blob: 5048494f45a4311ec247aff5361ae2ccf218e04b [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Jonathan Rajotte - Support of machine interface
**********************************************************************/
package org.eclipse.tracecompass.lttng2.control.ui.tests.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.IChannelInfo;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.IDomainInfo;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.IEventInfo;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.ILoggerInfo;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.ISessionInfo;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceChannelOutputType;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceEnablement;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceEventType;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLog4jLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TracePythonLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceSessionState;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.impl.SessionInfo;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.service.ILttngControlService;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.service.LTTngControlServiceMI;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.service.LttngVersion;
import org.junit.Ignore;
import org.junit.Test;
/**
* @author ejorajo
*
*/
public class LTTngControlServiceMiTest extends LTTngControlServiceTest {
private static final String MI_TEST_STREAM = "LTTngServiceMiTest.cfg";
private static final String SCEN_SESSION_WITH_SYSCALLS = "GetSessionWithSyscalls";
private static final String SCEN_LIST_SESSION_2_7_COMPAT = "ListSession2.7Compat";
private static final String SCEN_ENABLING_JUL_LOGGERS = "EnableJulLoggers";
private static final String SCEN_ENABLING_LOG4J_LOGGERS = "EnableLog4jLoggers";
private static final String SCEN_ENABLING_PYTHON_LOGGERS = "EnablePythonLoggers";
@Override
protected ILttngControlService getControlService() {
try {
return new LTTngControlServiceMI(getShell(), new LttngVersion("2.7.0"));
} catch (ExecutionException e) {
return null;
}
}
@Override
public void testGetSessionNameGarbage() {
try {
fShell.setScenario(SCEN_GET_SESSION_GARBAGE_OUT);
fService.getSessionNames(new NullProgressMonitor());
} catch (ExecutionException e) {
// Success. Parsing of garbage result in an ExecutionException
// generated by the XML document parser: Unable to parse the xml
// document.
}
}
@Override
@Ignore
public void testCreateLiveSession() throws ExecutionException {
fShell.setScenario(SCEN_CREATE_LIVE_SESSION);
ISessionInfo params = new SessionInfo("mysession");
params.setLive(true);
params.setStreamedTrace(true);
params.setNetworkUrl("net://127.0.0.1");
ISessionInfo sessionInfo = fService.createSession(params, new NullProgressMonitor());
assertNotNull(sessionInfo);
assertEquals("mysession", sessionInfo.getName());
assertEquals(TraceSessionState.INACTIVE, sessionInfo.getSessionState());
assertTrue(sessionInfo.isStreamedTrace());
assertTrue(sessionInfo.isLive());
assertEquals("tcp4://127.0.0.1:5342/ [data: 5343]", sessionInfo.getSessionPath());
List<String> names = fService.getSessionNames(new NullProgressMonitor());
assertEquals(names.get(0), "mysession");
fService.destroySession("mysession", new NullProgressMonitor());
}
@Override
protected String getTestStream() {
return MI_TEST_STREAM;
}
@Override
protected TraceLogLevel getAllEventTraceLogLevel() {
return TraceLogLevel.TRACE_DEBUG;
}
@Override
public void testGetKernelProviderNoUstVerbose() {
// Verbose mode in machine interface is deactivated. This test is
// ignored.
}
@Override
public void testCreateSession2_1() {
// 2.1 is not supported by mi. This test is ignored.
}
@Override
public void testGetKernelProviderNoUst3() {
// Verbose mode in machine interface is deactivated. This test is
// ignored.
}
@Override
public void testGetKernelProviderNoKernelVerbose() {
// Verbose mode in machine interface is deactivated. This test is
// ignored.
}
@Override
public void testCreateSessionVerbose2_1() {
// Verbose mode in machine interface is deactivated. This test is
// ignored.
}
@Override
public void testDestroySessionVerbose() {
// Verbose mode in machine interface is deactivated. This test is
// ignored.
}
@Override
public void testCreateSessionWithPrompt() {
// TODO Investigate if this case can happen in production. If yes than
// we need to rethinks the MI fetching and parsing.
}
@Override
public void testAddContext() {
// TODO This does not use mi feature.And currently the context enabling
// is wrong for 2.6.
}
@Override
public void testAddContextFailure() {
// TODO This does not use mi feature.And currently the context enabling
// is wrong for 2.6.
}
@Override
public void testCreateSnapshotSession2_5() {
// not applicable for MI
}
/**
* Tests the listing of syscalls
*/
@Test
public void testListSycallEvents() {
try {
fShell.setScenario(SCEN_SESSION_WITH_SYSCALLS);
ISessionInfo session = fService.getSession("mysession", new NullProgressMonitor());
// Verify Session
assertNotNull(session);
assertEquals("mysession", session.getName());
assertEquals("/home/user/lttng-traces/mysession-20120129-084256", session.getSessionPath());
assertEquals(TraceSessionState.INACTIVE, session.getSessionState());
IDomainInfo[] domains = session.getDomains();
assertNotNull(domains);
assertEquals(1, domains.length);
// Verify Kernel domain
assertEquals("Kernel", domains[0].getName());
IChannelInfo[] channels = domains[0].getChannels();
assertNotNull(channels);
assertEquals(1, channels.length);
// Verify Kernel's channel0
assertEquals("channel0", channels[0].getName());
assertEquals(4, channels[0].getNumberOfSubBuffers());
assertEquals("splice()", channels[0].getOutputType().getInName());
assertEquals(TraceChannelOutputType.SPLICE, channels[0].getOutputType());
assertEquals(false, channels[0].isOverwriteMode());
assertEquals(200, channels[0].getReadTimer());
assertEquals(TraceEnablement.ENABLED, channels[0].getState());
assertEquals(262144, channels[0].getSubBufferSize());
assertEquals(0, channels[0].getSwitchTimer());
// Verify event info
IEventInfo[] channel0Events = channels[0].getEvents();
assertNotNull(channel0Events);
assertEquals(2, channel0Events.length);
assertEquals("read", channel0Events[0].getName());
assertEquals(TraceEventType.SYSCALL, channel0Events[0].getEventType());
assertEquals(TraceEnablement.ENABLED, channel0Events[0].getState());
assertEquals("write", channel0Events[1].getName());
assertEquals(TraceEventType.SYSCALL, channel0Events[1].getEventType());
assertEquals(TraceEnablement.ENABLED, channel0Events[1].getState());
} catch (ExecutionException e) {
fail(e.toString());
}
}
/**
* Test List session for lttng 2.7.
*
* This is to make sure that it is possible to parse the output of a session
* create on a target with LTTng 2.7 installed.
*
*
*/
@Test
public void testListSessionCompatibility_2_7() {
/*
Note the session was created with basic commands:
lttng create mysession
lttng enable-event -a -k -s mysession
lttng enable-channel channel0 -u -s mysession --buffers-pid
lttng enable-event -a -u -s mysession -c channel0 --tracepoint
lttng add-context -u -t vtid -t procname
*/
try {
fShell.setScenario(SCEN_LIST_SESSION_2_7_COMPAT);
ISessionInfo session = fService.getSession("mysession", new NullProgressMonitor());
// Verify Session
assertNotNull(session);
assertEquals("mysession", session.getName());
assertEquals("/home/user/lttng-traces/mysession-20151020-085614", session.getSessionPath());
assertEquals(TraceSessionState.INACTIVE, session.getSessionState());
IDomainInfo[] domains = session.getDomains();
assertNotNull(domains);
assertEquals(2, domains.length);
// Verify Kernel domain
assertEquals("Kernel", domains[0].getName());
IChannelInfo[] channels = domains[0].getChannels();
assertNotNull(channels);
assertEquals(1, channels.length);
// Verify Kernel's channel0
assertEquals("channel0", channels[0].getName());
assertEquals(4, channels[0].getNumberOfSubBuffers());
assertEquals("splice()", channels[0].getOutputType().getInName());
assertEquals(TraceChannelOutputType.SPLICE, channels[0].getOutputType());
assertEquals(false, channels[0].isOverwriteMode());
assertEquals(200000, channels[0].getReadTimer());
assertEquals(TraceEnablement.ENABLED, channels[0].getState());
assertEquals(262144, channels[0].getSubBufferSize());
assertEquals(0, channels[0].getSwitchTimer());
// Verify event info
IEventInfo[] channel0Events = channels[0].getEvents();
assertNotNull(channel0Events);
assertEquals(2, channel0Events.length);
assertEquals("*", channel0Events[0].getName());
assertEquals(TraceEventType.SYSCALL, channel0Events[0].getEventType());
assertEquals(TraceEnablement.ENABLED, channel0Events[0].getState());
assertEquals("*", channel0Events[1].getName());
assertEquals(TraceLogLevel.TRACE_EMERG, channel0Events[1].getLogLevel());
assertEquals(LogLevelType.LOGLEVEL_ALL, channel0Events[1].getLogLevelType());
assertEquals(TraceEventType.TRACEPOINT, channel0Events[1].getEventType());
assertEquals(TraceEnablement.ENABLED, channel0Events[1].getState());
// Verify domain UST global
assertEquals("UST global", domains[1].getName());
IChannelInfo[] ustChannels = domains[1].getChannels();
// Verify UST global's channel0
assertEquals("channel0", ustChannels[0].getName());
assertEquals(4, ustChannels[0].getNumberOfSubBuffers());
assertEquals("mmap()", ustChannels[0].getOutputType().getInName());
assertEquals(TraceChannelOutputType.MMAP, ustChannels[0].getOutputType());
assertEquals(false, ustChannels[0].isOverwriteMode());
assertEquals(0, ustChannels[0].getReadTimer());
assertEquals(TraceEnablement.ENABLED, ustChannels[0].getState());
assertEquals(4096, ustChannels[0].getSubBufferSize());
assertEquals(0, ustChannels[0].getSwitchTimer());
// Verify event info
IEventInfo[] ustEvents = ustChannels[0].getEvents();
assertEquals(1, ustEvents.length);
assertEquals("*", ustEvents[0].getName());
assertEquals(TraceEventType.TRACEPOINT, ustEvents[0].getEventType());
assertEquals(TraceEnablement.ENABLED, ustEvents[0].getState());
} catch (ExecutionException e) {
fail(e.toString());
}
}
@Override
public void testEnableJulLoggers() {
try {
String sessionName = "mysession";
// Lists
List<String> loggerList = new ArrayList<>();
// Loggers
String loggerName1 = "logger";
String loggerName2 = "anotherLogger";
String allLoggerName = "*";
fShell.setScenario(SCEN_ENABLING_JUL_LOGGERS);
// 1) Enabling all loggers
loggerList.add(allLoggerName);
fService.enableEvents(sessionName, null, loggerList, TraceDomainType.JUL, null, null, new NullProgressMonitor());
loggerList.clear();
// 2) Enabling one logger
loggerList.add(loggerName1);
fService.enableEvents(sessionName, null, loggerList, TraceDomainType.JUL, null, null, new NullProgressMonitor());
// 3) Enabling two loggers with loglevel-only JUL_WARNING and
// verifying the attributes of one of them
loggerList.add(loggerName2);
fService.enableLogLevel(sessionName, null, loggerList, LogLevelType.LOGLEVEL_ONLY, TraceJulLogLevel.JUL_WARNING, null, TraceDomainType.JUL, new NullProgressMonitor());
@Nullable
ISessionInfo session = fService.getSession(sessionName, new NullProgressMonitor());
assertNotNull(session);
// Get the list of loggers
List<ILoggerInfo> loggers = session.getDomains()[1].getLoggers();
assertNotNull(loggers);
assertEquals(loggers.size(), 4);
// Get the "anotherLogger" logger
ILoggerInfo loggerInfo = loggers.stream()
.filter(logger -> logger.getName().equals(loggerName2))
.findFirst().get();
// Verify attributes
assertEquals(loggerName2, loggerInfo.getName());
assertEquals(TraceDomainType.JUL, loggerInfo.getDomain());
assertEquals(TraceJulLogLevel.JUL_WARNING, loggerInfo.getLogLevel());
assertEquals(LogLevelType.LOGLEVEL_ONLY, loggerInfo.getLogLevelType());
assertEquals(TraceEnablement.ENABLED, loggerInfo.getState());
} catch (ExecutionException e) {
fail(e.toString());
}
}
@Override
public void testEnableLog4jLoggers() {
try {
String sessionName = "mysession";
// Lists
List<String> loggerList = new ArrayList<>();
// Loggers
String loggerName1 = "logger";
String loggerName2 = "anotherLogger";
String allLoggerName = "*";
fShell.setScenario(SCEN_ENABLING_LOG4J_LOGGERS);
// 1) Enabling all loggers
loggerList.add(allLoggerName);
fService.enableEvents(sessionName, null, loggerList, TraceDomainType.LOG4J, null, null, new NullProgressMonitor());
loggerList.clear();
// 2) Enabling one logger
loggerList.add(loggerName1);
fService.enableEvents(sessionName, null, loggerList, TraceDomainType.LOG4J, null, null, new NullProgressMonitor());
// 3) Enabling two loggers with loglevel-only LOG4J_FATAL and
// verifying the attributes of one of them
loggerList.add(loggerName2);
fService.enableLogLevel(sessionName, null, loggerList, LogLevelType.LOGLEVEL_ONLY, TraceLog4jLogLevel.LOG4J_FATAL, null, TraceDomainType.LOG4J, new NullProgressMonitor());
@Nullable
ISessionInfo session = fService.getSession(sessionName, new NullProgressMonitor());
assertNotNull(session);
// Get the list of loggers
List<ILoggerInfo> loggers = session.getDomains()[1].getLoggers();
assertNotNull(loggers);
assertEquals(4, loggers.size());
// Get the "anotherLogger" logger
ILoggerInfo loggerInfo = loggers.stream()
.filter(logger -> logger.getName().equals(loggerName2))
.findFirst().get();
// Verify attributes
assertEquals(loggerName2, loggerInfo.getName());
assertEquals(TraceDomainType.LOG4J, loggerInfo.getDomain());
assertEquals(TraceLog4jLogLevel.LOG4J_FATAL, loggerInfo.getLogLevel());
assertEquals(LogLevelType.LOGLEVEL_ONLY, loggerInfo.getLogLevelType());
assertEquals(TraceEnablement.ENABLED, loggerInfo.getState());
} catch (ExecutionException e) {
fail(e.toString());
}
}
@Override
public void testEnablePythonLoggers() {
try {
String sessionName = "mysession";
// Lists
List<String> loggerList = new ArrayList<>();
// Loggers
String loggerName1 = "logger";
String loggerName2 = "anotherLogger";
String allLoggerName = "*";
fShell.setScenario(SCEN_ENABLING_PYTHON_LOGGERS);
// 1) Enabling all loggers
loggerList.add(allLoggerName);
fService.enableEvents(sessionName, null, loggerList, TraceDomainType.PYTHON, null, null, new NullProgressMonitor());
loggerList.clear();
// 2) Enabling one logger
loggerList.add(loggerName1);
fService.enableEvents(sessionName, null, loggerList, TraceDomainType.PYTHON, null, null, new NullProgressMonitor());
// 3) Enabling two loggers with loglevel-only PYTHON_CRITICAL and
// verifying the attributes of one of them
loggerList.add(loggerName2);
fService.enableLogLevel(sessionName, null, loggerList, LogLevelType.LOGLEVEL_ONLY, TracePythonLogLevel.PYTHON_CRITICAL, null, TraceDomainType.PYTHON, new NullProgressMonitor());
@Nullable
ISessionInfo session = fService.getSession(sessionName, new NullProgressMonitor());
assertNotNull(session);
// Get the list of loggers
List<ILoggerInfo> loggers = session.getDomains()[1].getLoggers();
assertNotNull(loggers);
assertEquals(4, loggers.size());
// Get the "anotherLogger" logger
ILoggerInfo loggerInfo = loggers.stream()
.filter(logger -> logger.getName().equals(loggerName2))
.findFirst().get();
// Verify attributes
assertEquals(loggerName2, loggerInfo.getName());
assertEquals(TraceDomainType.PYTHON, loggerInfo.getDomain());
assertEquals(TracePythonLogLevel.PYTHON_CRITICAL, loggerInfo.getLogLevel());
assertEquals(LogLevelType.LOGLEVEL_ONLY, loggerInfo.getLogLevelType());
assertEquals(TraceEnablement.ENABLED, loggerInfo.getState());
} catch (ExecutionException e) {
fail(e.toString());
}
}
}