/******************************************************************************* * Copyright (c) 2013 Red Hat Inc. * 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 * * Contributors: * Red Hat Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.perf.swtbot.tests; import static org.eclipse.swtbot.swt.finder.waits.Conditions.waitForWidget; import static org.eclipse.swtbot.swt.finder.waits.Conditions.widgetIsEnabled; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceDescription; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.linuxtools.internal.perf.IPerfData; import org.eclipse.linuxtools.internal.perf.PerfCore; import org.eclipse.linuxtools.profiling.tests.AbstractTest; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException; import org.eclipse.swtbot.swt.finder.finders.ContextMenuHelper; import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable; import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner; import org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory; import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell; import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton; import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree; import org.eclipse.ui.PlatformUI; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.osgi.framework.FrameworkUtil; /** * Abstract SWTBot test for Perf views, sub-classes must implement the abstract * methods to specify the test view and logic. */ @RunWith(SWTBotJunit4ClassRunner.class) public abstract class AbstractSWTBotTest extends AbstractTest { private static final String PROJ_NAME = "fibTest"; private static SWTBotView projectExplorer; @BeforeClass public static void setUpWorkbench() throws Exception { SWTWorkbenchBot bot = new SWTWorkbenchBot(); try { bot.viewByTitle("Welcome").close(); // hide Subclipse Usage stats popup if present/installed bot.shell("Subclipse Usage").activate(); bot.button("Cancel").click(); } catch (WidgetNotFoundException e) { // ignore } // Set C/C++ perspective. bot.perspectiveByLabel("C/C++").activate(); bot.sleep(500); for (SWTBotShell sh : bot.shells()) { if (sh.getText().startsWith("C/C++")) { sh.activate(); bot.sleep(500); break; } } // Turn off automatic building by default to avoid timing issues IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceDescription desc = workspace.getDescription(); boolean isAutoBuilding = desc.isAutoBuilding(); if (isAutoBuilding) { desc.setAutoBuilding(false); workspace.setDescription(desc); } projectExplorer = bot.viewByTitle("Project Explorer"); } @AfterClass public static void resetExplorerState() { exitProjectFolder(new SWTWorkbenchBot()); } @Test public void runPerfViewTest() throws Exception { SWTWorkbenchBot bot = new SWTWorkbenchBot(); /* * - Method returns when the build is complete - * AbstractTest#createProjectAndBuild builds a single executable binary * under "Binaries". */ proj = createProjectAndBuild(FrameworkUtil.getBundle(this.getClass()), PROJ_NAME); try { runPerfViewTestActions(bot); } catch (Exception e) { throw e; } finally { deleteProject(proj); } } private void runPerfViewTestActions(SWTWorkbenchBot bot) throws Exception { projectExplorer.bot().tree().select(PROJ_NAME); final Shell shellWidget = bot.activeShell().widget; // Open profiling configurations dialog UIThreadRunnable.asyncExec(() -> { DebugUITools.openLaunchConfigurationDialogOnGroup(shellWidget, (StructuredSelection) PlatformUI.getWorkbench().getWorkbenchWindows()[0].getSelectionService() .getSelection(), "org.eclipse.debug.ui.launchGroup.profilee"); }); bot.shell("Profiling Tools Configurations").activate(); // Create new Perf configuration SWTBotTree profilingConfigs = bot.tree(); SWTBotTree perfNode = profilingConfigs.select("Profile with Perf"); perfNode.contextMenu("New").click(); // Activate options tab bot.cTabItem("Perf Options").activate(); setPerfOptions(bot); bot.button("Apply").click(); if (PerfCore.checkPerfInPath(null)) { bot.button("Profile").click(); } else { bot.button("Close").click(); openStubView(); } testPerfView(); } /** * Compare The selected items in PROJ_NAME with each other * @param The name of a tree item to select * @param The name of a second tree item to select */ public void compareWithEachOther (String first, String second) { SWTWorkbenchBot bot = new SWTWorkbenchBot(); enterProjectFolder(bot); // Refresh and Select SWTBotTree treeBot = projectExplorer.bot().tree(); treeBot.contextMenu("Refresh").click(); treeBot.select(new String [] {first, second}); // Workaround for context menu on multiple selections click(ContextMenuHelper.contextMenu(treeBot, "Compare With", "Each Other")); exitProjectFolder(bot); } /** * Enter the project folder so as to avoid expanding trees later */ private static SWTBotView enterProjectFolder(SWTWorkbenchBot bot) { projectExplorer.bot().tree().select(PROJ_NAME). contextMenu("Go Into").click(); bot.waitUntil(waitForWidget(WidgetMatcherFactory.withText( PROJ_NAME), projectExplorer.getWidget())); return projectExplorer; } /** * Exit from the project tree. */ private static void exitProjectFolder(SWTWorkbenchBot bot) { try { SWTBotToolbarButton forwardButton = projectExplorer.toolbarPushButton("Forward"); projectExplorer.toolbarPushButton("Back to Workspace").click(); bot.waitUntil(widgetIsEnabled(forwardButton)); } catch (WidgetNotFoundException e) { // Already exited from project folder } } /** * Click specfied menu item. * * @param menuItem * menu item to click */ public static void click(final MenuItem menuItem) { final Event event = new Event(); event.time = (int) System.currentTimeMillis(); event.widget = menuItem; event.display = menuItem.getDisplay(); event.type = SWT.Selection; UIThreadRunnable.asyncExec(menuItem.getDisplay(), () -> { menuItem.notifyListeners(SWT.Selection, event); }); } @Override protected ILaunchConfigurationType getLaunchConfigType() { return null; } @Override protected void setProfileAttributes(ILaunchConfigurationWorkingCopy wc) { } /** * Set Perf launch options. * * @param bot SWTWorkbenchBot bot focused in Perf options tab. */ protected abstract void setPerfOptions(SWTWorkbenchBot bot); /** * Open view with fake data. To be used when perf is not installed. */ protected abstract void openStubView(); /** * Test perf view. */ protected abstract void testPerfView(); /** * Stub data for use in case the Perf tool is not installed. */ protected static class StubPerfData implements IPerfData { @Override public String getPerfData() { return "stub_perf_data"; } @Override public String getTitle() { return "stub_perf_title"; } } }