Bug 6291 - Fix bugs of new Restconf 11 implementation 65/42565/17
authorIvan Hrasko <ihrasko@cisco.com>
Tue, 26 Jul 2016 12:46:04 +0000 (14:46 +0200)
committerIvan Hrasko <ihrasko@cisco.com>
Mon, 1 Aug 2016 07:52:07 +0000 (07:52 +0000)
- first identifier does not start with slash
when deserialization is invoked
- adapted unit tests
- return error 404 when data missing with GET
operation
- return config data when state data does
not exists with GET operation
- return state data when config data does
not exists with GET operation
- identifier can be null and it is deserialized to
YangInstanceIdentifier.EMPTY

Change-Id: I426a2bc1cb0e908dc189553e464f405ef4ce1457
Signed-off-by: Ivan Hrasko <ihrasko@cisco.com>
restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializer.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializer.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/restful/utils/ReadDataTransactionUtil.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java
restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/IdentifierCodecTest.java
restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializerTest.java
restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializerTest.java
restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/rest/services/impl/RestconfModulesServiceTestUtils.java
restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/utils/parser/ParserIdentifierTest.java

index 6fc16fa232a78a18b0b2e4d0a2c87addb79e3fe5..00c3a2cd822e587233882dd83b690c5c10a8f2ee 100644 (file)
@@ -57,30 +57,26 @@ public final class YangInstanceIdentifierDeserializer {
                 data, DataSchemaContextTree.from(schemaContext).getRoot(),
                 YangInstanceIdentifierDeserializer.MainVarsWrapper.STARTING_OFFSET, schemaContext);
 
