swtbot: Stabilize use of SWTBotUtils.maximizeTable()
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui.swtbot.tests / shared / org / eclipse / tracecompass / tmf / ui / swtbot / tests / shared / SWTBotUtils.java
index 71995f8cc0f049378d5cdc27eb85b563c9f4666e..3e0638adeccb254ed24315291d4048191106aebe 100644 (file)
@@ -17,17 +17,24 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.util.List;
+import java.util.TimeZone;
+import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jface.bindings.keys.IKeyLookup;
 import org.eclipse.jface.bindings.keys.KeyStroke;
 import org.eclipse.jface.bindings.keys.ParseException;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Display;
@@ -53,9 +60,14 @@ import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
 import org.eclipse.swtbot.swt.finder.widgets.TimeoutException;
+import org.eclipse.tracecompass.internal.tmf.ui.project.operations.NewExperimentOperation;
 import org.eclipse.tracecompass.tmf.ui.editors.TmfEventsEditor;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentFolder;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfOpenTraceHelper;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectElement;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectRegistry;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfTracesFolder;
 import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers.ProjectElementHasChild;
@@ -73,10 +85,12 @@ import org.hamcrest.Matcher;
  *
  * @author Matthew Khouzam
  */
+@SuppressWarnings("restriction")
 public final class SWTBotUtils {
 
     private static final String WINDOW_MENU = "Window";
     private static final String PREFERENCES_MENU_ITEM = "Preferences";
+    private static boolean fPrintedEnvironment = false;
 
     private SWTBotUtils() {
     }
@@ -182,6 +196,39 @@ public final class SWTBotUtils {
         deleteProject(projectName, true, bot);
     }
 
+    /**
+     * Creates an experiment
+     *
+     * @param bot
+     *            a given workbench bot
+     * @param projectName
+     *            the name of the project, creates the project if needed
+     * @param expName
+     *            the experiment name
+     */
+    public static void createExperiment(SWTWorkbenchBot bot, String projectName, final @NonNull String expName) {
+        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+        TmfProjectElement tmfProject = TmfProjectRegistry.getProject(project, true);
+        TmfExperimentFolder expFolder = tmfProject.getExperimentsFolder();
+        assertNotNull(expFolder);
+        NewExperimentOperation operation = new NewExperimentOperation(expFolder, expName);
+        operation.run(new NullProgressMonitor());
+
+        bot.waitUntil(new DefaultCondition() {
+            @Override
+            public boolean test() throws Exception {
+                TmfExperimentElement experiment = expFolder.getExperiment(expName);
+                return experiment != null;
+            }
+
+            @Override
+            public String getFailureMessage() {
+                return "Experiment (" + expName + ") couldn't be created";
+            }
+        });
+    }
+
+
     /**
      * Focus on the main window
      *
@@ -263,6 +310,7 @@ public final class SWTBotUtils {
 
         SWTWorkbenchBot bot = new SWTWorkbenchBot();
         UIThreadRunnable.syncExec(() -> {
+            printEnvironment();
 
             // There seems to be problems on some system where the main shell is
             // not in focus initially. This was seen using Xvfb and Xephyr on some occasions.
@@ -277,6 +325,37 @@ public final class SWTBotUtils {
         });
     }
 
+    private static void printEnvironment() {
+        if (fPrintedEnvironment) {
+            return;
+        }
+
+        // Print some information about the environment that could affect test outcome
+        Rectangle bounds = Display.getDefault().getBounds();
+        System.out.println("Display size: " + bounds.width + "x" + bounds.height);
+
+        String osVersion = System.getProperty("os.version");
+        if (osVersion != null) {
+            System.out.println("OS version=" + osVersion);
+        }
+        String gtkVersion = System.getProperty("org.eclipse.swt.internal.gtk.version");
+        if (gtkVersion != null) {
+            System.out.println("GTK version=" + gtkVersion);
+            String overlayScrollbar = System.getenv("LIBOVERLAY_SCROLLBAR");
+            if (overlayScrollbar != null) {
+                System.out.println("LIBOVERLAY_SCROLLBAR=" + overlayScrollbar);
+            }
+            String ubuntuMenuProxy = System.getenv("UBUNTU_MENUPROXY");
+            if (ubuntuMenuProxy != null) {
+                System.out.println("UBUNTU_MENUPROXY=" + ubuntuMenuProxy);
+            }
+        }
+
+        System.out.println("Time zone: " + TimeZone.getDefault().getDisplayName());
+
+        fPrintedEnvironment = true;
+    }
+
     /**
      * If the test is running in the UI thread then fail
      */
@@ -460,6 +539,101 @@ public final class SWTBotUtils {
         return tracesFolderItem;
     }
 
+    /**
+     * Clear the traces folder
+     *
+     * @param bot
+     *            a given workbench bot
+     * @param projectName
+     *            the name of the project (needs to exist)
+     */
+    public static void clearTracesFolder(SWTWorkbenchBot bot, String projectName) {
+        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+        TmfProjectElement tmfProject = TmfProjectRegistry.getProject(project, false);
+        TmfTraceFolder tracesFolder = tmfProject.getTracesFolder();
+        try {
+            for (TmfTraceElement traceElement : tracesFolder.getTraces()) {
+                traceElement.delete(null);
+            }
+
+            final IFolder resource = tracesFolder.getResource();
+            resource.accept(new IResourceVisitor() {
+                @Override
+                public boolean visit(IResource visitedResource) throws CoreException {
+                    if (visitedResource != resource) {
+                        visitedResource.delete(true, null);
+                    }
+                    return true;
+                }
+            }, IResource.DEPTH_ONE, 0);
+        } catch (CoreException e) {
+            fail(e.getMessage());
+        }
+
+        bot.waitUntil(new DefaultCondition() {
+            private int fTraceNb = 0;
+
+            @Override
+            public boolean test() throws Exception {
+                List<TmfTraceElement> traces = tracesFolder.getTraces();
+                fTraceNb = traces.size();
+                return fTraceNb == 0;
+            }
+
+            @Override
+            public String getFailureMessage() {
+                return "Traces Folder not empty (" + fTraceNb + ")";
+            }
+        });
+    }
+
+    /**
+     * Clear the experiment folder
+     *
+     * @param bot
+     *            a given workbench bot
+     * @param projectName
+     *            the name of the project (needs to exist)
+     */
+    public static void clearExperimentFolder(SWTWorkbenchBot bot, String projectName) {
+        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+        TmfProjectElement tmfProject = TmfProjectRegistry.getProject(project, false);
+        TmfExperimentFolder expFolder = tmfProject.getExperimentsFolder();
+        expFolder.getExperiments().forEach(experiment -> {
+            IResource resource = experiment.getResource();
+            try {
+                // Close the experiment if open
+                experiment.closeEditors();
+
+                IPath path = resource.getLocation();
+                if (path != null) {
+                    // Delete supplementary files
+                    experiment.deleteSupplementaryFolder();
+                }
+                // Finally, delete the experiment
+                resource.delete(true, null);
+            } catch (CoreException e) {
+                fail(e.getMessage());
+            }
+        });
+
+        bot.waitUntil(new DefaultCondition() {
+            private int fExperimentNb = 0;
+
+            @Override
+            public boolean test() throws Exception {
+                List<TmfExperimentElement> experiments = expFolder.getExperiments();
+                fExperimentNb = experiments.size();
+                return fExperimentNb == 0;
+            }
+
+            @Override
+            public String getFailureMessage() {
+                return "Experiment Folder not empty (" + fExperimentNb + ")";
+            }
+        });
+    }
+
     /**
      * Select the project in Project Explorer
      *
@@ -508,11 +682,35 @@ public final class SWTBotUtils {
      *            the {@link SWTBotTable} table
      */
     public static void maximizeTable(SWTBotTable tableBot) {
+        final AtomicBoolean controlResized = new AtomicBoolean();
+        UIThreadRunnable.syncExec(new VoidResult() {
+            @Override
+            public void run() {
+                tableBot.widget.addControlListener(new ControlAdapter() {
+                    @Override
+                    public void controlResized(ControlEvent e) {
+                        tableBot.widget.removeControlListener(this);
+                        controlResized.set(true);
+                    }
+                });
+            }
+        });
         try {
             tableBot.pressShortcut(KeyStroke.getInstance(IKeyLookup.CTRL_NAME + "+"), KeyStroke.getInstance("M"));
         } catch (ParseException e) {
             fail();
         }
+        new SWTBot().waitUntil(new DefaultCondition() {
+            @Override
+            public boolean test() throws Exception {
+                return controlResized.get();
+            }
+
+            @Override
+            public String getFailureMessage() {
+                return "Control was not resized";
+            }
+        });
     }
 
     /**
This page took 0.027893 seconds and 5 git commands to generate.