c67a0176d2de550ed6287607b14b546df64d71f7
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / test / java / org / opendaylight / controller / sal / binding / test / AbstractDataServiceTest.java
1 package org.opendaylight.controller.sal.binding.test;
2
3 import java.io.File;
4 import java.io.InputStream;
5 import java.util.ArrayList;
6 import java.util.List;
7 import java.util.Set;
8
9 import javassist.ClassPool;
10
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;
30
31 import com.google.common.base.Predicate;
32 import com.google.common.util.concurrent.ListeningExecutorService;
33 import com.google.common.util.concurrent.MoreExecutors;
34
35 public abstract class AbstractDataServiceTest {
36     private static Logger log = LoggerFactory.getLogger(AbstractDataServiceTest.class);
37
38     protected org.opendaylight.controller.sal.core.api.data.DataProviderService biDataService;
39     protected DataProviderService baDataService;
40
41     /**
42      * Workaround for JUNIT sharing classloaders
43      * 
44      */
45     protected static final ClassPool POOL = new ClassPool();
46
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;
56
57     protected DataStore dataStore;
58
59     @Before
60     public void setUp() {
61         executor = MoreExecutors.sameThreadExecutor();
62         baDataImpl = new DataBrokerImpl();
63         baDataService = baDataImpl;
64         baDataImpl.setExecutor(executor);
65
66         biDataImpl = new org.opendaylight.controller.sal.dom.broker.DataBrokerImpl();
67         biDataService = biDataImpl;
68         biDataImpl.setExecutor(executor);
69
70         rawDataStore = new HashMapDataStore();
71         schemaAwareDataStore = new SchemaAwareDataStoreAdapter();
72         schemaAwareDataStore.changeDelegate(rawDataStore);
73         dataStoreStats = new DataStoreStatsWrapper(schemaAwareDataStore);
74         dataStore = dataStoreStats;
75
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);
81
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);
90
91         connectorServiceImpl = new BindingIndependentDataServiceConnector();
92         connectorServiceImpl.setBaDataService(baDataService);
93         connectorServiceImpl.setBiDataService(biDataService);
94         connectorServiceImpl.setMappingService(mappingServiceImpl);
95         connectorServiceImpl.start();
96
97         String[] yangFiles = getModelFilenames();
98         if (yangFiles != null && yangFiles.length > 0) {
99             SchemaContext context = getContext(yangFiles);
100             mappingServiceImpl.onGlobalContextUpdated(context);
101             schemaAwareDataStore.onGlobalContextUpdated(context);
102         }
103     }
104
105     protected String[] getModelFilenames() {
106         return getAllModelFilenames();
107     }
108
109     public static String[] getAllModelFilenames() {
110         Predicate<String> predicate = new Predicate<String>() {
111             @Override
112             public boolean apply(String input) {
113                 return input.endsWith(".yang");
114             }
115         };
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()]);
119     }
120
121     public static SchemaContext getContext(String[] yangFiles) {
122
123         ClassLoader loader = AbstractDataServiceTest.class.getClassLoader();
124
125         List<InputStream> streams = new ArrayList<>();
126         for (String string : yangFiles) {
127             InputStream stream = loader.getResourceAsStream(string);
128             streams.add(stream);
129
130         }
131         YangParserImpl parser = new YangParserImpl();
132
133         Set<Module> modules = parser.parseYangModelsFromStreams(streams);
134         return parser.resolveSchemaContext(modules);
135     }
136
137     @After
138     public void afterTest() {
139
140         log.info("BIDataStore Statistics: Configuration Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
141                 dataStoreStats.getConfigurationReadCount(), dataStoreStats.getConfigurationReadTotalTime(),
142                 dataStoreStats.getConfigurationReadAverageTime());
143
144         log.info("BIDataStore Statistics: Operational Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
145                 dataStoreStats.getOperationalReadCount(), dataStoreStats.getOperationalReadTotalTime(),
146                 dataStoreStats.getOperationalReadAverageTime());
147
148         log.info("BIDataStore Statistics: Request Commit Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
149                 dataStoreStats.getRequestCommitCount(), dataStoreStats.getRequestCommitTotalTime(),
150                 dataStoreStats.getRequestCommitAverageTime());
151
152     }
153 }