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.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 org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
21 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCachingCodec;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.TopBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey;
27 import org.opendaylight.yangtools.yang.binding.DataObject;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
30 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
31 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
35 public class CachingCodecTest extends AbstractBindingCodecTest {
37 private static final NodeIdentifier TOP_LEVEL_LIST_ARG = new NodeIdentifier(TopLevelList.QNAME);
38 private static final InstanceIdentifier<Top> TOP_PATH = InstanceIdentifier.create(Top.class);
39 private static final List<TopLevelList> TWO_LIST = createList(2);
40 private static final List<TopLevelList> THREE_LIST = createList(3);
42 private static final Top TOP_TWO_LIST_DATA = new TopBuilder().setTopLevelList(TWO_LIST).build();
43 private static final Top TOP_THREE_LIST_DATA = new TopBuilder().setTopLevelList(THREE_LIST).build();
45 private BindingCodecTreeNode<Top> topNode;
49 public void before() {
51 topNode = registry.getCodecContext().getSubtreeCodec(TOP_PATH);
54 private static List<TopLevelList> createList(final int num) {
56 final ImmutableList.Builder<TopLevelList> builder = ImmutableList.builder();
57 for (int i = 0; i < num; i++) {
58 final TopLevelListKey key = new TopLevelListKey("test-" + i);
59 builder.add(new TopLevelListBuilder().withKey(key).build());
61 return builder.build();
65 public void testListCache() {
66 final BindingNormalizedNodeCachingCodec<Top> cachingCodec = createCachingCodec(TopLevelList.class);
67 final NormalizedNode<?, ?> first = cachingCodec.serialize(TOP_TWO_LIST_DATA);
68 final NormalizedNode<?, ?> second = cachingCodec.serialize(TOP_TWO_LIST_DATA);
70 assertNotSame(first, second);
71 assertEquals(first, second);
72 verifyListItemSame(first, second);
74 final NormalizedNode<?, ?> third = cachingCodec.serialize(TOP_THREE_LIST_DATA);
75 verifyListItemSame(first, third);
76 verifyListItemSame(second, third);
80 public void testTopAndListCache() {
81 final BindingNormalizedNodeCachingCodec<Top> cachingCodec = createCachingCodec(Top.class, TopLevelList.class);
82 final NormalizedNode<?, ?> first = cachingCodec.serialize(TOP_TWO_LIST_DATA);
83 final NormalizedNode<?, ?> second = cachingCodec.serialize(TOP_TWO_LIST_DATA);
85 assertEquals(first, second);
86 assertSame(first, second);
88 final NormalizedNode<?, ?> third = cachingCodec.serialize(TOP_THREE_LIST_DATA);
89 verifyListItemSame(first, third);
93 private final BindingNormalizedNodeCachingCodec<Top> createCachingCodec(
94 final Class<? extends DataObject>... classes) {
95 return topNode.createCachingCodec(ImmutableSet.<Class<? extends DataObject>>copyOf(classes));
98 private static void verifyListItemSame(final NormalizedNode<?, ?> firstTop, final NormalizedNode<?, ?> secondTop) {
99 final Collection<MapEntryNode> initialNodes = getListItems(firstTop).getValue();
100 final MapNode secondMap = getListItems(secondTop);
102 for (final MapEntryNode initial : initialNodes) {
103 final MapEntryNode second = secondMap.getChild(initial.getIdentifier()).get();
104 assertEquals(initial, second);
105 assertSame(initial, second);
109 private static MapNode getListItems(final NormalizedNode<?, ?> top) {
110 return (MapNode) ((DataContainerNode<?>) top).getChild(TOP_LEVEL_LIST_ARG).get();