From: Matthew Khouzam Date: Thu, 6 Oct 2016 03:04:47 +0000 (-0400) Subject: tmf.ui: add export to tsv events table test X-Git-Url: http://git.efficios.com/?p=deliverable%2Ftracecompass.git;a=commitdiff_plain;h=f15a39b6b3e5d34266f615597364edbfe3b1a5c5 tmf.ui: add export to tsv events table test This removes manual test case: 8.2, 8.1 could be considered redundant too. Change-Id: I854e48431bedf187d4e7e625778ae58371804d65 Signed-off-by: Matthew Khouzam Reviewed-on: https://git.eclipse.org/r/82571 Reviewed-by: Hudson CI Reviewed-by: Genevieve Bastien Tested-by: Genevieve Bastien --- diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/ExportToTsvTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/ExportToTsvTest.java new file mode 100644 index 0000000000..4e4ab7ffe3 --- /dev/null +++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/ExportToTsvTest.java @@ -0,0 +1,278 @@ +/******************************************************************************* + * Copyright (c) 2016 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.ui.swtbot.tests.viewers.events; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; +import static org.junit.Assume.assumeTrue; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Logger; +import org.apache.log4j.SimpleLayout; +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.swt.SWT; +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.junit.SWTBotJunit4ClassRunner; +import org.eclipse.swtbot.swt.finder.keyboard.Keyboard; +import org.eclipse.swtbot.swt.finder.keyboard.KeyboardFactory; +import org.eclipse.swtbot.swt.finder.keyboard.Keystrokes; +import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences; +import org.eclipse.swtbot.swt.finder.waits.Conditions; +import org.eclipse.swtbot.swt.finder.waits.ICondition; +import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable; +import org.eclipse.tracecompass.tmf.core.tests.TmfCoreTestPlugin; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; +import org.eclipse.tracecompass.tmf.ui.dialog.TmfFileDialogFactory; +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; + +import com.google.common.collect.ImmutableList; + +/** + * SWTBot test for testing export to tsv. + */ +@RunWith(SWTBotJunit4ClassRunner.class) +@NonNullByDefault +public class ExportToTsvTest { + + private static final class FileLargerThanZeroCondition implements ICondition { + private File fFile; + + public FileLargerThanZeroCondition(File file) { + fFile = file; + } + + @Override + public boolean test() throws Exception { + return fFile.length() >= 1; + } + + @Override + public void init(@Nullable SWTBot bot) { + // nothing + } + + @Override + public String getFailureMessage() { + return "File is still of length 0 : " + fFile.getAbsolutePath(); + } + } + + private static final String HEADER_TEXT = "Timestamp\tHost\tLogger\tFile\tLine\tMessage"; + private static final String EVENT1_TEXT = "01:01:01.000 000 000\tHostA\tLoggerA\tSourceFile\t4\tMessage A"; + private static final String EVENT2_TEXT = "02:02:02.000 000 000\tHostB\tLoggerB\tSourceFile\t5\tMessage B"; + private static final String EVENT3_TEXT = "03:03:03.000 000 000\tHostC\tLoggerC\tSourceFile\t6\tMessage C"; + @SuppressWarnings("null") + private static final Keyboard KEYBOARD = KeyboardFactory.getSWTKeyboard(); + private static final String TRACE_PROJECT_NAME = "test"; + private static final String TRACE_NAME = "syslog_collapse"; + private static final String TRACE_PATH = "testfiles/" + TRACE_NAME; + private static final String TRACE_TYPE = "org.eclipse.linuxtools.tmf.tests.stubs.trace.text.testsyslog"; + private static final String EXPORT_TO_TSV = "Export To Text..."; + private static final int TIMEOUT = 2000; /* 20 second timeout */ + + private @Nullable static File fTestFile = null; + + private static SWTWorkbenchBot fBot = new SWTWorkbenchBot(); + private @Nullable SWTBotEditor fEditorBot; + private @Nullable String fAbsolutePath; + + /** The Log4j logger instance. */ + @SuppressWarnings("null") + private static final Logger fLogger = Logger.getRootLogger(); + + /** + * Test Class setup + */ + @BeforeClass + public static void beforeClass() { + SWTBotUtils.initialize(); + + /* set up test trace */ + URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(TRACE_PATH), null); + URI uri; + try { + uri = FileLocator.toFileURL(location).toURI(); + fTestFile = new File(uri); + } catch (URISyntaxException | IOException e) { + fail(e.getMessage()); + } + + File testFile = fTestFile; + assertNotNull(testFile); + assumeTrue(testFile.exists()); + + /* Set up for swtbot */ + SWTBotPreferences.TIMEOUT = TIMEOUT; + SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US"; + fLogger.removeAllAppenders(); + fLogger.addAppender(new ConsoleAppender(new SimpleLayout(), ConsoleAppender.SYSTEM_OUT)); + fBot = new SWTWorkbenchBot(); + + /* Close welcome view */ + SWTBotUtils.closeView("Welcome", fBot); + + /* Switch perspectives */ + SWTBotUtils.switchToTracingPerspective(); + + /* Finish waiting for eclipse to load */ + WaitUtils.waitForJobs(); + + SWTBotUtils.createProject(TRACE_PROJECT_NAME); + } + + /** + * Test class tear down method. + */ + @AfterClass + public static void afterClass() { + SWTBotUtils.deleteProject(TRACE_PROJECT_NAME, fBot); + fLogger.removeAllAppenders(); + } + + /** + * Before Test + */ + @Before + public void before() { + File testFile = fTestFile; + assertNotNull(testFile); + SWTBotUtils.openTrace(TRACE_PROJECT_NAME, testFile.getAbsolutePath(), TRACE_TYPE); + fEditorBot = SWTBotUtils.activateEditor(fBot, testFile.getName()); + fAbsolutePath = TmfTraceManager.getTemporaryDirPath() + File.separator + "exportToTsvTest.tsv"; + TmfFileDialogFactory.setOverrideFiles(fAbsolutePath); + } + + /** + * After Test + */ + @After + public void after() { + fBot.closeAllEditors(); + } + + /** + * Test export a single selection + * + * @throws IOException + * File not found or such + */ + @Test + public void testExportSingleSelection() throws IOException { + assumeTrue(!isAffectedByBug486302()); + + SWTBotEditor editorBot = fEditorBot; + assertNotNull(editorBot); + final SWTBotTable tableBot = editorBot.bot().table(); + tableBot.getTableItem(0).click(3); + KEYBOARD.typeText("LoggerA"); + KEYBOARD.pressShortcut(Keystrokes.CTRL, Keystrokes.CR); + fBot.waitUntil(Conditions.tableHasRows(tableBot, 4), 5000); + tableBot.contextMenu(EXPORT_TO_TSV).click(); + assertTsvContentsEquals(ImmutableList.of(HEADER_TEXT, EVENT1_TEXT)); + } + + /** + * Test export multiple selection + * + * @throws IOException + * File not found or such + */ + @Test + public void testExportMultipleSelection() throws IOException { + assumeTrue(!isAffectedByBug486302()); + SWTBotEditor editorBot = fEditorBot; + assertNotNull(editorBot); + final SWTBotTable tableBot = editorBot.bot().table(); + tableBot.getTableItem(0).click(3); + KEYBOARD.typeText("LoggerA|LoggerB|LoggerC"); + KEYBOARD.pressShortcut(Keystrokes.CTRL, Keystrokes.CR); + fBot.waitUntil(Conditions.tableHasRows(tableBot, 6), 5000); + tableBot.contextMenu(EXPORT_TO_TSV).click(); + assertTsvContentsEquals(ImmutableList.of(HEADER_TEXT, EVENT1_TEXT, EVENT2_TEXT, EVENT3_TEXT)); + } + + /** + * Returns whether or not the running Eclipse is affected by Bug 486302. The + * bug is present in Eclipse 4.5.2 and earlier running GTK3. + */ + private static boolean isAffectedByBug486302() { + String property = System.getProperty("org.eclipse.swt.internal.gtk.version"); + if (property != null) { + @NonNull + String @NonNull [] versionSegments = property.split("\\."); + if (versionSegments.length > 0) { + return SWT.getVersion() <= 4530 && versionSegments[0].equals("3"); + } + } + + return false; + } + + /** + * Test full export + * + * @throws IOException + * File not found or such + */ + @Test + public void testExportNoSelection() throws IOException { + SWTBotEditor editorBot = fEditorBot; + assertNotNull(editorBot); + final SWTBotTable tableBot = editorBot.bot().table(); + tableBot.getTableItem(1).click(); + KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.UP); + + tableBot.contextMenu(EXPORT_TO_TSV).click(); + File file = new File(fAbsolutePath); + fBot.waitUntil(new FileLargerThanZeroCondition(file)); + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + long lines = br.lines().count(); + assertEquals("Both reads", 23, lines); + } finally { + new File(fAbsolutePath).delete(); + } + } + + private void assertTsvContentsEquals(final List expected) throws FileNotFoundException, IOException { + File file = new File(fAbsolutePath); + fBot.waitUntil(new FileLargerThanZeroCondition(file)); + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + List lines = br.lines().collect(Collectors.toList()); + assertEquals("Both reads", expected, lines); + } finally { + file.delete(); + } + } +}