/******************************************************************************* * Copyright (c) 2011 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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.jboss.tools.maven.ui.bot.test; /** * @author Rastislav Wagner * */ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.List; import java.util.Scanner; import org.jboss.reddeer.eclipse.condition.ProjectExists; import org.jboss.reddeer.eclipse.core.resources.Project; import org.jboss.reddeer.eclipse.jdt.ui.ProjectExplorer; import org.jboss.reddeer.eclipse.jdt.ui.packageexplorer.PackageExplorer; import org.jboss.reddeer.eclipse.jst.servlet.ui.WebProjectFirstPage; import org.jboss.reddeer.eclipse.jst.servlet.ui.WebProjectThirdPage; import org.jboss.reddeer.eclipse.jst.servlet.ui.WebProjectWizard; import org.jboss.reddeer.eclipse.m2e.core.ui.wizard.MavenProjectWizard; import org.jboss.reddeer.eclipse.m2e.core.ui.wizard.MavenProjectWizardArtifactPage; import org.jboss.reddeer.eclipse.m2e.core.ui.wizard.MavenProjectWizardPage; import org.jboss.reddeer.eclipse.ui.console.ConsoleView; import org.jboss.reddeer.core.condition.JobIsRunning; import org.jboss.reddeer.core.condition.ShellWithTextIsActive; import org.jboss.reddeer.core.condition.ShellWithTextIsAvailable; import org.jboss.reddeer.core.exception.CoreLayerException; import org.jboss.reddeer.swt.api.StyledText; import org.jboss.reddeer.swt.condition.WidgetIsEnabled; import org.jboss.reddeer.swt.exception.SWTLayerException; import org.jboss.reddeer.swt.impl.button.CheckBox; import org.jboss.reddeer.swt.impl.button.LabeledCheckBox; import org.jboss.reddeer.swt.impl.button.PushButton; import org.jboss.reddeer.swt.impl.combo.LabeledCombo; import org.jboss.reddeer.swt.impl.ctab.DefaultCTabItem; import org.jboss.reddeer.swt.impl.group.DefaultGroup; import org.jboss.reddeer.swt.impl.menu.ContextMenu; import org.jboss.reddeer.swt.impl.shell.DefaultShell; import org.jboss.reddeer.swt.impl.styledtext.DefaultStyledText; import org.jboss.reddeer.swt.impl.tab.DefaultTabItem; import org.jboss.reddeer.swt.impl.text.LabeledText; import org.jboss.reddeer.swt.impl.tree.DefaultTree; import org.jboss.reddeer.swt.impl.tree.DefaultTreeItem; import org.jboss.reddeer.workbench.api.Editor; import org.jboss.reddeer.workbench.handler.EditorHandler; import org.jboss.reddeer.workbench.impl.editor.DefaultEditor; import org.jboss.reddeer.workbench.impl.shell.WorkbenchShell; import org.jboss.reddeer.workbench.ui.dialogs.WorkbenchPreferenceDialog; import org.jboss.reddeer.common.exception.WaitTimeoutExpiredException; import org.jboss.reddeer.common.logging.Logger; import org.jboss.reddeer.common.matcher.RegexMatcher; import org.jboss.reddeer.core.matcher.WithTextMatchers; import org.jboss.reddeer.common.wait.AbstractWait; import org.jboss.reddeer.common.wait.TimePeriod; import org.jboss.reddeer.common.wait.WaitUntil; import org.jboss.reddeer.common.wait.WaitWhile; import org.jboss.tools.maven.ui.bot.test.utils.ProjectIsBuilt; import org.junit.AfterClass; import org.junit.BeforeClass; import org.jboss.tools.maven.reddeer.preferences.MavenPreferencePage; public abstract class AbstractMavenSWTBotTest{ private static final Logger log = Logger.getLogger(AbstractMavenSWTBotTest.class); @BeforeClass public static void beforeClass(){ new WorkbenchShell().maximize(); WorkbenchPreferenceDialog preferenceDialog = new WorkbenchPreferenceDialog(); preferenceDialog.open(); MavenPreferencePage mpreferencesp = new MavenPreferencePage(); preferenceDialog.select(mpreferencesp); mpreferencesp.updateIndexesOnStartup(false); preferenceDialog.ok(); setGit(); } @AfterClass public static void cleanUp(){ EditorHandler.getInstance().closeAll(false); ProjectExplorer pe = new ProjectExplorer(); pe.open(); for(Project p: pe.getProjects()){ try{ org.jboss.reddeer.direct.project.Project.delete(p.getName(), true, true); } catch (Exception ex) { AbstractWait.sleep(TimePeriod.NORMAL); if(!p.getTreeItem().isDisposed()){ org.jboss.reddeer.direct.project.Project.delete(p.getName(), true, true); } } } } public boolean hasNature(String projectName, String version, String... natureID){ PackageExplorer pexplorer = new PackageExplorer(); pexplorer.open(); pexplorer.getProject(projectName).select(); new ContextMenu("Properties").select(); new WaitUntil(new ShellWithTextIsActive("Properties for "+projectName), TimePeriod.NORMAL); new DefaultTreeItem("Project Facets").select(); boolean result = new DefaultTreeItem(new DefaultTree(1),natureID).isChecked(); if(version!=null){ result = result && new DefaultTreeItem(new DefaultTree(1),natureID).getCell(1).equals(version); } new PushButton("OK").click(); new WaitWhile(new ShellWithTextIsAvailable("Properties for "+projectName), TimePeriod.NORMAL); return result; } protected void addDependency(String projectName, String groupId, String artifactId, String version){ PackageExplorer pexplorer = new PackageExplorer(); pexplorer.open(); pexplorer.getProject(projectName).select(); new ContextMenu("Maven","Add Dependency").select(); new WaitUntil(new ShellWithTextIsActive("Add Dependency"), TimePeriod.NORMAL); new LabeledText("Group Id:").setText(groupId); new LabeledText("Artifact Id:").setText(artifactId); new LabeledText("Version: ").setText(version); new PushButton("OK").click(); new WaitWhile(new JobIsRunning(), TimePeriod.VERY_LONG); } public void addPlugin(String projectName, String groupId, String artifactId, String version){ PackageExplorer pexplorer = new PackageExplorer(); pexplorer.open(); pexplorer.getProject(projectName).select(); new ContextMenu("Maven","Add Plugin").select(); new WaitUntil(new ShellWithTextIsActive("Add Plugin"), TimePeriod.NORMAL); new LabeledText("Group Id:").setText(groupId); new LabeledText("Artifact Id:").setText(artifactId); new LabeledText("Version: ").setText(version); new PushButton("OK").click(); new WaitWhile(new JobIsRunning(), TimePeriod.VERY_LONG); } protected static void updateConf(String projectName){ updateConf(projectName,false); } protected static void updateConf(String projectName,boolean forceDependencies){ PackageExplorer pexplorer = new PackageExplorer(); pexplorer.open(); pexplorer.getProject(projectName).select(); new ContextMenu("Maven","Update Project...").select(); new WaitUntil(new ShellWithTextIsActive("Update Maven Project"),TimePeriod.LONG); new CheckBox("Force Update of Snapshots/Releases").toggle(forceDependencies); new PushButton("OK").click(); new WaitWhile(new ShellWithTextIsAvailable("Update Maven Project"),TimePeriod.NORMAL); new WaitWhile(new JobIsRunning(),TimePeriod.VERY_LONG); } public void buildProject(String projectName, String mavenBuild, String goals, boolean shouldBuild){ ConsoleView cview = new ConsoleView(); cview.open(); try{ cview.clearConsole(); } catch (CoreLayerException ex){ //there's not clear console button, since nothing run before } PackageExplorer pexplorer = new PackageExplorer(); pexplorer.open(); pexplorer.getProject(projectName).select(); RegexMatcher rm1 = new RegexMatcher("Run As"); RegexMatcher rm2 = new RegexMatcher(mavenBuild); WithTextMatchers m = new WithTextMatchers(rm1,rm2); new ContextMenu(m.getMatchers()).select(); new WaitUntil(new ShellWithTextIsActive("Edit Configuration"),TimePeriod.NORMAL); new LabeledText("Goals:").setText(goals); new PushButton("Run").click(); ProjectIsBuilt pb = new ProjectIsBuilt(); new WaitUntil(pb,TimePeriod.VERY_LONG); if(shouldBuild){ assertTrue(pb.isBuildSuccesfull()); }else { assertFalse(pb.isBuildSuccesfull()); } } public static void deleteProjects(boolean fromSystem){ EditorHandler.getInstance().closeAll(false); ProjectExplorer pe = new ProjectExplorer(); pe.open(); for(Project p: pe.getProjects()){ try{ org.jboss.reddeer.direct.project.Project.delete(p.getName(), true, true); } catch (Exception ex) { AbstractWait.sleep(TimePeriod.NORMAL); if(!p.getTreeItem().isDisposed()){ org.jboss.reddeer.direct.project.Project.delete(p.getName(), true, true); } } } } public void checkWebTarget(String projectName, String finalName){ PackageExplorer pe = new PackageExplorer(); pe.open(); pe.getProject(projectName).select(); new ContextMenu("Refresh").select(); new WaitWhile(new JobIsRunning()); assertTrue(pe.getProject(projectName).containsItem("target",finalName+".war")); } public void convertToMavenProject(String projectName, String defaultPackaging, boolean withDependencies){ PackageExplorer pexplorer = new PackageExplorer(); pexplorer.open(); new WaitUntil(new ProjectExists(projectName)); pexplorer.getProject(projectName).select(); new ContextMenu("Configure","Convert to Maven Project").select(); new DefaultShell("Create new POM"); assertEquals("Project " +projectName+" packaging should be set to "+defaultPackaging, defaultPackaging, new LabeledCombo(new DefaultGroup("Artifact"),"Packaging:").getText()); new PushButton("Finish").click(); try{ new DefaultShell("Convert to Maven Dependencies"); new WaitUntil(new WidgetIsEnabled(new PushButton("Finish")), TimePeriod.LONG); if(withDependencies){ new PushButton("Finish").click(); } else { new PushButton("Skip Dependency Conversion").click(); } new WaitWhile(new ShellWithTextIsAvailable("Convert to Maven Dependencies")); } catch (SWTLayerException ex){ } finally { new WaitWhile(new ShellWithTextIsAvailable("Create new POM")); new WaitWhile(new JobIsRunning(),TimePeriod.VERY_LONG); } } //TODO editor is missing in Reddeer...and check the packaging public void checkPackaging(String projectName, String packaging){ PackageExplorer pExplorer = new PackageExplorer(); pExplorer.open(); //new ViewTreeItem(projectName,"pom.xml").select(); //new ContextMenu("Open").select(); } public void createWebProject(String name,String runtime, boolean webxml){ WebProjectWizard dw = new WebProjectWizard(); dw.open(); WebProjectFirstPage dfp = new WebProjectFirstPage(); dfp.setProjectName(name); if(runtime == null){ dfp.setTargetRuntime("<None>"); } else { dfp.setTargetRuntime(runtime); } dw.next(); dw.next(); WebProjectThirdPage dtp = new WebProjectThirdPage(); dtp.setGenerateWebXmlDeploymentDescriptor(webxml); dw.finish(); waitForAllScheduledJobs(); } public static void setGit(){ WorkbenchPreferenceDialog wd = new WorkbenchPreferenceDialog(); wd.open(); wd.select("Team","Git","Label Decorations"); new DefaultTabItem("Text Decorations").activate(); if(!new LabeledText("Projects:").getText().equals("{name}")){ new LabeledText("Projects:").setText("{name}"); } wd.ok(); new WaitWhile(new JobIsRunning(),TimePeriod.VERY_LONG); } public void createBasicMavenProject(String artifactId, String groupId, String projectPackage, String javaTarget){ MavenProjectWizard mw = new MavenProjectWizard(); mw.open(); MavenProjectWizardPage mp = new MavenProjectWizardPage(); mp.createSimpleProject(true); mw.next(); MavenProjectWizardArtifactPage ap = new MavenProjectWizardArtifactPage(); ap.setArtifactId(artifactId); ap.setGroupId(groupId); ap.setPackage(projectPackage); mw.finish(); Editor e= openPom(artifactId); StyledText stext = new DefaultStyledText(); int pos = stext.getPositionOfText("</project>"); String javaTargetPlugin = null; try { javaTargetPlugin = new Scanner(new FileInputStream("resources/pom/JavaTarget")).useDelimiter("\\A").next(); } catch (FileNotFoundException ex) { // TODO Auto-generated catch block ex.printStackTrace(); } stext.selectPosition(pos); stext.insertText(javaTargetPlugin); stext.selectText("source_to_replace"); stext.insertText(javaTarget); stext.selectText("target_to_replace"); stext.insertText(javaTarget); e.save(); } public Editor openPom(String project){ ProjectExplorer pe = new ProjectExplorer(); pe.open(); pe.getProject(project).getProjectItem("pom.xml").open(); Editor e = new DefaultEditor(project+"/pom.xml"); new DefaultCTabItem("pom.xml").activate(); return e; } private void waitForAllScheduledJobs(){ int i =1; while(i>0){ try{ new WaitUntil(new JobIsRunning()); } catch (WaitTimeoutExpiredException ex){ break; } new WaitWhile(new JobIsRunning(),TimePeriod.LONG); } } }