/******************************************************************************
* 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.tmf.ctf.ui.swtbot.tests;
import java.io.File;
import java.util.Arrays;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;
import org.eclipse.swtbot.swt.finder.SWTBot;
import org.eclipse.swtbot.swt.finder.waits.Conditions;
import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotCombo;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotRadio;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTableItem;
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.internal.tmf.ui.project.wizards.importtrace.ImportTraceWizardPage;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace.Messages;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
/**
* Several SWTBot utility methods common to testing import test cases.
*/
public final class SWTBotImportWizardUtils {
/**
* While in the import wizard, select the specified directory as a source.
*
* @param bot
* the SWTBot
* @param directoryPath
* the directory path to set as a source
*/
public static void selectImportFromDirectory(SWTBot bot, String directoryPath) {
SWTBotRadio button = bot.radio("Select roo&t directory:");
button.click();
SWTBotCombo sourceCombo = bot.comboBox();
File traceFolderParent = new File(directoryPath);
sourceCombo.setFocus();
sourceCombo.setText(traceFolderParent.getAbsolutePath());
/* the resource tree gets updated when the combo loses focus */
SWTBotText text = bot.text();
text.setFocus();
}
/**
* While in the import wizard, select the specified archive as a source.
*
* @param bot
* the SWTBot
* @param archivePath
* the archive path to set as a source
*/
public static void selectImportFromArchive(SWTBot bot, String archivePath) {
SWTBotRadio button = bot.radio("Select &archive file:");
button.click();
SWTBotCombo sourceCombo = bot.comboBox(1);
sourceCombo.setFocus();
sourceCombo.setText(new File(archivePath).getAbsolutePath());
/* the resource tree gets updated when the combo loses focus */
SWTBotText text = bot.text();
text.setFocus();
}
/**
* While in the import wizard, select an item in the file selection control.
* The item can be a folder in the left tree or a file in the right table.
* The item will be checked.
*
* @param bot
* the SWTBot
* @param treePath
* the path to the item, ending with a file or folder
*/
public static void selectItem(SWTBot bot, String... treePath) {
SWTBotTree tree = bot.tree();
bot.waitUntil(Conditions.widgetIsEnabled(tree));
if (treePath.length == 0) {
return;
}
if (treePath.length == 1) {
SWTBotTreeItem rootNode = SWTBotUtils.getTreeItem(bot, tree, treePath);
rootNode.select();
rootNode.check();
return;
}
String[] parentPath = Arrays.copyOf(treePath, treePath.length - 1);
String itemName = treePath[treePath.length - 1];
SWTBotTreeItem folderNode = SWTBotUtils.getTreeItem(bot, tree, parentPath);
folderNode.expand();
if (folderNode.getNodes().contains(itemName)) {
folderNode = folderNode.getNode(itemName);
folderNode.select();
folderNode.check();
} else {
folderNode.select();
SWTBotTable fileTable = bot.table();
bot.waitUntil(Conditions.widgetIsEnabled(fileTable));
bot.waitUntil(ConditionHelpers.isTableItemAvailable(itemName, fileTable));
SWTBotTableItem tableItem = fileTable.getTableItem(itemName);
tableItem.check();
}
}
/**
* While in the import wizard, select a folder in the file selection tree.
*
* @param bot
* the SWTBot
* @param check
* whether or not to check the folder item
* @param treePath
* the path to the folder in the tree
*/
public static void selectFolder(SWTBot bot, boolean check, String... treePath) {
SWTBotTree tree = bot.tree();
bot.waitUntil(Conditions.widgetIsEnabled(tree));
SWTBotTreeItem folderNode = SWTBotUtils.getTreeItem(bot, tree, treePath);
folderNode.select();
if (check) {
folderNode.check();
}
}
/**
* While in the import wizard, select a file in the file selection tree.
*
* @param bot
* the SWTBot
* @param fileName
* the name of the file to select
* @param folderTreePath
* the path to the parent folder in the tree
*/
public static void selectFile(SWTBot bot, String fileName, String... folderTreePath) {
selectFolder(bot, false, folderTreePath);
SWTBotTable fileTable = bot.table();
bot.waitUntil(Conditions.widgetIsEnabled(fileTable));
bot.waitUntil(ConditionHelpers.isTableItemAvailable(fileName, fileTable));
SWTBotTableItem tableItem = fileTable.getTableItem(fileName);
tableItem.check();
}
/**
* While in the import wizard, set the various options (checkboxes, trace
* type combo).
*
* @param bot
* the SWTBot
* @param optionFlags
* options that affects mostly checkboxes, see
* {@link ImportTraceWizardPage#OPTION_CREATE_LINKS_IN_WORKSPACE}
* for example.
* @param traceTypeName
* the trace type to select in the combobox, or null for
* auto-detect.
*/
public static void setOptions(SWTBot bot, int optionFlags, String traceTypeName) {
SWTBotCombo comboBox = bot.comboBoxWithLabel(Messages.ImportTraceWizard_TraceType);
if (traceTypeName != null && !traceTypeName.isEmpty()) {
comboBox.setSelection(traceTypeName);
} else {
comboBox.setSelection(ImportTraceWizardPage.TRACE_TYPE_AUTO_DETECT);
}
SWTBotCheckBox checkBox = bot.checkBox(Messages.ImportTraceWizard_CreateLinksInWorkspace);
if (checkBox.isEnabled()) {
if ((optionFlags & ImportTraceWizardPage.OPTION_CREATE_LINKS_IN_WORKSPACE) != 0) {
checkBox.select();
} else {
checkBox.deselect();
}
}
checkBox = bot.checkBox(Messages.ImportTraceWizard_PreserveFolderStructure);
if ((optionFlags & ImportTraceWizardPage.OPTION_PRESERVE_FOLDER_STRUCTURE) != 0) {
checkBox.select();
} else {
checkBox.deselect();
}
checkBox = bot.checkBox(Messages.ImportTraceWizard_ImportUnrecognized);
if (checkBox.isEnabled()) {
if ((optionFlags & ImportTraceWizardPage.OPTION_IMPORT_UNRECOGNIZED_TRACES) != 0) {
checkBox.select();
} else {
checkBox.deselect();
}
}
checkBox = bot.checkBox(Messages.ImportTraceWizard_OverwriteExistingTrace);
if ((optionFlags & ImportTraceWizardPage.OPTION_OVERWRITE_EXISTING_RESOURCES) != 0) {
checkBox.select();
} else {
checkBox.deselect();
}
checkBox = bot.checkBox(Messages.ImportTraceWizard_CreateExperiment);
if ((optionFlags & ImportTraceWizardPage.OPTION_CREATE_EXPERIMENT) != 0) {
checkBox.select();
} else {
checkBox.deselect();
}
}
/**
* Test that the events editor gets activated and that the first event is
* selectable.
*
* @param bot
* the SWTBot
* @param editorName
* the expected name of the editor
* @param nbEvents
* the expected number of events
* @param firstEventStr
* the first event timestamp in string form. This is used to see
* if the cell contains this text (String.contains()). Since
* there can be timezone issues with hours and days, this value
* should only specify minutes and more precise digits. For
* example: 04:32.650 993 664
*/
public static void testEventsTable(SWTWorkbenchBot bot, String editorName, long nbEvents, String firstEventStr) {
SWTBotEditor editor = SWTBotUtils.activeEventsEditor(bot, editorName);
bot.waitUntil(ConditionHelpers.numberOfEventsInTrace(TmfTraceManager.getInstance().getActiveTrace(), nbEvents));
if (nbEvents == 0 || firstEventStr == null || firstEventStr.isEmpty()) {
return;
}
bot.waitUntil(new DefaultCondition() {
@Override
public boolean test() throws Exception {
SWTBotTable table = editor.bot().table();
return table.rowCount() > 1;
}
@Override
public String getFailureMessage() {
return "No items in table";
}
});
SWTBotTable table = editor.bot().table();
// Select first event (skip filter/search row)
table.getTableItem(1).select();
editor.bot().waitUntil(new DefaultCondition() {
@Override
public boolean test() throws Exception {
// Get the table again since it can get re-created
SWTBotTable curTable = editor.bot().table();
boolean ret = curTable.selection().rowCount() == 1 && curTable.selection().get(0).toString().contains(firstEventStr);
if (!ret) {
// FIXME: Not sure why, sometimes the first select() ends up
// selecting an empty item. Retry selecting here.
curTable.getTableItem(1).select();
}
return ret;
}
@Override
public String getFailureMessage() {
return "First event not selected.";
}
});
}
}