blob: a33c6a5128d6fcfcbdca196dd850d321dfc13671 [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.analysis.counters.ui.swtbot.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarDropDownButton;
import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.ctf.core.tests.shared.CtfTmfTestTraceUtils;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.XYDataProviderBaseTest;
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.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXAxisChartViewer;
import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
import org.eclipse.ui.IViewPart;
import org.junit.Test;
/**
* SWTBot tests for pin & clone for xy-charts using Counters view example.
*
* @author Bernd Hufmann
*/
public class CounterViewPinAndCloneTest extends XYDataProviderBaseTest {
private static final String TRACETYPE_ID = "org.eclipse.linuxtools.lttng2.kernel.tracetype";
private static final String TRACE_NAME = "kernel_vm";
private static final @NonNull String COUNTERS_VIEW_TITLE = "Counters";
private static final @NonNull String MAIN_SERIES_NAME = "kernel_vm/Ungrouped/minor_faults";
private static final @NonNull String COUNTERS_VIEW_ID = "org.eclipse.tracecompass.analysis.counters.ui.view.counters";
private static final String PINNED_TO_TRACE_COUNTERS_VIEW_TITLE = COUNTERS_VIEW_TITLE + " <" + TRACE_NAME + ">";
private static final String PINNED_TO_CTX_SWITCH_VIEW_TITLE = COUNTERS_VIEW_TITLE + " <context-switches-kernel>";
private static final String PIN_VIEW_BUTTON_NAME = "Pin View";
private static final String UNPIN_VIEW_BUTTON_NAME = "Unpin View";
private static final String PIN_TO_PREFIX = "Pin to ";
private static final String NEW_COUNTER_STACK_MENU = "New " + COUNTERS_VIEW_TITLE + " view";
private static final String PINNED_TO_PREFIX = "pinned to ";
private static final String CLONED_TRACE_SUFFIX = " | 2";
private static final String CLONED_VIEW_TITLE_NAME = COUNTERS_VIEW_TITLE + " <" + TRACE_NAME + " | 2>";
private static final int SECOND = 1000000000;
private static final long KERNEL_START = 1363700740555978750L;
private static final long KERNEL_TEST_START = KERNEL_START + SECOND;
private static final long KERNEL_TEST_END = KERNEL_START + 2 * SECOND;
private static final long KERNEL_TEST_INITIAL_END = KERNEL_START + 100000000L;
private static final long KERNEL_INITIAL_END = KERNEL_START + 100000000L;
private static final @NonNull TmfTimeRange RANGE = new TmfTimeRange(TmfTimestamp.fromNanos(KERNEL_TEST_START), TmfTimestamp.fromNanos(KERNEL_TEST_END));
/**
* Ensure the data displayed in the chart viewer reflects the tree viewer's
* selected entries.
*/
@Test
public void testPinSingleTrace() {
SWTBotView originalViewBot = getSWTBotView();
// ensure that the view name is correct before
assertEquals(COUNTERS_VIEW_TITLE, originalViewBot.getTitle());
// ensure that the pin drop down is present, pin the view.
fBot.waitUntil(new DefaultCondition() {
WidgetNotFoundException fException;
@Override
public boolean test() throws Exception {
try {
SWTBotToolbarDropDownButton toolbarDropDownButton = originalViewBot.toolbarDropDownButton(PIN_VIEW_BUTTON_NAME);
toolbarDropDownButton.menuItem(PIN_TO_PREFIX + getTestTrace().getName()).click();
return true;
} catch (WidgetNotFoundException e) {
fException = e;
return false;
}
}
@Override
public String getFailureMessage() {
return "Traces not available in toolbar drop down menu: " + fException;
}
});
// Ensure that the view has been renamed. Get the view by title and ensure i private static final int SECOND = 1000000000;
// has the same widget as there is a renaming bug.
assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
originalViewBot.toolbarButton(UNPIN_VIEW_BUTTON_NAME).click();
// Ensure that the view has been renamed. Get the view by title and ensure it
// has the same widget as there is a renaming bug.
assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
// Ensure that the pin button is present, pin the view.
originalViewBot.toolbarButton(PIN_VIEW_BUTTON_NAME).click();
// Ensure that the view has been renamed. Get the view by title and ensure it
// has the same widget as there is a renaming bug.
assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
// Ensure that the pin button is present, unpin the view.
originalViewBot.toolbarButton(UNPIN_VIEW_BUTTON_NAME).click();
assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
}
/**
* Test the behavior with two traces.
*/
@Test
public void testPinTwoTraces() {
SWTBotView originalViewBot = getSWTBotView();
ITmfTrace activeTrace = TmfTraceManager.getInstance().getActiveTrace();
assertNotNull(activeTrace);
ITmfTrace kernelTestTrace = CtfTmfTestTraceUtils.getTrace(CtfTestTrace.CONTEXT_SWITCHES_KERNEL);
SWTBotUtils.openTrace(TRACE_PROJECT_NAME, kernelTestTrace.getPath(), TRACETYPE_ID);
/// Finish waiting for the trace to index
WaitUtils.waitForJobs();
// wait for the editor to be ready.
fBot.editorByTitle(kernelTestTrace.getName());
// Assert that the pin to drop down menuItems are present for both traces.
fBot.waitUntil(new DefaultCondition() {
WidgetNotFoundException fException;
@Override
public boolean test() throws Exception {
try {
SWTBotToolbarDropDownButton toolbarDropDownButton = originalViewBot.toolbarDropDownButton(PIN_VIEW_BUTTON_NAME);
toolbarDropDownButton.menuItem(PIN_TO_PREFIX + kernelTestTrace.getName());
toolbarDropDownButton.menuItem(PIN_TO_PREFIX + getTestTrace().getName()).click();
return true;
} catch (WidgetNotFoundException e) {
fException = e;
return false;
}
}
@Override
public String getFailureMessage() {
return "Traces not available in toolbar drop down menu: " + fException;
}
});
/*
* Assert that the pinned view is the kernel_vm trace despite the active trace being
* the context-switch trace.
*/
assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
activeTrace = TmfTraceManager.getInstance().getActiveTrace();
assertNotNull("There should be an active trace", activeTrace);
assertEquals("context-switches-kernel should be the active trace", kernelTestTrace.getName(), activeTrace.getName());
// Get the window range of the kernel trace
TmfTraceManager traceManager = TmfTraceManager.getInstance();
ITmfTrace kernelTrace = traceManager.getActiveTrace();
assertNotNull(kernelTrace);
// Switch back and forth
SWTBotUtils.activateEditor(fBot, getTestTrace().getName());
assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
SWTBotUtils.activateEditor(fBot, kernelTestTrace.getName());
assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
IViewPart viewPart = originalViewBot.getViewReference().getView(false);
assertTrue(viewPart instanceof TmfChartView);
final TmfCommonXAxisChartViewer chartViewer = (TmfCommonXAxisChartViewer) getChartViewer(viewPart);
assertNotNull(chartViewer);
TmfSignalManager.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, RANGE, kernelTrace));
// Assert that the original views trace's window range did not change
SWTBotUtils.activateEditor(fBot, getTestTrace().getName());
SWTBotUtils.waitUntil(v -> (v.getWindowStartTime() == KERNEL_START && v.getWindowEndTime() == KERNEL_TEST_INITIAL_END), chartViewer, "Range of cloned view changed");
// Unpin from active trace
SWTBotUtils.activateEditor(fBot, kernelTrace.getName());
originalViewBot.toolbarButton(UNPIN_VIEW_BUTTON_NAME).click();
assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
originalViewBot.toolbarButton(PIN_VIEW_BUTTON_NAME).click();
assertOriginalViewTitle(PINNED_TO_CTX_SWITCH_VIEW_TITLE);
// Close the pinned trace
SWTBotEditor kernelTable = fBot.editorByTitle(kernelTestTrace.getName());
kernelTable.close();
// Verify that view title is reset
SWTBotUtils.waitUntil(v -> v.getReference().getPartName().equals(COUNTERS_VIEW_TITLE), originalViewBot, "View name didn't change");
kernelTestTrace.dispose();
}
/**
* Test the cloning feature.
*/
@Test
public void testCloneSingleTrace() {
SWTBotView originalViewBot = getSWTBotView();
SWTBotMenu cloneMenu = originalViewBot.viewMenu().menu(NEW_COUNTER_STACK_MENU);
/*
* Assert that the original editor was not renamed and that the cloned one
* exists and is pinned to the kernel_vm trace.
*/
cloneMenu.menu(PINNED_TO_PREFIX + getTestTrace().getName()).click();
assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
SWTBotView clonedView = fBot.viewByTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
assertEquals("Should not have created a new instance", 1, fBot.editors().size());
clonedView.close();
// Assert that a new instance is created.
cloneMenu.menu(PINNED_TO_PREFIX + getTestTrace().getName() + " | new instance").click();
assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
clonedView = fBot.viewByTitle(CLONED_VIEW_TITLE_NAME);
assertEquals("Should have created a new instance", 2, fBot.editors().size());
SWTBotEditor cloneEditor = fBot.editorByTitle(getTestTrace().getName() + CLONED_TRACE_SUFFIX);
// Get the window range of the cloned trace
TmfTraceManager traceManager = TmfTraceManager.getInstance();
ITmfTrace cloneTrace = traceManager.getActiveTrace();
assertNotNull(cloneTrace);
// Go back to original trace, pin it
SWTBotUtils.activateEditor(fBot, getTestTrace().getName());
originalViewBot.toolbarButton(PIN_VIEW_BUTTON_NAME).click();
// Assert that the cloned trace's window range did not change
SWTBotUtils.activateEditor(fBot, cloneTrace.getName() + CLONED_TRACE_SUFFIX);
IViewPart viewPart = clonedView.getViewReference().getView(false);
assertTrue(viewPart instanceof TmfChartView);
final TmfCommonXAxisChartViewer chartViewer = (TmfCommonXAxisChartViewer) getChartViewer(viewPart);
assertNotNull(chartViewer);
fBot.waitUntil(ConditionHelpers.xyViewerIsReadyCondition(chartViewer));
TmfSignalManager.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, RANGE, getTestTrace()));
fBot.waitUntil(ConditionHelpers.xyViewerIsReadyCondition(chartViewer));
SWTBotUtils.waitUntil(v -> (v.getWindowStartTime() == KERNEL_START && v.getWindowEndTime() == KERNEL_INITIAL_END), chartViewer, "Range of cloned view changed");
cloneEditor.close();
}
private void assertOriginalViewTitle(String newName) {
Widget expectedWidget = getSWTBotView().getWidget();
assertNotNull(expectedWidget);
SWTBotView actualView = fBot.viewByTitle(newName);
Widget actualWidget = actualView.getWidget();
assertNotNull(actualWidget);
assertEquals(expectedWidget, actualWidget);
}
@Override
protected @NonNull String getMainSeriesName() {
return MAIN_SERIES_NAME;
}
@Override
protected @NonNull String getTitle() {
return COUNTERS_VIEW_TITLE;
}
@Override
protected String getViewID() {
return COUNTERS_VIEW_ID;
}
@Override
protected ITmfTrace getTestTrace() {
return CtfTmfTestTraceUtils.getTrace(CtfTestTrace.KERNEL_VM);
}
@Override
protected void disposeTestTrace() {
CtfTmfTestTraceUtils.dispose(CtfTestTrace.KERNEL_VM);
}
}