-        checkValid(!data.isEmpty(), "Empty path is not valid", variables.getData(), variables.getOffset());
-
-        if (!data.equals(String.valueOf(RestconfConstants.SLASH))) {
-            while (!allCharsConsumed(variables)) {
-                validArg(variables);
-                final QName qname = prepareQName(variables);
-
-                // this is the last identifier (input is consumed) or end of identifier (slash)
-                if (allCharsConsumed(variables)
-                        || currentChar(variables.getOffset(), variables.getData()) == RestconfConstants.SLASH) {
-                    prepareIdentifier(qname, path, variables);
-                    path.add(variables.getCurrent().getIdentifier());
-                } else if (currentChar(variables.getOffset(),
-                        variables.getData()) == ParserBuilderConstants.Deserializer.EQUAL) {
-                    if (nextContextNode(qname, path, variables).getDataSchemaNode() instanceof ListSchemaNode) {
-                        prepareNodeWithPredicates(qname, path, variables);
-                    } else {
-                        prepareNodeWithValue(qname, path, variables);
-                    }
+        while (!allCharsConsumed(variables)) {
+            validArg(variables);
+            final QName qname = prepareQName(variables);
+
+            // this is the last identifier (input is consumed) or end of identifier (slash)
+            if (allCharsConsumed(variables)
+                    || currentChar(variables.getOffset(), variables.getData()) == RestconfConstants.SLASH) {
+                prepareIdentifier(qname, path, variables);
+                path.add(variables.getCurrent().getIdentifier());
+            } else if (currentChar(variables.getOffset(),
+                    variables.getData()) == ParserBuilderConstants.Deserializer.EQUAL) {
+                if (nextContextNode(qname, path, variables).getDataSchemaNode() instanceof ListSchemaNode) {
+                    prepareNodeWithPredicates(qname, path, variables);
                 } else {
-                    throw new IllegalArgumentException(
-                            "Bad char " + currentChar(variables.getOffset(), variables.getData()) + " on position "
-                                    + variables.getOffset() + ".");
+                    prepareNodeWithValue(qname, path, variables);
                 }
+            } else {
+                throw new IllegalArgumentException(
+                        "Bad char " + currentChar(variables.getOffset(), variables.getData()) + " on position "
+                                + variables.getOffset() + ".");
             }
         }
 
@@ -287,11 +283,18 @@ public final class YangInstanceIdentifierDeserializer {
     }
 
     private static void validArg(final MainVarsWrapper variables) {
-        checkValid(RestconfConstants.SLASH == currentChar(variables.getOffset(), variables.getData()),
-                "Identifier must start with '/'.", variables.getData(), variables.getOffset());
-        skipCurrentChar(variables);
-        checkValid(!allCharsConsumed(variables), "Identifier cannot end with '/'.",
-                variables.getData(), variables.getOffset());
+        // every identifier except of the first MUST start with slash
+        if (variables.getOffset() != MainVarsWrapper.STARTING_OFFSET) {
+            checkValid(RestconfConstants.SLASH == currentChar(variables.getOffset(), variables.getData()),
+                    "Identifier must start with '/'.", variables.getData(), variables.getOffset());
+
+            // skip slash
+            skipCurrentChar(variables);
+
+            // check if slash is not also the last char in identifier
+            checkValid(!allCharsConsumed(variables), "Identifier cannot end with '/'.",
+                    variables.getData(), variables.getOffset());
+        }
     }
 
     private static void skipCurrentChar(final MainVarsWrapper variables) {
index 1384eac69d1d1f906a1cc029bf77866e83b75f1c..538dbdc3d40b84105b90d7f2a4bf5cef451d3f9a 100644 (file)
@@ -49,10 +49,7 @@ public final class YangInstanceIdentifierSerializer {
     public static String create(final SchemaContext schemaContext, final YangInstanceIdentifier data) {
         final DataSchemaContextNode<?> current = DataSchemaContextTree.from(schemaContext).getRoot();
         final MainVarsWrapper variables = new MainVarsWrapper(current);
-
-        // for empty data return slash
-        final StringBuilder path = (data.getPathArguments().size() == 0) ?
-                new StringBuilder(String.valueOf(RestconfConstants.SLASH)) : new StringBuilder();
+        final StringBuilder path = new StringBuilder();
 
         QNameModule parentModule = null;
         for (int i = 0; i < data.getPathArguments().size(); i++) {
@@ -74,9 +71,13 @@ public final class YangInstanceIdentifierSerializer {
             // append namespace before every node which is defined in other module than its parent
             // condition is satisfied also for the first path argument
             if (!arg.getNodeType().getModule().equals(parentModule)) {
-                path.append(RestconfConstants.SLASH
-                        + prefixForNamespace(arg.getNodeType(), schemaContext)
-                        + ParserBuilderConstants.Deserializer.COLON);
+                // append slash if it is not the first path argument
+                if (path.length() > 0) {
+                    path.append(RestconfConstants.SLASH);
+                }
+
+                path.append(prefixForNamespace(arg.getNodeType(), schemaContext));
+                path.append(ParserBuilderConstants.Deserializer.COLON);
             } else {
                 path.append(RestconfConstants.SLASH);
             }
index 3c82c207e2325523c2152755e5fe1c1a630fcd5b..425f23bf702ed4c313c9791698669ac45c2b8d20 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.restconf.restful.utils;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.CheckedFuture;
+import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.netconf.sal.restconf.impl.RestconfDocumentedException;
@@ -116,6 +117,25 @@ public final class ReadDataTransactionUtil {
         transactionNode.setLogicalDatastoreType(LogicalDatastoreType.CONFIGURATION);
         final NormalizedNode<?, ?> configDataNode = readDataViaTransaction(transactionNode);
 
+        // if no data exists
+        if (stateDataNode == null && configDataNode == null) {
+            throw new RestconfDocumentedException(
+                    "Request could not be completed because the relevant data model content does not exist",
+                    ErrorType.PROTOCOL,
+                    ErrorTag.DATA_MISSING);
+        }
+
+        // return config data
+        if (stateDataNode == null) {
+            return configDataNode;
+        }
+
+        // return state data
+        if (configDataNode == null) {
+            return stateDataNode;
+        }
+
+        // merge data from config and state
         return mapNode(stateDataNode, configDataNode);
     }
 
@@ -267,8 +287,8 @@ public final class ReadDataTransactionUtil {
      * @param configDataNode
      *            - data node of config data
      */
-    private static void validPossibilityOfMergeNodes(final NormalizedNode<?, ?> stateDataNode,
-            final NormalizedNode<?, ?> configDataNode) {
+    private static void validPossibilityOfMergeNodes(@Nonnull final NormalizedNode<?, ?> stateDataNode,
+            @Nonnull final NormalizedNode<?, ?> configDataNode) {
         final QNameModule moduleOfStateData = stateDataNode.getIdentifier().getNodeType().getModule();
         final QNameModule moduleOfConfigData = configDataNode.getIdentifier().getNodeType().getModule();
         if (moduleOfStateData != moduleOfConfigData) {
index 9b9b8d33c43514291fb8e84542c2d64f010455e5..d24c3deb07336c99016c453b3810d1cf44f556d9 100644 (file)
@@ -14,6 +14,7 @@ import java.text.ParseException;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
+import javax.annotation.Nullable;
 import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint;
 import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService;
 import org.opendaylight.netconf.md.sal.rest.schema.SchemaExportContext;
@@ -55,10 +56,10 @@ public final class ParserIdentifier {
      *            - {@link SchemaContext}
      * @return {@link InstanceIdentifierContext}
      */
-    public static InstanceIdentifierContext<?> toInstanceIdentifier(final String identifier,
+    public static InstanceIdentifierContext<?> toInstanceIdentifier(@Nullable final String identifier,
             final SchemaContext schemaContext) {
         final YangInstanceIdentifier deserialize;
-        if (identifier.contains(RestconfConstants.MOUNT)) {
+        if (identifier != null && identifier.contains(RestconfConstants.MOUNT)) {
             final String mountPointId = identifier.substring(0, identifier.indexOf("/" + RestconfConstants.MOUNT));
             deserialize = IdentifierCodec.deserialize(mountPointId, schemaContext);
         } else {
@@ -155,11 +156,18 @@ public final class ParserIdentifier {
             final StringBuilder pathBuilder = new StringBuilder();
             while (componentIter.hasNext()) {
                 final String current = componentIter.next();
-                pathBuilder.append("/");
-                pathBuilder.append(current);
+
                 if (RestconfConstants.MOUNT.equals(current)) {
+                    pathBuilder.append("/");
+                    pathBuilder.append(RestconfConstants.MOUNT);
                     break;
                 }
+
+                if (pathBuilder.length() != 0) {
+                    pathBuilder.append("/");
+                }
+
+                pathBuilder.append(current);
             }
             final InstanceIdentifierContext<?> point = ParserIdentifier
                     .toInstanceIdentifier(pathBuilder.toString(), schemaContext);
index 8907e5fcc35c655b25110be57945c15506ef4ec0..5e0e266cacba444c85beb7c3c5fb02d874872614 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.restconf.parser;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -22,8 +23,8 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 public class IdentifierCodecTest {
 
     private static final String URI_WITH_LIST_AND_LEAF =
-            "/list-test:top/list1=%2C%27" + '"' + "%3A" + '"' + "%20%2F,,foo/list2=a,b/result";
-    private static final String URI_WITH_LEAF_LIST = "/list-test:top/Y=x%3Ay";
+            "list-test:top/list1=%2C%27" + '"' + "%3A" + '"' + "%20%2F,,foo/list2=a,b/result";
+    private static final String URI_WITH_LEAF_LIST = "list-test:top/Y=x%3Ay";
 
     private SchemaContext schemaContext;
 
@@ -74,13 +75,13 @@ public class IdentifierCodecTest {
     }
 
     /**
-     * Positive test of serialization <code>YangInstanceIdentifier.EMPTY</code>. Single slash is
+     * Positive test of serialization <code>YangInstanceIdentifier.EMPTY</code>. Empty <code>String</code> is
      * expected to be returned.
      */
     @Test
     public void codecSerializeEmptyTest () {
         final String serialized = IdentifierCodec.serialize(YangInstanceIdentifier.EMPTY, this.schemaContext);
-        assertEquals("Failed codec serialization test", "/", serialized);
+        assertTrue("Failed codec serialization test", serialized.isEmpty());
     }
 
     /**
index 7ba1bace71f0705c2e6f81b873870fba61304c97..43b9b218a9d15565320eb60702ff22357e9d6bae 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.netconf.sal.restconf.impl.RestconfDocumentedException;
 import org.opendaylight.netconf.sal.restconf.impl.RestconfError;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 /**
@@ -52,7 +53,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void deserializeContainerTest() {
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer
-                .create(schemaContext, "/deserializer-test:contA");
+                .create(schemaContext, "deserializer-test:contA");
 
         assertEquals("Result does not contains expected number of path arguments", 1, Iterables.size(result));
         assertEquals("Not expected path argument",
@@ -67,7 +68,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void deserializeContainerWithLeafTest() {
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer
-                .create(schemaContext, "/deserializer-test:contA/leaf-A");
+                .create(schemaContext, "deserializer-test:contA/leaf-A");
 
         assertEquals("Result does not contains expected number of path arguments", 2, Iterables.size(result));
 
@@ -87,7 +88,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void deserializeContainerWithListWithLeafListTest() {
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer
-                .create(schemaContext, "/deserializer-test:contA/list-A=100/leaf-list-AA=instance");
+                .create(schemaContext, "deserializer-test:contA/list-A=100/leaf-list-AA=instance");
 
         assertEquals("Result does not contains expected number of path arguments", 5, Iterables.size(result));
 
@@ -125,7 +126,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void deserializeListWithNoKeysTest() {
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer
-                .create(schemaContext, "/deserializer-test:list-no-key");
+                .create(schemaContext, "deserializer-test:list-no-key");
 
         assertEquals("Result does not contains expected number of path arguments", 2, Iterables.size(result));
 
@@ -147,7 +148,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void deserializeListWithOneKeyTest() {
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer
-                .create(schemaContext, "/deserializer-test:list-one-key=value");
+                .create(schemaContext, "deserializer-test:list-one-key=value");
 
         assertEquals("Result does not contains expected number of path arguments", 2, Iterables.size(result));
 
@@ -175,7 +176,7 @@ public class YangInstanceIdentifierDeserializerTest {
         values.put(QName.create(list, "enabled"), false);
 
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer
-                .create(schemaContext, "/deserializer-test:list-multiple-keys=value,100,false");
+                .create(schemaContext, "deserializer-test:list-multiple-keys=value,100,false");
 
         assertEquals("Result does not contains expected number of path arguments", 2, Iterables.size(result));
 
@@ -196,7 +197,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void deserializeLeafListTest() {
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer
-                .create(schemaContext, "/deserializer-test:leaf-list-0=true");
+                .create(schemaContext, "deserializer-test:leaf-list-0=true");
 
         assertEquals("Result does not contains expected number of path arguments", 2, Iterables.size(result));
 
@@ -211,6 +212,15 @@ public class YangInstanceIdentifierDeserializerTest {
                 iterator.next().toString());
     }
 
+    /**
+     * Test when empty <code>String</code> is supplied as an input. Test is expected to return empty result.
+     */
+    @Test
+    public void deserializeEmptyDataTest() {
+        final Iterable<PathArgument> result = YangInstanceIdentifierDeserializer.create(schemaContext, "");
+        assertTrue("Empty result expected", Iterables.isEmpty(result));
+    }
+
     /**
      * Negative test when supplied <code>SchemaContext</code> is null. Test is expected to fail with
      * <code>NullPointerException</code>.
@@ -218,7 +228,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void deserializeNullSchemaContextNegativeTest() {
         thrown.expect(NullPointerException.class);
-        YangInstanceIdentifierDeserializer.create(null, "/deserializer-test:contA");
+        YangInstanceIdentifierDeserializer.create(null, "deserializer-test:contA");
     }
 
     /**
@@ -231,16 +241,6 @@ public class YangInstanceIdentifierDeserializerTest {
         YangInstanceIdentifierDeserializer.create(schemaContext, null);
     }
 
-    /**
-     * Negative test when empty <code>String</code> is supplied as an input. Test is expected to fail with
-     * <code>IllegalArgumentException</code>.
-     */
-    @Test
-    public void deserializeEmptyDataNegativeTest() {
-        thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "");
-    }
-
     /**
      * Negative test when identifier is not followed by slash or equals. Test is expected to fail with
      * <code>IllegalArgumentException</code>.
@@ -248,28 +248,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void deserializeBadCharMissingSlashOrEqualNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:cont*leaf-A");
-    }
-
-    /**
-     * Negative test of validating identifier when identifier does not start with slash.
-     * <code>IllegalArgumentException</code> is expected.
-     */
-    @Test
-    public void deserializeNoBeginningSlashNegativeTest() {
-        thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:contA");
-    }
-
-    /**
-     * Positive test of validating identifier when identifier contains slash only. Deserialization should return
-     * empty result.
-     */
-    @Test
-    public void validArgOnlySlashTest() {
-        final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer
-                .create(schemaContext, "/");
-        assertTrue("Result does not contains expected number of path arguments", Iterables.isEmpty(result));
+        YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:cont*leaf-A");
     }
 
     /**
@@ -279,7 +258,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void validArgIdentifierContainerEndsWithSlashNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:contA/");
+        YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:contA/");
     }
 
     /**
@@ -289,17 +268,17 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void validArgIdentifierListEndsWithSlashLNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:list-one-key=value/");
+        YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:list-one-key=value/");
     }
 
     /**
-     * Negative test of creating <code>QName</code> when identifier is empty (example: '//'). Test is expected to fail
+     * Negative test of creating <code>QName</code> when identifier is empty (example: '/'). Test is expected to fail
      * with <code>IllegalArgumentException</code>.
      */
     @Test
     public void prepareQnameEmptyIdentifierNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "//");
+        YangInstanceIdentifierDeserializer.create(schemaContext, "/");
     }
 
     /**
@@ -309,7 +288,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void prepareQnameTwoSlashesNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:contA//leaf-A");
+        YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:contA//leaf-A");
     }
 
     /**
@@ -319,7 +298,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void prepareQnameBuildPathNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test*contA");
+        YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test*contA");
     }
 
     /**
@@ -329,7 +308,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void prepareQnameNotExistingPrefixNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "/not-existing:contA");
+        YangInstanceIdentifierDeserializer.create(schemaContext, "not-existing:contA");
     }
 
     /**
@@ -339,7 +318,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void prepareQnameNotValidPrefixAndLocalNameNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:*not-parsable-identifier");
+        YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:*not-parsable-identifier");
     }
 
     /**
@@ -349,7 +328,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void prepareQnameErrorParsingNegativeTest() {
         thrown.expect(StringIndexOutOfBoundsException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:");
+        YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:");
     }
 
     /**
@@ -360,7 +339,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void prepareQnameNotValidContainerNameNegativeTest() {
         try {
-            YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:contA/leafB");
+            YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:contA/leafB");
             fail("Test should fail due to unknown child node in container");
         } catch (final RestconfDocumentedException e) {
             assertEquals("Not expected error type",
@@ -380,7 +359,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void prepareQnameNotValidListNameNegativeTest() {
         try {
-            YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:list-no-key/disabled=false");
+            YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:list-no-key/disabled=false");
             fail("Test should fail due to unknown child node in list");
         } catch (final RestconfDocumentedException e) {
             assertEquals("Not expected error type",
@@ -399,7 +378,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void prepareIdentifierNotKeyedEntryNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
-        YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:list-one-key");
+        YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:list-one-key");
     }
 
     /**
@@ -410,7 +389,7 @@ public class YangInstanceIdentifierDeserializerTest {
     public void deserializeKeysEndsWithComaNegativeTest() {
         thrown.expect(IllegalArgumentException.class);
         YangInstanceIdentifierDeserializer.create( schemaContext,
-                "/deserializer-test:list-multiple-keys=value,100,false,");
+                "deserializer-test:list-multiple-keys=value,100,false,");
     }
 
     /**
@@ -426,7 +405,7 @@ public class YangInstanceIdentifierDeserializerTest {
         values.put(QName.create(list, "enabled"), "");
 
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer.create(
-                schemaContext, "/deserializer-test:list-multiple-keys=%3Afoo,,/string-value");
+                schemaContext, "deserializer-test:list-multiple-keys=%3Afoo,,/string-value");
 
         assertEquals("Result does not contains expected number of path arguments", 3, Iterables.size(result));
 
@@ -456,7 +435,7 @@ public class YangInstanceIdentifierDeserializerTest {
     public void notAllListKeysEncodedNegativeTest() {
         try {
             YangInstanceIdentifierDeserializer.create(
-                    schemaContext, "/deserializer-test:list-multiple-keys=%3Afoo/string-value");
+                    schemaContext, "deserializer-test:list-multiple-keys=%3Afoo/string-value");
             fail("Test should fail due to missing list key values");
         } catch (final RestconfDocumentedException e) {
             assertEquals("Not expected error type",
@@ -468,21 +447,13 @@ public class YangInstanceIdentifierDeserializerTest {
         }
     }
 
-    /**
-     * Negative test of preparing node with predicates when it is not possible to get <code>DataSchemaNode</code>.
-     * Test is expected to fail with <code>NullPointerException</code>.
-     */
-    @Ignore
-    @Test
-    public void prepareNodeWithPredicatesNegativeTest() {}
-
     /**
      * Test URI with list where key value starts with, ends with or contains percent encoded characters.The encoded
      * value should be complete also with not percent-encoded parts.
      */
     @Test
     public void percentEncodedKeyEndsWithNoPercentEncodedChars() {
-        final String URI = "/deserializer-test:list-multiple-keys=%3Afoo,bar%3A,foo%3Abar";
+        final String URI = "deserializer-test:list-multiple-keys=%3Afoo,bar%3A,foo%3Abar";
         final YangInstanceIdentifier result = YangInstanceIdentifier.create(
                 YangInstanceIdentifierDeserializer.create(schemaContext, URI));
 
@@ -506,7 +477,7 @@ public class YangInstanceIdentifierDeserializerTest {
         values.put(QName.create(list, "enabled"), "");
 
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer
-                .create(schemaContext, "/deserializer-test:list-multiple-keys=,,");
+                .create(schemaContext, "deserializer-test:list-multiple-keys=,,");
 
         assertEquals("Result does not contains expected number of path arguments", 2, Iterables.size(result));
 
@@ -528,7 +499,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void leafListMissingKeyNegativeTest() {
         try {
-            YangInstanceIdentifierDeserializer.create(schemaContext, "/deserializer-test:leaf-list-0=");
+            YangInstanceIdentifierDeserializer.create(schemaContext, "deserializer-test:leaf-list-0=");
             fail("Test should fail due to missing instance value");
         } catch (final RestconfDocumentedException e) {
             assertEquals("Not expected error type",
@@ -546,7 +517,7 @@ public class YangInstanceIdentifierDeserializerTest {
     @Test
     public void deserializePartInOtherModuleTest() {
         final Iterable<YangInstanceIdentifier.PathArgument> result = YangInstanceIdentifierDeserializer.create(
-                schemaContext, "/deserializer-test-included:augmented-list=100/augmented-leaf");
+                schemaContext, "deserializer-test-included:augmented-list=100/augmented-leaf");
 
         assertEquals("Result does not contains expected number of path arguments", 4, Iterables.size(result));
 
index 965ce3499528cdbfb90ea7904118d77dba549609..b05f43f4f62378a78093b52ea86b0d75c10bbe5f 100644 (file)
@@ -54,7 +54,7 @@ public class YangInstanceIdentifierSerializerTest {
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
         assertEquals("Serialization not successful",
-                "/serializer-test:contA", result);
+                "serializer-test:contA", result);
     }
 
     /**
@@ -69,7 +69,7 @@ public class YangInstanceIdentifierSerializerTest {
                 .build();
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
-        assertEquals("Serialization not successful", "/serializer-test:contA/leaf-A", result);
+        assertEquals("Serialization not successful", "serializer-test:contA/leaf-A", result);
     }
 
     /**
@@ -92,7 +92,7 @@ public class YangInstanceIdentifierSerializerTest {
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
         assertEquals("Serialization not successful",
-                "/serializer-test:contA/list-A=100/leaf-list-AA=instance",
+                "serializer-test:contA/list-A=100/leaf-list-AA=instance",
                 result);
     }
 
@@ -109,7 +109,7 @@ public class YangInstanceIdentifierSerializerTest {
                 .build();
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
-        assertEquals("Serialization not successful", "/serializer-test:list-no-key", result);
+        assertEquals("Serialization not successful", "serializer-test:list-no-key", result);
     }
 
     /**
@@ -126,7 +126,7 @@ public class YangInstanceIdentifierSerializerTest {
                 .build();
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
-        assertEquals("Serialization not successful", "/serializer-test:list-one-key=value", result);
+        assertEquals("Serialization not successful", "serializer-test:list-one-key=value", result);
     }
 
     /**
@@ -146,7 +146,7 @@ public class YangInstanceIdentifierSerializerTest {
                 .node(list).nodeWithKey(list, values).build();
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
-        assertEquals("Serialization not successful", "/serializer-test:list-multiple-keys=value-1,2,true", result);
+        assertEquals("Serialization not successful", "serializer-test:list-multiple-keys=value-1,2,true", result);
     }
 
     /**
@@ -161,7 +161,7 @@ public class YangInstanceIdentifierSerializerTest {
                 .build();
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
-        assertEquals("Serialization not successful", "/serializer-test:leaf-0", result);
+        assertEquals("Serialization not successful", "serializer-test:leaf-0", result);
     }
 
     /**
@@ -177,7 +177,7 @@ public class YangInstanceIdentifierSerializerTest {
                 .build();
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
-        assertEquals("Serialization not successful", "/serializer-test:leaf-list-0=instance", result);
+        assertEquals("Serialization not successful", "serializer-test:leaf-list-0=instance", result);
     }
 
     /**
@@ -205,12 +205,12 @@ public class YangInstanceIdentifierSerializerTest {
     /**
      * Test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when supplied
      * <code>YangInstanceIdentifier</code> is <code>YangInstanceIdentifier.EMPTY</code>.
-     * Single slash is expected as a return value.
+     * Empty <code>String</code> is expected as a return value.
      */
     @Test
     public void serializeEmptyDataTest() {
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, YangInstanceIdentifier.EMPTY);
-        assertEquals("Empty identifier is expected", "/", result);
+        assertTrue("Empty identifier is expected", result.isEmpty());
     }
 
     /**
@@ -263,7 +263,7 @@ public class YangInstanceIdentifierSerializerTest {
                 .build();
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
-        assertEquals("Serialization not successful", "/serializer-test:list-one-key=" + encoded, result);
+        assertEquals("Serialization not successful", "serializer-test:list-one-key=" + encoded, result);
     }
 
     /**
@@ -280,7 +280,7 @@ public class YangInstanceIdentifierSerializerTest {
                 .build();
 
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
-        assertEquals("Serialization not successful", "/serializer-test:list-one-key=" + value, result);
+        assertEquals("Serialization not successful", "serializer-test:list-one-key=" + value, result);
     }
 
     /**
@@ -303,7 +303,7 @@ public class YangInstanceIdentifierSerializerTest {
         final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
 
         assertEquals("Serialization not successful",
-                "/serializer-test-included:augmented-list=100/serializer-test:augmented-leaf", result);
+                "serializer-test-included:augmented-list=100/serializer-test:augmented-leaf", result);
     }
 
     /**
index 34310909149ccfcee89e61294c9fab60e6ca47b3..4f221b0ae1663bab8c1fd673c515ec1bb80c631a 100644 (file)
@@ -48,8 +48,8 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceIm
 import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream;
 
 class RestconfModulesServiceTestUtils {
-    static final String MOUNT_POINT = "/mount-point-1:cont/" + RestconfConstants.MOUNT + "/";
-    static final String NOT_REGISTERED_MOUNT_POINT = "/mount-point-1:listA/" + RestconfConstants.MOUNT + "/";
+    static final String MOUNT_POINT = "mount-point-1:cont/" + RestconfConstants.MOUNT + "/";
+    static final String NOT_REGISTERED_MOUNT_POINT = "mount-point-1:listA/" + RestconfConstants.MOUNT + "/";
 
     static final String TEST_MODULE = "module1/2014-01-01";
     static final String NOT_EXISTING_MODULE = "not-existing/2016-01-01";
index 7793075db8dcb572fb9c6c69a61cfbc20cdea2f7..a5380a3004a55b27d54d132efbe12807e348ed00 100644 (file)
@@ -45,18 +45,18 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 public class ParserIdentifierTest {
     // mount point identifier + expected result
     private static final String MOUNT_POINT_IDENT =
-            "/mount-point:mount-container/point-number" + "/" + RestconfConstants.MOUNT;
+            "mount-point:mount-container/point-number" + "/" + RestconfConstants.MOUNT;
 
     private static final String MOUNT_POINT_IDENT_RESULT =
             "/(mount:point?revision=2016-06-02)mount-container/point-number";
 
     // invalid mount point identifier
     private static final String INVALID_MOUNT_POINT_IDENT =
-            "/mount-point:point-number" + "/" + RestconfConstants.MOUNT;
+            "mount-point:point-number" + "/" + RestconfConstants.MOUNT;
 
     // test identifier + expected result
     private static final String TEST_IDENT =
-            "/parser-identifier:cont1/cont2/listTest/list-in-grouping=name/leaf-A.B";
+            "parser-identifier:cont1/cont2/listTest/list-in-grouping=name/leaf-A.B";
 
     private static final String TEST_IDENT_RESULT =
             "/(parser:identifier?revision=2016-06-02)cont1/cont2/listTest/listTest/list-in-grouping/"
@@ -64,7 +64,7 @@ public class ParserIdentifierTest {
 
     // test identifier with nodes defined in other modules using augmentation + expected result
     private static final String TEST_IDENT_OTHERS =
-            "/parser-identifier-included:list-1=name,2016-06-02/parser-identifier:augment-leaf";
+            "parser-identifier-included:list-1=name,2016-06-02/parser-identifier:augment-leaf";
 
     private static final String TEST_IDENT_OTHERS_RESULT =
             "/(parser:identifier:included?revision=2016-06-02)list-1/list-1"
@@ -75,7 +75,7 @@ public class ParserIdentifierTest {
 
     // invalid test identifier
     private static final String INVALID_TEST_IDENT =
-            "/parser-identifier:cont2/listTest/list-in-grouping=name/leaf-A.B";
+            "parser-identifier:cont2/listTest/list-in-grouping=name/leaf-A.B";
 
     // schema context with test modules
     private SchemaContext schemaContext;
@@ -83,7 +83,6 @@ public class ParserIdentifierTest {
     private static final String TEST_MODULE_NAME = "test-module";
     private static final String TEST_MODULE_REVISION = "2016-06-02";
     private static final String TEST_MODULE_NAMESPACE = "test:module";
-    private static final String MOUNT_POINT_IDENT_WITHOUT_SLASH = MOUNT_POINT_IDENT.replaceFirst("/", "");
 
     // mount point and mount point service
     private DOMMountPoint mountPoint;
@@ -163,13 +162,14 @@ public class ParserIdentifierTest {
     }
 
     /**
-     * Negative test of creating <code>InstanceIdentifierContext</code> when identifier is <code>null</code>. Test
-     * fails expecting <code>NullPointerException</code>.
+     * Test of creating <code>InstanceIdentifierContext</code> when identifier is <code>null</code>.
+     * <code>{@link YangInstanceIdentifier#EMPTY}</code> should be returned.
      */
     @Test
-    public void toInstanceIdentifierNullIdentifierNegativeTest() {
-        thrown.expect(NullPointerException.class);
-        ParserIdentifier.toInstanceIdentifier(null, schemaContext);
+    public void toInstanceIdentifierNullIdentifierTest() {
+        final InstanceIdentifierContext<?> context = ParserIdentifier.toInstanceIdentifier(null, schemaContext);
+        assertEquals("Returned not expected identifier",
+                YangInstanceIdentifier.EMPTY, context.getInstanceIdentifier());
     }
 
     /**
@@ -183,47 +183,27 @@ public class ParserIdentifierTest {
     }
 
     /**
-     * Api path can contains single slash. <code>YangInstanceIdentifier.EMPTY</code> is expected to be returned.
+     * Api path can be empty. <code>YangInstanceIdentifier.EMPTY</code> is expected to be returned.
      */
     @Test
-    public void toInstanceIdentifierSlashIdentifierTest() {
-        final InstanceIdentifierContext<?> context = ParserIdentifier.toInstanceIdentifier("/", schemaContext);
+    public void toInstanceIdentifierEmptyIdentifierTest() {
+        final InstanceIdentifierContext<?> context = ParserIdentifier.toInstanceIdentifier("", schemaContext);
         assertEquals("Returned not expected identifier",
                 YangInstanceIdentifier.EMPTY, context.getInstanceIdentifier());
     }
 
     /**
-     * Api path can contains single slash. <code>YangInstanceIdentifier.EMPTY</code> is expected to be returned.
+     * Api path can be empty. <code>YangInstanceIdentifier.EMPTY</code> is expected to be returned.
      * Test when identifier contains {@link RestconfConstants#MOUNT}.
      */
     @Test
-    public void toInstanceIdentifierSlashIdentifierMountPointTest() {
+    public void toInstanceIdentifierEmptyIdentifierMountPointTest() {
         final InstanceIdentifierContext<?> context = ParserIdentifier.toInstanceIdentifier(
-                "/" + "/" + RestconfConstants.MOUNT, schemaContext);
+                "" + "/" + RestconfConstants.MOUNT, schemaContext);
         assertEquals("Returned not expected identifier",
                 YangInstanceIdentifier.EMPTY, context.getInstanceIdentifier());
     }
 
-    /**
-     * Negative test of creating <code>InstanceIdentifierContext</code> with empty identifier.
-     * <code>IllegalArgumentException</code> is expected.
-     */
-    @Test
-    public void toInstanceIdentifierEmptyIdentifierNegativeTest() {
-        thrown.expect(IllegalArgumentException.class);
-        ParserIdentifier.toInstanceIdentifier("", schemaContext);
-    }
-
-    /**
-     * Negative test of creating <code>InstanceIdentifierContext</code> from identifier containing
-     * {@link RestconfConstants#MOUNT} when identifier part is empty. <code>IllegalArgumentException</code> is expected.
-     */
-    @Test
-    public void toInstanceIdentifierMountPointEmptyIdentifierNegativeTest() {
-        thrown.expect(IllegalArgumentException.class);
-        ParserIdentifier.toInstanceIdentifier("/" + RestconfConstants.MOUNT, schemaContext);
-    }
-
     /**
      * Negative test with invalid test identifier. Test should fail with <code>IllegalArgumentException</code>.
      */
@@ -493,7 +473,7 @@ public class ParserIdentifierTest {
     public void toSchemaExportContextFromIdentifierMountPointTest() {
         final SchemaExportContext exportContext = ParserIdentifier.toSchemaExportContextFromIdentifier(
                 schemaContext,
-                MOUNT_POINT_IDENT_WITHOUT_SLASH + "/" + TEST_MODULE_NAME + "/" + TEST_MODULE_REVISION,
+                MOUNT_POINT_IDENT + "/" + TEST_MODULE_NAME + "/" + TEST_MODULE_REVISION,
                 mountPointService);
 
         final Module module = exportContext.getModule();
@@ -515,7 +495,7 @@ public class ParserIdentifierTest {
     public void toSchemaExportContextFromIdentifierMountPointNotFoundTest() {
         final SchemaExportContext exportContext = ParserIdentifier.toSchemaExportContextFromIdentifier(
                 schemaContext,
-                MOUNT_POINT_IDENT_WITHOUT_SLASH + "/" + "not-existing-module" + "/" + "2016-01-01",
+                MOUNT_POINT_IDENT + "/" + "not-existing-module" + "/" + "2016-01-01",
                 mountPointService);
 
         assertNotNull("Export context should be parsed", exportContext);
@@ -532,7 +512,7 @@ public class ParserIdentifierTest {
         try {
             ParserIdentifier.toSchemaExportContextFromIdentifier(
                     schemaContext,
-                    MOUNT_POINT_IDENT_WITHOUT_SLASH + "/" + TEST_MODULE_REVISION + "/" + TEST_MODULE_NAME,
+                    MOUNT_POINT_IDENT + "/" + TEST_MODULE_REVISION + "/" + TEST_MODULE_NAME,
                     mountPointService);
 
             fail("Test should fail due to invalid identifier supplied");
@@ -546,19 +526,6 @@ public class ParserIdentifierTest {
         }
     }
 
-    /**
-     * Negative test of getting <code>SchemaExportContext</code> with identifier beginning with slash defining module
-     * behind mount point. Test is expected to fail with <code>IllegalArgumentException</code>.
-     */
-    @Test
-    public void toSchemaExportContextFromIdentifierMountPointBeginsWithSlashNegativeTest() {
-        thrown.expect(IllegalArgumentException.class);
-        ParserIdentifier.toSchemaExportContextFromIdentifier(
-                schemaContext,
-                MOUNT_POINT_IDENT + "/" + TEST_MODULE_NAME + "/" + TEST_MODULE_REVISION,
-                mountPointService);
-    }
-
     /**
      * Negative test of getting <code>SchemaExportContext</code> when supplied identifier is null.
      * <code>NullPointerException</code> is expected. <code>DOMMountPointService</code> is not used.
@@ -589,7 +556,7 @@ public class ParserIdentifierTest {
         thrown.expect(NullPointerException.class);
         ParserIdentifier.toSchemaExportContextFromIdentifier(
                 null,
-                MOUNT_POINT_IDENT_WITHOUT_SLASH
+                MOUNT_POINT_IDENT
                 + "/"
                 + TEST_MODULE_NAME
                 + "/"
@@ -607,7 +574,7 @@ public class ParserIdentifierTest {
         thrown.expect(NullPointerException.class);
         ParserIdentifier.toSchemaExportContextFromIdentifier(
                 schemaContext,
-                MOUNT_POINT_IDENT_WITHOUT_SLASH
+                MOUNT_POINT_IDENT
                 + "/"
                 + TEST_MODULE_NAME
                 + "/"