1 /*******************************************************************************
2 * Copyright (c) 2012, 2014 Ericsson
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
10 * Alexandre Montplaisir - Initial API and implementation
11 * Alexandre Montplaisir - Port to JUnit4
12 ******************************************************************************/
14 package org
.eclipse
.linuxtools
.tmf
.core
.tests
.statesystem
;
16 import static org
.junit
.Assert
.assertEquals
;
17 import static org
.junit
.Assert
.assertTrue
;
18 import static org
.junit
.Assert
.fail
;
21 import java
.io
.IOException
;
22 import java
.util
.List
;
24 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.statesystem
.StateSystem
;
25 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.statesystem
.backends
.IStateHistoryBackend
;
26 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.statesystem
.backends
.historytree
.HistoryTreeBackend
;
27 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.AttributeNotFoundException
;
28 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.StateSystemDisposedException
;
29 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.StateValueTypeException
;
30 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.TimeRangeException
;
31 import org
.eclipse
.linuxtools
.tmf
.core
.interval
.ITmfStateInterval
;
32 import org
.eclipse
.linuxtools
.tmf
.core
.statesystem
.ITmfStateSystemBuilder
;
33 import org
.eclipse
.linuxtools
.tmf
.core
.statevalue
.ITmfStateValue
;
34 import org
.eclipse
.linuxtools
.tmf
.core
.statevalue
.TmfStateValue
;
35 import org
.junit
.After
;
36 import org
.junit
.Before
;
37 import org
.junit
.Test
;
40 * Unit tests for stack-attributes in the Generic State System (using
41 * pushAttribute() and popAttribute())
43 * @author Alexandre Montplaisir
45 public class StateSystemPushPopTest
{
47 private ITmfStateSystemBuilder ss
;
49 private ITmfStateInterval interval
;
50 private int attribute
;
52 private File testHtFile
;
54 private final static String errMsg
= "Caught exception: ";
56 /* State values that will be used */
57 //private final static ITmfStateValue nullValue = TmfStateValue.nullValue();
58 private final static ITmfStateValue value1
= TmfStateValue
.newValueString("A");
59 private final static ITmfStateValue value2
= TmfStateValue
.newValueInt(10);
60 private final static ITmfStateValue value3
= TmfStateValue
.nullValue();
61 private final static ITmfStateValue value4
= TmfStateValue
.newValueString("D");
62 private final static ITmfStateValue value5
= TmfStateValue
.newValueLong(Long
.MAX_VALUE
);
65 * Initialization. We run the checks for the return values of
66 * .popAttribute() in here, since this is only available when we are
67 * building the state history.
70 * If we can write the file to the temporary directory.
71 * @throws TimeRangeException
73 * @throws AttributeNotFoundException
75 * @throws StateValueTypeException
79 public void setUp() throws IOException
, TimeRangeException
,
80 AttributeNotFoundException
, StateValueTypeException
{
82 testHtFile
= File
.createTempFile("test", ".ht");
84 IStateHistoryBackend backend
= new HistoryTreeBackend(testHtFile
, 0, 0L);
85 ss
= new StateSystem("push-pop-test", backend
, true);
88 final int attrib
= ss
.getQuarkAbsoluteAndAdd("Test", "stack");
90 ss
.pushAttribute( 2, value1
, attrib
);
91 ss
.pushAttribute( 4, value2
, attrib
);
92 ss
.pushAttribute( 6, value3
, attrib
);
93 ss
.pushAttribute( 8, value4
, attrib
);
94 ss
.pushAttribute(10, value5
, attrib
);
96 value
= ss
.popAttribute(11, attrib
);
97 assertEquals(value5
, value
);
99 value
= ss
.popAttribute(12, attrib
);
100 assertEquals(value4
, value
);
102 value
= ss
.popAttribute(14, attrib
);
103 assertEquals(value3
, value
);
105 value
= ss
.popAttribute(16, attrib
);
106 assertEquals(value2
, value
);
108 value
= ss
.popAttribute(17, attrib
);
109 assertEquals(value1
, value
);
111 value
= ss
.popAttribute(20, attrib
);
112 assertEquals(null, value
); // Stack should already be empty here.
114 ss
.pushAttribute(21, value1
, attrib
);
115 //ss.pushAttribute(22, value1, attrib); //FIXME pushing twice the same value bugs out atm
116 ss
.pushAttribute(22, value2
, attrib
);
118 value
= ss
.popAttribute(24, attrib
);
119 //assertEquals(value1, value);
120 assertEquals(value2
, value
);
122 value
= ss
.popAttribute(26, attrib
);
123 assertEquals(value1
, value
);
125 value
= ss
.popAttribute(28, attrib
);
126 assertEquals(null, value
); // Stack should already be empty here.
129 attribute
= ss
.getQuarkAbsolute("Test", "stack");
133 * Clean-up after running a test. Delete the .ht file we created.
136 public void tearDown() {
141 * Test that the value of the stack-attribute at the start and end of the
142 * history are correct.
145 public void testBeginEnd() {
147 interval
= ss
.querySingleState(0, attribute
);
148 assertEquals(0, interval
.getStartTime());
149 assertEquals(1, interval
.getEndTime());
150 assertTrue(interval
.getStateValue().isNull());
152 interval
= ss
.querySingleState(29, attribute
);
153 assertEquals(26, interval
.getStartTime());
154 assertEquals(30, interval
.getEndTime());
155 assertTrue(interval
.getStateValue().isNull());
157 } catch (AttributeNotFoundException e
) {
158 fail(errMsg
+ e
.toString());
159 } catch (TimeRangeException e
) {
160 fail(errMsg
+ e
.toString());
161 } catch (StateSystemDisposedException e
) {
162 fail(errMsg
+ e
.toString());
167 * Run single queries on the attribute stacks (with .querySingleState()).
170 public void testSingleQueries() {
172 final int subAttribute1
= ss
.getQuarkRelative(attribute
, "1");
173 final int subAttribute2
= ss
.getQuarkRelative(attribute
, "2");
175 /* Test the stack attributes themselves */
176 interval
= ss
.querySingleState(11, attribute
);
177 assertEquals(4, interval
.getStateValue().unboxInt());
179 interval
= ss
.querySingleState(24, attribute
);
180 assertEquals(1, interval
.getStateValue().unboxInt());
182 /* Go retrieve the user values manually */
183 interval
= ss
.querySingleState(10, subAttribute1
);
184 assertEquals(value1
, interval
.getStateValue()); //
186 interval
= ss
.querySingleState(22, subAttribute2
);
187 assertEquals(value2
, interval
.getStateValue());
189 interval
= ss
.querySingleState(25, subAttribute2
);
190 assertTrue(interval
.getStateValue().isNull()); // Stack depth is 1 at that point.
192 } catch (AttributeNotFoundException e
) {
193 fail(errMsg
+ e
.toString());
194 } catch (StateValueTypeException e
) {
195 fail(errMsg
+ e
.toString());
196 } catch (TimeRangeException e
) {
197 fail(errMsg
+ e
.toString());
198 } catch (StateSystemDisposedException e
) {
199 fail(errMsg
+ e
.toString());
204 * Test the .querySingletStackTop() convenience method.
207 public void testStackTop() {
209 interval
= ss
.querySingleStackTop(10, attribute
);
210 assertEquals(value5
, interval
.getStateValue());
212 interval
= ss
.querySingleStackTop(9, attribute
);
213 assertEquals(value4
, interval
.getStateValue());
215 interval
= ss
.querySingleStackTop(13, attribute
);
216 assertEquals(value3
, interval
.getStateValue());
218 interval
= ss
.querySingleStackTop(16, attribute
);
219 assertEquals(value1
, interval
.getStateValue());
221 interval
= ss
.querySingleStackTop(25, attribute
);
222 assertEquals(value1
, interval
.getStateValue());
224 } catch (AttributeNotFoundException e
) {
225 fail(errMsg
+ e
.toString());
226 } catch (StateValueTypeException e
) {
227 fail(errMsg
+ e
.toString());
228 } catch (TimeRangeException e
) {
229 fail(errMsg
+ e
.toString());
230 } catch (StateSystemDisposedException e
) {
231 fail(errMsg
+ e
.toString());
236 * Test the places where the stack is empty.
239 public void testEmptyStack() {
242 interval
= ss
.querySingleState(1, attribute
);
243 assertTrue(interval
.getStateValue().isNull());
244 interval
= ss
.querySingleStackTop(1, attribute
);
245 assertEquals(null, interval
);
247 /* Between the two "stacks" in the state history */
248 interval
= ss
.querySingleState(19, attribute
);
249 assertTrue(interval
.getStateValue().isNull());
250 interval
= ss
.querySingleStackTop(19, attribute
);
251 assertEquals(null, interval
);
254 interval
= ss
.querySingleState(27, attribute
);
255 assertTrue(interval
.getStateValue().isNull());
256 interval
= ss
.querySingleStackTop(27, attribute
);
257 assertEquals(null, interval
);
259 } catch (AttributeNotFoundException e
) {
260 fail(errMsg
+ e
.toString());
261 } catch (StateValueTypeException e
) {
262 fail(errMsg
+ e
.toString());
263 } catch (TimeRangeException e
) {
264 fail(errMsg
+ e
.toString());
265 } catch (StateSystemDisposedException e
) {
266 fail(errMsg
+ e
.toString());
271 * Test full-queries (.queryFullState()) on the attribute stacks.
274 public void testFullQueries() {
275 List
<ITmfStateInterval
> state
;
277 final int subAttrib1
= ss
.getQuarkRelative(attribute
, "1");
278 final int subAttrib2
= ss
.getQuarkRelative(attribute
, "2");
279 final int subAttrib3
= ss
.getQuarkRelative(attribute
, "3");
280 final int subAttrib4
= ss
.getQuarkRelative(attribute
, "4");
282 /* Stack depth = 5 */
283 state
= ss
.queryFullState(10);
284 assertEquals(5, state
.get(attribute
).getStateValue().unboxInt());
285 assertEquals(value1
, state
.get(subAttrib1
).getStateValue());
286 assertEquals(value2
, state
.get(subAttrib2
).getStateValue());
287 assertEquals(value3
, state
.get(subAttrib3
).getStateValue());
288 assertEquals(value4
, state
.get(subAttrib4
).getStateValue());
291 state
= ss
.queryFullState(18);
292 assertTrue(state
.get(attribute
).getStateValue().isNull());
293 assertTrue(state
.get(subAttrib1
).getStateValue().isNull());
294 assertTrue(state
.get(subAttrib2
).getStateValue().isNull());
295 assertTrue(state
.get(subAttrib3
).getStateValue().isNull());
296 assertTrue(state
.get(subAttrib4
).getStateValue().isNull());
298 /* Stack depth = 1 */
299 state
= ss
.queryFullState(21);
300 assertEquals(1, state
.get(attribute
).getStateValue().unboxInt());
301 assertEquals(value1
, state
.get(subAttrib1
).getStateValue());
302 assertTrue(state
.get(subAttrib2
).getStateValue().isNull());
303 assertTrue(state
.get(subAttrib3
).getStateValue().isNull());
304 assertTrue(state
.get(subAttrib4
).getStateValue().isNull());
306 } catch (AttributeNotFoundException e
) {
307 fail(errMsg
+ e
.toString());
308 } catch (StateValueTypeException e
) {
309 fail(errMsg
+ e
.toString());
310 } catch (TimeRangeException e
) {
311 fail(errMsg
+ e
.toString());
312 } catch (StateSystemDisposedException e
) {
313 fail(errMsg
+ e
.toString());