From ab45c6b32ceb44d7f4a3bc8340eda45a439fc470 Mon Sep 17 00:00:00 2001 From: Ivan Hrasko Date: Tue, 26 Jul 2016 14:46:04 +0200 Subject: [PATCH] Bug 6291 - Fix bugs of new Restconf 11 implementation - 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 --- .../YangInstanceIdentifierDeserializer.java | 57 +++++----- .../YangInstanceIdentifierSerializer.java | 15 +-- .../utils/ReadDataTransactionUtil.java | 24 +++- .../utils/parser/ParserIdentifier.java | 16 ++- .../restconf/parser/IdentifierCodecTest.java | 9 +- ...angInstanceIdentifierDeserializerTest.java | 105 +++++++----------- .../YangInstanceIdentifierSerializerTest.java | 26 ++--- .../impl/RestconfModulesServiceTestUtils.java | 4 +- .../utils/parser/ParserIdentifierTest.java | 77 ++++--------- 9 files changed, 152 insertions(+), 181 deletions(-) diff --git a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializer.java b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializer.java index 6fc16fa232..00c3a2cd82 100644 --- a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializer.java +++ b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializer.java @@ -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) { diff --git a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializer.java b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializer.java index 1384eac69d..538dbdc3d4 100644 --- a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializer.java +++ b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializer.java @@ -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); } diff --git a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/restful/utils/ReadDataTransactionUtil.java b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/restful/utils/ReadDataTransactionUtil.java index 3c82c207e2..425f23bf70 100644 --- a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/restful/utils/ReadDataTransactionUtil.java +++ b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/restful/utils/ReadDataTransactionUtil.java @@ -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) { diff --git a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java index 9b9b8d33c4..d24c3deb07 100644 --- a/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java +++ b/restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java @@ -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); diff --git a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/IdentifierCodecTest.java b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/IdentifierCodecTest.java index 8907e5fcc3..5e0e266cac 100644 --- a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/IdentifierCodecTest.java +++ b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/IdentifierCodecTest.java @@ -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 YangInstanceIdentifier.EMPTY. Single slash is + * Positive test of serialization YangInstanceIdentifier.EMPTY. Empty String 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()); } /** diff --git a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializerTest.java b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializerTest.java index 7ba1bace71..43b9b218a9 100644 --- a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializerTest.java +++ b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializerTest.java @@ -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 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 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 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 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 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 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 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 String is supplied as an input. Test is expected to return empty result. + */ + @Test + public void deserializeEmptyDataTest() { + final Iterable result = YangInstanceIdentifierDeserializer.create(schemaContext, ""); + assertTrue("Empty result expected", Iterables.isEmpty(result)); + } + /** * Negative test when supplied SchemaContext is null. Test is expected to fail with * NullPointerException. @@ -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 String is supplied as an input. Test is expected to fail with - * IllegalArgumentException. - */ - @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 * IllegalArgumentException. @@ -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. - * IllegalArgumentException 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 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 QName when identifier is empty (example: '//'). Test is expected to fail + * Negative test of creating QName when identifier is empty (example: '/'). Test is expected to fail * with IllegalArgumentException. */ @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 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 DataSchemaNode. - * Test is expected to fail with NullPointerException. - */ - @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 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 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)); diff --git a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializerTest.java b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializerTest.java index 965ce34995..b05f43f4f6 100644 --- a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializerTest.java +++ b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializerTest.java @@ -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 YangInstanceIdentifier to String when supplied * YangInstanceIdentifier is YangInstanceIdentifier.EMPTY. - * Single slash is expected as a return value. + * Empty String 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); } /** diff --git a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/rest/services/impl/RestconfModulesServiceTestUtils.java b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/rest/services/impl/RestconfModulesServiceTestUtils.java index 3431090914..4f221b0ae1 100644 --- a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/rest/services/impl/RestconfModulesServiceTestUtils.java +++ b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/rest/services/impl/RestconfModulesServiceTestUtils.java @@ -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"; diff --git a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/utils/parser/ParserIdentifierTest.java b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/utils/parser/ParserIdentifierTest.java index 7793075db8..a5380a3004 100644 --- a/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/utils/parser/ParserIdentifierTest.java +++ b/restconf/sal-rest-connector/src/test/java/org/opendaylight/restconf/utils/parser/ParserIdentifierTest.java @@ -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 InstanceIdentifierContext when identifier is null. Test - * fails expecting NullPointerException. + * Test of creating InstanceIdentifierContext when identifier is null. + * {@link YangInstanceIdentifier#EMPTY} 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. YangInstanceIdentifier.EMPTY is expected to be returned. + * Api path can be empty. YangInstanceIdentifier.EMPTY 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. YangInstanceIdentifier.EMPTY is expected to be returned. + * Api path can be empty. YangInstanceIdentifier.EMPTY 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 InstanceIdentifierContext with empty identifier. - * IllegalArgumentException is expected. - */ - @Test - public void toInstanceIdentifierEmptyIdentifierNegativeTest() { - thrown.expect(IllegalArgumentException.class); - ParserIdentifier.toInstanceIdentifier("", schemaContext); - } - - /** - * Negative test of creating InstanceIdentifierContext from identifier containing - * {@link RestconfConstants#MOUNT} when identifier part is empty. IllegalArgumentException 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 IllegalArgumentException. */ @@ -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 SchemaExportContext with identifier beginning with slash defining module - * behind mount point. Test is expected to fail with IllegalArgumentException. - */ - @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 SchemaExportContext when supplied identifier is null. * NullPointerException is expected. DOMMountPointService 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 + "/" -- 2.36.6