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