summaryrefslogtreecommitdiffstats
path: root/v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/ModificationDiffTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/ModificationDiffTest.java')
-rw-r--r--v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/ModificationDiffTest.java215
1 files changed, 128 insertions, 87 deletions
diff --git a/v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/ModificationDiffTest.java b/v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/ModificationDiffTest.java
index 3475973d6..bc7582e93 100644
--- a/v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/ModificationDiffTest.java
+++ b/v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/ModificationDiffTest.java
@@ -1,7 +1,8 @@
package io.fd.honeycomb.v3po.data.impl;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.hamcrest.CoreMatchers.hasItems;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
import java.util.Map;
import org.junit.Test;
@@ -11,6 +12,8 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
@@ -28,15 +31,23 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceIm
public class ModificationDiffTest {
- private static final QName TOP_CONTAINER_QNAME =
+ static final QName TOP_CONTAINER_QNAME =
QName.create("urn:opendaylight:params:xml:ns:yang:test:diff", "2015-01-05", "top-container");
- private static final QName STRING_LEAF_QNAME = QName.create(TOP_CONTAINER_QNAME, "string");
- private static final QName NAME_LEAF_QNAME = QName.create(TOP_CONTAINER_QNAME, "name");
- private static final QName TEXT_LEAF_QNAME = QName.create(TOP_CONTAINER_QNAME, "text");
- private static final QName NESTED_LIST_QNAME = QName.create(TOP_CONTAINER_QNAME, "nested-list");
- private static final QName DEEP_LIST_QNAME = QName.create(TOP_CONTAINER_QNAME, "deep-list");
+ static final QName STRING_LEAF_QNAME = QName.create(TOP_CONTAINER_QNAME, "string");
+ static final QName NAME_LEAF_QNAME = QName.create(TOP_CONTAINER_QNAME, "name");
+ static final QName TEXT_LEAF_QNAME = QName.create(TOP_CONTAINER_QNAME, "text");
+ static final QName NESTED_LIST_QNAME = QName.create(TOP_CONTAINER_QNAME, "nested-list");
+ static final QName DEEP_LIST_QNAME = QName.create(TOP_CONTAINER_QNAME, "deep-list");
+
+ static final QName WITH_CHOICE_CONTAINER_QNAME =
+ QName.create("urn:opendaylight:params:xml:ns:yang:test:diff", "2015-01-05", "with-choice");
+ static final QName CHOICE_QNAME = QName.create(WITH_CHOICE_CONTAINER_QNAME, "choice");
+ static final QName IN_CASE1_LEAF_QNAME = QName.create(WITH_CHOICE_CONTAINER_QNAME, "in-case1");
+ static final QName IN_CASE2_LEAF_QNAME = QName.create(WITH_CHOICE_CONTAINER_QNAME, "in-case2");
+
+ static final YangInstanceIdentifier TOP_CONTAINER_ID = YangInstanceIdentifier.of(TOP_CONTAINER_QNAME);
+ static final YangInstanceIdentifier NESTED_LIST_ID = TOP_CONTAINER_ID.node(new YangInstanceIdentifier.NodeIdentifier(NESTED_LIST_QNAME));
- private static final YangInstanceIdentifier TOP_CONTAINER_ID = YangInstanceIdentifier.of(TOP_CONTAINER_QNAME);
@Test
public void testInitialWrite() throws Exception {
@@ -47,10 +58,33 @@ public class ModificationDiffTest {
dataTreeModification.write(TOP_CONTAINER_ID, topContainer);
final DataTreeCandidateTip prepare = prepareModification(dataTree, dataTreeModification);
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff = getModificationDiff(prepare);
+ final ModificationDiff modificationDiff = getModificationDiff(prepare);
- assertTrue(modificationDiff.getModificationsBefore().isEmpty());
- assertAfter(topContainer, TOP_CONTAINER_ID, modificationDiff);
+ assertThat(modificationDiff.getUpdates().size(), is(1));
+ assertThat(modificationDiff.getUpdates().values().size(), is(1));
+ assertUpdate(modificationDiff.getUpdates().values().iterator().next(), TOP_CONTAINER_ID, null, topContainer);
+ }
+
+ @Test
+ public void testInitialWriteForContainerWithChoice() throws Exception {
+ final TipProducingDataTree dataTree = getDataTree();
+ final DataTreeModification dataTreeModification = getModification(dataTree);
+ final ContainerNode containerWithChoice = Builders.containerBuilder()
+ .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(WITH_CHOICE_CONTAINER_QNAME))
+ .withChild(Builders.choiceBuilder()
+ .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(CHOICE_QNAME))
+ .withChild(ImmutableNodes.leafNode(IN_CASE1_LEAF_QNAME, "withinCase1"))
+ .build())
+ .build();
+ final YangInstanceIdentifier WITH_CHOICE_CONTAINER_ID = YangInstanceIdentifier.of(WITH_CHOICE_CONTAINER_QNAME);
+ dataTreeModification.write(WITH_CHOICE_CONTAINER_ID, containerWithChoice);
+ final DataTreeCandidateTip prepare = prepareModification(dataTree, dataTreeModification);
+
+ final Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates = getModificationDiff(prepare).getUpdates();
+
+ assertThat(updates.size(), is(1));
+ assertUpdate(getNormalizedNodeUpdateForAfterType(updates, ContainerNode.class),
+ WITH_CHOICE_CONTAINER_ID, null, containerWithChoice);
}
private DataTreeModification getModification(final TipProducingDataTree dataTree) {
@@ -66,10 +100,9 @@ public class ModificationDiffTest {
dataTreeModification.write(TOP_CONTAINER_ID, topContainer);
final DataTreeCandidateTip prepare = prepareModification(dataTree, dataTreeModification);
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff = getModificationDiff(prepare);
+ final ModificationDiff modificationDiff = getModificationDiff(prepare);
- assertTrue(modificationDiff.getModificationsBefore().isEmpty());
- assertTrue(modificationDiff.getModificationsAfter().isEmpty());
+ assertThat(modificationDiff.getUpdates().size(), is(0));
}
private DataTreeCandidateTip prepareModification(final TipProducingDataTree dataTree,
@@ -83,60 +116,61 @@ public class ModificationDiffTest {
@Test
public void testUpdateWrite() throws Exception {
final TipProducingDataTree dataTree = getDataTree();
- final NormalizedNode<?, ?> topContainerBefore = addTopContainer(dataTree);
+ final ContainerNode topContainer = getTopContainer("string1");
+ addNodeToTree(dataTree, topContainer, TOP_CONTAINER_ID);
final DataTreeModification dataTreeModification = getModification(dataTree);
final NormalizedNode<?, ?> topContainerAfter = getTopContainer("string2");
dataTreeModification.write(TOP_CONTAINER_ID, topContainerAfter);
final DataTreeCandidateTip prepare = prepareModification(dataTree, dataTreeModification);
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff = getModificationDiff(prepare);
+ final Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates = getModificationDiff(prepare).getUpdates();
- assertBefore(topContainerBefore, TOP_CONTAINER_ID, modificationDiff);
- assertAfter(topContainerAfter, TOP_CONTAINER_ID, modificationDiff);
+ assertThat(updates.size(), is(1));
+ assertThat(updates.values().size(), is(1));
+ assertUpdate(updates.values().iterator().next(), TOP_CONTAINER_ID, topContainer, topContainerAfter);
}
- private ModifiableDataTreeDelegator.ModificationDiff getModificationDiff(final DataTreeCandidateTip prepare) {
- return ModifiableDataTreeDelegator.ModificationDiff
- .recursivelyFromCandidate(YangInstanceIdentifier.EMPTY, prepare.getRootNode());
+ private ModificationDiff getModificationDiff(final DataTreeCandidateTip prepare) {
+ return ModificationDiff.recursivelyFromCandidate(YangInstanceIdentifier.EMPTY, prepare.getRootNode());
}
@Test
public void testUpdateMerge() throws Exception {
final TipProducingDataTree dataTree = getDataTree();
- final NormalizedNode<?, ?> topContainerBefore = addTopContainer(dataTree);
+ final ContainerNode topContainer = getTopContainer("string1");
+ addNodeToTree(dataTree, topContainer, TOP_CONTAINER_ID);
final DataTreeModification dataTreeModification = getModification(dataTree);
final NormalizedNode<?, ?> topContainerAfter = getTopContainer("string2");
dataTreeModification.merge(TOP_CONTAINER_ID, topContainerAfter);
final DataTreeCandidateTip prepare = prepareModification(dataTree, dataTreeModification);
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff =
- getModificationDiff(prepare);
-
- assertBefore(topContainerBefore, TOP_CONTAINER_ID, modificationDiff);
- assertAfter(topContainerAfter, TOP_CONTAINER_ID, modificationDiff);
+ final Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates = getModificationDiff(prepare).getUpdates();
+ assertThat(updates.size(), is(1));
+ assertThat(updates.values().size(), is(1));
+ assertUpdate(updates.values().iterator().next(), TOP_CONTAINER_ID, topContainer, topContainerAfter);
}
@Test
public void testUpdateDelete() throws Exception {
final TipProducingDataTree dataTree = getDataTree();
- final NormalizedNode<?, ?> topContainerBefore = addTopContainer(dataTree);
+ final ContainerNode topContainer = getTopContainer("string1");
+ addNodeToTree(dataTree, topContainer, TOP_CONTAINER_ID);
final DataTreeModification dataTreeModification = getModification(dataTree);
dataTreeModification.delete(TOP_CONTAINER_ID);
final DataTreeCandidateTip prepare = prepareModification(dataTree, dataTreeModification);
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff = getModificationDiff(prepare);
-
- assertBefore(topContainerBefore, TOP_CONTAINER_ID, modificationDiff);
- assertTrue(modificationDiff.getModificationsAfter().isEmpty());
+ final Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates = getModificationDiff(prepare).getUpdates();
+ assertThat(updates.size(), is(1));
+ assertThat(updates.values().size(), is(1));
+ assertUpdate(updates.values().iterator().next(), TOP_CONTAINER_ID, topContainer, null);
}
@Test
public void testWriteAndUpdateInnerList() throws Exception {
final TipProducingDataTree dataTree = getDataTree();
- addTopContainer(dataTree);
DataTreeSnapshot dataTreeSnapshot = dataTree.takeSnapshot();
DataTreeModification dataTreeModification = dataTreeSnapshot.newModification();
@@ -146,15 +180,17 @@ public class ModificationDiffTest {
new YangInstanceIdentifier.NodeIdentifier(NESTED_LIST_QNAME));
final MapNode mapNode = getNestedList("name1", "text");
+ final YangInstanceIdentifier listEntryId = listId.node(mapNode.getValue().iterator().next().getIdentifier());
dataTreeModification.write(listId, mapNode);
dataTreeModification.ready();
dataTree.validate(dataTreeModification);
DataTreeCandidateTip prepare = dataTree.prepare(dataTreeModification);
- ModifiableDataTreeDelegator.ModificationDiff modificationDiff = getModificationDiff(prepare);
+ Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates = getModificationDiff(prepare).getUpdates();
- assertTrue(modificationDiff.getModificationsBefore().isEmpty());
- assertAfter(mapNode, listId, modificationDiff);
+ assertThat(updates.size(), is(1));
+ assertUpdate(getNormalizedNodeUpdateForAfterType(updates, MapEntryNode.class),
+ listEntryId, null, mapNode.getValue().iterator().next());
// Commit so that update can be tested next
dataTree.commit(prepare);
@@ -171,9 +207,17 @@ public class ModificationDiffTest {
dataTree.validate(dataTreeModification);
prepare = dataTree.prepare(dataTreeModification);
- modificationDiff = getModificationDiff(prepare);
- assertBefore(mapNode.getValue().iterator().next(), listItemId, modificationDiff);
- assertAfter(mapEntryNode, listItemId, modificationDiff);
+ updates = getModificationDiff(prepare).getUpdates();
+ assertThat(updates.size(), is(1 /*Actual list entry*/));
+ }
+//
+ private void assertUpdate(final ModificationDiff.NormalizedNodeUpdate update,
+ final YangInstanceIdentifier idExpected,
+ final NormalizedNode<?, ?> beforeExpected,
+ final NormalizedNode<?, ?> afterExpected) {
+ assertThat(update.getId(), is(idExpected));
+ assertThat(update.getDataBefore(), is(beforeExpected));
+ assertThat(update.getDataAfter(), is(afterExpected));
}
@Test
@@ -192,25 +236,44 @@ public class ModificationDiffTest {
new YangInstanceIdentifier.NodeIdentifier(NESTED_LIST_QNAME));
final MapNode mapNode = getNestedList("name1", "text");
+ final YangInstanceIdentifier listEntryId = listId.node(mapNode.getValue().iterator().next().getIdentifier());
+
dataTreeModification.write(listId, mapNode);
final DataTreeCandidateTip prepare = prepareModification(dataTree, dataTreeModification);
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff = getModificationDiff(prepare);
+ final Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates = getModificationDiff(prepare).getUpdates();
+
+ assertThat(updates.size(), is(2));
+ assertThat(updates.values().size(), is(2));
+ assertUpdate(getNormalizedNodeUpdateForAfterType(updates, ContainerNode.class), TOP_CONTAINER_ID, null,
+ Builders.containerBuilder(topContainer).withChild(mapNode).build());
+ assertUpdate(getNormalizedNodeUpdateForAfterType(updates, MapEntryNode.class), listEntryId, null, mapNode.getValue().iterator().next());
+ // Assert that keys of the updates map are not wildcarded YID
+ assertThat(updates.keySet(), hasItems(
+ TOP_CONTAINER_ID,
+ listEntryId));
+ }
- assertTrue(modificationDiff.getModificationsBefore().isEmpty());
+ private ModificationDiff.NormalizedNodeUpdate getNormalizedNodeUpdateForAfterType(
+ final Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates,
+ final Class<? extends NormalizedNode<?, ?>> containerNodeClass) {
+ return updates.values().stream()
+ .filter(update -> containerNodeClass.isAssignableFrom(update.getDataAfter().getClass()))
+ .findFirst().get();
+ }
- // TODO HONEYCOMB-94 2 after modifications should appear, for top-container and nested-list entry
- assertAfter(Builders.containerBuilder(topContainer)
- .withChild(mapNode)
- .build(),
- TOP_CONTAINER_ID, modificationDiff);
+ private ModificationDiff.NormalizedNodeUpdate getNormalizedNodeUpdateForBeforeType(
+ final Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates,
+ final Class<? extends NormalizedNode<?, ?>> containerNodeClass) {
+ return updates.values().stream()
+ .filter(update -> containerNodeClass.isAssignableFrom(update.getDataBefore().getClass()))
+ .findFirst().get();
}
@Test
public void testWriteDeepList() throws Exception {
final TipProducingDataTree dataTree = getDataTree();
- addTopContainer(dataTree);
DataTreeSnapshot dataTreeSnapshot = dataTree.takeSnapshot();
DataTreeModification dataTreeModification = dataTreeSnapshot.newModification();
@@ -250,7 +313,8 @@ public class ModificationDiffTest {
.withChild(ImmutableNodes.leafNode(NAME_LEAF_QNAME, "name1")).build());
dataTreeModification.merge(
deepListId,
- Builders.mapBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(DEEP_LIST_QNAME))
+ Builders.mapBuilder()
+ .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(DEEP_LIST_QNAME))
.build());
dataTreeModification.merge(
deepListEntryId,
@@ -261,16 +325,14 @@ public class ModificationDiffTest {
prepare = dataTree.prepare(dataTreeModification);
dataTree.commit(prepare);
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff = getModificationDiff(prepare);
-
- assertTrue(modificationDiff.getModificationsBefore().isEmpty());
- assertAfter(getDeepList("name1"), deepListId, modificationDiff);
+ final Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates = getModificationDiff(prepare).getUpdates();
+ assertThat(updates.size(), is(1));
+ assertUpdate(getNormalizedNodeUpdateForAfterType(updates, MapEntryNode.class), deepListEntryId, null, deepListEntry);
}
@Test
public void testDeleteInnerListItem() throws Exception {
final TipProducingDataTree dataTree = getDataTree();
- addTopContainer(dataTree);
DataTreeSnapshot dataTreeSnapshot = dataTree.takeSnapshot();
DataTreeModification dataTreeModification = dataTreeSnapshot.newModification();
@@ -298,58 +360,37 @@ public class ModificationDiffTest {
dataTree.validate(dataTreeModification);
prepare = dataTree.prepare(dataTreeModification);
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff = getModificationDiff(prepare);
-
- assertBefore(mapNode.getValue().iterator().next(), listItemId, modificationDiff);
- assertTrue(modificationDiff.getModificationsAfter().isEmpty());
+ final Map<YangInstanceIdentifier, ModificationDiff.NormalizedNodeUpdate> updates = getModificationDiff(prepare).getUpdates();
+ assertThat(updates.size(), is(1));
+ assertUpdate(getNormalizedNodeUpdateForBeforeType(updates, MapEntryNode.class), listItemId, mapNode.getValue().iterator().next(), null);
}
- private NormalizedNode<?, ?> addTopContainer(final TipProducingDataTree dataTree)
+ static void addNodeToTree(final DataTree dataTree, final NormalizedNode<?, ?> node,
+ final YangInstanceIdentifier id)
throws DataValidationFailedException {
DataTreeSnapshot dataTreeSnapshot = dataTree.takeSnapshot();
DataTreeModification dataTreeModification = dataTreeSnapshot.newModification();
- final NormalizedNode<?, ?> topContainerBefore = getTopContainer("string1");
- dataTreeModification.write(TOP_CONTAINER_ID, topContainerBefore);
+ dataTreeModification.write(id, node);
dataTreeModification.ready();
dataTree.validate(dataTreeModification);
- DataTreeCandidateTip prepare = dataTree.prepare(dataTreeModification);
+ DataTreeCandidate prepare = dataTree.prepare(dataTreeModification);
dataTree.commit(prepare);
- return topContainerBefore;
- }
-
- private void assertAfter(final NormalizedNode<?, ?> topContainer, final YangInstanceIdentifier TOP_CONTAINER_ID,
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff) {
- assertModification(topContainer, TOP_CONTAINER_ID, modificationDiff.getModificationsAfter());
- }
-
- private void assertModification(final NormalizedNode<?, ?> topContainer,
- final YangInstanceIdentifier TOP_CONTAINER_ID,
- final Map<YangInstanceIdentifier, NormalizedNode<?, ?>> modificationMap) {
- assertEquals(1, modificationMap.keySet().size());
- assertEquals(TOP_CONTAINER_ID, modificationMap.keySet().iterator().next());
- assertEquals(topContainer, modificationMap.values().iterator().next());
- }
-
- private void assertBefore(final NormalizedNode<?, ?> topContainerBefore,
- final YangInstanceIdentifier TOP_CONTAINER_ID,
- final ModifiableDataTreeDelegator.ModificationDiff modificationDiff) {
- assertModification(topContainerBefore, TOP_CONTAINER_ID, modificationDiff.getModificationsBefore());
}
- private TipProducingDataTree getDataTree() throws ReactorException {
+ static TipProducingDataTree getDataTree() throws ReactorException {
final TipProducingDataTree dataTree = InMemoryDataTreeFactory.getInstance().create(TreeType.CONFIGURATION);
dataTree.setSchemaContext(getSchemaCtx());
return dataTree;
}
- private ContainerNode getTopContainer(final String stringValue) {
+ static ContainerNode getTopContainer(final String stringValue) {
return Builders.containerBuilder()
.withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TOP_CONTAINER_QNAME))
.withChild(ImmutableNodes.leafNode(STRING_LEAF_QNAME, stringValue))
.build();
}
- private MapNode getNestedList(final String listItemName, final String text) {
+ static MapNode getNestedList(final String listItemName, final String text) {
return Builders.mapBuilder()
.withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(NESTED_LIST_QNAME))
.withChild(
@@ -378,9 +419,9 @@ public class ModificationDiffTest {
.build();
}
- private SchemaContext getSchemaCtx() throws ReactorException {
+ private static SchemaContext getSchemaCtx() throws ReactorException {
final CrossSourceStatementReactor.BuildAction buildAction = YangInferencePipeline.RFC6020_REACTOR.newBuild();
- buildAction.addSource(new YangStatementSourceImpl(getClass().getResourceAsStream("/test-diff.yang")));
+ buildAction.addSource(new YangStatementSourceImpl(ModificationDiffTest.class.getResourceAsStream("/test-diff.yang")));
return buildAction.buildEffective();
}
} \ No newline at end of file