blob: a92bf645df76b69f88bfa6a20e4db8c5d79028da [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2017, 2020 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
**********************************************************************/
package org.eclipse.tracecompass.tmf.ui.swtbot.tests.views;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.IOException;
import java.util.function.Predicate;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.results.Result;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.utils.TableCollection;
import org.eclipse.swtbot.swt.finder.utils.TableRow;
import org.eclipse.swtbot.swt.finder.waits.Conditions;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTableItem;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils;
import org.eclipse.ui.internal.views.markers.BookmarksView;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.google.common.base.Objects;
/**
* SWT bot test to test the {@link BookmarksView} in Trace Compass
*
* @author Loic Prieur-Drevon
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public class BookmarksViewTest {
/** The Log4j logger instance. */
private static final Logger fLogger = Logger.getRootLogger();
private static final String PROJECT_NAME = "TestBookmarks";
private static final String TRACE_TYPE = "org.eclipse.linuxtools.tmf.core.tests.secondtt";
private static final String BOOKMARK_NAME = "banana";
private static final @NonNull String EXPERIMENT_NAME = "experiment";
private static final Predicate<SWTBotTable> TABLE_NOT_EMPTY = tb -> tb.rowCount() > 2;
private static SWTWorkbenchBot fBot;
/**
* 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.removeAllAppenders();
fLogger.addAppender(new ConsoleAppender(new SimpleLayout()));
fBot = new SWTWorkbenchBot();
SWTBotUtils.switchToTracingPerspective();
/* finish waiting for eclipse to load */
WaitUtils.waitForJobs();
}
/**
* Open a trace and focus on the Bookmarks view
*/
@Before
public void beforeTest() {
SWTBotUtils.createProject(PROJECT_NAME);
SWTBotTreeItem treeItem = SWTBotUtils.selectTracesFolder(fBot, PROJECT_NAME);
assertNotNull(treeItem);
}
/**
* Test bookmarks on a trace.
*
* @throws IOException
* if an error occurs during the file URL -> path conversion
*/
@Test
public void testTrace() throws IOException {
SWTBotUtils.openTrace(PROJECT_NAME, FileLocator.toFileURL(TmfTraceStub.class.getResource("/testfiles/A-Test-10K")).getPath(), TRACE_TYPE);
bookmarkTest("A-Test-10K");
}
/**
* Test bookmarking an experiment
*
* @throws IOException
* if an error occurs during the file URL -> path conversion
*/
@Test
public void testExperiment() throws IOException {
/**
* Create Experiment with 2 LTTng CTF Kernel traces in it and open
* experiment. Verify that an Events editor is opened showing LTTng
* Kernel specific columns.
*/
SWTBotUtils.openTrace(PROJECT_NAME, FileLocator.toFileURL(TmfTraceStub.class.getResource("/testfiles/A-Test-10K")).getPath(), TRACE_TYPE);
SWTBotUtils.openTrace(PROJECT_NAME, FileLocator.toFileURL(TmfTraceStub.class.getResource("/testfiles/A-Test-10K-2")).getPath(), TRACE_TYPE);
WaitUtils.waitForJobs();
SWTBotUtils.createExperiment(fBot, PROJECT_NAME, EXPERIMENT_NAME);
SWTBotTreeItem project = SWTBotUtils.selectProject(fBot, PROJECT_NAME);
SWTBotTreeItem experiment = SWTBotUtils.getTraceProjectItem(fBot, project, "Experiments", EXPERIMENT_NAME);
experiment.contextMenu("Select Traces...").click();
SWTBotShell selectTracesShell = fBot.shell("Select Traces");
selectTracesShell.bot().button("Select All").click();
selectTracesShell.bot().button("Finish").click();
experiment.select();
experiment.doubleClick();
SWTBotEditor editor = SWTBotUtils.activeEventsEditor(fBot, EXPERIMENT_NAME);
assertEquals("Event editor is displaying the wrong trace/experiment", EXPERIMENT_NAME, editor.getTitle());
bookmarkTest(EXPERIMENT_NAME);
}
private static void bookmarkTest(String editorName) throws IOException {
SWTBotView fViewBot = fBot.viewByPartName("Bookmarks");
fViewBot.setFocus();
WaitUtils.waitForJobs();
assertEquals("Failed to show the Bookmarks View", "Bookmarks", fViewBot.getTitle());
/**
* Add a bookmark: a) Double click to select an event in the event
* editor b) Go to the Edit > Add Bookmark... menu c) Enter the bookmark
* description in dialog box
*/
SWTBotEditor editorBot = SWTBotUtils.activateEditor(fBot, editorName);
SWTBotTable tableBot = editorBot.bot().table();
SWTBotTableItem tableItem = tableBot.getTableItem(7);
String expectedTimeStamp = tableItem.getText(1);
assertNull("The image should not be bookmarked yet", getBookmarkImage(tableItem));
tableItem.select();
tableItem.doubleClick();
fBot.menu("Edit").menu("Add Bookmark...").click();
WaitUtils.waitForJobs();
SWTBotShell addBookmarkShell = fBot.shell("Add Bookmark");
addBookmarkShell.bot().text().setText(BOOKMARK_NAME);
addBookmarkShell.bot().button("OK").click();
assertNotNull("Failed to add bookmark in event editor", getBookmarkImage(tableItem));
fViewBot.setFocus();
WaitUtils.waitForJobs();
SWTBotTree bookmarkTree = fViewBot.bot().tree();
WaitUtils.waitForJobs();
/**
* throws WidgetNotFoundException - if the node was not found, nothing
* to assert
*/
SWTBotTreeItem bookmark = bookmarkTree.getTreeItem(BOOKMARK_NAME);
assertEquals(BOOKMARK_NAME, bookmark.cell(0));
/**
* Scroll within event table so that bookmark is not visible anymore and
* then double-click on bookmark in Bookmarks View
*/
UIThreadRunnable.syncExec(() -> TmfSignalManager.dispatchSignal(new TmfSelectionRangeUpdatedSignal(null, TmfTimestamp.fromMicros(22))));
bookmark.doubleClick();
WaitUtils.waitUntil(TABLE_NOT_EMPTY, tableBot, "Table is still empty");
TableCollection selection = tableBot.selection();
TableRow row = selection.get(0);
assertNotNull(selection.toString(), row);
assertEquals("Wrong event was selected " + selection, expectedTimeStamp, row.get(1));
/**
* Open another trace #2 and then double-click on bookmark in Bookmarks
* view
*/
SWTBotUtils.openTrace(PROJECT_NAME, FileLocator.toFileURL(TmfTraceStub.class.getResource("/testfiles/E-Test-10K")).getPath(), TRACE_TYPE);
WaitUtils.waitForJobs();
bookmark.doubleClick();
editorBot = SWTBotUtils.activeEventsEditor(fBot, editorName);
WaitUtils.waitUntil(TABLE_NOT_EMPTY, tableBot, "Table is still empty");
selection = tableBot.selection();
row = selection.get(0);
assertNotNull(selection.toString(), row);
assertEquals("Wrong event was selected " + selection, expectedTimeStamp, row.get(1));
/**
* Close the trace #1 and then double-click on bookmark in Bookmarks
* view
*/
editorBot.close();
WaitUtils.waitUntil(eb -> !eb.isActive(), editorBot, "Waiting for the editor to close");
bookmark.doubleClick();
editorBot = SWTBotUtils.activeEventsEditor(fBot, editorName);
WaitUtils.waitUntil(eb -> eb.bot().table().selection().rowCount() > 0, editorBot, "Selection is still empty");
tableBot = editorBot.bot().table();
WaitUtils.waitUntil(tb -> !Objects.equal(tb.selection().get(0).get(1), "<srch>"), tableBot, "Header is still selected");
selection = tableBot.selection();
row = selection.get(0);
assertNotNull(selection.toString(), row);
assertEquals("Wrong event was selected " + selection, expectedTimeStamp, row.get(1));
/**
* Select bookmarks icon in bookmark view right-click on icon and select
* "Remove Bookmark"
*/
bookmark.select();
bookmark.contextMenu("Delete").click();
SWTBotShell deleteBookmarkShell = fBot.shell("Delete Selected Entries");
SWTBotUtils.anyButtonOf(deleteBookmarkShell.bot(), "Delete", "Yes").click();
fBot.waitUntil(Conditions.treeHasRows(bookmarkTree, 0));
tableItem = editorBot.bot().table().getTableItem(7);
assertNull("Bookmark not deleted from event table", getBookmarkImage(tableItem));
}
private static Image getBookmarkImage(SWTBotTableItem tableItem) {
return UIThreadRunnable.syncExec((Result<Image>) () -> tableItem.widget.getImage(0));
}
/**
* Close the editor
*/
@After
public void tearDown() {
fBot.closeAllEditors();
SWTBotUtils.deleteProject(PROJECT_NAME, fBot);
}
/**
* Delete the file
*/
@AfterClass
public static void cleanUp() {
fLogger.removeAllAppenders();
}
}