Teach BindingNormalizedNodeCache to cache leaf type objects
[mdsal.git] / binding / mdsal-binding-dom-codec / src / test / java / org / opendaylight / mdsal / binding / dom / codec / test / CachingCodecTest.java
index a5280ccde5ee00c260e34dc8702af33e2aeb2e65..a70e46733d8f46c36d26082d795d70cd4fdc1487 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.mdsal.binding.dom.codec.test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
@@ -26,8 +27,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey;
+import org.opendaylight.yang.gen.v1.urn.test.leaf.caching.codec.rev190201.Cont;
+import org.opendaylight.yang.gen.v1.urn.test.leaf.caching.codec.rev190201.ContBuilder;
+import org.opendaylight.yang.gen.v1.urn.test.leaf.caching.codec.rev190201.MyType;
+import org.opendaylight.yangtools.yang.binding.BindingObject;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
@@ -44,13 +50,20 @@ public class CachingCodecTest extends AbstractBindingCodecTest {
     private static final Top TOP_TWO_LIST_DATA = new TopBuilder().setTopLevelList(TWO_LIST).build();
     private static final Top TOP_THREE_LIST_DATA = new TopBuilder().setTopLevelList(THREE_LIST).build();
 
+    private static final NodeIdentifier LEAF_ARG = new NodeIdentifier(QName.create(Cont.QNAME, "caching"));
+    private static final InstanceIdentifier<Cont> CONT_PATH = InstanceIdentifier.create(Cont.class);
+    private static final Cont CONT_DATA = new ContBuilder().setCaching(new MyType(1)).setNonCaching("test").build();
+    private static final Cont CONT2_DATA = new ContBuilder().setCaching(new MyType(1)).setNonCaching("test2").build();
+
     private BindingDataObjectCodecTreeNode<Top> topNode;
+    private BindingDataObjectCodecTreeNode<Cont> contNode;
 
     @Override
     @Before
     public void before() {
         super.before();
         topNode = registry.getCodecContext().getSubtreeCodec(TOP_PATH);
+        contNode = registry.getCodecContext().getSubtreeCodec(CONT_PATH);
     }
 
     private static List<TopLevelList> createList(final int num) {
@@ -91,6 +104,16 @@ public class CachingCodecTest extends AbstractBindingCodecTest {
         verifyListItemSame(first, third);
     }
 
+    @Test
+    public void testLeafCache() {
+        final BindingNormalizedNodeCachingCodec<Cont> cachingCodec = createContCachingCodec(Cont.class, MyType.class);
+        final NormalizedNode<?, ?> first = cachingCodec.serialize(CONT_DATA);
+        final NormalizedNode<?, ?> second = cachingCodec.serialize(CONT2_DATA);
+
+        assertNotEquals(first, second);
+        verifyLeafItemSame(first, second);
+    }
+
     @Test
     public void testDefaultInvocation() {
         final BindingNormalizedNodeCachingCodec<Top> cachingCodec = createCachingCodec(Top.class, TopLevelList.class);
@@ -114,6 +137,12 @@ public class CachingCodecTest extends AbstractBindingCodecTest {
         return topNode.createCachingCodec(ImmutableSet.copyOf(classes));
     }
 
+    @SafeVarargs
+    private final BindingNormalizedNodeCachingCodec<Cont> createContCachingCodec(
+            final Class<? extends BindingObject>... classes) {
+        return contNode.createCachingCodec(ImmutableSet.copyOf(classes));
+    }
+
     private static void verifyListItemSame(final NormalizedNode<?, ?> firstTop, final NormalizedNode<?, ?> secondTop) {
         final Collection<MapEntryNode> initialNodes = getListItems(firstTop).getValue();
         final MapNode secondMap = getListItems(secondTop);
@@ -128,4 +157,10 @@ public class CachingCodecTest extends AbstractBindingCodecTest {
     private static MapNode getListItems(final NormalizedNode<?, ?> top) {
         return (MapNode) ((DataContainerNode<?>) top).getChild(TOP_LEVEL_LIST_ARG).get();
     }
+
+    private static void verifyLeafItemSame(final NormalizedNode<?, ?> firstCont,
+            final NormalizedNode<?, ?> secondCont) {
+        assertSame(((DataContainerNode<?>) firstCont).getChild(LEAF_ARG).get(),
+                ((DataContainerNode<?>) secondCont).getChild(LEAF_ARG).get());
+    }
 }