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