/******************************************************************************* * Copyright (c) 2015 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.eclipse.tracecompass.lttng2.control.ui.swtbot.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.net.URL; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.Logger; import org.apache.log4j.SimpleLayout; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.remote.core.IRemoteConnection; import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; import org.eclipse.swtbot.swt.finder.SWTBot; import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner; import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences; import org.eclipse.swtbot.swt.finder.waits.Conditions; import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton; import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox; import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu; import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell; import org.eclipse.swtbot.swt.finder.widgets.SWTBotText; import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree; import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem; import org.eclipse.tracecompass.ctf.core.tests.shared.LttngTraceGenerator; import org.eclipse.tracecompass.internal.lttng2.control.core.model.TargetNodeState; import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceSessionState; import org.eclipse.tracecompass.internal.lttng2.control.stubs.service.TestRemoteSystemProxy; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.ControlView; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.ITraceControlComponent; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TargetNodeComponent; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceSessionComponent; import org.eclipse.tracecompass.tmf.remote.core.proxy.TmfRemoteConnectionFactory; import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement; import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentFolder; import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectElement; import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectRegistry; import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers; import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils; import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils; import org.eclipse.ui.IViewPart; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.osgi.framework.FrameworkUtil; /** * Test for the LTTng Control view in Trace Compass * * @author Bernd Hufmann */ @RunWith(SWTBotJunit4ClassRunner.class) public class ControlViewTest { // ------------------------------------------------------------------------ // Constants // ------------------------------------------------------------------------ private static final String TEST_STREAM = "CreateSessionTestLTTng2_8.cfg"; /** The initialize scenario name */ protected static final String INIT_SCENARIO_NAME = "Initialize"; private static final String CREATE_SESSION_WITH_LTTNG_2_8_SCENARIO_NAME = "CreateSession_2.8"; private static final String SESSION_NAME = "mysession"; private static final String UST_CHANNEL_NAME = ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME; private static final String NODE_NAME = "myNode"; private static final String PERSPECTIVE_ID = "org.eclipse.tracecompass.lttng2.control.ui.swtbot.tests.perspective"; // ------------------------------------------------------------------------ // Test data // ------------------------------------------------------------------------ /** The Log4j logger instance. */ protected static final Logger fLogger = Logger.getRootLogger(); /** The workbench bot */ protected static SWTWorkbenchBot fBot; private IRemoteConnection fHost = TmfRemoteConnectionFactory.getLocalConnection(); /** The test remote system proxy */ protected @NonNull TestRemoteSystemProxy fProxy = new TestRemoteSystemProxy(fHost); /** The trace control tree */ protected SWTBotTree fTree; /** The trace control root component */ protected ITraceControlComponent fRoot; /** The target node component */ protected TargetNodeComponent fNode; /** The test file */ protected String fTestFile; // ------------------------------------------------------------------------ // Housekeeping // ------------------------------------------------------------------------ /** * Initialization */ @BeforeClass public static void init() { SWTBotUtils.initialize(); Thread.currentThread().setName("SWTBot Thread"); // for the debugger /* set up for swtbot */ SWTBotPreferences.TIMEOUT = 20000; /* 20 second timeout */ fLogger.addAppender(new ConsoleAppender(new SimpleLayout())); fBot = new SWTWorkbenchBot(); SWTBotUtils.closeView("welcome", fBot); /* finish waiting for eclipse to load */ WaitUtils.waitForJobs(); SWTBotUtils.switchToPerspective(PERSPECTIVE_ID); } /** * Open a trace in an editor * * @throws Exception * if problem occurs */ @Before public void beforeTest() throws Exception { SWTBotUtils.openView(ControlView.ID); WaitUtils.waitForJobs(); URL location = FileLocator.find(FrameworkUtil.getBundle(this.getClass()), new Path("testfiles" + File.separator + getTestStream()), null); File testfile = new File(FileLocator.toFileURL(location).toURI()); fTestFile = testfile.getAbsolutePath(); // Create root component SWTBotView viewBot = fBot.viewById(ControlView.ID); viewBot.setFocus(); IViewPart part = viewBot.getViewReference().getView(true); ControlView view = (ControlView) part; fRoot = view.getTraceControlRoot(); // Create node component fNode = new TargetNodeComponent(getNodeName(), fRoot, fProxy); fRoot.addChild(fNode); fTree = viewBot.bot().tree(); } /** * Close the editor */ @After public void tearDown() { fBot.closeAllEditors(); if (fRoot != null) { fRoot.removeAllChildren(); } } /** * Get the test stream file name to use for the test suite * * @return the name of the test stream file */ protected String getTestStream() { return TEST_STREAM; } /** * Get the session name * * @return the session name for this test */ protected String getSessionName() { return SESSION_NAME; } /** * Get the node name * * @return the node name for the test */ protected String getNodeName() { return NODE_NAME; } /** * Test basic trace session generation. */ @Test public void testTraceSessionTree() { fProxy.setTestFile(fTestFile); fProxy.setScenario(INIT_SCENARIO_NAME); testConnectToNode(); // Set the scenario fProxy.setScenario(CREATE_SESSION_WITH_LTTNG_2_8_SCENARIO_NAME); testCreateSession(); testEnableKernelEvent(); testEnableSyscalls(); testEnableUstChannel(); testEnableUstEvents(); testStartStopTracing(TraceSessionState.ACTIVE); testStartStopTracing(TraceSessionState.INACTIVE); // Import without experiment creation testImport(false, true); SWTBotUtils.clearTracesFolder(fBot, ControlViewSwtBotUtil.DEFAULT_REMOTE_PROJECT); // Import with experiment creation (default experiment name) testImport(true, true); SWTBotUtils.clearTracesFolder(fBot, ControlViewSwtBotUtil.DEFAULT_REMOTE_PROJECT); /* * Import with experiment creation, test experiment already exists and * with experiment name validation */ testImport(true, false); SWTBotUtils.clearExperimentFolder(fBot, ControlViewSwtBotUtil.DEFAULT_REMOTE_PROJECT); testDestroySession(); testDisconnectFromNode(); SWTBotUtils.deleteProject(ControlViewSwtBotUtil.DEFAULT_REMOTE_PROJECT, fBot); } /** * Test connect to node */ protected void testConnectToNode() { SWTBotTreeItem nodeItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName()); nodeItem.select(); SWTBotMenu menuBot = nodeItem.contextMenu(ControlViewSwtBotUtil.CONNECT_MENU_ITEM); menuBot.click(); fBot.waitUntil(ConditionHelpers.IsTreeChildNodeAvailable(ControlViewSwtBotUtil.SESSION_GROUP_NAME, nodeItem)); // Verify that node is connected fBot.waitUntil(ControlViewSwtBotUtil.isStateChanged(fNode, TargetNodeState.CONNECTED)); // Wait for node configuration jobs WaitUtils.waitForJobs(); assertEquals(TargetNodeState.CONNECTED, fNode.getTargetNodeState()); } /** * Test create session */ protected void testCreateSession() { SWTBotTreeItem nodeItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName()); SWTBotTreeItem sessionGroupItem = nodeItem.getNode(ControlViewSwtBotUtil.SESSION_GROUP_NAME); sessionGroupItem.select(); SWTBotMenu menuBot = sessionGroupItem.contextMenu(ControlViewSwtBotUtil.CREATE_SESSION_MENU_ITEM); menuBot.click(); SWTBotShell shell = fBot.shell(ControlViewSwtBotUtil.CREATE_SESSION_DIALOG_TITLE).activate(); SWTBotText sessionText = shell.bot().textWithLabel(ControlViewSwtBotUtil.SESSION_NAME_LABEL); sessionText.setText(SESSION_NAME); shell.bot().button(ControlViewSwtBotUtil.DIALOG_OK_BUTTON).click(); WaitUtils.waitForJobs(); sessionGroupItem.expand(); fBot.waitUntil(ConditionHelpers.IsTreeChildNodeAvailable(getSessionName(), sessionGroupItem)); assertEquals(1, sessionGroupItem.getNodes().size()); SWTBotTreeItem sessionItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName()); assertEquals(getSessionName(), sessionItem.getText()); } /** * Test enable event (all kernel tracepoints) on session level */ protected void testEnableKernelEvent() { SWTBotTreeItem sessionItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName()); sessionItem.select(); SWTBotMenu menuBot = sessionItem.contextMenu(ControlViewSwtBotUtil.ENABLE_EVENT_DEFAULT_CHANNEL_MENU_ITEM); menuBot.click(); SWTBotShell shell = fBot.shell(ControlViewSwtBotUtil.ENABLE_EVENT_DIALOG_TITLE).activate(); shell.bot().radioInGroup(ControlViewSwtBotUtil.GROUP_SELECT_NAME, ControlViewSwtBotUtil.TRACEPOINTS_GROUP_NAME).click(); SWTBotTree tracepointsTree = shell.bot().treeInGroup(ControlViewSwtBotUtil.TRACEPOINTS_GROUP_NAME); SWTBotTreeItem allItem = SWTBotUtils.getTreeItem(fBot, tracepointsTree, ControlViewSwtBotUtil.ALL_TREE_NODE); allItem.check(); shell.bot().button(ControlViewSwtBotUtil.DIALOG_OK_BUTTON).click(); WaitUtils.waitForJobs(); fBot.waitUntil(ConditionHelpers.IsTreeChildNodeAvailable(ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, sessionItem)); SWTBotTreeItem channelItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME); assertEquals(ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME, channelItem.getText()); SWTBotTreeItem eventItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME, ControlViewSwtBotUtil.ALL_EVENTS_NAME); assertEquals(ControlViewSwtBotUtil.ALL_EVENTS_NAME, eventItem.getText()); SWTBotTreeItem kernelDomainItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME); assertEquals(ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, kernelDomainItem.getText()); } /** * Test enable Event (syscall) on domain level */ protected void testEnableSyscalls() { // Case 1: Enabling all syscalls SWTBotTreeItem sessionItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName()); sessionItem.select(); SWTBotMenu menuBot = sessionItem.contextMenu(ControlViewSwtBotUtil.ENABLE_EVENT_DEFAULT_CHANNEL_MENU_ITEM); menuBot.click(); SWTBotShell shell = fBot.shell(ControlViewSwtBotUtil.ENABLE_EVENT_DIALOG_TITLE).activate(); shell.bot().radioInGroup(ControlViewSwtBotUtil.GROUP_SELECT_NAME, ControlViewSwtBotUtil.SYSCALL_GROUP_NAME).click(); SWTBotTree syscallsTree = shell.bot().treeInGroup(ControlViewSwtBotUtil.SYSCALL_GROUP_NAME); SWTBotTreeItem allItem = SWTBotUtils.getTreeItem(fBot, syscallsTree, ControlViewSwtBotUtil.ALL_TREE_NODE); allItem.check(); shell.bot().button(ControlViewSwtBotUtil.DIALOG_OK_BUTTON).click(); WaitUtils.waitForJobs(); fBot.waitUntil(ConditionHelpers.IsTreeChildNodeAvailable(ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, sessionItem)); SWTBotTreeItem kernelDomainItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME); assertEquals(ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, kernelDomainItem.getText()); SWTBotTreeItem channelItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME); assertEquals(ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME, channelItem.getText()); SWTBotTreeItem eventItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME, ControlViewSwtBotUtil.ALL_EVENTS_NAME); assertEquals(ControlViewSwtBotUtil.ALL_EVENTS_NAME, eventItem.getText()); // Case 2: Enabling three syscalls (write, read, close) from the syscall tree sessionItem.select(); menuBot = sessionItem.contextMenu(ControlViewSwtBotUtil.ENABLE_EVENT_DEFAULT_CHANNEL_MENU_ITEM); menuBot.click(); shell = fBot.shell(ControlViewSwtBotUtil.ENABLE_EVENT_DIALOG_TITLE).activate(); shell.bot().radioInGroup(ControlViewSwtBotUtil.GROUP_SELECT_NAME, ControlViewSwtBotUtil.SYSCALL_GROUP_NAME).click(); syscallsTree = shell.bot().treeInGroup(ControlViewSwtBotUtil.SYSCALL_GROUP_NAME); allItem = SWTBotUtils.getTreeItem(fBot, syscallsTree, ControlViewSwtBotUtil.ALL_TREE_NODE); allItem.expand(); // Enable 'write' syscall SWTBotTreeItem writeItem = SWTBotUtils.getTreeItem(fBot, syscallsTree, ControlViewSwtBotUtil.ALL_TREE_NODE, ControlViewSwtBotUtil.SYSCALL_WRITE_EVENT); writeItem.check(); // Enable 'read' syscall SWTBotTreeItem readItem = SWTBotUtils.getTreeItem(fBot, syscallsTree, ControlViewSwtBotUtil.ALL_TREE_NODE, ControlViewSwtBotUtil.SYSCALL_READ_EVENT); readItem.check(); // Enable 'close' syscall SWTBotTreeItem closeItem = SWTBotUtils.getTreeItem(fBot, syscallsTree, ControlViewSwtBotUtil.ALL_TREE_NODE, ControlViewSwtBotUtil.SYSCALL_CLOSE_EVENT); closeItem.check(); shell.bot().button(ControlViewSwtBotUtil.DIALOG_OK_BUTTON).click(); WaitUtils.waitForJobs(); fBot.waitUntil(ConditionHelpers.IsTreeChildNodeAvailable(ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, sessionItem)); kernelDomainItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME); assertEquals(ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, kernelDomainItem.getText()); channelItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME); assertEquals(ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME, channelItem.getText()); eventItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME, ControlViewSwtBotUtil.SYSCALL_WRITE_EVENT); assertEquals(ControlViewSwtBotUtil.SYSCALL_WRITE_EVENT, eventItem.getText()); eventItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME, ControlViewSwtBotUtil.SYSCALL_READ_EVENT); assertEquals(ControlViewSwtBotUtil.SYSCALL_READ_EVENT, eventItem.getText()); eventItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.KERNEL_DOMAIN_NAME, ControlViewSwtBotUtil.DEFAULT_CHANNEL_NAME, ControlViewSwtBotUtil.SYSCALL_CLOSE_EVENT); assertEquals(ControlViewSwtBotUtil.SYSCALL_CLOSE_EVENT, eventItem.getText()); } /** * Test enable UST channel on session level (default values) */ protected void testEnableUstChannel() { SWTBotTreeItem sessionItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName()); sessionItem.select(); SWTBotMenu menuBot = sessionItem.contextMenu(ControlViewSwtBotUtil.ENABLE_CHANNEL_MENU_ITEM); menuBot.click(); SWTBotShell shell = fBot.shell(ControlViewSwtBotUtil.ENABLE_CHANNEL_DIALOG_TITLE).activate(); SWTBotText channelText = shell.bot().textWithLabel(ControlViewSwtBotUtil.CHANNEL_NAME_LABEL); channelText.setText(UST_CHANNEL_NAME); shell.bot().radioInGroup(ControlViewSwtBotUtil.UST_GROUP_NAME, ControlViewSwtBotUtil.DOMAIN_GROUP_NAME).click(); shell.bot().radioInGroup(ControlViewSwtBotUtil.BUFFERTYPE_PER_UID, ControlViewSwtBotUtil.BUFFERTYPE_GROUP_NAME).click(); shell.bot().button(ControlViewSwtBotUtil.DIALOG_OK_BUTTON).click(); WaitUtils.waitForJobs(); fBot.waitUntil(ConditionHelpers.IsTreeChildNodeAvailable(ControlViewSwtBotUtil.UST_DOMAIN_NAME, sessionItem)); } /** * Test enable event (all tracepoints) on channel level */ protected void testEnableUstEvents() { SWTBotTreeItem channelItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.UST_DOMAIN_NAME, UST_CHANNEL_NAME); assertEquals(UST_CHANNEL_NAME, channelItem.getText()); channelItem.select(); SWTBotMenu menuBot = channelItem.contextMenu(ControlViewSwtBotUtil.ENABLE_EVENT_MENU_ITEM); menuBot.click(); SWTBotShell shell = fBot.shell(ControlViewSwtBotUtil.ENABLE_EVENT_DIALOG_TITLE).activate(); SWTBotTree tracepointsTree = shell.bot().tree(); tracepointsTree.select(ControlViewSwtBotUtil.ALL_TREE_NODE); shell.bot().button(ControlViewSwtBotUtil.DIALOG_OK_BUTTON).click(); WaitUtils.waitForJobs(); SWTBotTreeItem eventItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName(), ControlViewSwtBotUtil.UST_DOMAIN_NAME, UST_CHANNEL_NAME, ControlViewSwtBotUtil.ALL_EVENTS_NAME); assertEquals(ControlViewSwtBotUtil.ALL_EVENTS_NAME, eventItem.getText()); } /** * Test start or stop tracing * * @param state * the state to change to */ protected void testStartStopTracing(TraceSessionState state) { SWTBotTreeItem sessionItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName()); sessionItem.select(); if (state == TraceSessionState.ACTIVE) { SWTBotMenu menuBot = sessionItem.contextMenu(ControlViewSwtBotUtil.START_MENU_ITEM); menuBot.click(); WaitUtils.waitForJobs(); } else { SWTBotMenu menuBot = sessionItem.contextMenu(ControlViewSwtBotUtil.STOP_MENU_ITEM); menuBot.click(); WaitUtils.waitForJobs(); } TraceSessionComponent sessionComp = ControlViewSwtBotUtil.getSessionComponent(fNode, getSessionName()); fBot.waitUntil(ControlViewSwtBotUtil.isSessionStateChanged(sessionComp, state)); assertEquals(state, sessionComp.getSessionState()); } /** * Test destroy session */ protected void testDestroySession() { SWTBotTreeItem sessionItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName()); sessionItem.select(); SWTBotMenu menuBot = sessionItem.contextMenu(ControlViewSwtBotUtil.DESTROY_MENU_ITEM); menuBot.click(); SWTBotShell shell = fBot.shell(ControlViewSwtBotUtil.DESTROY_CONFIRM_DIALOG_TITLE).activate(); shell.bot().button(ControlViewSwtBotUtil.CONFIRM_DIALOG_OK_BUTTON).click(); WaitUtils.waitForJobs(); SWTBotTreeItem sessionGroupItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME); fBot.waitUntil(ConditionHelpers.isTreeChildNodeRemoved(0, sessionGroupItem)); assertEquals(0, sessionGroupItem.getNodes().size()); } /** * Test disconnect from node */ protected void testDisconnectFromNode() { SWTBotTreeItem nodeItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName()); nodeItem.select(); SWTBotMenu menuBot = nodeItem.contextMenu(ControlViewSwtBotUtil.DISCONNECT_MENU_ITEM); menuBot.click(); WaitUtils.waitForJobs(); // Verify that node is connected fBot.waitUntil(ControlViewSwtBotUtil.isStateChanged(fNode, TargetNodeState.DISCONNECTED)); assertEquals(TargetNodeState.DISCONNECTED, fNode.getTargetNodeState()); assertEquals(0, nodeItem.getNodes().size()); } /** * Test import * * @param createExperiment * flag to indicate to create an experiment or not * @param defaultExperiment * flag to indicate to use default experiment or not */ protected void testImport(boolean createExperiment, boolean defaultExperiment) { SWTBotTreeItem sessionItem = SWTBotUtils.getTreeItem(fBot, fTree, getNodeName(), ControlViewSwtBotUtil.SESSION_GROUP_NAME, getSessionName()); sessionItem.select(); TraceSessionComponent sessionComp = ControlViewSwtBotUtil.getSessionComponent(fNode, getSessionName()); String pathString = sessionComp.isSnapshotSession() ? sessionComp.getSnapshotInfo().getSnapshotPath() : sessionComp.getSessionPath(); IPath path = new Path(pathString); IWorkspace workspace = ResourcesPlugin.getWorkspace(); //get location of workspace (java.io.File) File workspaceDirectory = workspace.getRoot().getLocation().toFile(); Path workspacePath = new Path(workspaceDirectory.toString()); // Only do tests if session path is in workspace if (workspacePath.isPrefixOf(path)) { generateTrace(path); // Open import wizard SWTBotMenu menuBot = sessionItem.contextMenu(ControlViewSwtBotUtil.IMPORT_MENU_ITEM); menuBot.click(); SWTBotShell shell = fBot.shell(ControlViewSwtBotUtil.IMPORT_WIZARD_TITLE).activate(); // This will create the Remote project if needed closeImportWizard(shell, ControlViewSwtBotUtil.CANCEL_BUTTON); // Verify that remote project was created by import wizard TmfProjectElement tmfProject = verifyRemoteProject(); // Re-open import wizard menuBot = sessionItem.contextMenu(ControlViewSwtBotUtil.IMPORT_MENU_ITEM); menuBot.click(); shell = fBot.shell(ControlViewSwtBotUtil.IMPORT_WIZARD_TITLE).activate(); // Prepare and verify experiment handling String experimentName = prepareAndVerifyExperimentHandling(shell.bot(), createExperiment, defaultExperiment, path); // Finish and import closeImportWizard(shell, ControlViewSwtBotUtil.FINISH_BUTTON); // Verify experiment folder verifyExperimentFolder(createExperiment, tmfProject, experimentName); } } private static TmfProjectElement verifyRemoteProject() { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(ControlViewSwtBotUtil.DEFAULT_REMOTE_PROJECT); // verify that project was created assertTrue(project.exists()); TmfProjectElement tmfProject = TmfProjectRegistry.getProject(project, true); return tmfProject; } private static void verifyExperimentFolder(boolean createExperiment, TmfProjectElement tmfProject, String experimentName) { TmfExperimentFolder expFolder = tmfProject.getExperimentsFolder(); assertNotNull(expFolder); if (createExperiment) { if (experimentName != null) { TmfExperimentElement expElement = expFolder.getExperiment(experimentName); assertNotNull(expElement); assertEquals(1, expElement.getTraces().size()); } } else { assertTrue(expFolder.getExperiments().size() == 0); } } private static void generateTrace(IPath path) { File traceParent = path.toFile(); traceParent.mkdirs(); LttngTraceGenerator.generateLttngTrace(path.append(ControlViewSwtBotUtil.KERNEL_TRACE_NAME).toFile()); } private static void closeImportWizard(SWTBotShell shell, String buttonName) { SWTBotButton button = shell.bot().button(buttonName); shell.bot().waitUntil(Conditions.widgetIsEnabled(button)); button.click(); fBot.waitUntil(Conditions.shellCloses(shell)); WaitUtils.waitForJobs(); } private static String prepareAndVerifyExperimentHandling(SWTBot bot, boolean createExperiment, boolean defaultExperiment, IPath path) { String experimentName = path.lastSegment(); if (createExperiment) { SWTBotCheckBox checkBox = bot.checkBox(); checkBox.click(); if (!defaultExperiment) { experimentName = verifyExperimentNameHandling(bot, experimentName); } } return experimentName; } private static @NonNull String verifyExperimentNameHandling(SWTBot bot, String aExperimentName) { String experimentName = aExperimentName; // experiment already exists checkFinishButton(bot, false); SWTBotText expText = bot.textInGroup(ControlViewSwtBotUtil.OPTION_GROUP_NAME); // Invalid experiment name (only whitespaces) expText.setText(String.valueOf(' ')); checkFinishButton(bot, false); // Invalid experiment name expText.setText(String.valueOf('/')); checkFinishButton(bot, false); // Set valid experiment name experimentName += '_'; expText.setText(experimentName); return experimentName; } private static void checkFinishButton(SWTBot bot, boolean isEnabled) { final SWTBotButton finishButton = bot.button(ControlViewSwtBotUtil.FINISH_BUTTON); assertTrue(finishButton.isEnabled() == isEnabled); } }