1 /**********************************************************************
2 * Copyright (c) 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 * Jonathan Rajotte - Support of machine interface
11 **********************************************************************/
13 package org
.eclipse
.tracecompass
.lttng2
.control
.ui
.tests
.service
;
15 import static org
.junit
.Assert
.assertEquals
;
16 import static org
.junit
.Assert
.assertNotNull
;
17 import static org
.junit
.Assert
.assertTrue
;
18 import static org
.junit
.Assert
.fail
;
21 import java
.util
.HashSet
;
22 import java
.util
.List
;
25 import org
.eclipse
.core
.commands
.ExecutionException
;
26 import org
.eclipse
.core
.runtime
.NullProgressMonitor
;
27 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IChannelInfo
;
28 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IDomainInfo
;
29 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.IEventInfo
;
30 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.ISessionInfo
;
31 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.LogLevelType
;
32 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.TraceChannelOutputType
;
33 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.TraceEnablement
;
34 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.TraceEventType
;
35 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.TraceLogLevel
;
36 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.TraceSessionState
;
37 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.core
.model
.impl
.SessionInfo
;
38 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.ui
.views
.service
.ILttngControlService
;
39 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.ui
.views
.service
.LTTngControlService
;
40 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.ui
.views
.service
.LTTngControlServiceConstants
;
41 import org
.eclipse
.tracecompass
.internal
.lttng2
.control
.ui
.views
.service
.LTTngControlServiceMI
;
42 import org
.junit
.Ignore
;
43 import org
.junit
.Test
;
49 @SuppressWarnings("javadoc")
50 public class LTTngControlServiceMiTest
extends LTTngControlServiceTest
{
52 private static final String MI_TEST_STREAM
= "LTTngServiceMiTest.cfg";
54 private static final String SCEN_SESSION_WITH_SYSCALLS
= "GetSessionWithSyscalls";
55 private static final String SCEN_LIST_SESSION_2_7_COMPAT
= "ListSession2.7Compat";
56 private static final String SCEN_GET_SESSION_FILTER_EXPRESSION
= "GetSessionFilterExpression";
57 private static final String SCEN_LIST_CONTEXT_28
= "ListContext28";
60 protected ILttngControlService
getControlService() {
62 URL resource
= LTTngControlServiceMI
.class.getResource(LTTngControlServiceConstants
.MI_XSD_FILENAME
);
63 return new LTTngControlServiceMI(getShell(), resource
);
64 } catch (ExecutionException e
) {
70 public void testGetSessionNameGarbage() {
72 fShell
.setScenario(SCEN_GET_SESSION_GARBAGE_OUT
);
73 fService
.getSessionNames(new NullProgressMonitor());
74 } catch (ExecutionException e
) {
75 // Success. Parsing of garbage result in an ExecutionException
76 // generated by the XML document parser: Unable to parse the xml
83 public void testCreateLiveSession() throws ExecutionException
{
84 fShell
.setScenario(SCEN_CREATE_LIVE_SESSION
);
86 ISessionInfo params
= new SessionInfo("mysession");
88 params
.setStreamedTrace(true);
89 params
.setNetworkUrl("net://127.0.0.1");
90 ISessionInfo sessionInfo
= fService
.createSession(params
, new NullProgressMonitor());
91 assertNotNull(sessionInfo
);
92 assertEquals("mysession", sessionInfo
.getName());
93 assertEquals(TraceSessionState
.INACTIVE
, sessionInfo
.getSessionState());
94 assertTrue(sessionInfo
.isStreamedTrace());
95 assertTrue(sessionInfo
.isLive());
96 assertEquals("tcp4://127.0.0.1:5342/ [data: 5343]", sessionInfo
.getSessionPath());
97 List
<String
> names
= fService
.getSessionNames(new NullProgressMonitor());
98 assertEquals(names
.get(0), "mysession");
99 fService
.destroySession("mysession", new NullProgressMonitor());
103 protected String
getTestStream() {
104 return MI_TEST_STREAM
;
108 protected TraceLogLevel
getAllEventTraceLogLevel() {
109 return TraceLogLevel
.TRACE_DEBUG
;
113 public void testGetKernelProviderNoUstVerbose() {
114 // Verbose mode in machine interface is deactivated. This test is
119 public void testCreateSession2_1() {
120 // 2.1 is not supported by mi. This test is ignored.
124 public void testGetKernelProviderNoUst3() {
125 // Verbose mode in machine interface is deactivated. This test is
130 public void testGetKernelProviderNoKernelVerbose() {
131 // Verbose mode in machine interface is deactivated. This test is
136 public void testCreateSessionVerbose2_1() {
137 // Verbose mode in machine interface is deactivated. This test is
142 public void testDestroySessionVerbose() {
143 // Verbose mode in machine interface is deactivated. This test is
148 public void testCreateSessionWithPrompt() {
149 // TODO Investigate if this case can happen in production. If yes than
150 // we need to rethinks the MI fetching and parsing.
154 public void testAddContext() {
155 // TODO This does not use mi feature.And currently the context enabling
160 public void testAddContextFailure() {
161 // TODO This does not use mi feature.And currently the context enabling
166 public void testListContext28() throws ExecutionException
{
167 ((LTTngControlService
)fService
).setVersion("2.8.0");
168 fShell
.setScenario(SCEN_LIST_CONTEXT_28
);
170 List
<String
> availContexts
= fService
.getContextList(new NullProgressMonitor());
171 assertNotNull(availContexts
);
172 assertEquals(12, availContexts
.size());
174 Set
<String
> expectedContexts
= new HashSet
<>();
175 expectedContexts
.add("pid");
176 expectedContexts
.add("procname");
177 expectedContexts
.add("prio");
178 expectedContexts
.add("nice");
179 expectedContexts
.add("vpid");
180 expectedContexts
.add("tid");
181 expectedContexts
.add("pthread_id");
182 expectedContexts
.add("vtid");
183 expectedContexts
.add("ppid");
184 expectedContexts
.add("vppid");
185 expectedContexts
.add("perf:cpu:cpu-cycles");
186 expectedContexts
.add("perf:cpu:cycles");
188 assertTrue(expectedContexts
.containsAll(availContexts
));
192 public void testCreateSnapshotSession2_5() {
193 // not applicable for MI
197 * Tests the listing of syscalls
200 public void testListSycallEvents() {
202 fShell
.setScenario(SCEN_SESSION_WITH_SYSCALLS
);
203 ISessionInfo session
= fService
.getSession("mysession", new NullProgressMonitor());
206 assertNotNull(session
);
207 assertEquals("mysession", session
.getName());
208 assertEquals("/home/user/lttng-traces/mysession-20120129-084256", session
.getSessionPath());
209 assertEquals(TraceSessionState
.INACTIVE
, session
.getSessionState());
211 IDomainInfo
[] domains
= session
.getDomains();
212 assertNotNull(domains
);
213 assertEquals(1, domains
.length
);
215 // Verify Kernel domain
216 assertEquals("Kernel", domains
[0].getName());
217 IChannelInfo
[] channels
= domains
[0].getChannels();
218 assertNotNull(channels
);
219 assertEquals(1, channels
.length
);
221 // Verify Kernel's channel0
222 assertEquals("channel0", channels
[0].getName());
223 assertEquals(4, channels
[0].getNumberOfSubBuffers());
224 assertEquals("splice()", channels
[0].getOutputType().getInName());
225 assertEquals(TraceChannelOutputType
.SPLICE
, channels
[0].getOutputType());
226 assertEquals(false, channels
[0].isOverwriteMode());
227 assertEquals(200, channels
[0].getReadTimer());
228 assertEquals(TraceEnablement
.ENABLED
, channels
[0].getState());
229 assertEquals(262144, channels
[0].getSubBufferSize());
230 assertEquals(0, channels
[0].getSwitchTimer());
233 IEventInfo
[] channel0Events
= channels
[0].getEvents();
234 assertNotNull(channel0Events
);
235 assertEquals(2, channel0Events
.length
);
236 assertEquals("read", channel0Events
[0].getName());
237 assertEquals(TraceEventType
.SYSCALL
, channel0Events
[0].getEventType());
238 assertEquals(TraceEnablement
.ENABLED
, channel0Events
[0].getState());
240 assertEquals("write", channel0Events
[1].getName());
241 assertEquals(TraceEventType
.SYSCALL
, channel0Events
[1].getEventType());
242 assertEquals(TraceEnablement
.ENABLED
, channel0Events
[1].getState());
243 } catch (ExecutionException e
) {
249 * Test List session for lttng 2.7.
251 * This is to make sure that it is possible to parse the output of a session
252 * create on a target with LTTng 2.7 installed.
257 public void testListSessionCompatibility_2_7() {
260 Note the session was created with basic commands:
261 lttng create mysession
262 lttng enable-event -a -k -s mysession
263 lttng enable-channel channel0 -u -s mysession --buffers-pid
264 lttng enable-event -a -u -s mysession -c channel0 --tracepoint
265 lttng add-context -u -t vtid -t procname
269 fShell
.setScenario(SCEN_LIST_SESSION_2_7_COMPAT
);
270 ISessionInfo session
= fService
.getSession("mysession", new NullProgressMonitor());
273 assertNotNull(session
);
274 assertEquals("mysession", session
.getName());
275 assertEquals("/home/user/lttng-traces/mysession-20151020-085614", session
.getSessionPath());
276 assertEquals(TraceSessionState
.INACTIVE
, session
.getSessionState());
278 IDomainInfo
[] domains
= session
.getDomains();
279 assertNotNull(domains
);
280 assertEquals(2, domains
.length
);
282 // Verify Kernel domain
283 assertEquals("Kernel", domains
[0].getName());
284 IChannelInfo
[] channels
= domains
[0].getChannels();
285 assertNotNull(channels
);
286 assertEquals(1, channels
.length
);
288 // Verify Kernel's channel0
289 assertEquals("channel0", channels
[0].getName());
290 assertEquals(4, channels
[0].getNumberOfSubBuffers());
291 assertEquals("splice()", channels
[0].getOutputType().getInName());
292 assertEquals(TraceChannelOutputType
.SPLICE
, channels
[0].getOutputType());
293 assertEquals(false, channels
[0].isOverwriteMode());
294 assertEquals(200000, channels
[0].getReadTimer());
295 assertEquals(TraceEnablement
.ENABLED
, channels
[0].getState());
296 assertEquals(262144, channels
[0].getSubBufferSize());
297 assertEquals(0, channels
[0].getSwitchTimer());
300 IEventInfo
[] channel0Events
= channels
[0].getEvents();
301 assertNotNull(channel0Events
);
302 assertEquals(2, channel0Events
.length
);
303 assertEquals("*", channel0Events
[0].getName());
304 assertEquals(TraceEventType
.SYSCALL
, channel0Events
[0].getEventType());
305 assertEquals(TraceEnablement
.ENABLED
, channel0Events
[0].getState());
307 assertEquals("*", channel0Events
[1].getName());
308 assertEquals(TraceLogLevel
.TRACE_EMERG
, channel0Events
[1].getLogLevel());
309 assertEquals(LogLevelType
.LOGLEVEL_ALL
, channel0Events
[1].getLogLevelType());
310 assertEquals(TraceEventType
.TRACEPOINT
, channel0Events
[1].getEventType());
311 assertEquals(TraceEnablement
.ENABLED
, channel0Events
[1].getState());
313 // Verify domain UST global
314 assertEquals("UST global", domains
[1].getName());
316 IChannelInfo
[] ustChannels
= domains
[1].getChannels();
318 // Verify UST global's channel0
319 assertEquals("channel0", ustChannels
[0].getName());
320 assertEquals(4, ustChannels
[0].getNumberOfSubBuffers());
321 assertEquals("mmap()", ustChannels
[0].getOutputType().getInName());
322 assertEquals(TraceChannelOutputType
.MMAP
, ustChannels
[0].getOutputType());
323 assertEquals(false, ustChannels
[0].isOverwriteMode());
324 assertEquals(0, ustChannels
[0].getReadTimer());
325 assertEquals(TraceEnablement
.ENABLED
, ustChannels
[0].getState());
326 assertEquals(4096, ustChannels
[0].getSubBufferSize());
327 assertEquals(0, ustChannels
[0].getSwitchTimer());
330 IEventInfo
[] ustEvents
= ustChannels
[0].getEvents();
331 assertEquals(1, ustEvents
.length
);
333 assertEquals("*", ustEvents
[0].getName());
334 assertEquals(TraceEventType
.TRACEPOINT
, ustEvents
[0].getEventType());
335 assertEquals(TraceEnablement
.ENABLED
, ustEvents
[0].getState());
337 } catch (ExecutionException e
) {
343 public void testGetSessionWithFilterExpression() throws ExecutionException
{
344 // FIXME: Disable scheme validation for now until MI 3.0 is integrated
345 LTTngControlServiceMI service
= new LTTngControlServiceMI(getShell(), null);
347 fShell
.setScenario(SCEN_GET_SESSION_FILTER_EXPRESSION
);
348 ISessionInfo session
= service
.getSession("mysession", new NullProgressMonitor());
351 assertNotNull(session
);
352 assertEquals("mysession", session
.getName());
353 assertEquals("/home/user/lttng-traces/mysession-20120129-084256", session
.getSessionPath());
354 assertEquals(TraceSessionState
.ACTIVE
, session
.getSessionState());
356 IDomainInfo
[] domains
= session
.getDomains();
357 assertNotNull(domains
);
358 assertEquals(2, domains
.length
);
360 // Verify Kernel domain
361 assertEquals("Kernel", domains
[0].getName());
362 IChannelInfo
[] channels
= domains
[0].getChannels();
363 assertNotNull(channels
);
364 assertEquals(1, channels
.length
);
366 // Verify Kernel's channel0
367 assertEquals("channel0", channels
[0].getName());
368 assertEquals(4, channels
[0].getNumberOfSubBuffers());
369 assertEquals("splice()", channels
[0].getOutputType().getInName());
370 assertEquals(TraceChannelOutputType
.SPLICE
, channels
[0].getOutputType());
371 assertEquals(false, channels
[0].isOverwriteMode());
372 assertEquals(200, channels
[0].getReadTimer());
373 assertEquals(TraceEnablement
.ENABLED
, channels
[0].getState());
374 assertEquals(262144, channels
[0].getSubBufferSize());
375 assertEquals(0, channels
[0].getSwitchTimer());
378 IEventInfo
[] channel0Events
= channels
[0].getEvents();
379 assertNotNull(channel0Events
);
380 assertEquals(1, channel0Events
.length
);
381 assertEquals("block_rq_remap", channel0Events
[0].getName());
382 assertEquals(TraceLogLevel
.TRACE_EMERG
, channel0Events
[0].getLogLevel());
383 assertEquals(TraceEventType
.TRACEPOINT
, channel0Events
[0].getEventType());
384 assertEquals(TraceEnablement
.ENABLED
, channel0Events
[0].getState());
385 assertEquals("foo > 10", channel0Events
[0].getFilterExpression());
387 // Verify domain UST global
388 assertEquals("UST global", domains
[1].getName());
390 IChannelInfo
[] ustChannels
= domains
[1].getChannels();
392 // Verify UST global's channel0
393 assertEquals("channel0", ustChannels
[0].getName());
394 assertEquals(4, ustChannels
[0].getNumberOfSubBuffers());
395 assertEquals("mmap()", ustChannels
[0].getOutputType().getInName());
396 assertEquals(TraceChannelOutputType
.MMAP
, ustChannels
[0].getOutputType());
397 assertEquals(false, ustChannels
[0].isOverwriteMode());
398 assertEquals(200, ustChannels
[0].getReadTimer());
399 assertEquals(TraceEnablement
.ENABLED
, ustChannels
[0].getState());
400 assertEquals(4096, ustChannels
[0].getSubBufferSize());
401 assertEquals(0, ustChannels
[0].getSwitchTimer());
404 IEventInfo
[] ustEvents
= ustChannels
[0].getEvents();
405 assertEquals(1, ustEvents
.length
);
407 assertEquals("ust_tests_hello:tptest_sighandler", ustEvents
[0].getName());
408 assertEquals(TraceLogLevel
.TRACE_DEBUG_LINE
, ustEvents
[0].getLogLevel());
409 assertEquals(TraceEventType
.TRACEPOINT
, ustEvents
[0].getEventType());
410 assertEquals(TraceEnablement
.DISABLED
, ustEvents
[0].getState());
411 assertEquals("foo > 10", ustEvents
[0].getFilterExpression());