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