1 /*******************************************************************************
2 * Copyright (c) 2013, 2016 École Polytechnique de Montréal
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *******************************************************************************/
10 package org
.eclipse
.tracecompass
.tmf
.core
.tests
.statesystem
;
12 import static org
.junit
.Assert
.assertEquals
;
13 import static org
.junit
.Assert
.assertFalse
;
14 import static org
.junit
.Assert
.assertNotNull
;
15 import static org
.junit
.Assert
.assertNull
;
16 import static org
.junit
.Assert
.assertTrue
;
17 import static org
.junit
.Assert
.fail
;
20 import java
.util
.concurrent
.BrokenBarrierException
;
21 import java
.util
.concurrent
.CyclicBarrier
;
22 import java
.util
.concurrent
.TimeUnit
;
24 import org
.eclipse
.tracecompass
.statesystem
.core
.ITmfStateSystem
;
25 import org
.eclipse
.tracecompass
.statesystem
.core
.statevalue
.TmfStateValue
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceOpenedSignal
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.statesystem
.Messages
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.statesystem
.TmfStateSystemAnalysisModule
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.tests
.TmfCoreTestPlugin
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
31 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.analysis
.TestStateSystemModule
;
32 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.analysis
.TestStateSystemProvider
;
33 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.trace
.xml
.TmfXmlTraceStub
;
34 import org
.junit
.After
;
35 import org
.junit
.Before
;
36 import org
.junit
.Ignore
;
37 import org
.junit
.Rule
;
38 import org
.junit
.Test
;
39 import org
.junit
.rules
.TestRule
;
40 import org
.junit
.rules
.Timeout
;
43 * Test the {@link TmfStateSystemAnalysisModule} class
45 * @author Geneviève Bastien
47 public class StateSystemAnalysisModuleTest
{
49 /** Time-out tests after 1 minute. */
51 public TestRule globalTimeout
= new Timeout(1, TimeUnit
.MINUTES
);
53 /** ID of the test state system analysis module */
54 public static final String MODULE_SS
= "org.eclipse.linuxtools.tmf.core.tests.analysis.sstest";
55 private static final String XML_TRACE
= "testfiles/stub_xml_traces/valid/analysis_dependency.xml";
57 private TestStateSystemModule fModule
;
58 private ITmfTrace fTrace
;
64 public void setupTraces() {
65 TmfXmlTraceStub trace
= TmfXmlTraceStub
.setupTrace(TmfCoreTestPlugin
.getAbsoluteFilePath(XML_TRACE
));
66 trace
.traceOpened(new TmfTraceOpenedSignal(this, trace
, null));
69 fModule
= (TestStateSystemModule
) trace
.getAnalysisModule(MODULE_SS
);
73 * Some tests use traces, let's clean them here
76 public void cleanupTraces() {
81 * Test the state system module execution and result
84 public void testSsModule() {
85 ITmfStateSystem ss
= fModule
.getStateSystem();
88 if (fModule
.waitForCompletion()) {
89 ss
= fModule
.getStateSystem();
92 fail("Module did not complete properly");
97 * Make sure that the state system is initialized after calling
98 * {@link TmfStateSystemAnalysisModule#waitForInitialization()}.
101 public void testInitialization() {
102 assertNull(fModule
.getStateSystem());
105 assertTrue("Initialization succeeded", fModule
.waitForInitialization());
106 assertNotNull(fModule
.getStateSystem());
110 * Test that helper returns the right properties
113 public void testProperties() {
115 /* The stub state system has in mem backend 2 properties */
116 Map
<String
, String
> properties
= fModule
.getProperties();
117 assertEquals(fModule
.getBackendName(), properties
.get(Messages
.TmfStateSystemAnalysisModule_PropertiesBackend
));
118 assertEquals(fModule
.getId(), properties
.get(org
.eclipse
.tracecompass
.tmf
.core
.analysis
.Messages
.TmfAbstractAnalysisModule_LabelId
));
121 private static final String CRUCIAL_EVENT
= "crucialEvent";
122 private static final String CRUCIAL_FIELD
= "crucialInfo";
124 private static void setupDependentAnalysisHandler(CyclicBarrier barrier
) {
125 TestStateSystemProvider
.setEventHandler((ss
, event
) -> {
127 /* Wait before processing the current event */
129 if (event
.getName().equals(CRUCIAL_EVENT
)) {
130 String crucialInfo
= (String
) event
.getContent().getField(CRUCIAL_FIELD
).getValue();
131 int quark
= ss
.getQuarkAbsoluteAndAdd(CRUCIAL_FIELD
);
133 ss
.modifyAttribute(event
.getTimestamp().toNanos(), TmfStateValue
.newValueString(crucialInfo
), quark
);
134 } catch (Exception e
) {
135 fail(e
.getMessage());
138 /* Wait before processing the next event */
141 } catch (InterruptedException
| BrokenBarrierException e1
) {
149 * Test the {@link TmfStateSystemAnalysisModule#isQueryable(long)} method
152 public void testIsQueryable() {
154 CyclicBarrier barrier
= new CyclicBarrier(2);
155 setupDependentAnalysisHandler(barrier
);
157 TestStateSystemModule module
= fModule
;
158 assertNotNull(module
);
160 /* Module is not started, it should be queriable */
161 assertTrue(module
.isQueryable(1));
162 assertTrue(module
.isQueryable(4));
163 assertTrue(module
.isQueryable(5));
164 assertTrue(module
.isQueryable(7));
165 assertTrue(module
.isQueryable(10));
169 assertTrue(module
.waitForInitialization());
171 assertFalse(module
.isQueryable(1));
174 /* 2 waits for a barrier for one event */
180 assertTrue(module
.isQueryable(1));
181 assertTrue(module
.isQueryable(4));
182 assertFalse(module
.isQueryable(5));
186 assertTrue(module
.isQueryable(1));
187 assertTrue(module
.isQueryable(4));
188 assertFalse(module
.isQueryable(5));
192 assertTrue(module
.isQueryable(1));
193 assertTrue(module
.isQueryable(4));
194 assertFalse(module
.isQueryable(5));
198 assertTrue(module
.isQueryable(1));
199 assertTrue(module
.isQueryable(4));
200 assertTrue(module
.isQueryable(5));
201 assertFalse(module
.isQueryable(7));
205 assertTrue(module
.isQueryable(1));
206 assertTrue(module
.isQueryable(4));
207 assertTrue(module
.isQueryable(5));
208 assertFalse(module
.isQueryable(7));
212 assertTrue(module
.isQueryable(1));
213 assertTrue(module
.isQueryable(4));
214 assertTrue(module
.isQueryable(5));
215 assertTrue(module
.isQueryable(7));
216 assertFalse(module
.isQueryable(10));
219 fModule
.waitForCompletion();
220 assertTrue(module
.isQueryable(1));
221 assertTrue(module
.isQueryable(4));
222 assertTrue(module
.isQueryable(5));
223 assertTrue(module
.isQueryable(7));
224 assertTrue(module
.isQueryable(10));
226 // Should return true only if later than trace time
227 assertTrue(module
.isQueryable(100));
229 } catch (InterruptedException
| BrokenBarrierException e1
) {
230 fail(e1
.getMessage());
233 TestStateSystemProvider
.setEventHandler(null);
238 * Test the {@link TmfStateSystemAnalysisModule#isQueryable(long)} method
239 * when the analysis is cancelled
241 @Ignore("Hangs very often")
243 public void testIsQueryableCancel() {
245 TestStateSystemModule module
= fModule
;
246 assertNotNull(module
);
247 /* Set the queue to 1 to limit the number of events buffered */
248 module
.setPerEventSignalling(true);
250 /* Module is not started, it should be queriable */
251 assertTrue(module
.isQueryable(1));
252 assertTrue(module
.isQueryable(4));
253 assertTrue(module
.isQueryable(5));
254 assertTrue(module
.isQueryable(7));
255 assertTrue(module
.isQueryable(10));
259 assertTrue(module
.waitForInitialization());
261 assertFalse(module
.isQueryable(1));
263 // Process 2 events, then cancel
264 module
.signalNextEvent();
265 module
.signalNextEvent();
267 module
.setPerEventSignalling(false);
269 fModule
.waitForCompletion();
270 assertTrue(module
.isQueryable(1));
271 assertTrue(module
.isQueryable(4));
272 assertTrue(module
.isQueryable(5));
273 assertTrue(module
.isQueryable(7));
274 assertTrue(module
.isQueryable(10));