Merge "On link flap new SimpleForwarding flows are rejected by FRM"
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / test / java / org / opendaylight / controller / sal / binding / test / util / BindingTestContext.java
1 package org.opendaylight.controller.sal.binding.test.util;
2
3 import java.io.InputStream;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.Set;
7
8 import javassist.ClassPool;
9
10 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
11 import org.opendaylight.controller.sal.binding.dom.serializer.impl.RuntimeGeneratedMappingServiceImpl;
12 import org.opendaylight.controller.sal.binding.impl.DataBrokerImpl;
13 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentDataServiceConnector;
14 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentMappingService;
15 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
16 import org.opendaylight.controller.sal.core.api.data.DataStore;
17 import org.opendaylight.controller.sal.dom.broker.impl.DataStoreStatsWrapper;
18 import org.opendaylight.controller.sal.dom.broker.impl.HashMapDataStore;
19 import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareDataStoreAdapter;
20 import org.opendaylight.yangtools.yang.model.api.Module;
21 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
22 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
23 import org.reflections.Reflections;
24 import org.reflections.scanners.ResourcesScanner;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 import com.google.common.base.Predicate;
29 import com.google.common.util.concurrent.ListeningExecutorService;
30 import com.google.common.util.concurrent.MoreExecutors;
31
32 import static com.google.common.base.Preconditions.*;
33
34 public class BindingTestContext {
35     
36     
37     public static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier TREE_ROOT = org.opendaylight.yangtools.yang.data.api.InstanceIdentifier
38             .builder().toInstance();
39
40     private static final Logger LOG = LoggerFactory.getLogger(BindingTestContext.class);
41     
42     private RuntimeGeneratedMappingServiceImpl mappingServiceImpl;
43     private DataBrokerImpl baDataImpl;
44     private org.opendaylight.controller.sal.dom.broker.DataBrokerImpl biDataImpl;
45     
46     private BindingIndependentDataServiceConnector connectorServiceImpl;
47     private HashMapDataStore rawDataStore;
48     private SchemaAwareDataStoreAdapter schemaAwareDataStore;
49     private DataStoreStatsWrapper dataStoreStats;
50     private DataStore dataStore;
51
52     
53     private boolean dataStoreStatisticsEnabled = false;
54     
55     private final ListeningExecutorService executor;
56     private final ClassPool classPool;
57
58     private final boolean startWithSchema;
59     
60     protected BindingTestContext(ListeningExecutorService executor, ClassPool classPool, boolean startWithSchema) {
61         this.executor = executor;
62         this.classPool = classPool;
63         this.startWithSchema = startWithSchema;
64     }
65
66     public void startDomDataStore() {
67         checkState(dataStore == null, "DataStore already started.");
68         checkState(biDataImpl != null, "Dom Data Broker not present");
69         rawDataStore = new HashMapDataStore();
70         schemaAwareDataStore = new SchemaAwareDataStoreAdapter();
71         schemaAwareDataStore.changeDelegate(rawDataStore);
72         if(dataStoreStatisticsEnabled) {
73         dataStoreStats = new DataStoreStatsWrapper(schemaAwareDataStore);
74         dataStore = dataStoreStats;
75         } else {
76             dataStore = schemaAwareDataStore;
77         }
78         
79         biDataImpl.registerConfigurationReader(TREE_ROOT, dataStore);
80         biDataImpl.registerOperationalReader(TREE_ROOT, dataStore);
81         biDataImpl.registerCommitHandler(TREE_ROOT, dataStore);
82     }
83     
84     public void startDomDataBroker() {
85         checkState(executor != null,"Executor needs to be set");
86         biDataImpl = new org.opendaylight.controller.sal.dom.broker.DataBrokerImpl();
87         biDataImpl.setExecutor(executor);
88     }
89     
90     public void startBindingDataBroker() {
91         checkState(executor != null,"Executor needs to be set");
92         baDataImpl = new DataBrokerImpl();
93         baDataImpl.setExecutor(executor);
94     }
95     
96     public void startBindingToDomDataConnector() {
97         checkState(baDataImpl != null,"Binding Data Broker needs to be started");
98         checkState(biDataImpl != null,"DOM Data Broker needs to be started.");
99         checkState(mappingServiceImpl != null,"DOM Mapping Service needs to be started.");
100         connectorServiceImpl = new BindingIndependentDataServiceConnector();
101         connectorServiceImpl.setBaDataService(baDataImpl);
102         connectorServiceImpl.setBiDataService(biDataImpl);
103         connectorServiceImpl.setMappingService(mappingServiceImpl);
104         connectorServiceImpl.start();
105     }
106     
107     public void startBindingToDomMappingService() {
108         checkState(classPool != null,"ClassPool needs to be present");
109         mappingServiceImpl = new RuntimeGeneratedMappingServiceImpl();
110         mappingServiceImpl.setPool(classPool);
111         mappingServiceImpl.start(null);
112     }
113     
114     
115     public void updateYangSchema(String[] files) {
116         SchemaContext context = getContext(files);
117         if(schemaAwareDataStore != null) {
118             schemaAwareDataStore.onGlobalContextUpdated(context);
119         }
120         if(mappingServiceImpl != null) {
121             mappingServiceImpl.onGlobalContextUpdated(context);
122         }
123     }
124     
125     
126     public static String[] getAllYangFilesOnClasspath() {
127         Predicate<String> predicate = new Predicate<String>() {
128             @Override
129             public boolean apply(String input) {
130                 return input.endsWith(".yang");
131             }
132         };
133         Reflections reflection = new Reflections("META-INF.yang", new ResourcesScanner());
134         Set<String> result = reflection.getResources(predicate);
135         return (String[]) result.toArray(new String[result.size()]);
136     }
137     
138     private static SchemaContext getContext(String[] yangFiles) {
139         ClassLoader loader = BindingTestContext.class.getClassLoader();
140         List<InputStream> streams = new ArrayList<>();
141         for (String string : yangFiles) {
142             InputStream stream = loader.getResourceAsStream(string);
143             streams.add(stream);
144         }
145         YangParserImpl parser = new YangParserImpl();
146         Set<Module> modules = parser.parseYangModelsFromStreams(streams);
147         return parser.resolveSchemaContext(modules);
148     }
149     
150     public void start() {
151         startBindingDataBroker();
152         startDomDataBroker();
153         startDomDataStore();
154         startBindingToDomMappingService();
155         startBindingToDomDataConnector();
156         if(startWithSchema) {
157             loadYangSchemaFromClasspath();
158         }
159     }
160
161     public void loadYangSchemaFromClasspath() {
162         String[] files = getAllYangFilesOnClasspath();
163         updateYangSchema(files);
164     }
165
166     public DataProviderService getBindingDataBroker() {
167         return baDataImpl;
168     }
169
170     public org.opendaylight.controller.sal.core.api.data.DataProviderService getDomDataBroker() {
171         return biDataImpl;
172     }
173
174     public DataStore getDomDataStore() {
175         return dataStore;
176     }
177
178     public BindingIndependentMappingService getBindingToDomMappingService() {
179         return mappingServiceImpl;
180     }
181
182     public void logDataStoreStatistics() {
183         if(dataStoreStats == null) {
184             return;
185         }
186         
187         LOG.info("BIDataStore Statistics: Configuration Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
188                 dataStoreStats.getConfigurationReadCount(), dataStoreStats.getConfigurationReadTotalTime(),
189                 dataStoreStats.getConfigurationReadAverageTime());
190
191         LOG.info("BIDataStore Statistics: Operational Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
192                 dataStoreStats.getOperationalReadCount(), dataStoreStats.getOperationalReadTotalTime(),
193                 dataStoreStats.getOperationalReadAverageTime());
194
195         LOG.info("BIDataStore Statistics: Request Commit Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
196                 dataStoreStats.getRequestCommitCount(), dataStoreStats.getRequestCommitTotalTime(),
197                 dataStoreStats.getRequestCommitAverageTime());
198     }
199 }