Leaf String value comparison matches mix of single and double quotes 53/120853/5
authorshivasubedi <shiva.subedi@est.tech>
Thu, 22 Apr 2021 13:54:49 +0000 (14:54 +0100)
committershivasubedi <shiva.subedi@est.tech>
Mon, 26 Apr 2021 10:05:59 +0000 (11:05 +0100)
Issue-ID: CPS-345
Signed-off-by: shivasubedi <shiva.subedi@est.tech>
Change-Id: Id6db86817878ed5ed8ccaed4a9a71c5a06d6f97c

cps-ri/src/main/java/org/onap/cps/spi/query/CpsPathQuery.java
cps-ri/src/test/groovy/org/onap/cps/spi/query/CpsPathQuerySpec.groovy

index c5861bd..ac7e7e0 100644 (file)
@@ -52,7 +52,8 @@ public class CpsPathQuery {
 
     private static final Pattern LEAF_INTEGER_VALUE_PATTERN = Pattern.compile("[-+]?\\d+");
 
-    private static final Pattern LEAF_STRING_VALUE_PATTERN = Pattern.compile("['\"](.*)['\"]");
+    private static final Pattern LEAF_STRING_VALUE_IN_SINGLE_QUOTES_PATTERN = Pattern.compile("'(.*)'");
+    private static final Pattern LEAF_STRING_VALUE_IN_DOUBLE_QUOTES_PATTERN = Pattern.compile("\"(.*)\"");
 
     private static final String YANG_MULTIPLE_LEAF_VALUE_EQUALS_CONDITION =  "\\[(.*?)\\s{0,9}]";
 
@@ -118,9 +119,15 @@ public class CpsPathQuery {
     }
 
     private static Object convertLeafValueToCorrectType(final String leafValueString, final String cpsPath) {
-        final Matcher stringValueWithQuotesMatcher = LEAF_STRING_VALUE_PATTERN.matcher(leafValueString);
-        if (stringValueWithQuotesMatcher.matches()) {
-            return stringValueWithQuotesMatcher.group(1);
+        final Matcher stringValueWithSingleQuotesMatcher =
+                LEAF_STRING_VALUE_IN_SINGLE_QUOTES_PATTERN.matcher(leafValueString);
+        if (stringValueWithSingleQuotesMatcher.matches()) {
+            return stringValueWithSingleQuotesMatcher.group(1);
+        }
+        final Matcher stringValueWithDoubleQuotesMatcher =
+                LEAF_STRING_VALUE_IN_DOUBLE_QUOTES_PATTERN.matcher(leafValueString);
+        if (stringValueWithDoubleQuotesMatcher.matches()) {
+            return stringValueWithDoubleQuotesMatcher.group(1);
         }
         final Matcher integerValueMatcher = LEAF_INTEGER_VALUE_PATTERN.matcher(leafValueString);
         if (integerValueMatcher.matches()) {
index 99302a4..b3b2053 100644 (file)
@@ -85,9 +85,27 @@ class CpsPathQuerySpec extends Specification {
             scenario                                                            | cpsPath
             'no / at the start'                                                 | 'invalid-cps-path/child'
             'additional / after descendant option'                              | '///cps-path'
-            'float value'                                                       | '/parent-200/child-202[@common-leaf-name-float=5.0]'
+            'float value'                                                       | '/parent/child[@someFloat=5.0]'
+            'unmatched quotes, double quote first '                             | '/parent/child[@someString="value with unmatched quotes\']'
+            'unmatched quotes, single quote first'                              | '/parent/child[@someString=\'value with unmatched quotes"]'
             'too many containers'                                               | '/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99/100[@a=1]'
             'end with descendant and more than one attribute separated by "or"' | '//child[@int-leaf=5 or @leaf-name="leaf value"]'
             'missing attribute value'                                           | '//child[@int-leaf=5 and @name]'
     }
-}
+
+    @Unroll
+    def 'Convert cps leaf value to valid type with leaf of type #scenario.'() {
+        when: 'the given leaf value is converted'
+            def result = objectUnderTest.convertLeafValueToCorrectType(leafValueInputString, 'source xPath (for error message only)')
+        then: 'the leaf value returned is of the right type'
+            result == expectedLeafOutputValue
+        where: "the following data is used"
+            scenario                         | leafValueInputString         ||  expectedLeafOutputValue
+            'Integer'                        | "5"                          ||  5
+            'String with single quotes'      | '\'value in single quotes\'' || 'value in single quotes'
+            'String with double quotes'      | '"value in double quotes"'   || 'value in double quotes'
+            'String containing single quote' | '"value with \'"'            || 'value with \''
+            'String containing double quote' | '\'value with "\''           || 'value with "'
+    }
+    
+}
\ No newline at end of file