a5280ccde5ee00c260e34dc8702af33e2aeb2e65
[mdsal.git] / binding / mdsal-binding-dom-codec / src / test / java / org / opendaylight / mdsal / binding / dom / codec / test / CachingCodecTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.binding.dom.codec.test;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotSame;
12 import static org.junit.Assert.assertNull;
13 import static org.junit.Assert.assertSame;
14 import static org.junit.Assert.assertTrue;
15
16 import com.google.common.collect.ImmutableList;
17 import com.google.common.collect.ImmutableSet;
18 import java.util.Collection;
19 import java.util.List;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
23 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCachingCodec;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.TopBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey;
29 import org.opendaylight.yangtools.yang.binding.DataObject;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
32 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
34 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
35 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
36
37 public class CachingCodecTest extends AbstractBindingCodecTest {
38
39     private static final NodeIdentifier TOP_LEVEL_LIST_ARG = new NodeIdentifier(TopLevelList.QNAME);
40     private static final InstanceIdentifier<Top> TOP_PATH = InstanceIdentifier.create(Top.class);
41     private static final List<TopLevelList> TWO_LIST = createList(2);
42     private static final List<TopLevelList> THREE_LIST = createList(3);
43
44     private static final Top TOP_TWO_LIST_DATA = new TopBuilder().setTopLevelList(TWO_LIST).build();
45     private static final Top TOP_THREE_LIST_DATA = new TopBuilder().setTopLevelList(THREE_LIST).build();
46
47     private BindingDataObjectCodecTreeNode<Top> topNode;
48
49     @Override
50     @Before
51     public void before() {
52         super.before();
53         topNode = registry.getCodecContext().getSubtreeCodec(TOP_PATH);
54     }
55
56     private static List<TopLevelList> createList(final int num) {
57
58         final ImmutableList.Builder<TopLevelList> builder = ImmutableList.builder();
59         for (int i = 0; i < num; i++) {
60             final TopLevelListKey key = new TopLevelListKey("test-" + i);
61             builder.add(new TopLevelListBuilder().withKey(key).build());
62         }
63         return builder.build();
64     }
65
66     @Test
67     public void testListCache() {
68         final BindingNormalizedNodeCachingCodec<Top> cachingCodec = createCachingCodec(TopLevelList.class);
69         final NormalizedNode<?, ?> first = cachingCodec.serialize(TOP_TWO_LIST_DATA);
70         final NormalizedNode<?, ?> second = cachingCodec.serialize(TOP_TWO_LIST_DATA);
71
72         assertNotSame(first, second);
73         assertEquals(first, second);
74         verifyListItemSame(first, second);
75
76         final NormalizedNode<?, ?> third = cachingCodec.serialize(TOP_THREE_LIST_DATA);
77         verifyListItemSame(first, third);
78         verifyListItemSame(second, third);
79     }
80
81     @Test
82     public void testTopAndListCache() {
83         final BindingNormalizedNodeCachingCodec<Top> cachingCodec = createCachingCodec(Top.class, TopLevelList.class);
84         final NormalizedNode<?, ?> first = cachingCodec.serialize(TOP_TWO_LIST_DATA);
85         final NormalizedNode<?, ?> second = cachingCodec.serialize(TOP_TWO_LIST_DATA);
86
87         assertEquals(first, second);
88         assertSame(first, second);
89
90         final NormalizedNode<?, ?> third = cachingCodec.serialize(TOP_THREE_LIST_DATA);
91         verifyListItemSame(first, third);
92     }
93
94     @Test
95     public void testDefaultInvocation() {
96         final BindingNormalizedNodeCachingCodec<Top> cachingCodec = createCachingCodec(Top.class, TopLevelList.class);
97
98         final Top input = new TopBuilder().build();
99         assertNull(input.getTopLevelList());
100         assertEquals(ImmutableList.of(), input.nonnullTopLevelList());
101
102         final NormalizedNode<?, ?> dom = cachingCodec.serialize(input);
103         final Top output = cachingCodec.deserialize(dom);
104         assertTrue(input.equals(output));
105         assertTrue(output.equals(input));
106
107         assertNull(output.getTopLevelList());
108         assertEquals(ImmutableList.of(), output.nonnullTopLevelList());
109     }
110
111     @SafeVarargs
112     private final BindingNormalizedNodeCachingCodec<Top> createCachingCodec(
113             final Class<? extends DataObject>... classes) {
114         return topNode.createCachingCodec(ImmutableSet.copyOf(classes));
115     }
116
117     private static void verifyListItemSame(final NormalizedNode<?, ?> firstTop, final NormalizedNode<?, ?> secondTop) {
118         final Collection<MapEntryNode> initialNodes = getListItems(firstTop).getValue();
119         final MapNode secondMap = getListItems(secondTop);
120
121         for (final MapEntryNode initial : initialNodes) {
122             final MapEntryNode second = secondMap.getChild(initial.getIdentifier()).get();
123             assertEquals(initial, second);
124             assertSame(initial, second);
125         }
126     }
127
128     private static MapNode getListItems(final NormalizedNode<?, ?> top) {
129         return (MapNode) ((DataContainerNode<?>) top).getChild(TOP_LEVEL_LIST_ARG).get();
130     }
131 }