Binding v2 runtime - adapters - abstract data broker test
[mdsal.git] / binding2 / mdsal-binding2-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / javav2 / dom / adapter / test / BindingTestContext.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.mdsal.binding.javav2.dom.adapter.test;
9
10 import static com.google.common.base.Preconditions.checkState;
11
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableMap;
14 import com.google.common.collect.ImmutableSet;
15 import com.google.common.util.concurrent.ListeningExecutorService;
16 import com.google.common.util.concurrent.MoreExecutors;
17 import javassist.ClassPool;
18 import org.opendaylight.mdsal.binding.javav2.api.DataBroker;
19 import org.opendaylight.mdsal.binding.javav2.api.MountPointService;
20 import org.opendaylight.mdsal.binding.javav2.api.NotificationPublishService;
21 import org.opendaylight.mdsal.binding.javav2.api.NotificationService;
22 import org.opendaylight.mdsal.binding.javav2.api.RpcActionConsumerRegistry;
23 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.data.BindingDOMDataBrokerAdapter;
24 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.mountpoint.BindingDOMMountPointServiceAdapter;
25 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.notification.BindingDOMNotificationPublishServiceAdapter;
26 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.notification.BindingDOMNotificationServiceAdapter;
27 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.operation.BindingDOMOperationProviderServiceAdapter;
28 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.operation.BindingDOMOperationServiceAdapter;
29 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.api.TreeNodeSerializerGenerator;
30 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.impl.StreamWriterGenerator;
31 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
32 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec;
33 import org.opendaylight.mdsal.binding.javav2.generator.impl.GeneratedClassLoadingStrategy;
34 import org.opendaylight.mdsal.binding.javav2.runtime.context.ModuleInfoBackedContext;
35 import org.opendaylight.mdsal.binding.javav2.runtime.javassist.JavassistUtils;
36 import org.opendaylight.mdsal.binding.javav2.runtime.reflection.BindingReflections;
37 import org.opendaylight.mdsal.binding.javav2.spec.runtime.YangModuleInfo;
38 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
39 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
40 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
41 import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
42 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
43 import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
44 import org.opendaylight.mdsal.dom.api.DOMRpcService;
45 import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl;
46 import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
47 import org.opendaylight.mdsal.dom.broker.DOMRpcRouter;
48 import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker;
49 import org.opendaylight.mdsal.dom.spi.store.DOMStore;
50 import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStore;
51 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
52
53 @Beta
54 public class BindingTestContext implements AutoCloseable {
55
56     private final MockSchemaService mockSchemaService = new MockSchemaService();
57     private final ListeningExecutorService executor;
58     private final ClassPool classPool;
59     private final boolean startWithSchema;
60
61     private DOMMountPointService biMountImpl;
62     private BindingToNormalizedNodeCodec codec;
63     private ImmutableMap<LogicalDatastoreType, DOMStore> newDatastores;
64     private DOMDataBroker newDOMDataBroker;
65     private DataBroker dataBroker;
66     private RpcActionConsumerRegistry baConsumerRpc;
67     private BindingDOMOperationProviderServiceAdapter baProviderRpc;
68     private DOMRpcRouter domRouter;
69     private NotificationPublishService publishService;
70     private NotificationService listenService;
71     private DOMNotificationPublishService domPublishService;
72     private DOMNotificationService domListenService;
73
74     public DOMDataBroker getDomAsyncDataBroker() {
75         return newDOMDataBroker;
76     }
77
78     public BindingToNormalizedNodeCodec getCodec() {
79         return codec;
80     }
81
82     protected BindingTestContext(final ListeningExecutorService executor, final ClassPool classPool,
83             final boolean startWithSchema) {
84         this.executor = executor;
85         this.classPool = classPool;
86         this.startWithSchema = startWithSchema;
87     }
88
89     public void startDomDataBroker() {
90     }
91
92     public void startNewDataBroker() {
93         checkState(executor != null, "Executor needs to be set");
94         checkState(newDOMDataBroker != null, "DOM Data Broker must be set");
95         dataBroker = new BindingDOMDataBrokerAdapter(newDOMDataBroker, codec);
96     }
97
98     public void startNewDomDataBroker() {
99         checkState(executor != null, "Executor needs to be set");
100         final InMemoryDOMDataStore operStore =
101                 new InMemoryDOMDataStore("OPER", MoreExecutors.newDirectExecutorService());
102         final InMemoryDOMDataStore configStore =
103                 new InMemoryDOMDataStore("CFG", MoreExecutors.newDirectExecutorService());
104         newDatastores =
105                 ImmutableMap.<LogicalDatastoreType, DOMStore>builder().put(LogicalDatastoreType.OPERATIONAL, operStore)
106                         .put(LogicalDatastoreType.CONFIGURATION, configStore).build();
107
108         newDOMDataBroker = new SerializedDOMDataBroker(newDatastores, executor);
109
110         mockSchemaService.registerSchemaContextListener(configStore);
111         mockSchemaService.registerSchemaContextListener(operStore);
112     }
113
114     public void startBindingDataBroker() {
115
116     }
117
118     public void startBindingBroker() {
119         checkState(executor != null, "Executor needs to be set");
120
121         baConsumerRpc = new BindingDOMOperationServiceAdapter(getDomRpcInvoker(), codec);
122         baProviderRpc = new BindingDOMOperationProviderServiceAdapter(getDomRpcRegistry(), codec);
123         final MountPointService mountService = new BindingDOMMountPointServiceAdapter(biMountImpl, codec);
124     }
125
126     public void startForwarding() {
127
128     }
129
130     public void startBindingToDomMappingService() {
131         checkState(classPool != null, "ClassPool needs to be present");
132
133         final TreeNodeSerializerGenerator generator =
134                 StreamWriterGenerator.create(JavassistUtils.forClassPool(classPool));
135         final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(generator);
136         final GeneratedClassLoadingStrategy loading =
137                 (GeneratedClassLoadingStrategy) GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
138         codec = new BindingToNormalizedNodeCodec(loading, codecRegistry);
139         mockSchemaService.registerSchemaContextListener(codec);
140     }
141
142     private void updateYangSchema(final ImmutableSet<YangModuleInfo> moduleInfos) {
143         mockSchemaService.changeSchema(getContext(moduleInfos));
144     }
145
146     private SchemaContext getContext(final ImmutableSet<YangModuleInfo> moduleInfos) {
147         final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
148         ctx.addModuleInfos(moduleInfos);
149         return ctx.tryToCreateSchemaContext().get();
150     }
151
152     public SchemaContext getContext() {
153         return mockSchemaService.getSchemaContext();
154     }
155
156     public void start() {
157         startNewDomDataBroker();
158
159         startDomBroker();
160         startDomMountPoint();
161         startBindingToDomMappingService();
162         startNewDataBroker();
163         startBindingNotificationBroker();
164         startBindingBroker();
165
166         startForwarding();
167         if (startWithSchema) {
168             loadYangSchemaFromClasspath();
169         }
170     }
171
172     private void startDomMountPoint() {
173         biMountImpl = new DOMMountPointServiceImpl();
174     }
175
176     private void startDomBroker() {
177         checkState(executor != null);
178         domRouter = new DOMRpcRouter();
179         mockSchemaService.registerSchemaContextListener(domRouter);
180     }
181
182     public void startBindingNotificationBroker() {
183         checkState(executor != null);
184         final DOMNotificationRouter router = DOMNotificationRouter.create(16);
185         domPublishService = router;
186         domListenService = router;
187         publishService = new BindingDOMNotificationPublishServiceAdapter(codec, domPublishService);
188         listenService = new BindingDOMNotificationServiceAdapter(codec, domListenService);
189
190     }
191
192     public void loadYangSchemaFromClasspath() {
193         final ImmutableSet<YangModuleInfo> moduleInfos = BindingReflections.loadModuleInfos();
194         updateYangSchema(moduleInfos);
195     }
196
197     public DOMRpcProviderService getDomRpcRegistry() {
198         return domRouter;
199     }
200
201     public DOMRpcService getDomRpcInvoker() {
202         return domRouter;
203     }
204
205     @Override
206     public void close() throws Exception {
207
208     }
209
210     public DOMMountPointService getDomMountProviderService() {
211         return biMountImpl;
212     }
213
214     public DataBroker getDataBroker() {
215         return dataBroker;
216     }
217 }