/****************************************************************************** * Copyright (c) 2011, EBM WebSourcing * 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: * EBM WebSourcing - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.ui.wizards; import java.net.URL; import org.eclipse.bpel.validator.Builder; import org.eclipse.bpel.validator.model.IProblem; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner; import org.eclipse.swtbot.swt.finder.waits.DefaultCondition; import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu; import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell; import org.junit.After; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; /** * A set of tests for the BPEL creation wizard. * @author Vincent Zurczak - EBM WebSourcing */ @RunWith(SWTBotJunit4ClassRunner.class) public class NewBpelFileWizardTest { private static final String BPEL_DIR = "bpelContent"; private static final String BPEL_NAME = "myProcess"; private static final String PROJECT_NAME = "BpelTest"; private static final String BPEL_FILE_NAME = BPEL_NAME + ".bpel"; private static SWTWorkbenchBot bot = new SWTWorkbenchBot(); private final Builder bpelBuilder = new Builder(); /** * Deletes the created project (and will thus close the BPEL editor). * @throws Exception */ @After public void afterTest() throws Exception { // Close a previous wizard whose test failed? try { bot.button( "Cancel" ).click(); } catch( Exception e ) { // nothing } // Delete the project final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( PROJECT_NAME ); if( ! project.exists()) return; project.delete( true, null ); bot.waitUntil( new DefaultCondition() { @Override public boolean test() throws Exception { return ! project.exists(); } @Override public String getFailureMessage() { return "The project could not be deleted."; } }); } /** * Prepares the work. * @throws Exception */ @BeforeClass public static void beforeClass() throws Exception { // Close the welcome page try { bot.viewByTitle( "Welcome" ).close(); } catch( Exception e ) { // nothing } // Disable auto-build // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=260010 SWTBotMenu menu = null; String ba = "Build Automatically"; try { menu = bot.menu( "Project" ).menu( ba ); } catch( Exception e ) { // nothing } if( menu == null ) { try { menu = bot.menu( "Project", 1 ).menu( ba ); } catch( Exception e2 ) { // nothing } } if( menu == null ) { try { menu = bot.menu( ba ); } catch( Exception e ) { // nothing } } if( menu != null && menu.isChecked()) menu.click(); } /** * Tests the creation of a BPEL from a template. * <p> * The process is created in the "bpelContent" directory of a BPEL project. * Empty process. * </p> * * @throws Exception */ @Test public void testTemplateInBpelDirectoryEmpty() throws Exception { testTemplate( 1, false, 1, true, true ); } /** * Tests the creation of a BPEL from a template. * <p> * The process is created in the "bpelContent" directory of a BPEL project. * Synchronous process. * </p> * * @throws Exception */ @Test public void testTemplateInBpelDirectorySynchronous() throws Exception { testTemplate( 2, false, 0, true, true ); } /** * Tests the creation of a BPEL from a template. * <p> * The process is created in the "bpelContent" directory of a BPEL project. * Asynchronous process. * </p> * * @throws Exception */ @Test public void testTemplateInBpelDirectoryAsynchronous() throws Exception { testTemplate( 0, false, 0, true, true ); } /** * Tests the creation of a BPEL from a template. * <p> * The process is created in the "bpelContent" directory of a BPEL project. * Empty process. * </p> * * @throws Exception */ @Test public void testTemplateInBpelProjectEmpty() throws Exception { testTemplate( 1, false, 1, true, false ); } /** * Tests the creation of a BPEL from a template. * <p> * The process is created in the "bpelContent" directory of a BPEL project. * Synchronous process. * </p> * * @throws Exception */ @Test public void testTemplateInBpelProjectSynchronous() throws Exception { testTemplate( 2, false, 0, true, false ); } /** * Tests the creation of a BPEL from a template. * <p> * The process is created in the "bpelContent" directory of a BPEL project. * Asynchronous process. * </p> * * @throws Exception */ @Test public void testTemplateInBpelProjectAsynchronous() throws Exception { testTemplate( 0, false, 0, true, false ); } /** * Tests the creation of a BPEL from a template. * <p> * The process is created in the "bpelContent" directory of a BPEL project. * Empty process. * </p> * * @throws Exception */ @Test public void testTemplateInNonBpelProjectEmpty() throws Exception { testTemplate( 1, false, 1, false, false ); } /** * Tests the creation of a BPEL from a template. * <p> * The process is created in the "bpelContent" directory of a BPEL project. * Synchronous process. * </p> * * @throws Exception */ @Test public void testTemplateInNonBpelProjectSynchronous() throws Exception { testTemplate( 2, false, 0, false, false ); } /** * Tests the creation of a BPEL from a template. * <p> * The process is created in the "bpelContent" directory of a BPEL project. * Asynchronous process. * </p> * * @throws Exception */ @Test public void testTemplateInNonBpelProjectAsynchronous() throws Exception { testTemplate( 0, false, 0, false, false ); } /** * Tests the creation of an abstract BPEL from a template. * <p> * The process is created at the root of a BPEL project. * Empty process. * </p> * * @throws Exception */ @Test public void testAbstractTemplateEmpty() throws Exception { testTemplate( 1, true, 1, true, false ); } /** *Tests the creation of an abstract BPEL from a template. * <p> * The process is created at the root of a BPEL project. * Synchronous process. * </p> * * @throws Exception */ @Test public void testAbstractTemplateSynchronous() throws Exception { testTemplate( 2, true, 1, true, false ); } /** * Tests the creation of an abstract BPEL from a template. * <p> * The process is created at the root of a BPEL project. * Asynchronous process. * </p> * * @throws Exception */ @Test public void testAbstractTemplateAsynchronous() throws Exception { testTemplate( 0, true, 1, true, false ); } /** * Tests the creation of a BPEL from a WSDL definition. * <p> * The WSDL is imported in the project. * The process is created in the "bpelContent" directory of a BPEL project. * The created process is NOT abstract. * </p> * * @throws Exception */ @Test public void testWsdlWithImportTux() throws Exception { testWsdlFirst( "test1/tuxDroid.wsdl", false, true, true, true, 0 ); } /** * Tests the creation of a BPEL from a WSDL definition. * <p> * The WSDL is imported in the project. * The process is created in the "bpelContent" directory of a BPEL project. * The created process is NOT abstract. * </p> * * @throws Exception */ @Test public void testWsdlWithImportTo() throws Exception { testWsdlFirst( "test2/To.wsdl", false, true, true, true, 0 ); } /** * Tests the creation of a BPEL from a WSDL definition. * <p> * The WSDL is NOT imported in the project. * The process is created in the "bpelContent" directory of a BPEL project. * The created process is NOT abstract. * </p> * * @throws Exception */ @Test public void testWsdlWithoutImportTux() throws Exception { testWsdlFirst( "test1/tuxDroid.wsdl", false, true, true, true, 0 ); } /** * Tests the creation of a BPEL from a WSDL definition. * <p> * The WSDL is NOT imported in the project. * The process is created in the "bpelContent" directory of a BPEL project. * The created process is NOT abstract. * </p> * * @throws Exception */ @Test public void testWsdlWithoutImportTo() throws Exception { testWsdlFirst( "test2/To.wsdl", false, true, true, true, 0 ); } /** * Tests the creation of a BPEL from a WSDL definition. * <p> * The WSDL is imported in the project. * The process is created in the "bpelContent" directory of a BPEL project. * The created process is abstract. * </p> * * @throws Exception */ @Test public void testWsdlAsAbstractWithImportTux() throws Exception { testWsdlFirst( "test1/tuxDroid.wsdl", true, true, true, true, 1 ); } /** * Tests the creation of a BPEL from a WSDL definition. * <p> * The WSDL is imported in the project. * The process is created in the "bpelContent" directory of a BPEL project. * The created process is abstract. * </p> * * @throws Exception */ @Test public void testWsdlAsAbstractWithImportTo() throws Exception { testWsdlFirst( "test2/To.wsdl", true, true, true, true, 1 ); } /** * Tests the creation of a BPEL from a WSDL. * @param wsdlFile the relative location of the WSDL file to use as input * @param isAbstract true f the created process must be abstract, false otherwise * @param importWsdl true to import the WSDL in the project, false to reference the remote one * @param createBpelProject true to create a BPEL project, false for a simple Eclipse project * @param selectBpelDir true to select the BPEL directory, false otherwise (only makes sense for a BPEL project) * @param expectedNumberOfProblems the number of problems the created process should contain * @throws Exception */ private void testWsdlFirst( String wsdlFile, boolean isAbstract, boolean importWsdl, boolean createBpelProject, boolean selectBpelDir, int expectedNumberOfProblems ) throws Exception { if( createBpelProject ) createBpelProject(); else createSimpleProject(); SWTBotMenu newMenu = bot.menu( "File" ).menu( "New" ); newMenu.menu( "BPEL Process File" ).click(); bot.comboBox().setSelection( 1 ); bot.text( 0 ).setText( BPEL_NAME ); bot.comboBox( 1 ).setText( "http://" + BPEL_NAME ); if( isAbstract ) bot.checkBox( 0 ).select(); bot.button( "Next >" ).click(); URL url = getClass().getResource( "/wsdls/" + wsdlFile ); url = FileLocator.toFileURL( url ); bot.text( 0 ).setText( url.toString()); bot.link( 2 ).click(); bot.comboBox( 0 ).setSelection( 0 ); if( ! importWsdl ) bot.checkBox( 0 ).deselect(); bot.button( "Next >" ).click(); completeBpelFileCreation( selectBpelDir ); IPath path; if( selectBpelDir ) path = new Path( PROJECT_NAME ).append( BPEL_DIR ).append( BPEL_FILE_NAME ); else path = new Path( PROJECT_NAME ).append( BPEL_FILE_NAME ); IFile bpelFile = ResourcesPlugin.getWorkspace().getRoot().getFile( path ); Assert.assertTrue( bpelFile.isAccessible()); IProblem[] problems = this.bpelBuilder.validate( bpelFile, null ); Assert.assertEquals( problems.length, expectedNumberOfProblems ); // No import => only 1 WSDL, the one for the artifacts if( ! importWsdl ) { int wsdlCpt = 0; for( IResource r : bpelFile.getParent().members()) { if( r instanceof IFile && "wsdl".equalsIgnoreCase( r.getFileExtension())) wsdlCpt ++; } Assert.assertEquals( wsdlCpt, 1 ); } } /** * Tests the creation of a BPEL from a template. * @param tplId the template ID (index of the template in the associated combo) * @param isAbstract true if the created process must be abstract, false otherwise * @param expectedNumberOfProblems the number of problems the created process should contain * @param createBpelProject true to create a BPEL project, false for a simple Eclipse project * @param selectBpelDir true to select the BPEL directory, false otherwise (only makes sense for a BPEL project) * @throws Exception */ private void testTemplate( int tplId, boolean isAbstract, int expectedNumberOfProblems, boolean createBpelProject, boolean selectBpelDir ) throws Exception { if( createBpelProject ) createBpelProject(); else createSimpleProject(); bot.defaultPerspective().activate(); bot.menu( "File" ).menu( "New" ).menu( "Other..." ).click(); SWTBotShell shell = bot.shell( "New" ); shell.activate(); bot.tree( 0 ).setFocus(); bot.tree( 0 ).expandNode( "BPEL 2.0" ).select( "BPEL Process File" ); bot.button("Next >").click(); bot.text( 0 ).setText( BPEL_NAME ); bot.comboBox( 1 ).setText( "http://" + BPEL_NAME ); if( isAbstract ) bot.checkBox( 0 ).select(); bot.button( "Next >" ).click(); bot.comboBox( 0 ).setSelection( tplId ); bot.button( "Next >" ).click(); completeBpelFileCreation( selectBpelDir ); IPath path; if( selectBpelDir ) path = new Path( PROJECT_NAME ).append( BPEL_DIR ).append( BPEL_FILE_NAME ); else path = new Path( PROJECT_NAME ).append( BPEL_FILE_NAME ); IFile bpelFile = ResourcesPlugin.getWorkspace().getRoot().getFile( path ); Assert.assertTrue( bpelFile.isAccessible()); // The empty template is not valid because it does not start with an starting activity IProblem[] problems = this.bpelBuilder.validate( bpelFile, null ); Assert.assertEquals( problems.length, expectedNumberOfProblems ); } /** * Completes the creation of a new BPEL file. * @param selectBpelDir true to create the BPEL in the {@link #BPEL_DIR} directory, false for the root of the project * @throws Exception if the created project could not be built */ private void completeBpelFileCreation( boolean selectBpelDir ) throws Exception { // Create the project if( selectBpelDir ) bot.tree( 0 ).expandNode( PROJECT_NAME ).select( BPEL_DIR ); else bot.tree( 0 ).select( PROJECT_NAME ); bot.button( "Finish" ).click(); bot.waitUntil( new DefaultCondition() { @Override public boolean test() throws Exception { String title = NewBpelFileWizardTest.bot.activeEditor().getTitle(); return (BPEL_NAME + ".bpel").equals( title ); } @Override public String getFailureMessage() { return "Could not wait for the BPEL Designer to be open"; } }); } /** * Creates a BPEL project. */ private void createBpelProject() { bot.menu( "File" ).menu( "New" ).menu( "Other..." ).click(); SWTBotShell shell = bot.shell( "New" ); shell.activate(); bot.tree( 0 ).setFocus(); bot.tree( 0 ).expandNode( "BPEL 2.0" ).select( "BPEL Project" ); bot.button("Next >").click(); bot.text( 0 ).setText( PROJECT_NAME ); bot.button( "Next >" ).click(); bot.button( "Finish" ).click(); try { shell = bot.shell( "Open Associated Perspective?" ); shell.activate(); bot.button( "Yes" ).click(); } catch( Exception e ) { // nothing - the shell does not appear all the time } } /** * Creates a simple project. */ private void createSimpleProject() { bot.menu( "File" ).menu( "New" ).menu( "Other..." ).click(); SWTBotShell shell = bot.shell( "New" ); shell.activate(); bot.tree( 0 ).setFocus(); bot.tree( 0 ).expandNode( "General" ).select( "Project" ); bot.button("Next >").click(); bot.text( 0 ).setText( PROJECT_NAME ); bot.button( "Finish" ).click(); // The following code is useless - there is no default perspective for simple projects - // but it makes one test work (otherwise, this test fails and there is no reason for it). try { shell = bot.shell( "Open Associated Perspective?" ); shell.activate(); bot.button( "Yes" ).click(); } catch( Exception e ) { // nothing - the shell does not appear all the time } } }