blob: f3c6c1f980c2d126744e8148c5ba74349e1e227a [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2018, 2019 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.analysis.xml.ui.swtbot.tests.preferences;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.util.Arrays;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
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.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.internal.tmf.analysis.xml.core.module.XmlAnalysisModuleSource;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlUtils;
import org.eclipse.tracecompass.tmf.analysis.xml.core.tests.Activator;
import org.eclipse.tracecompass.tmf.ui.dialog.DirectoryDialogFactory;
import org.eclipse.tracecompass.tmf.ui.dialog.TmfFileDialogFactory;
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.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* SWTBot test for the XML analyses preference page
*
* @author Christophe Bourque Bedard
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public class XMLAnalysesManagerPreferencePageTest {
/** The Log4j logger instance. */
private static final Logger fLogger = Logger.getRootLogger();
/** Default project name */
protected static final String TRACE_PROJECT_NAME = "xml-test";
/** XML files */
private static final String EXTENSION = "." + XmlUtils.XML_EXTENSION;
private static final String TEST_FILES_FOLDER = "test_xml_files/";
private static final String VALID_FILES_FOLDER = "test_valid/";
private static final String INVALID_FILES_FOLDER = "test_invalid/";
private static final String[] FILES_IMPORT_VALID = new String[] { "test_valid",
"test_valid_xml_timegraphView" };
private static final String FILE_IMPORT_INVALID = "test_invalid";
private static final String[] FILES_DELETE = new String[] { "test_valid_extended",
"test_valid_pattern" };
private static final String[] FILES_EDIT = new String[] { "kvm_exits",
"test_consuming_fsm" };
private static final String FILE_EXPORT = "state_provider_placement";
private static final String[] FILES_BUTTONS = new String[] { "test_state_values",
"test_state_values_pattern",
"test_pattern_segment",
"test_doubles",
"test_attributes" };
/** Button labels */
private static final @NonNull String CHECK_SELECTED = "Check selected";
private static final @NonNull String CHECK_ALL = "Check all";
private static final @NonNull String UNCHECK_SELECTED = "Uncheck selected";
private static final @NonNull String UNCHECK_ALL = "Uncheck all";
/** Workbench bot */
private static SWTWorkbenchBot fBot;
private static final String TEMP_DIRECTORY = "/tmp";
private static final String PROJECT_EXPLORER_VIEW_NAME = "Project Explorer";
private static final String MANAGE_XML_ANALYSES_COMMAND_NAME = "Manage XML analyses...";
private static final String MANAGE_XML_ANALYSES_PREF_TITLE = "Manage XML analyses files";
private static final String PREFERENCES_SHELL = "Preferences";
private static final String MANAGE_XML_ANALYSES_PREF_TITLE_FILTERED = "Manage XML analyses files (Filtered)";
/**
* Before Class for launch and setup
*/
@BeforeClass
public static void beforeClass() {
SWTBotUtils.initialize();
/* set up for swtbot */
SWTBotPreferences.TIMEOUT = 20000; /* 20 second timeout */
SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US";
fLogger.removeAllAppenders();
fLogger.addAppender(new ConsoleAppender(new SimpleLayout(), ConsoleAppender.SYSTEM_OUT));
fBot = new SWTWorkbenchBot();
}
/**
* Before each test
*/
@Before
public void before() {
/* Finish waiting for eclipse to load */
WaitUtils.waitForJobs();
}
/**
* Test opening up the preference page through menu bar
*/
@Test
public void testPreferencePageMenuBar() {
SWTBot bot = openXMLAnalysesPreferences().bot();
SWTBotUtils.pressOKishButtonInPreferences(bot);
}
/**
* Test opening up the preference page from context menu of Traces folder
*/
@Test
public void testPreferencePageContextMenu() {
SWTBotUtils.createProject(TRACE_PROJECT_NAME);
/* Finish waiting for eclipse to load */
WaitUtils.waitForJobs();
/* Open preferences page from context menu */
SWTBotTreeItem tracesFolder = SWTBotUtils.selectTracesFolder(fBot, TRACE_PROJECT_NAME);
fBot.viewByTitle(PROJECT_EXPLORER_VIEW_NAME).setFocus();
tracesFolder.contextMenu().menu(MANAGE_XML_ANALYSES_COMMAND_NAME).click();
SWTBotShell shell = SWTBotUtils.anyShellOf(fBot, PREFERENCES_SHELL, MANAGE_XML_ANALYSES_PREF_TITLE_FILTERED).activate();
SWTBot bot = shell.bot();
/* Close preference page*/
SWTBotUtils.pressOKishButtonInPreferences(bot);
SWTBotUtils.deleteProject(TRACE_PROJECT_NAME, fBot);
}
/**
* Test the deletion of files
*/
@Test
public void testDelete() {
// Import valid analysis file
SWTBot bot = openXMLAnalysesPreferences().bot();
importAnalysis(bot, FILES_DELETE.length, getRelativePaths(VALID_FILES_FOLDER, FILES_DELETE));
SWTBotTable tablebot = bot.table(0);
// Open editor for first file
tablebot.select(FILES_DELETE[0]);
bot.button("Edit...").click();
// Delete files
tablebot.select(FILES_DELETE);
bot.button("Delete").click();
// Check that the confirmation pop-up is displayed
SWTBotShell deleteShell = bot.shell("Delete XML file(s)").activate();
deleteShell.bot().button("Yes").click();
// Check that the files do not exist anymore
for (String deleteFile : FILES_DELETE) {
assertFalse(deleteFile, tablebot.containsItem(deleteFile));
}
// Check that the opened editor was closed
fBot.editors().forEach(editor -> {
if (editor != null) {
if (editor.getTitle().equals(FILES_DELETE[0] + EXTENSION)) {
fail("Editor is still open: " + FILES_DELETE[0] + EXTENSION);
}
}
});
SWTBotUtils.pressOKishButtonInPreferences(bot);
}
/**
* Test the import of valid files
*/
@Test
public void testImportValid() {
// Import valid analysis file
SWTBot bot = openXMLAnalysesPreferences().bot();
importAnalysis(bot, FILES_IMPORT_VALID.length, getRelativePaths(VALID_FILES_FOLDER, FILES_IMPORT_VALID));
// Check that the "enabled" label is displayed
SWTBotTable tablebot = bot.table(0);
for (String importedItem : FILES_IMPORT_VALID) {
tablebot.getTableItem(importedItem).select();
assertTrue(bot.label("File enabled").isVisible());
}
SWTBotUtils.pressOKishButtonInPreferences(bot);
}
/**
* Test the import of an invalid file
*/
@Test
public void testImportInvalid() {
// Import invalid analysis file
SWTBot bot = openXMLAnalysesPreferences().bot();
importAnalysis(bot, 0, TEST_FILES_FOLDER + INVALID_FILES_FOLDER + FILE_IMPORT_INVALID + EXTENSION);
// Check that the parsing error pop-up is displayed
SWTBotShell popupShell = bot.shell("Import XML analysis file failed.").activate();
popupShell.bot().button("OK").click();
SWTBotUtils.pressOKishButtonInPreferences(bot);
}
/**
* Test the edit function
*/
@Test
public void testEdit() {
// Import valid analysis files
SWTBot bot = openXMLAnalysesPreferences().bot();
importAnalysis(bot, FILES_EDIT.length, getRelativePaths(VALID_FILES_FOLDER, FILES_EDIT));
// Open the editor
SWTBotTable tablebot = bot.table(0);
tablebot.select(FILES_EDIT);
bot.button("Edit...").click();
SWTBotUtils.pressOKishButtonInPreferences(bot);
// Check that the editors were opened
// No need to actually check that they are active
for (String editFile : FILES_EDIT) {
fBot.editorByTitle(editFile + EXTENSION).isActive();
}
}
/**
* Test the invalid file label
*/
@Test
public void testInvalidLabel() {
// Import invalid analysis file manually (otherwise it is rejected)
XmlUtils.addXmlFile(Activator.getAbsolutePath(new Path(TEST_FILES_FOLDER
+ INVALID_FILES_FOLDER
+ FILE_IMPORT_INVALID
+ EXTENSION)).toFile());
XmlAnalysisModuleSource.notifyModuleChange();
// Check that the "invalid" label displayed
// and that the checkbox was unchecked as a result
SWTBot bot = openXMLAnalysesPreferences().bot();
SWTBotTable tablebot = bot.table(0);
SWTBotTableItem tableItem = tablebot.getTableItem(FILE_IMPORT_INVALID);
tableItem.select();
assertNotNull(bot.label("Invalid file"));
assertFalse(tableItem.isChecked());
SWTBotUtils.pressOKishButtonInPreferences(bot);
}
/**
* Test the check/uncheck buttons
*/
@Test
public void testCheckButtons() {
SWTBot bot = openXMLAnalysesPreferences().bot();
SWTBotTable tableBot = bot.table(0);
// Delete existing analysis files, if any
int rowsCount = tableBot.rowCount();
if (rowsCount > 0) {
String[] itemNames = new String[rowsCount];
for (int i = 0; i < rowsCount; ++i) {
itemNames[i] = tableBot.getTableItem(i).getText();
}
tableBot.select(itemNames);
bot.button("Delete").click();
SWTBotShell deleteShell = bot.shell("Delete XML file(s)").activate();
deleteShell.bot().button("Yes").click();
}
// Import files
int preRowCount = tableBot.rowCount();
importAnalysis(bot, FILES_BUTTONS.length, getRelativePaths(VALID_FILES_FOLDER, FILES_BUTTONS));
int postRowCount = tableBot.rowCount();
assertEquals(preRowCount + FILES_BUTTONS.length, postRowCount);
// Uncheck selected
int preCheckCount = SWTBotUtils.getTableCheckedItemCount(tableBot);
int uncheckCount = 2;
String[] toUncheck = Arrays.copyOfRange(FILES_BUTTONS, 0, uncheckCount);
tableBot.select(toUncheck);
bot.button(UNCHECK_SELECTED).click();
int postCheckCount = SWTBotUtils.getTableCheckedItemCount(tableBot);
assertEquals(UNCHECK_SELECTED, preCheckCount - uncheckCount, postCheckCount);
// Check selected
tableBot.select(toUncheck);
bot.button(CHECK_SELECTED).click();
postCheckCount = SWTBotUtils.getTableCheckedItemCount(tableBot);
assertEquals(CHECK_SELECTED, preCheckCount, postCheckCount);
// Uncheck all
bot.button(UNCHECK_ALL).click();
postCheckCount = SWTBotUtils.getTableCheckedItemCount(tableBot);
assertEquals(UNCHECK_ALL, 0, postCheckCount);
// Check all
bot.button(CHECK_ALL).click();
postCheckCount = SWTBotUtils.getTableCheckedItemCount(tableBot);
assertEquals(CHECK_ALL, postRowCount, postCheckCount);
SWTBotUtils.pressOKishButtonInPreferences(bot);
}
/**
* Test the export function
*/
@Test
public void testExport() {
// Import valid analysis file
SWTBot bot = openXMLAnalysesPreferences().bot();
final String fileNameXml = FILE_EXPORT + EXTENSION;
importAnalysis(bot, 1, TEST_FILES_FOLDER + VALID_FILES_FOLDER + fileNameXml);
// Setup target folder
File targetDirectory = new File(TEMP_DIRECTORY);
DirectoryDialogFactory.setOverridePath(targetDirectory.getAbsolutePath());
// Export
SWTBotTable tableBot = bot.table(0);
tableBot.select(FILE_EXPORT);
bot.button("Export").click();
// Check that the file was created
File targetFile = new File(targetDirectory, fileNameXml);
assertTrue(targetFile.toString(), targetFile.exists());
SWTBotUtils.pressOKishButtonInPreferences(bot);
}
/**
* After each test, delete all analyses
*/
@After
public void after() {
fBot.closeAllEditors();
SWTBot bot = openXMLAnalysesPreferences().bot();
SWTBotTable tableBot = bot.table(0);
// Delete existing analysis files, if any
int rowsCount = tableBot.rowCount();
if (rowsCount > 0) {
String[] itemNames = new String[rowsCount];
for (int i = 0; i < rowsCount; ++i) {
itemNames[i] = tableBot.getTableItem(i).getText();
}
tableBot.select(itemNames);
bot.button("Delete").click();
SWTBotShell deleteShell = bot.shell("Delete XML file(s)").activate();
deleteShell.bot().button("Yes").click();
}
SWTBotUtils.pressOKishButtonInPreferences(bot);
}
/**
* After Class for cleanup
*/
@AfterClass
public static void afterClass() {
fLogger.removeAllAppenders();
}
private static String[] getRelativePaths(String folder, String[] files) {
String[] relativePaths = new String[files.length];
for (int i = 0; i < files.length; ++i) {
relativePaths[i] = TEST_FILES_FOLDER + folder + files[i] + EXTENSION;
}
return relativePaths;
}
private static void importAnalysis(SWTBot bot, int expected, String... relativePaths) {
String[] absolutePaths = new String[relativePaths.length];
for (int i = 0; i < relativePaths.length; ++i) {
absolutePaths[i] = Activator.getAbsolutePath(new Path(relativePaths[i])).toString();
}
TmfFileDialogFactory.setOverrideFiles(absolutePaths);
bot.button("Import").click();
SWTBotUtils.waitUntil(table -> table.rowCount() == expected, bot.table(0), "Failed to import analysis");
}
private static SWTBotShell openXMLAnalysesPreferences() {
SWTBotShell preferencesShell = SWTBotUtils.openPreferences(fBot, MANAGE_XML_ANALYSES_PREF_TITLE);
SWTBot bot = preferencesShell.bot();
SWTBotTree tree = bot.tree(0);
SWTBotTreeItem treeNode = tree.getTreeItem("Tracing");
treeNode.select();
treeNode.expand();
bot.waitUntil(ConditionHelpers.isTreeChildNodeAvailable("XML Analyses", treeNode));
treeNode = treeNode.getNode("XML Analyses");
treeNode.select();
return preferencesShell;
}
}