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.mdsal.binding.dom.codec.test;
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;
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;
37 public class CachingCodecTest extends AbstractBindingCodecTest {
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);
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();
47 private BindingDataObjectCodecTreeNode<Top> topNode;
51 public void before() {
53 topNode = registry.getCodecContext().getSubtreeCodec(TOP_PATH);
56 private static List<TopLevelList> createList(final int num) {
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());
63 return builder.build();
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);
72 assertNotSame(first, second);
73 assertEquals(first, second);
74 verifyListItemSame(first, second);
76 final NormalizedNode<?, ?> third = cachingCodec.serialize(TOP_THREE_LIST_DATA);
77 verifyListItemSame(first, third);
78 verifyListItemSame(second, third);
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);
87 assertEquals(first, second);
88 assertSame(first, second);
90 final NormalizedNode<?, ?> third = cachingCodec.serialize(TOP_THREE_LIST_DATA);
91 verifyListItemSame(first, third);
95 public void testDefaultInvocation() {
96 final BindingNormalizedNodeCachingCodec<Top> cachingCodec = createCachingCodec(Top.class, TopLevelList.class);
98 final Top input = new TopBuilder().build();
99 assertNull(input.getTopLevelList());
100 assertEquals(ImmutableList.of(), input.nonnullTopLevelList());
102 final NormalizedNode<?, ?> dom = cachingCodec.serialize(input);
103 final Top output = cachingCodec.deserialize(dom);
104 assertTrue(input.equals(output));
105 assertTrue(output.equals(input));
107 assertNull(output.getTopLevelList());
108 assertEquals(ImmutableList.of(), output.nonnullTopLevelList());
112 private final BindingNormalizedNodeCachingCodec<Top> createCachingCodec(
113 final Class<? extends DataObject>... classes) {
114 return topNode.createCachingCodec(ImmutableSet.copyOf(classes));
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);
121 for (final MapEntryNode initial : initialNodes) {
122 final MapEntryNode second = secondMap.getChild(initial.getIdentifier()).get();
123 assertEquals(initial, second);
124 assertSame(initial, second);
128 private static MapNode getListItems(final NormalizedNode<?, ?> top) {
129 return (MapNode) ((DataContainerNode<?>) top).getChild(TOP_LEVEL_LIST_ARG).get();