Add missing package exports
[deliverable/tracecompass.git] / analysis / org.eclipse.tracecompass.analysis.os.linux.core.tests / src / org / eclipse / tracecompass / analysis / os / linux / core / tests / kernelanalysis / KernelThreadInformationProviderTest.java
CommitLineData
50a47aa6 1/*******************************************************************************
ed902a2b 2 * Copyright (c) 2014, 2015 École Polytechnique de Montréal
50a47aa6
GB
3 *
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 *
9 * Contributors:
10 * Geneviève Bastien - Initial API and implementation
11 *******************************************************************************/
12
e363eae1 13package org.eclipse.tracecompass.analysis.os.linux.core.tests.kernelanalysis;
50a47aa6 14
e363eae1 15import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
50a47aa6
GB
16import static org.junit.Assert.assertEquals;
17import static org.junit.Assert.assertNotNull;
18import static org.junit.Assert.assertNull;
19import static org.junit.Assert.assertTrue;
50a47aa6
GB
20
21import java.io.File;
22import java.util.Collection;
23import java.util.List;
24
50a47aa6 25import org.eclipse.core.runtime.IProgressMonitor;
50a47aa6
GB
26import org.eclipse.core.runtime.NullProgressMonitor;
27import org.eclipse.jdt.annotation.NonNull;
6d16f5a9 28import org.eclipse.tracecompass.analysis.os.linux.core.kernelanalysis.KernelAnalysisModule;
e363eae1
AM
29import org.eclipse.tracecompass.analysis.os.linux.core.kernelanalysis.KernelThreadInformationProvider;
30import org.eclipse.tracecompass.analysis.os.linux.core.kernelanalysis.StateValues;
0783ea52
GB
31import org.eclipse.tracecompass.analysis.os.linux.core.tests.stubs.LinuxTestCase;
32import org.eclipse.tracecompass.analysis.os.linux.core.tests.stubs.kernel.KernelAnalysisTestFactory;
50a47aa6
GB
33import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
34import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
35import org.eclipse.tracecompass.statesystem.core.statevalue.TmfStateValue;
36import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
50a47aa6
GB
37import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
38import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
39import org.eclipse.tracecompass.tmf.core.trace.TmfTrace;
40import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
41import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
50a47aa6
GB
42import org.junit.After;
43import org.junit.Before;
44import org.junit.Test;
45
c8f45ad2
MK
46import com.google.common.collect.ImmutableSet;
47
50a47aa6 48/**
6d16f5a9 49 * Test analysis-specific methods for the {@link KernelAnalysisModule} class.
50a47aa6
GB
50 *
51 * @author Geneviève Bastien
52 */
e363eae1 53public class KernelThreadInformationProviderTest {
50a47aa6 54
0783ea52 55 private static final @NonNull LinuxTestCase KERNEL_TEST_CASE = KernelAnalysisTestFactory.KERNEL_SCHED;
e363eae1 56
50a47aa6 57 private ITmfTrace fTrace;
6d16f5a9 58 private KernelAnalysisModule fModule;
50a47aa6
GB
59
60 private static void deleteSuppFiles(ITmfTrace trace) {
61 /* Remove supplementary files */
62 File suppDir = new File(TmfTraceManager.getSupplementaryFileDir(trace));
63 for (File file : suppDir.listFiles()) {
64 file.delete();
65 }
66 }
67
68 /**
69 * Setup the trace for the tests
70 */
71 @Before
72 public void setUp() {
0783ea52 73 ITmfTrace trace = KERNEL_TEST_CASE.getKernelTrace();
1d83ed07
AM
74 deleteSuppFiles(trace);
75 ((TmfTrace) trace).traceOpened(new TmfTraceOpenedSignal(this, trace, null));
50a47aa6 76 IAnalysisModule module = null;
6d16f5a9 77 for (IAnalysisModule mod : TmfTraceUtils.getAnalysisModulesOfClass(trace, KernelAnalysisModule.class)) {
50a47aa6
GB
78 module = mod;
79 }
80 assertNotNull(module);
81 module.schedule();
82 module.waitForCompletion();
6d16f5a9 83 fModule = TmfTraceUtils.getAnalysisModuleOfClass(trace, KernelAnalysisModule.class, KernelAnalysisModule.ID);
1d83ed07 84 fTrace = trace;
50a47aa6
GB
85 }
86
87 /**
88 * Clean up
89 */
90 @After
91 public void tearDown() {
92 deleteSuppFiles(fTrace);
93 fTrace.dispose();
94 }
95
96 /**
97 * Test the
6d16f5a9 98 * {@link KernelThreadInformationProvider#getThreadIds(KernelAnalysisModule)}
50a47aa6
GB
99 * method
100 */
101 @Test
102 public void testGetThreadQuarks() {
6d16f5a9 103 KernelAnalysisModule module = checkNotNull(fModule);
e363eae1 104 Collection<Integer> threadIds = KernelThreadInformationProvider.getThreadIds(module);
c8f45ad2 105 assertEquals(ImmutableSet.<Integer>of(10,11,20,21,30,100), threadIds);
50a47aa6
GB
106 }
107
108 /**
109 * Test the
6d16f5a9 110 * {@link KernelThreadInformationProvider#getThreadOnCpu(KernelAnalysisModule, long, long)}
50a47aa6
GB
111 * method
112 */
113 @Test
114 public void testGetThreadOnCpu() {
6d16f5a9 115 KernelAnalysisModule module = checkNotNull(fModule);
50a47aa6
GB
116
117 /* Check with invalid timestamps */
e363eae1 118 Integer tid = KernelThreadInformationProvider.getThreadOnCpu(module, 0, -1);
50a47aa6
GB
119 assertNull(tid);
120
e363eae1 121 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 0, 80);
50a47aa6
GB
122 assertNull(tid);
123
124 /* Check with invalid cpus */
e363eae1 125 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 2, 20);
50a47aa6
GB
126 assertNull(tid);
127
e363eae1 128 tid = KernelThreadInformationProvider.getThreadOnCpu(module, -1, 20);
50a47aa6
GB
129 assertNull(tid);
130
131 /* Check valid values */
e363eae1 132 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 0, 4);
50a47aa6
GB
133 assertNull(tid);
134
e363eae1 135 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 0, 15);
50a47aa6
GB
136 assertNull(tid);
137
e363eae1 138 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 1, 15);
50a47aa6
GB
139 assertEquals(Integer.valueOf(11), tid);
140
e363eae1 141 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 1, 29);
50a47aa6
GB
142 assertEquals(Integer.valueOf(20), tid);
143
e363eae1 144 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 1, 30);
50a47aa6
GB
145 assertEquals(Integer.valueOf(21), tid);
146
e363eae1 147 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 0, 59);
50a47aa6
GB
148 assertEquals(Integer.valueOf(11), tid);
149
e363eae1 150 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 1, 59);
50a47aa6
GB
151 assertEquals(Integer.valueOf(30), tid);
152
e363eae1 153 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 0, 60);
50a47aa6
GB
154 assertEquals(Integer.valueOf(11), tid);
155
e363eae1 156 tid = KernelThreadInformationProvider.getThreadOnCpu(module, 1, 60);
50a47aa6
GB
157 assertEquals(Integer.valueOf(21), tid);
158
159 }
160
161 /**
162 * Test the
6d16f5a9 163 * {@link KernelThreadInformationProvider#getParentPid(KernelAnalysisModule, Integer, long)}
50a47aa6
GB
164 * method
165 */
166 @Test
167 public void testGetPpid() {
6d16f5a9 168 KernelAnalysisModule module = checkNotNull(fModule);
50a47aa6
GB
169
170 /* Check with invalid timestamps */
e363eae1 171 Integer ppid = KernelThreadInformationProvider.getParentPid(module, 11, -1);
50a47aa6
GB
172 assertNull(ppid);
173
e363eae1 174 ppid = KernelThreadInformationProvider.getParentPid(module, 11, 80);
50a47aa6
GB
175 assertNull(ppid);
176
177 /* Check with invalid cpus */
e363eae1 178 ppid = KernelThreadInformationProvider.getParentPid(module, -4, 20);
50a47aa6
GB
179 assertNull(ppid);
180
e363eae1 181 ppid = KernelThreadInformationProvider.getParentPid(module, 12, 20);
50a47aa6
GB
182 assertNull(ppid);
183
184 /* Check values with no parent */
e363eae1 185 ppid = KernelThreadInformationProvider.getParentPid(module, 10, 20);
50a47aa6
GB
186 assertEquals(Integer.valueOf(0), ppid);
187
e363eae1 188 ppid = KernelThreadInformationProvider.getParentPid(module, 30, 60);
50a47aa6
GB
189 assertEquals(Integer.valueOf(0), ppid);
190
191 /* Check parent determined at statedump */
e363eae1 192 ppid = KernelThreadInformationProvider.getParentPid(module, 11, 4);
50a47aa6
GB
193 assertNull(ppid);
194
e363eae1 195 ppid = KernelThreadInformationProvider.getParentPid(module, 11, 5);
50a47aa6
GB
196 assertEquals(Integer.valueOf(10), ppid);
197
198 /* Check parent after process fork */
e363eae1 199 ppid = KernelThreadInformationProvider.getParentPid(module, 21, 25);
50a47aa6
GB
200 assertEquals(Integer.valueOf(20), ppid);
201
e363eae1 202 ppid = KernelThreadInformationProvider.getParentPid(module, 21, 70);
50a47aa6
GB
203 assertEquals(Integer.valueOf(20), ppid);
204
205 }
206
207 /**
6d16f5a9 208 * Test the {@link KernelThreadInformationProvider#getExecutableName(KernelAnalysisModule, Integer)} method
50a47aa6
GB
209 */
210 @Test
211 public void testGetExecutableName() {
6d16f5a9 212 KernelAnalysisModule module = checkNotNull(fModule);
e363eae1 213
50a47aa6 214 /* Check with invalid threads */
e363eae1 215 String execName = KernelThreadInformationProvider.getExecutableName(module, 101);
50a47aa6
GB
216 assertNull(execName);
217
e363eae1 218 execName = KernelThreadInformationProvider.getExecutableName(module, -2);
50a47aa6
GB
219 assertNull(execName);
220
221 /* Check valid value */
e363eae1 222 execName = KernelThreadInformationProvider.getExecutableName(module, 20);
50a47aa6
GB
223 assertEquals("proc20", execName);
224
225 /* Check valid value with process name change in history */
e363eae1 226 execName = KernelThreadInformationProvider.getExecutableName(module, 21);
50a47aa6
GB
227 assertEquals("proc21", execName);
228
229 }
230
231 private static void testIntervals(String info, List<ITmfStateInterval> intervals, ITmfStateValue[] values) {
232 assertEquals(info + " interval count", values.length, intervals.size());
233 for (int i = 0; i < values.length; i++) {
234 assertEquals(info + " interval " + i, values[i], intervals.get(i).getStateValue());
235 }
236 }
237
238 /**
239 * Test the
6d16f5a9 240 * {@link KernelThreadInformationProvider#getStatusIntervalsForThread(KernelAnalysisModule, Integer, long, long, long, IProgressMonitor)}
50a47aa6
GB
241 * method
242 */
243 @Test
244 public void testGetStatusIntervalsForThread() {
6d16f5a9 245 KernelAnalysisModule module = checkNotNull(fModule);
50a47aa6
GB
246
247 IProgressMonitor monitor = new NullProgressMonitor();
248 Integer process21 = 21;
249 Integer process20 = 20;
250
251 /* Check invalid time ranges */
e363eae1 252 List<ITmfStateInterval> intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, process21, -15, -5, 3, monitor);
50a47aa6
GB
253 assertTrue(intervals.isEmpty());
254
e363eae1 255 intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, process21, 80, 1500000000L, 50, monitor);
50a47aa6
GB
256 assertTrue(intervals.isEmpty());
257
258 /* Check invalid quarks */
e363eae1 259 intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, -1, 0, 70L, 3, monitor);
50a47aa6
GB
260 assertTrue(intervals.isEmpty());
261
e363eae1 262 intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, 0, 0, 70L, 3, monitor);
50a47aa6
GB
263 assertTrue(intervals.isEmpty());
264
265 /* Check different time ranges and resolutions */
266 ITmfStateValue[] values = { TmfStateValue.nullValue(), StateValues.PROCESS_STATUS_WAIT_FOR_CPU_VALUE,
2e3a31c4
FG
267 StateValues.PROCESS_STATUS_RUN_USERMODE_VALUE, StateValues.PROCESS_STATUS_WAIT_FOR_CPU_VALUE,
268 StateValues.PROCESS_STATUS_RUN_USERMODE_VALUE };
e363eae1 269 intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, process21, 0, 70L, 3, monitor);
50a47aa6
GB
270 testIntervals("tid 21 [0,70,3]", intervals, values);
271
2e3a31c4
FG
272 ITmfStateValue[] values2 = { TmfStateValue.nullValue(), StateValues.PROCESS_STATUS_RUN_USERMODE_VALUE,
273 StateValues.PROCESS_STATUS_RUN_USERMODE_VALUE };
e363eae1 274 intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, process21, 1, 70L, 30, monitor);
50a47aa6
GB
275 testIntervals("tid 21 [0,70,30]", intervals, values2);
276
277 ITmfStateValue[] values3 = { StateValues.PROCESS_STATUS_WAIT_FOR_CPU_VALUE,
2e3a31c4 278 StateValues.PROCESS_STATUS_RUN_USERMODE_VALUE };
e363eae1 279 intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, process21, 25, 50L, 3, monitor);
50a47aa6
GB
280 testIntervals("tid 21 [25,50,3]", intervals, values3);
281
a810c240 282 ITmfStateValue[] values4 = { TmfStateValue.nullValue(), StateValues.PROCESS_STATUS_WAIT_UNKNOWN_VALUE,
50a47aa6 283 StateValues.PROCESS_STATUS_RUN_USERMODE_VALUE, StateValues.PROCESS_STATUS_WAIT_FOR_CPU_VALUE };
e363eae1 284 intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, process20, 0, 70L, 3, monitor);
50a47aa6
GB
285 testIntervals("tid 20 [0,70,3]", intervals, values4);
286
287 ITmfStateValue[] values5 = { TmfStateValue.nullValue(), StateValues.PROCESS_STATUS_WAIT_FOR_CPU_VALUE };
e363eae1 288 intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, process20, 1, 70L, 30, monitor);
50a47aa6
GB
289 testIntervals("tid 20 [0,70,30]", intervals, values5);
290
291 ITmfStateValue[] values6 = { StateValues.PROCESS_STATUS_RUN_USERMODE_VALUE,
292 StateValues.PROCESS_STATUS_WAIT_FOR_CPU_VALUE };
e363eae1 293 intervals = KernelThreadInformationProvider.getStatusIntervalsForThread(module, process20, 25, 50L, 3, monitor);
50a47aa6
GB
294 testIntervals("tid 20 [25,50,3]", intervals, values6);
295
296 }
297
298}
This page took 0.069494 seconds and 5 git commands to generate.