2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.binding.data.codec.test;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotSame;
12 import static org.junit.Assert.assertSame;
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.mdsal.test.binding.rev140701.Top;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.TopBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey;
25 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
26 import org.opendaylight.mdsal.binding.dom.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;
38 public class CachingCodecTest extends AbstractBindingRuntimeTest {
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);
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();
48 private BindingNormalizedNodeCodecRegistry registry;
49 private BindingCodecTreeNode<Top> topNode;
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);
62 private static List<TopLevelList> createList(final int num) {
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());
69 return builder.build();
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);
78 assertNotSame(first, second);
79 assertEquals(first, second);
80 verifyListItemSame(first, second);
82 final NormalizedNode<?, ?> third = cachingCodec.serialize(TOP_THREE_LIST_DATA);
83 verifyListItemSame(first, third);
84 verifyListItemSame(second, third);
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);
94 assertEquals(first, second);
95 assertSame(first, second);
97 final NormalizedNode<?, ?> third = cachingCodec.serialize(TOP_THREE_LIST_DATA);
98 verifyListItemSame(first, third);
102 private final BindingNormalizedNodeCachingCodec<Top> createCachingCodec(
103 final Class<? extends DataObject>... classes) {
104 return topNode.createCachingCodec(ImmutableSet.<Class<? extends DataObject>>copyOf(classes));
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);
111 for (final MapEntryNode initial : initialNodes) {
112 final MapEntryNode second = secondMap.getChild(initial.getIdentifier()).get();
113 assertEquals(initial, second);
114 assertSame(initial, second);
119 private static MapNode getListItems(final NormalizedNode<?, ?> top) {
120 return ((MapNode) ((DataContainerNode<?>) top).getChild(TOP_LEVEL_LIST_ARG).get());