Bug 1430: Off-load notifications from single commit thread
[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 import org.junit.After;
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.util.concurrent.SpecialExecutors;
22 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
23 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
28 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
31 import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
32 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
33 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
34 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
35 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
36 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
37 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
38
39 import com.google.common.util.concurrent.MoreExecutors;
40
41 public abstract class AbstractDataChangeListenerTest {
42
43     protected static final YangInstanceIdentifier TOP_LEVEL = YangInstanceIdentifier
44             .of(Top.QNAME);
45     private static final QName NAME_QNAME = QName.create(Top.QNAME, "name");
46     protected static final String FOO = "foo";
47     protected static final String BAR = "bar";
48     protected static final String BAZ = "baz";
49
50     private InMemoryDOMDataStore datastore;
51     private SchemaContext schemaContext;
52     private TestDCLExecutorService dclExecutorService;
53
54     @Before
55     public final void setup() throws Exception {
56         YangModuleInfo moduleInfo = BindingReflections
57                 .getModuleInfo(TwoLevelList.class);
58         ModuleInfoBackedContext context = ModuleInfoBackedContext.create();
59         context.registerModuleInfo(moduleInfo);
60         schemaContext = context.tryToCreateSchemaContext().get();
61
62         dclExecutorService = new TestDCLExecutorService(
63                 SpecialExecutors.newBlockingBoundedFastThreadPool(1, 10, "DCL" ));
64
65         datastore = new InMemoryDOMDataStore("TEST",
66                 MoreExecutors.sameThreadExecutor(), dclExecutorService );
67         datastore.onGlobalContextUpdated(schemaContext);
68     }
69
70     @After
71     public void tearDown() {
72         if( dclExecutorService != null ) {
73             dclExecutorService.shutdownNow();
74         }
75     }
76
77     public final DatastoreTestTask newTestTask() {
78         return new DatastoreTestTask(datastore, dclExecutorService).cleanup(DatastoreTestTask
79                 .simpleDelete(TOP_LEVEL));
80     }
81
82
83     public static final YangInstanceIdentifier path(final String topName,
84             final String nestedName) {
85         return path(topName).node(NestedList.QNAME).node(
86                 new NodeIdentifierWithPredicates(NestedList.QNAME, NAME_QNAME,
87                         nestedName));
88     }
89
90     public static final YangInstanceIdentifier path(final String topName) {
91         return TOP_LEVEL.node(TopLevelList.QNAME).node(
92                 new NodeIdentifierWithPredicates(TopLevelList.QNAME,
93                         NAME_QNAME, topName));
94     }
95
96     protected static DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> top() {
97         return Builders.containerBuilder().withNodeIdentifier(
98                 new NodeIdentifier(Top.QNAME));
99     }
100
101
102
103     protected static void assertEmpty(final Collection<?> set) {
104         Assert.assertTrue(set.isEmpty());
105     }
106
107     protected static void assertEmpty(final Map<?,?> set) {
108         Assert.assertTrue(set.isEmpty());
109     }
110
111     protected static <K> void assertContains(final Collection<K> set, final K... values) {
112         for (K key : values) {
113             Assert.assertTrue(set.contains(key));
114         }
115
116     }
117
118     protected static <K> void assertNotContains(final Collection<K> set, final K... values) {
119         for (K key : values) {
120             Assert.assertFalse(set.contains(key));
121         }
122     }
123
124     protected static <K> void assertContains(final Map<K,?> map, final K... values) {
125         for (K key : values) {
126             Assert.assertTrue(map.containsKey(key));
127         }
128     }
129
130     protected static <K> void assertNotContains(final Map<K,?> map, final K... values) {
131         for (K key : values) {
132             Assert.assertFalse(map.containsKey(key));
133         }
134     }
135
136     protected static CollectionNodeBuilder<MapEntryNode, MapNode> topLevelMap() {
137         return ImmutableNodes.mapNodeBuilder(TopLevelList.QNAME);
138     }
139
140     protected static CollectionNodeBuilder<MapEntryNode, OrderedMapNode> nestedMap() {
141         return Builders.orderedMapBuilder().withNodeIdentifier(new NodeIdentifier(NestedList.QNAME));
142     }
143
144     public static DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> topLevelList(
145             final String key) {
146         return ImmutableNodes.mapEntryBuilder(TopLevelList.QNAME, NAME_QNAME,
147                 key);
148     }
149
150     public static DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> nestedList(
151             final String key) {
152         return ImmutableNodes
153                 .mapEntryBuilder(NestedList.QNAME, NAME_QNAME, key);
154     }
155
156     public static final WriteTransactionCustomizer writeOneTopMultipleNested(
157             final String topName, final String... nestedName) {
158         CollectionNodeBuilder<MapEntryNode, OrderedMapNode> nestedMapBuilder = nestedMap();
159         for (String nestedItem : nestedName) {
160             nestedMapBuilder.addChild(nestedList(nestedItem).build());
161         }
162
163         final ContainerNode data = top().addChild(
164                 topLevelMap().addChild(
165                         topLevelList(topName)
166                                 .addChild(nestedMapBuilder.build()).build())
167                         .build()).build();
168
169         return DatastoreTestTask.simpleWrite(TOP_LEVEL, data);
170     }
171
172     public static final  WriteTransactionCustomizer deleteNested(final String topName,
173             final String nestedName) {
174         return DatastoreTestTask.simpleDelete(path(topName, nestedName));
175     }
176 }