1 package org.opendaylight.controller.sal.binding.test;
4 import java.io.InputStream;
5 import java.util.ArrayList;
9 import javassist.ClassPool;
11 import org.junit.After;
12 import org.junit.Before;
13 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
14 import org.opendaylight.controller.sal.binding.impl.DataBrokerImpl;
15 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentDataServiceConnector;
16 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentMappingService;
17 import org.opendaylight.controller.sal.binding.dom.serializer.impl.RuntimeGeneratedMappingServiceImpl;
18 import org.opendaylight.controller.sal.core.api.data.DataBrokerService;
19 import org.opendaylight.controller.sal.core.api.data.DataStore;
20 import org.opendaylight.controller.sal.dom.broker.impl.DataStoreStatsWrapper;
21 import org.opendaylight.controller.sal.dom.broker.impl.HashMapDataStore;
22 import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareDataStoreAdapter;
23 import org.opendaylight.yangtools.yang.model.api.Module;
24 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
25 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
26 import org.reflections.Reflections;
27 import org.reflections.scanners.ResourcesScanner;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 import com.google.common.base.Predicate;
32 import com.google.common.util.concurrent.ListeningExecutorService;
33 import com.google.common.util.concurrent.MoreExecutors;
35 public abstract class AbstractDataServiceTest {
36 private static Logger log = LoggerFactory.getLogger(AbstractDataServiceTest.class);
38 protected org.opendaylight.controller.sal.core.api.data.DataProviderService biDataService;
39 protected DataProviderService baDataService;
42 * Workaround for JUNIT sharing classloaders
45 protected static final ClassPool POOL = new ClassPool();
47 protected RuntimeGeneratedMappingServiceImpl mappingServiceImpl;
48 protected BindingIndependentMappingService mappingService;
49 protected DataBrokerImpl baDataImpl;
50 protected org.opendaylight.controller.sal.dom.broker.DataBrokerImpl biDataImpl;
51 protected ListeningExecutorService executor;
52 protected BindingIndependentDataServiceConnector connectorServiceImpl;
53 protected HashMapDataStore rawDataStore;
54 protected SchemaAwareDataStoreAdapter schemaAwareDataStore;
55 private DataStoreStatsWrapper dataStoreStats;
57 protected DataStore dataStore;
61 executor = MoreExecutors.sameThreadExecutor();
62 baDataImpl = new DataBrokerImpl();
63 baDataService = baDataImpl;
64 baDataImpl.setExecutor(executor);
66 biDataImpl = new org.opendaylight.controller.sal.dom.broker.DataBrokerImpl();
67 biDataService = biDataImpl;
68 biDataImpl.setExecutor(executor);
70 rawDataStore = new HashMapDataStore();
71 schemaAwareDataStore = new SchemaAwareDataStoreAdapter();
72 schemaAwareDataStore.changeDelegate(rawDataStore);
73 dataStoreStats = new DataStoreStatsWrapper(schemaAwareDataStore);
74 dataStore = dataStoreStats;
76 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier treeRoot = org.opendaylight.yangtools.yang.data.api.InstanceIdentifier
77 .builder().toInstance();
78 biDataImpl.registerConfigurationReader(treeRoot, dataStore);
79 biDataImpl.registerOperationalReader(treeRoot, dataStore);
80 biDataImpl.registerCommitHandler(treeRoot, dataStore);
82 mappingServiceImpl = new RuntimeGeneratedMappingServiceImpl();
83 mappingServiceImpl.setPool(POOL);
84 mappingService = mappingServiceImpl;
85 File pathname = new File("target/gen-classes-debug");
86 // System.out.println("Generated classes are captured in " +
87 // pathname.getAbsolutePath());
88 mappingServiceImpl.start(null);
89 // mappingServiceImpl.getBinding().setClassFileCapturePath(pathname);
91 connectorServiceImpl = new BindingIndependentDataServiceConnector();
92 connectorServiceImpl.setBaDataService(baDataService);
93 connectorServiceImpl.setBiDataService(biDataService);
94 connectorServiceImpl.setMappingService(mappingServiceImpl);
95 connectorServiceImpl.start();
97 String[] yangFiles = getModelFilenames();
98 if (yangFiles != null && yangFiles.length > 0) {
99 SchemaContext context = getContext(yangFiles);
100 mappingServiceImpl.onGlobalContextUpdated(context);
101 schemaAwareDataStore.onGlobalContextUpdated(context);
105 protected String[] getModelFilenames() {
106 return getAllModelFilenames();
109 public static String[] getAllModelFilenames() {
110 Predicate<String> predicate = new Predicate<String>() {
112 public boolean apply(String input) {
113 return input.endsWith(".yang");
116 Reflections reflection = new Reflections("META-INF.yang", new ResourcesScanner());
117 Set<String> result = reflection.getResources(predicate);
118 return (String[]) result.toArray(new String[result.size()]);
121 public static SchemaContext getContext(String[] yangFiles) {
123 ClassLoader loader = AbstractDataServiceTest.class.getClassLoader();
125 List<InputStream> streams = new ArrayList<>();
126 for (String string : yangFiles) {
127 InputStream stream = loader.getResourceAsStream(string);
131 YangParserImpl parser = new YangParserImpl();
133 Set<Module> modules = parser.parseYangModelsFromStreams(streams);
134 return parser.resolveSchemaContext(modules);
138 public void afterTest() {
140 log.info("BIDataStore Statistics: Configuration Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
141 dataStoreStats.getConfigurationReadCount(), dataStoreStats.getConfigurationReadTotalTime(),
142 dataStoreStats.getConfigurationReadAverageTime());
144 log.info("BIDataStore Statistics: Operational Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
145 dataStoreStats.getOperationalReadCount(), dataStoreStats.getOperationalReadTotalTime(),
146 dataStoreStats.getOperationalReadAverageTime());
148 log.info("BIDataStore Statistics: Request Commit Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
149 dataStoreStats.getRequestCommitCount(), dataStoreStats.getRequestCommitTotalTime(),
150 dataStoreStats.getRequestCommitAverageTime());