2 * Copyright (c) 2014 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.controller.md.sal.dom.store.impl;
10 import com.google.common.util.concurrent.MoreExecutors;
12 import java.util.Collection;
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;
42 public abstract class AbstractDataChangeListenerTest {
44 protected static final YangInstanceIdentifier TOP_LEVEL = YangInstanceIdentifier
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";
51 private InMemoryDOMDataStore datastore;
52 private SchemaContext schemaContext;
53 private TestDCLExecutorService dclExecutorService;
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();
63 dclExecutorService = new TestDCLExecutorService(
64 SpecialExecutors.newBlockingBoundedFastThreadPool(1, 10, "DCL" ));
66 datastore = new InMemoryDOMDataStore("TEST",
67 MoreExecutors.sameThreadExecutor(), dclExecutorService );
68 datastore.onGlobalContextUpdated(schemaContext);
72 public void tearDown() {
73 if( dclExecutorService != null ) {
74 dclExecutorService.shutdownNow();
79 * Create a new test task. The task will operate on the backed database,
80 * and will use the proper background executor service.
82 * @return Test task initialized to clean up {@value #TOP_LEVEL} and its
85 public final DatastoreTestTask newTestTask() {
86 return new DatastoreTestTask(datastore, dclExecutorService).cleanup(DatastoreTestTask
87 .simpleDelete(TOP_LEVEL));
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,
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));
104 protected static DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> top() {
105 return Builders.containerBuilder().withNodeIdentifier(
106 new NodeIdentifier(Top.QNAME));
111 protected static void assertEmpty(final Collection<?> set) {
112 Assert.assertTrue(set.isEmpty());
115 protected static void assertEmpty(final Map<?,?> set) {
116 Assert.assertTrue(set.isEmpty());
119 protected static <K> void assertContains(final Collection<K> set, final K... values) {
120 for (K key : values) {
121 Assert.assertTrue(set.contains(key));
126 protected static <K> void assertNotContains(final Collection<K> set, final K... values) {
127 for (K key : values) {
128 Assert.assertFalse(set.contains(key));
132 protected static <K> void assertContains(final Map<K,?> map, final K... values) {
133 for (K key : values) {
134 Assert.assertTrue(map.containsKey(key));
138 protected static <K> void assertNotContains(final Map<K,?> map, final K... values) {
139 for (K key : values) {
140 Assert.assertFalse(map.containsKey(key));
144 protected static CollectionNodeBuilder<MapEntryNode, MapNode> topLevelMap() {
145 return ImmutableNodes.mapNodeBuilder(TopLevelList.QNAME);
148 protected static CollectionNodeBuilder<MapEntryNode, OrderedMapNode> nestedMap() {
149 return Builders.orderedMapBuilder().withNodeIdentifier(new NodeIdentifier(NestedList.QNAME));
152 public static DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> topLevelList(
154 return ImmutableNodes.mapEntryBuilder(TopLevelList.QNAME, NAME_QNAME,
158 public static DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> nestedList(
160 return ImmutableNodes
161 .mapEntryBuilder(NestedList.QNAME, NAME_QNAME, key);
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());
171 final ContainerNode data = top().addChild(
172 topLevelMap().addChild(
173 topLevelList(topName)
174 .addChild(nestedMapBuilder.build()).build())
177 return DatastoreTestTask.simpleWrite(TOP_LEVEL, data);
180 public static final WriteTransactionCustomizer deleteNested(final String topName,
181 final String nestedName) {
182 return DatastoreTestTask.simpleDelete(path(topName, nestedName));