/******************************************************************************* * 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.assertFalse; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.Logger; import org.apache.log4j.varia.NullAppender; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.RGB; import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor; import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner; import org.eclipse.swtbot.swt.finder.keyboard.Keystrokes; import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences; import org.eclipse.swtbot.swt.finder.waits.DefaultCondition; import org.eclipse.swtbot.swt.finder.waits.ICondition; import org.eclipse.swtbot.swt.finder.widgets.SWTBotStyledText; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; 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.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; /** * Test reading a trace in raw and eventy modes. */ @RunWith(SWTBotJunit4ClassRunner.class) public class RawTextEditorTest { private static final RGB WHITE = new RGB(255, 255, 255); private static final RGB HIGHLIGHT_COLOR = new RGB(231, 246, 254); private static final String PROJECT_NAME = "Test"; private static final String TRACE_TYPE_SYSLOG = "org.eclipse.linuxtools.tmf.tests.stubs.trace.text.testsyslog"; private static final String TIMESTAMP_FORMAT = "MMM dd HH:mm:ss"; private static final long INITIAL_NB_EVENTS = 100; private static final long SECOND_TO_MILLISECOND = 1000; private static final String TRACE_LOCATION = TmfTraceManager.getTemporaryDirPath() + File.separator + "test.txt"; private static SWTWorkbenchBot fBot; private long fNbWrittenEvents = 0; /** Test Class setup */ @BeforeClass public static void init() { SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US"; SWTBotUtils.initialize(); SWTBotPreferences.TIMEOUT = 20000; /* 20 second timeout */ Logger.getRootLogger().addAppender(new NullAppender()); fBot = new SWTWorkbenchBot(); SWTBotUtils.closeView("welcome", fBot); SWTBotUtils.switchToTracingPerspective(); /* finish waiting for eclipse to load */ WaitUtils.waitForJobs(); } /** * Test setup * * @throws Exception * on error */ @Before public void before() throws Exception { SWTBotUtils.createProject(PROJECT_NAME); SWTBotUtils.openTrace(PROJECT_NAME, createTrace(INITIAL_NB_EVENTS), getTraceType()); WaitUtils.waitForJobs(); } /** * Test tear down */ @After public void after() { SWTBotUtils.deleteProject(PROJECT_NAME, fBot); } /** * Test going to raw and back */ @Test public void testRead() { ITmfTrace activeTrace = TmfTraceManager.getInstance().getActiveTrace(); fBot.waitUntil(new NumberOfEventsCondition(activeTrace, INITIAL_NB_EVENTS)); SWTBotEditor eventsEditor = SWTBotUtils.activeEventsEditor(fBot); eventsEditor.setFocus(); assertFalse(eventsEditor.bot().table().rowCount() == 0); eventsEditor.bot().table().select(4); eventsEditor.bot().table().getTableItem(4).contextMenu("Show Raw").click(); eventsEditor.bot().table().getTableItem(4).click(); final SWTBotStyledText rawViewer = eventsEditor.bot().styledText(); String selection = rawViewer.getText(); assertEquals(":03 HostF LoggerF: SourceFileF:9 Message F", selection.substring(12, 54)); rawViewer.pressShortcut(Keystrokes.DOWN); final ICondition colorIsNotHighlight = new DefaultCondition() { @Override public boolean test() throws Exception { return !HIGHLIGHT_COLOR.equals(rawViewer.getLineBackground(0)); } @Override public String getFailureMessage() { return "Timed out"; } }; final ICondition colorIsHighlight = new DefaultCondition() { @Override public boolean test() { return HIGHLIGHT_COLOR.equals(rawViewer.getLineBackground(0)); } @Override public String getFailureMessage() { return "Timed out"; } }; fBot.waitUntil(colorIsNotHighlight); assertEquals("Non-highlighted color", WHITE, rawViewer.getLineBackground(0)); assertEquals("Highlighted color", HIGHLIGHT_COLOR, rawViewer.getLineBackground(1)); rawViewer.pressShortcut(Keystrokes.UP); fBot.waitUntil(colorIsHighlight); assertEquals("Highlighted color", HIGHLIGHT_COLOR, rawViewer.getLineBackground(0)); rawViewer.pressShortcut(Keystrokes.DOWN); fBot.waitUntil(colorIsNotHighlight); assertEquals("Non-highlighted color", WHITE, rawViewer.getLineBackground(0)); assertEquals("Highlighted color", HIGHLIGHT_COLOR, rawViewer.getLineBackground(1)); rawViewer.pressShortcut(Keystrokes.PAGE_UP); fBot.waitUntil(colorIsHighlight); assertEquals("Highlighted color", HIGHLIGHT_COLOR, rawViewer.getLineBackground(0)); rawViewer.pressShortcut(SWT.CTRL, SWT.END, ' '); assertEquals("Highlighted color", HIGHLIGHT_COLOR, rawViewer.getLineBackground(0)); rawViewer.pressShortcut(Keystrokes.UP); rawViewer.pressShortcut(Keystrokes.PAGE_DOWN); fBot.waitUntil(colorIsNotHighlight); assertEquals("Non-highlighted color", WHITE, rawViewer.getLineBackground(0)); assertEquals("Highlighted color", HIGHLIGHT_COLOR, rawViewer.getLineBackground(1)); rawViewer.pressShortcut(SWT.CTRL, SWT.HOME, ' '); fBot.waitUntil(colorIsHighlight); assertEquals("Highlighted color", HIGHLIGHT_COLOR, rawViewer.getLineBackground(0)); eventsEditor.bot().table().getTableItem(5).click(); eventsEditor.bot().table().getTableItem(4).contextMenu("Hide Raw").click(); assertFalse(rawViewer.isActive()); } private static class NumberOfEventsCondition extends DefaultCondition { private ITmfTrace fTrace; private long fNbEvents; private NumberOfEventsCondition(ITmfTrace trace, long nbEvents) { fTrace = trace; fNbEvents = nbEvents; } @Override public boolean test() throws Exception { return fTrace.getNbEvents() == fNbEvents; } @Override public String getFailureMessage() { return fTrace.getName() + " did not contain the expected number of " + fNbEvents + " events. Current: " + fTrace.getNbEvents(); } } /** * Create a trace with a number of events. * * @param nbEvents * the number of events to generate * @return the path to the created trace * @throws Exception * on error */ protected String createTrace(long nbEvents) throws Exception { writeToTrace(nbEvents, false); return TRACE_LOCATION; } private void writeToTrace(long nbEvents, boolean append) throws IOException { final File file = new File(TRACE_LOCATION); try (FileWriter writer = new FileWriter(file, append)) { for (int i = 0; i < nbEvents; ++i) { writeEvent(writer); } } } private void writeEvent(FileWriter fw) throws IOException { SimpleDateFormat f = new SimpleDateFormat(TIMESTAMP_FORMAT); String timeStampStr = f.format(new Date(fNbWrittenEvents * SECOND_TO_MILLISECOND)); fw.write(timeStampStr + " HostF LoggerF: SourceFileF:9 Message F\n"); fNbWrittenEvents++; } /** * Get the trace type for the test. * * @return the trace type */ protected String getTraceType() { return TRACE_TYPE_SYSLOG; } }