You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2021/09/24 06:38:58 UTC

[cassandra] branch cassandra-3.11 updated: ArrayIndexOutOfBoundsException in FunctionResource#fromName

This is an automated email from the ASF dual-hosted git repository.

bereng pushed a commit to branch cassandra-3.11
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-3.11 by this push:
     new 1aa7fb1  ArrayIndexOutOfBoundsException in FunctionResource#fromName
1aa7fb1 is described below

commit 1aa7fb172f7f107f7b3a252721c501a20ee6e8aa
Author: Bereng <be...@gmail.com>
AuthorDate: Mon Sep 20 10:21:11 2021 +0200

    ArrayIndexOutOfBoundsException in FunctionResource#fromName
    
    patch by kamlesh_ghoradkar, Berenguer Blasi; reviewed by Berenguer Blasi, Aleksei Zotov for CASSANDRA-16977
    
    Co-authored-by: kamlesh_ghoradkar <ka...@persistent.com>
    Co-authored-by: Berenguer Blasi <be...@gmail.com>
---
 .../apache/cassandra/auth/FunctionResource.java    |   5 +-
 .../cassandra/auth/FunctionResourceTest.java       | 115 +++++++++++++++++++++
 2 files changed, 119 insertions(+), 1 deletion(-)

diff --git a/src/java/org/apache/cassandra/auth/FunctionResource.java b/src/java/org/apache/cassandra/auth/FunctionResource.java
index 01a4de5..9a6c6ab 100644
--- a/src/java/org/apache/cassandra/auth/FunctionResource.java
+++ b/src/java/org/apache/cassandra/auth/FunctionResource.java
@@ -18,6 +18,7 @@
 package org.apache.cassandra.auth;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -176,8 +177,10 @@ public class FunctionResource implements IResource
         if (parts.length == 2)
             return keyspace(parts[1]);
 
+        if (!name.matches("^.+\\[.*\\]$"))
+            throw new IllegalArgumentException(String.format("%s is not a valid function resource name. It must end with \"[]\"", name));
         String[] nameAndArgs = StringUtils.split(parts[2], "[|]");
-        return function(parts[1], nameAndArgs[0], argsListFromString(nameAndArgs[1]));
+        return function(parts[1], nameAndArgs[0], nameAndArgs.length > 1 ? argsListFromString(nameAndArgs[1]) : Collections.emptyList());
     }
 
     /**
diff --git a/test/unit/org/apache/cassandra/auth/FunctionResourceTest.java b/test/unit/org/apache/cassandra/auth/FunctionResourceTest.java
new file mode 100644
index 0000000..54da393
--- /dev/null
+++ b/test/unit/org/apache/cassandra/auth/FunctionResourceTest.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cassandra.auth;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.db.marshal.TypeParser;
+
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.junit.Assert.assertEquals;
+
+public class FunctionResourceTest
+{
+    private static final String ks = "fr_ks";
+    private static final String func = "functions";
+    private static final String name = "concat";
+    private static final String varType = "org.apache.cassandra.db.marshal.UTF8Type";
+
+    @Test
+    public void testFunction() throws Exception
+    {
+        FunctionResource expected = FunctionResource.root();
+        FunctionResource actual = FunctionResource.fromName(func);
+        assertEquals(expected, actual);
+        assertEquals(expected.getName(), actual.getName());
+    }
+
+    @Test
+    public void testFunctionKeyspace() throws Exception
+    {
+        FunctionResource expected = FunctionResource.keyspace(ks);
+        FunctionResource actual = FunctionResource.fromName(String.format("%s/%s", func, ks));
+        assertEquals(expected, actual);
+        assertEquals(expected.getKeyspace(), actual.getKeyspace());
+    }
+
+    @Test
+    public void testFunctionWithSingleInputParameter() throws Exception
+    {
+        List<AbstractType<?>> argTypes = new ArrayList<>();
+        argTypes.add(TypeParser.parse(varType));
+        FunctionResource expected = FunctionResource.function(ks, name, argTypes);
+        FunctionResource actual = FunctionResource.fromName(String.format("%s/%s/%s[%s]", func, ks, name, varType));
+        assertEquals(expected, actual);
+        assertEquals(expected.getKeyspace(), actual.getKeyspace());
+    }
+
+    @Test
+    public void testFunctionWithMultipleInputParameters() throws Exception
+    {
+        List<AbstractType<?>> argTypes = new ArrayList<>();
+        argTypes.add(TypeParser.parse(varType));
+        argTypes.add(TypeParser.parse(varType));
+        FunctionResource expected = FunctionResource.function(ks, name, argTypes);
+        FunctionResource actual = FunctionResource.fromName(String.format("%s/%s/%s[%s^%s]", func, ks, name, varType, varType));
+        assertEquals(expected, actual);
+        assertEquals(expected.getKeyspace(), actual.getKeyspace());
+    }
+
+    @Test
+    public void testFunctionWithoutInputParameters() throws Exception
+    {
+        List<AbstractType<?>> argTypes = new ArrayList<>();
+        FunctionResource expected = FunctionResource.function(ks, name, argTypes);
+        FunctionResource actual = FunctionResource.fromName(String.format("%s/%s/%s[]", func, ks, name));
+        assertEquals(expected, actual);
+        assertEquals(expected.getKeyspace(), actual.getKeyspace());
+
+        String error = "functions/fr_ks/concat is not a valid function resource name. It must end with \"[]\"";
+        assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> FunctionResource.fromName(String.format("%s/%s/%s",
+                                                                                                                           func,
+                                                                                                                           ks,
+                                                                                                                           name)))
+                                                                 .withMessage(error);
+    }
+
+    @Test
+    public void testInvalidFunctionName()
+    {
+        String expected = "functions_test is not a valid function resource name";
+        assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> FunctionResource.fromName("functions_test"))
+                                                                 .withMessage(expected);
+    }
+
+    @Test
+    public void testFunctionWithInvalidInput()
+    {
+        String expected = String.format("%s/%s/%s[%s]/test is not a valid function resource name", func, ks, name, varType);
+        assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> FunctionResource.fromName(String.format("%s/%s/%s[%s]/test",
+                                                                                                                           func,
+                                                                                                                           ks,
+                                                                                                                           name,
+                                                                                                                           varType)))
+                                                                 .withMessage(expected);
+    }
+}

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org