blob: 8f05b830b6657497e16083540cf992f7a67181b8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016, 2018 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.lttng2.kernel.ui.swtbot.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
import org.eclipse.swtbot.swt.finder.waits.ICondition;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.controlflow.ControlFlowView;
import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
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.ui.swtbot.tests.shared.ConditionHelpers;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotTimeGraph;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotTimeGraphEntry;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractTimeGraphView;
import org.eclipse.ui.IWorkbenchPart;
import org.junit.Before;
import org.junit.Test;
/**
* SWTBot tests for Critical Flow view. This test also tests the control flow
* view's thread selection as the two views are tightly coupled.
*
* @author Matthew Khouzam
*/
public class CriticalPathTest extends KernelTestBase {
private static final int TID_NO = 338;
private static final String TID = String.valueOf(TID_NO);
private static final String PROCESS = "weston";
private static final int TID_NO2 = 340;
private static final String TID2 = String.valueOf(TID_NO2);
private static final String PROCESS2 = "weston-desktop-";
private static final @NonNull String CP_ID = "org.eclipse.linuxtools.tmf.analysis.graph.ui.criticalpath.view.criticalpathview";
private static final String KWORKER_PROCESS = "kworker/u16:0";
private static final String CRIT_PATH_MAIN_ENTRY = "[" + PROCESS + "," + TID + "]";
private static final String CRIT_PATH_OTHER_ENTRY = "[" + KWORKER_PROCESS + ",6]";
private static final String CRIT_PATH_MAIN_ENTRY2 = "[" + PROCESS2 + "," + TID2 + "]";
private static final String FOLLOW_FORWARD = "Follow critical path forward";
private static final String FOLLOW_BACKWARD = "Follow critical path backward";
private static final @NonNull ITmfTimestamp CPU_TIME0 = TmfTimestamp.fromNanos(1412670963793647239L);
private static final @NonNull ITmfTimestamp CPU_TIME1 = TmfTimestamp.fromNanos(1412670963793673139L);
private SWTBotView fViewBotCfv;
private SWTBotView fViewBotCp;
/**
* Before Test
*/
@Override
@Before
public void before() {
try {
String tracePath = FileUtils.toFile(FileLocator.toFileURL(CtfTestTrace.ARM_64_BIT_HEADER.getTraceURL())).getAbsolutePath();
SWTBotUtils.openTrace(TRACE_PROJECT_NAME, tracePath, KERNEL_TRACE_TYPE);
} catch (IOException e) {
fail(e.getMessage());
}
SWTBotUtils.activateEditor(fBot, "bug446190");
fViewBotCfv = fBot.viewById(ControlFlowView.ID);
SWTBotUtils.openView(CP_ID);
fViewBotCp = fBot.viewById(CP_ID);
fViewBotCp.show();
fViewBotCfv.show();
fViewBotCfv.setFocus();
}
/**
* test the behavior of the critical path for a thread selection signal from
* the control flow view
*/
@Test
public void testFull() {
SWTBotTimeGraph timeGraphCfv = new SWTBotTimeGraph(fViewBotCfv.bot());
SWTBotTree treeCp = fViewBotCp.bot().tree();
SWTBotTimeGraph timeGraphCp = new SWTBotTimeGraph(fViewBotCp.bot());
assertNotNull(timeGraphCfv.widget);
assertNotNull(treeCp.widget);
SWTBotTreeItem[] allItems = treeCp.getAllItems();
for (int i = 0; i < allItems.length; i++) {
assertEquals(0, allItems[i].getNodes().size());
}
ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
assertNotNull(trace);
SWTBotTimeGraphEntry entry = timeGraphCfv.getEntry(trace.getName(), "systemd", "we", PROCESS);
assertNotNull(entry);
entry.select();
SWTBotMenu menu = entry.contextMenu("Follow " + PROCESS + "/" + TID);
assertEquals("Follow " + PROCESS + "/" + TID, menu.getText());
menu.click();
fBot.waitUntil(new DefaultCondition() {
@Override
public boolean test() throws Exception {
SWTBotTimeGraphEntry[] entries = timeGraphCp.getEntries();
return CRIT_PATH_MAIN_ENTRY.equals(entries[0].getEntries()[0].getText());
}
@Override
public String getFailureMessage() {
return "Could not find " + CRIT_PATH_MAIN_ENTRY + " in Critical Path view";
}
});
// Test navigating the critical path view with the follow arrows buttons
IWorkbenchPart part = fViewBotCp.getViewReference().getPart(false);
TmfSignalManager.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, CPU_TIME0));
SWTBotTimeGraphEntry critPathEntry = timeGraphCp.getEntry(trace.getHostId(), CRIT_PATH_MAIN_ENTRY);
critPathEntry.select();
// Condition to wait for the time graph view to refresh
ICondition timeGraphIsReadyCondition = ConditionHelpers.timeGraphIsReadyCondition((AbstractTimeGraphView) part, new TmfTimeRange(CPU_TIME1, CPU_TIME1), CPU_TIME1);
// Reach the end of the current event
fViewBotCp.toolbarButton(FOLLOW_FORWARD).click();
fBot.waitUntil(timeGraphIsReadyCondition);
fBot.waitUntil(ConditionHelpers.timeGraphSelectionContains(timeGraphCp, 0, CRIT_PATH_MAIN_ENTRY));
// Follow the arrow down to the next item
fViewBotCp.toolbarButton(FOLLOW_FORWARD).click();
fBot.waitUntil(timeGraphIsReadyCondition);
fBot.waitUntil(ConditionHelpers.timeGraphSelectionContains(timeGraphCp, 0, CRIT_PATH_OTHER_ENTRY));
// Make sure changing the selection changed the selection in CFV too
fBot.waitUntil(ConditionHelpers.timeGraphSelectionContains(timeGraphCfv, 0, KWORKER_PROCESS));
// Follow it back up
fViewBotCp.toolbarButton(FOLLOW_BACKWARD).click();
fBot.waitUntil(timeGraphIsReadyCondition);
fBot.waitUntil(ConditionHelpers.timeGraphSelectionContains(timeGraphCp, 0, CRIT_PATH_MAIN_ENTRY));
// Make sure changing the selection changed the selection in CFV too
fBot.waitUntil(ConditionHelpers.timeGraphSelectionContains(timeGraphCfv, 0, PROCESS));
// Follow another process and make sure the critical path changes
entry = timeGraphCfv.getEntry(trace.getName(), "systemd", "we", PROCESS, PROCESS2);
assertNotNull(entry);
entry.select();
menu = entry.contextMenu("Follow " + PROCESS2 + "/" + TID2);
assertEquals("Follow " + PROCESS2 + "/" + TID2, menu.getText());
menu.click();
fBot.waitUntil(new DefaultCondition() {
@Override
public boolean test() throws Exception {
SWTBotTimeGraphEntry[] entries = timeGraphCp.getEntries();
return CRIT_PATH_MAIN_ENTRY2.equals(entries[0].getEntries()[0].getText());
}
@Override
public String getFailureMessage() {
return "Could not find " + CRIT_PATH_MAIN_ENTRY2 + " in Critical Path view";
}
});
}
}