/******************************************************************************* * Copyright (C) 2015 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: * - Mickael Istria (Red Hat Inc.) : initial implementation *******************************************************************************/ package org.eclipse.egit.ui.importer.tests; import static org.junit.Assert.fail; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.apache.tools.ant.taskdefs.Delete; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceDescription; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; import org.eclipse.swtbot.swt.finder.SWTBot; import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException; import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable; import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner; import org.eclipse.swtbot.swt.finder.results.BoolResult; import org.eclipse.swtbot.swt.finder.waits.DefaultCondition; import org.eclipse.swtbot.swt.finder.waits.ICondition; import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell; import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.wizards.datatransfer.SmartImportJob; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Assume; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @Ignore @RunWith(SWTBotJunit4ClassRunner.class) public class SmartImportWizardTest { protected static final SWTWorkbenchBot bot = new SWTWorkbenchBot(); private static volatile boolean welcomePageClosed = false; private static boolean initialAutobuild; @BeforeClass public static void prepareTest() throws CoreException { closeWelcomePage(); initialAutobuild = setAutobuild(false); } @AfterClass public static void restoreState() throws CoreException { setAutobuild(initialAutobuild); } private static boolean setAutobuild(boolean value) throws CoreException { IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceDescription desc = workspace.getDescription(); boolean isAutoBuilding = desc.isAutoBuilding(); if (isAutoBuilding != value) { desc.setAutoBuilding(value); workspace.setDescription(desc); } return isAutoBuilding; } private static void closeWelcomePage() { if (welcomePageClosed) return; try { bot.viewByTitle("Welcome").close(); } catch (WidgetNotFoundException e) { // somebody else probably closed it, lets not feel bad about it. } finally { welcomePageClosed = true; } } @Before public void setBotAndAtivateShell() { SWTBotShell[] shells = bot.shells(); for (SWTBotShell shell : shells) { if (isEclipseShell(shell)) { shell.activate(); return; } } fail("No active Eclipse shell found!"); } @After public void closeShells() { SWTBotShell[] shells = bot.shells(); for (SWTBotShell shell : shells) { if (shell.isOpen() && !isEclipseShell(shell)) { shell.close(); } } } @SuppressWarnings("boxing") protected static boolean isEclipseShell(final SWTBotShell shell) { return UIThreadRunnable.syncExec(new BoolResult() { @Override public Boolean run() { return PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getShell() == shell.widget; } }); } @Test public void test() throws Exception { try { new URL("https://git.eclipse.org/r/").openConnection(); } catch (Exception ex) { Assume.assumeNoException("Internet access is required for that test", ex); } Set<IProject> initialProjects = new HashSet<>(Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects())); Set<IProject> newProjects = null; bot.menu("File").menu("Import...").click(); expandAndWait(bot.tree().getTreeItem("Git")) .select("Projects from Git (with smart import)"); bot.button("Next >").click(); bot.tree().select("Clone URI"); bot.button("Next >").click(); bot.text().setText("https://git.eclipse.org/r/jgit/jgit"); bot.button("Next >").click(); waitForButtonEnabled("Next >", 30); // Time to fetch branch info bot.button("Deselect All").click(); bot.tree().getTreeItem("master").check(); bot.button("Next >").click(); Path tmpDir = Files.createTempDirectory(getClass().getName()); try { bot.text().setText(tmpDir.toString()); bot.button("Next >").click(); waitForButtonEnabled("Finish", 180); // Time to clone repo bot.button("Finish").click(); Job.getJobManager().join(SmartImportJob.class, new NullProgressMonitor()); newProjects = new HashSet<>(Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects())); newProjects.removeAll(initialProjects); Assert.assertTrue("There should be more than one project imported with jgit...", newProjects.size() > 1); IProject someProject = ResourcesPlugin.getWorkspace().getRoot().getProject("org.eclipse.jgit.ui"); Assert.assertTrue("Project not found", someProject.exists()); } finally { // clean up if (newProjects != null) { for (IProject p : newProjects) { p.delete(true, new NullProgressMonitor()); } } Delete deleteTask = new Delete(); deleteTask.setDir(tmpDir.toFile()); deleteTask.execute(); } } private void waitForButtonEnabled(final String buttonLabel, final long timeoutInSec) { bot.waitWhile(new ICondition() { @Override public boolean test() throws Exception { return !bot.button(buttonLabel).isEnabled(); } @Override public void init(SWTBot swtBot) { // Nothing } @Override public String getFailureMessage() { return buttonLabel + " button not enabled within " + timeoutInSec + "sec"; } }, timeoutInSec * 1000L); } private SWTBotTreeItem expandAndWait(final SWTBotTreeItem treeItem) { treeItem.expand(); new SWTBot().waitUntil(new DefaultCondition() { @Override public boolean test() { SWTBotTreeItem[] children = treeItem.getItems(); return children != null && children.length > 0; } @Override public String getFailureMessage() { return "No children found for " + treeItem.getText(); } }); return treeItem; } }