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