Merge "Bug 1112: Update toaster to use async best practices"
[controller.git] / opendaylight / md-sal / sal-inmemory-datastore / src / test / java / org / opendaylight / controller / md / sal / dom / store / impl / AbstractDataChangeListenerTest.java
1 /*
2  * Copyright (c) 2014 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.controller.md.sal.dom.store.impl;
9
10 import java.util.Collection;
11 import java.util.Map;
12
13 import org.junit.Assert;
14 import org.junit.Before;
15 import org.opendaylight.controller.md.sal.dom.store.impl.DatastoreTestTask.WriteTransactionCustomizer;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.Top;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.TwoLevelList;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.two.level.list.TopLevelList;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.two.level.list.top.level.list.NestedList;
20 import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
21 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
22 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
25 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates;
27 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
28 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
31 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
32 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
33 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
34 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
35 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
36 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
37
38 import com.google.common.util.concurrent.MoreExecutors;
39
40 public abstract class AbstractDataChangeListenerTest {
41
42     protected static final InstanceIdentifier TOP_LEVEL = InstanceIdentifier
43             .of(Top.QNAME);
44     private static final QName NAME_QNAME = QName.create(Top.QNAME, "name");
45     protected static final String FOO = "foo";
46     protected static final String BAR = "bar";
47     protected static final String BAZ = "baz";
48
49     private InMemoryDOMDataStore datastore;
50     private SchemaContext schemaContext;
51
52     @Before
53     public final void setup() throws Exception {
54         YangModuleInfo moduleInfo = BindingReflections
55                 .getModuleInfo(TwoLevelList.class);
56         ModuleInfoBackedContext context = ModuleInfoBackedContext.create();
57         context.registerModuleInfo(moduleInfo);
58         schemaContext = context.tryToCreateSchemaContext().get();
59         datastore = new InMemoryDOMDataStore("TEST",
60                 MoreExecutors.sameThreadExecutor());
61         datastore.onGlobalContextUpdated(schemaContext);
62     }
63
64     public final DatastoreTestTask newTestTask() {
65         return new DatastoreTestTask(datastore).cleanup(DatastoreTestTask
66                 .simpleDelete(TOP_LEVEL));
67     }
68
69
70     public static final InstanceIdentifier path(final String topName,
71             final String nestedName) {
72         return path(topName).node(NestedList.QNAME).node(
73                 new NodeIdentifierWithPredicates(NestedList.QNAME, NAME_QNAME,
74                         nestedName));
75     }
76
77     public static final InstanceIdentifier path(final String topName) {
78         return TOP_LEVEL.node(TopLevelList.QNAME).node(
79                 new NodeIdentifierWithPredicates(TopLevelList.QNAME,
80                         NAME_QNAME, topName));
81     }
82
83     protected static DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> top() {
84         return Builders.containerBuilder().withNodeIdentifier(
85                 new NodeIdentifier(Top.QNAME));
86     }
87
88
89
90     protected static void assertEmpty(final Collection<?> set) {
91         Assert.assertTrue(set.isEmpty());
92     }
93
94     protected static void assertEmpty(final Map<?,?> set) {
95         Assert.assertTrue(set.isEmpty());
96     }
97
98     protected static <K> void assertContains(final Collection<K> set, final K... values) {
99         for (K key : values) {
100             Assert.assertTrue(set.contains(key));
101         }
102
103     }
104
105     protected static <K> void assertNotContains(final Collection<K> set, final K... values) {
106         for (K key : values) {
107             Assert.assertFalse(set.contains(key));
108         }
109     }
110
111     protected static <K> void assertContains(final Map<K,?> map, final K... values) {
112         for (K key : values) {
113             Assert.assertTrue(map.containsKey(key));
114         }
115     }
116
117     protected static <K> void assertNotContains(final Map<K,?> map, final K... values) {
118         for (K key : values) {
119             Assert.assertFalse(map.containsKey(key));
120         }
121     }
122
123     protected static CollectionNodeBuilder<MapEntryNode, MapNode> topLevelMap() {
124         return ImmutableNodes.mapNodeBuilder(TopLevelList.QNAME);
125     }
126
127     protected static CollectionNodeBuilder<MapEntryNode, OrderedMapNode> nestedMap() {
128         return Builders.orderedMapBuilder().withNodeIdentifier(new NodeIdentifier(NestedList.QNAME));
129     }
130
131     public static DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> topLevelList(
132             final String key) {
133         return ImmutableNodes.mapEntryBuilder(TopLevelList.QNAME, NAME_QNAME,
134                 key);
135     }
136
137     public static DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> nestedList(
138             final String key) {
139         return ImmutableNodes
140                 .mapEntryBuilder(NestedList.QNAME, NAME_QNAME, key);
141     }
142
143     public static final WriteTransactionCustomizer writeOneTopMultipleNested(
144             final String topName, final String... nestedName) {
145         CollectionNodeBuilder<MapEntryNode, OrderedMapNode> nestedMapBuilder = nestedMap();
146         for (String nestedItem : nestedName) {
147             nestedMapBuilder.addChild(nestedList(nestedItem).build());
148         }
149
150         final ContainerNode data = top().addChild(
151                 topLevelMap().addChild(
152                         topLevelList(topName)
153                                 .addChild(nestedMapBuilder.build()).build())
154                         .build()).build();
155
156         return DatastoreTestTask.simpleWrite(TOP_LEVEL, data);
157     }
158
159     public static final  WriteTransactionCustomizer deleteNested(final String topName,
160             final String nestedName) {
161         return DatastoreTestTask.simpleDelete(path(topName, nestedName));
162     }
163 }