c0c0085dd5d183069c8170ed54dbdb8ee205e1f2
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / dom / adapter / test / util / BindingTestContext.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.mdsal.binding.dom.adapter.test.util;
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 java.util.Set;
18 import org.opendaylight.mdsal.binding.api.DataBroker;
19 import org.opendaylight.mdsal.binding.api.MountPointService;
20 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
21 import org.opendaylight.mdsal.binding.api.NotificationService;
22 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
23 import org.opendaylight.mdsal.binding.api.RpcProviderService;
24 import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
25 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter;
26 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMMountPointServiceAdapter;
27 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationPublishServiceAdapter;
28 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceAdapter;
29 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcProviderServiceAdapter;
30 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcServiceAdapter;
31 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
32 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
33 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
34 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
35 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
36 import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
37 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
38 import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
39 import org.opendaylight.mdsal.dom.api.DOMRpcService;
40 import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl;
41 import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
42 import org.opendaylight.mdsal.dom.broker.DOMRpcRouter;
43 import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker;
44 import org.opendaylight.mdsal.dom.spi.store.DOMStore;
45 import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStore;
46 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
47 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
48
49 @Beta
50 public class BindingTestContext implements AutoCloseable {
51     private MockAdapterContext codec;
52
53     private final ListeningExecutorService executor;
54
55     private final boolean startWithSchema;
56
57     private DOMMountPointService biMountImpl;
58
59     private ImmutableMap<LogicalDatastoreType, DOMStore> newDatastores;
60
61     private DOMDataBroker newDOMDataBroker;
62
63     private final MockSchemaService mockSchemaService = new MockSchemaService();
64
65     private DataBroker dataBroker;
66
67     private RpcConsumerRegistry baConsumerRpc;
68
69     private BindingDOMRpcProviderServiceAdapter baProviderRpc;
70     private DOMRpcRouter domRouter;
71
72     private NotificationPublishService publishService;
73
74     private NotificationService listenService;
75
76     private DOMNotificationPublishService domPublishService;
77
78     private DOMNotificationService domListenService;
79
80     private Set<YangModuleInfo> schemaModuleInfos;
81
82     public DOMDataBroker getDomAsyncDataBroker() {
83         return newDOMDataBroker;
84     }
85
86     public AdapterContext getCodec() {
87         return codec;
88     }
89
90     protected BindingTestContext(final ListeningExecutorService executor, final boolean startWithSchema) {
91         this.executor = executor;
92         this.startWithSchema = startWithSchema;
93     }
94
95     public void startDomDataBroker() {
96     }
97
98     public void startNewDataBroker() {
99         checkState(executor != null, "Executor needs to be set");
100         checkState(newDOMDataBroker != null, "DOM Data Broker must be set");
101         dataBroker = new BindingDOMDataBrokerAdapter(codec, newDOMDataBroker);
102     }
103
104     public void startNewDomDataBroker() {
105         checkState(executor != null, "Executor needs to be set");
106         final InMemoryDOMDataStore operStore = new InMemoryDOMDataStore("OPER",
107             MoreExecutors.newDirectExecutorService());
108         final InMemoryDOMDataStore configStore = new InMemoryDOMDataStore("CFG",
109             MoreExecutors.newDirectExecutorService());
110         newDatastores = ImmutableMap.<LogicalDatastoreType, DOMStore>builder()
111                 .put(LogicalDatastoreType.OPERATIONAL, operStore)
112                 .put(LogicalDatastoreType.CONFIGURATION, configStore)
113                 .build();
114
115         newDOMDataBroker = new SerializedDOMDataBroker(newDatastores, executor);
116
117         mockSchemaService.registerSchemaContextListener(configStore);
118         mockSchemaService.registerSchemaContextListener(operStore);
119     }
120
121     public void startBindingDataBroker() {
122
123     }
124
125     public void startBindingBroker() {
126         checkState(executor != null, "Executor needs to be set");
127
128         baConsumerRpc = new BindingDOMRpcServiceAdapter(codec, getDomRpcInvoker());
129         baProviderRpc = new BindingDOMRpcProviderServiceAdapter(codec, getDomRpcRegistry());
130         final MountPointService mountService = new BindingDOMMountPointServiceAdapter(codec, biMountImpl);
131     }
132
133     public void startForwarding() {
134
135     }
136
137     public void startBindingToDomMappingService() {
138         codec = new MockAdapterContext();
139         mockSchemaService.registerSchemaContextListener(codec);
140     }
141
142     private void updateYangSchema(final Set<YangModuleInfo> moduleInfos) {
143         mockSchemaService.changeSchema(BindingRuntimeHelpers.createEffectiveModel(moduleInfos));
144     }
145
146     public EffectiveModelContext getContext() {
147         return mockSchemaService.getEffectiveModelContext();
148     }
149
150     public void start() {
151         startNewDomDataBroker();
152
153         startDomBroker();
154         startDomMountPoint();
155         startBindingToDomMappingService();
156         startNewDataBroker();
157         startBindingNotificationBroker();
158         startBindingBroker();
159
160         startForwarding();
161
162         if (schemaModuleInfos != null) {
163             updateYangSchema(schemaModuleInfos);
164         } else if (startWithSchema) {
165             loadYangSchemaFromClasspath();
166         }
167     }
168
169     private void startDomMountPoint() {
170         biMountImpl = new DOMMountPointServiceImpl();
171     }
172
173     private void startDomBroker() {
174         checkState(executor != null);
175         domRouter = new DOMRpcRouter();
176         mockSchemaService.registerSchemaContextListener(domRouter);
177     }
178
179     public void startBindingNotificationBroker() {
180         checkState(executor != null);
181         final DOMNotificationRouter router = DOMNotificationRouter.create(16);
182         domPublishService = router;
183         domListenService = router;
184         publishService = new BindingDOMNotificationPublishServiceAdapter(codec, domPublishService);
185         listenService = new BindingDOMNotificationServiceAdapter(codec, domListenService);
186
187     }
188
189     public void loadYangSchemaFromClasspath() {
190         final ImmutableSet<YangModuleInfo> moduleInfos = BindingReflections.loadModuleInfos();
191         updateYangSchema(moduleInfos);
192     }
193
194     public DOMRpcProviderService getDomRpcRegistry() {
195         return domRouter.getRpcProviderService();
196     }
197
198     public DOMRpcService getDomRpcInvoker() {
199         return domRouter.getRpcService();
200     }
201
202     public RpcProviderService getBindingRpcProviderRegistry() {
203         return baProviderRpc;
204     }
205
206     public RpcConsumerRegistry getBindingRpcConsumerRegistry() {
207         return baConsumerRpc;
208     }
209
210     @Override
211     public void close() throws Exception {
212
213     }
214
215     public DOMMountPointService getDomMountProviderService() {
216         return biMountImpl;
217     }
218
219     public DataBroker getDataBroker() {
220         return dataBroker;
221     }
222
223     public void setSchemaModuleInfos(final Set<YangModuleInfo> moduleInfos) {
224         schemaModuleInfos = moduleInfos;
225     }
226 }