Return-Path: Delivered-To: apmail-maven-commits-archive@www.apache.org Received: (qmail 89912 invoked from network); 2 May 2006 06:44:10 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 2 May 2006 06:44:10 -0000 Received: (qmail 98509 invoked by uid 500); 2 May 2006 06:44:09 -0000 Delivered-To: apmail-maven-commits-archive@maven.apache.org Received: (qmail 98313 invoked by uid 500); 2 May 2006 06:44:08 -0000 Mailing-List: contact commits-help@maven.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@maven.apache.org Delivered-To: mailing list commits@maven.apache.org Received: (qmail 98302 invoked by uid 99); 2 May 2006 06:44:08 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 01 May 2006 23:44:08 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Mon, 01 May 2006 23:44:06 -0700 Received: (qmail 89784 invoked by uid 65534); 2 May 2006 06:43:46 -0000 Message-ID: <20060502064346.89782.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r398826 - in /maven/plugins/trunk/maven-release-plugin/src: main/java/org/apache/maven/plugins/release/exec/ main/java/org/apache/maven/plugins/release/phase/ main/resources/META-INF/plexus/ test/java/org/apache/maven/plugins/release/exec/ ... Date: Tue, 02 May 2006 06:43:42 -0000 To: commits@maven.apache.org From: brett@apache.org X-Mailer: svnmailer-1.0.8 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: brett Date: Mon May 1 23:43:39 2006 New Revision: 398826 URL: http://svn.apache.org/viewcvs?rev=398826&view=rev Log: [MRELEASE-98] add run tests phase and tests Added: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/CommandLineFactory.java (with props) maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/DefaultCommandLineFactory.java (with props) maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutor.java (with props) maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutor.java (with props) maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutorException.java (with props) maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/ maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/CommandLineFactoryTest.java (with props) maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutorTest.java (with props) maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/RunTestsPhaseTest.java (with props) Modified: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/RunTestsPhase.java maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml Added: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/CommandLineFactory.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/CommandLineFactory.java?rev=398826&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/CommandLineFactory.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/CommandLineFactory.java Mon May 1 23:43:39 2006 @@ -0,0 +1,42 @@ +package org.apache.maven.plugins.release.exec; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.codehaus.plexus.util.cli.Commandline; + +/** + * Create a command line for execution. Componentised to allow mocking. + * + * @author Brett Porter + */ +public interface CommandLineFactory +{ + /** + * Plexus role. + */ + String ROLE = CommandLineFactory.class.getName(); + + /** + * Create a command line object with default environment for the given executable. + * + * @param executable the executable + * @return the command line + * @throws MavenExecutorException if there was a problem creating the command line + */ + Commandline createCommandLine( String executable ) + throws MavenExecutorException; +} Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/CommandLineFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/CommandLineFactory.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/DefaultCommandLineFactory.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/DefaultCommandLineFactory.java?rev=398826&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/DefaultCommandLineFactory.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/DefaultCommandLineFactory.java Mon May 1 23:43:39 2006 @@ -0,0 +1,46 @@ +package org.apache.maven.plugins.release.exec; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.codehaus.plexus.util.cli.Commandline; + +/** + * Create a command line instance. + * + * @author Brett Porter + */ +public class DefaultCommandLineFactory + implements CommandLineFactory +{ + public Commandline createCommandLine( String executable ) + throws MavenExecutorException + { + Commandline commandline = new Commandline(); + commandline.setExecutable( executable ); + + try + { + commandline.addSystemEnvironment(); + } + catch ( Exception e ) + { + throw new MavenExecutorException( e.getMessage(), e ); + } + + return commandline; + } +} Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/DefaultCommandLineFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/DefaultCommandLineFactory.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutor.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutor.java?rev=398826&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutor.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutor.java Mon May 1 23:43:39 2006 @@ -0,0 +1,127 @@ +package org.apache.maven.plugins.release.exec; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.codehaus.plexus.logging.AbstractLogEnabled; +import org.codehaus.plexus.util.StringUtils; +import org.codehaus.plexus.util.cli.CommandLineException; +import org.codehaus.plexus.util.cli.CommandLineUtils; +import org.codehaus.plexus.util.cli.Commandline; +import org.codehaus.plexus.util.cli.StreamConsumer; + +import java.io.File; + +/** + * Fork Maven to executed a series of goals. + * + * @author Brett Porter + */ +public class ForkedMavenExecutor + extends AbstractLogEnabled + implements MavenExecutor +{ + private CommandLineFactory commandLineFactory; + + public void executeGoals( File workingDirectory, String goals, boolean interactive, String arguments ) + throws MavenExecutorException + { + Commandline cl = commandLineFactory.createCommandLine( "mvn" ); + + cl.setWorkingDirectory( workingDirectory.getAbsolutePath() ); + + cl.addEnvironment( "MAVEN_TERMINATE_CMD", "on" ); + + if ( goals != null ) + { + // accept both space and comma, so the old way still work + String [] tokens = StringUtils.split( goals, ", " ); + + for ( int i = 0; i < tokens.length; ++i ) + { + cl.createArgument().setValue( tokens[i] ); + } + } + + cl.createArgument().setValue( "--no-plugin-updates" ); + + if ( !interactive ) + { + cl.createArgument().setValue( "--batch-mode" ); + } + + // TODO [!] check that callers split parameters that could formerly be comma-separated + if ( !StringUtils.isEmpty( arguments ) ) + { + cl.createArgument().setLine( arguments ); + } + + /* TODO [!] + List profiles = project.getActiveProfiles(); + + if ( profiles != null && !profiles.isEmpty() ) + { + StringBuffer buffer = new StringBuffer(); + + buffer.append( "-P " ); + + for ( Iterator it = profiles.iterator(); it.hasNext(); ) + { + Profile profile = (Profile) it.next(); + + buffer.append( profile.getId() ).append( "," ); + } + + buffer.setLength( buffer.length() - 1 ); + + cl.createArgument().setLine( buffer.toString() ); + } +*/ + + // TODO: do these still stream? + StreamConsumer stdOut = new CommandLineUtils.StringStreamConsumer(); + + StreamConsumer stdErr = new CommandLineUtils.StringStreamConsumer(); + + try + { + getLogger().debug( cl.toString() ); + + int result = CommandLineUtils.executeCommandLine( cl, stdOut, stdErr ); + + if ( result != 0 ) + { + throw new MavenExecutorException( "Maven execution failed, exit code: \'" + result + "\'", result, + stdOut.toString(), stdErr.toString() ); + } + } + catch ( CommandLineException e ) + { + throw new MavenExecutorException( "Can't run goal " + goals, stdOut.toString(), stdErr.toString(), e ); + } + } + + public void executeGoals( File workingDirectory, String goals, boolean interactive ) + throws MavenExecutorException + { + executeGoals( workingDirectory, goals, interactive, null ); + } + + public void setCommandLineFactory( CommandLineFactory commandLineFactory ) + { + this.commandLineFactory = commandLineFactory; + } +} Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutor.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutor.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutor.java?rev=398826&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutor.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutor.java Mon May 1 23:43:39 2006 @@ -0,0 +1,55 @@ +package org.apache.maven.plugins.release.exec; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.File; + +/** + * Execute Maven. May be implemented as a forked instance, or embedded. + * + * @author Brett Porter + */ +public interface MavenExecutor +{ + /** + * Plexus Role. + */ + String ROLE = MavenExecutor.class.getName(); + + /** + * Execute goals using Maven. + * + * @param workingDirectory the directory to execute in + * @param goals the goals to run (space delimited) + * @param interactive whether to execute in interactive mode, or the default batch mode + * @param arguments the arguments to pass to the executable (space delimited) + * @throws MavenExecutorException if an error occurred executing Maven + */ + void executeGoals( File workingDirectory, String goals, boolean interactive, String arguments ) + throws MavenExecutorException; + + /** + * Execute goals using Maven. + * + * @param workingDirectory the directory to execute in + * @param goals the goals to run (space delimited) + * @param interactive whether to execute in interactive mode, or the default batch mode + * @throws MavenExecutorException if an error occurred executing Maven + */ + void executeGoals( File workingDirectory, String goals, boolean interactive ) + throws MavenExecutorException; +} Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutor.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutorException.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutorException.java?rev=398826&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutorException.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutorException.java Mon May 1 23:43:39 2006 @@ -0,0 +1,59 @@ +package org.apache.maven.plugins.release.exec; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Exception executing Maven. + * + * @author Brett Porter + */ +public class MavenExecutorException + extends Exception +{ + private String stdErr; + + private String stdOut; + + private int exitCode; + + public MavenExecutorException( String message, int exitCode, String stdOut, String stdErr ) + { + super( message ); + + this.exitCode = exitCode; + this.stdOut = stdOut; + this.stdErr = stdErr; + } + + public MavenExecutorException( String message, String stdOut, String stdErr, Exception e ) + { + super( message, e ); + + this.stdOut = stdOut; + this.stdErr = stdErr; + } + + public MavenExecutorException( String message, Throwable cause ) + { + super( message, cause ); + } + + public int getExitCode() + { + return exitCode; + } +} Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutorException.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/exec/MavenExecutorException.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/RunTestsPhase.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/RunTestsPhase.java?rev=398826&r1=398825&r2=398826&view=diff ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/RunTestsPhase.java (original) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/RunTestsPhase.java Mon May 1 23:43:39 2006 @@ -16,25 +16,51 @@ * limitations under the License. */ +import org.apache.maven.plugins.release.ReleaseExecutionException; import org.apache.maven.plugins.release.config.ReleaseConfiguration; +import org.apache.maven.plugins.release.exec.MavenExecutor; +import org.apache.maven.plugins.release.exec.MavenExecutorException; +import org.codehaus.plexus.logging.AbstractLogEnabled; /** - * TODO [!]: Description. + * Run the integration tests for the project to verify that it builds before committing. * * @author Brett Porter */ public class RunTestsPhase + extends AbstractLogEnabled implements ReleasePhase { + /** + * Component to assist in executing Maven. + */ + private MavenExecutor mavenExecutor; + public void execute( ReleaseConfiguration releaseConfiguration ) + throws ReleaseExecutionException { - // TODO [!]: implement - + try + { + mavenExecutor.executeGoals( releaseConfiguration.getWorkingDirectory(), "clean integration-test", + releaseConfiguration.isInteractive() ); + } + catch ( MavenExecutorException e ) + { + throw new ReleaseExecutionException( e.getMessage(), e ); + } } public void simulate( ReleaseConfiguration releaseConfiguration ) + throws ReleaseExecutionException { - // TODO [!]: implement + getLogger().info( + "Executing tests - since this is simulation mode it is testing the original project, not the rewritten ones" ); + execute( releaseConfiguration ); + } + + public void setMavenExecutor( MavenExecutor mavenExecutor ) + { + this.mavenExecutor = mavenExecutor; } } Modified: maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml?rev=398826&r1=398825&r2=398826&view=diff ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml (original) +++ maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml Mon May 1 23:43:39 2006 @@ -138,6 +138,11 @@ org.apache.maven.plugins.release.phase.ReleasePhase run-tests org.apache.maven.plugins.release.phase.RunTestsPhase + + + org.apache.maven.plugins.release.exec.MavenExecutor + + org.apache.maven.plugins.release.phase.ReleasePhase @@ -185,6 +190,14 @@ org.apache.maven.plugins.release.scm.ScmTranslator svn org.apache.maven.plugins.release.scm.SubversionScmTranslator + + + org.apache.maven.plugins.release.exec.MavenExecutor + org.apache.maven.plugins.release.exec.ForkedMavenExecutor + + + org.apache.maven.plugins.release.exec.CommandLineFactory + org.apache.maven.plugins.release.exec.DefaultCommandLineFactory Added: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/CommandLineFactoryTest.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/CommandLineFactoryTest.java?rev=398826&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/CommandLineFactoryTest.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/CommandLineFactoryTest.java Mon May 1 23:43:39 2006 @@ -0,0 +1,49 @@ +package org.apache.maven.plugins.release.exec; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.codehaus.plexus.PlexusTestCase; +import org.codehaus.plexus.util.cli.Commandline; + +/** + * Test the command line factory. + * + * @author Brett Porter + */ +public class CommandLineFactoryTest + extends PlexusTestCase +{ + private CommandLineFactory factory; + + protected void setUp() + throws Exception + { + super.setUp(); + + factory = (CommandLineFactory) lookup( CommandLineFactory.ROLE ); + } + + public void testCreation() + throws Exception + { + Commandline cl = factory.createCommandLine( "exec" ); + + assertEquals( "Check executable", "exec", cl.getExecutable() ); + assertNotNull( "Check environment", cl.getEnvironments() ); + assertFalse( "Check environment", cl.getEnvironments().length == 0 ); + } +} Propchange: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/CommandLineFactoryTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/CommandLineFactoryTest.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutorTest.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutorTest.java?rev=398826&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutorTest.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutorTest.java Mon May 1 23:43:39 2006 @@ -0,0 +1,213 @@ +package org.apache.maven.plugins.release.exec; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.codehaus.plexus.PlexusTestCase; +import org.codehaus.plexus.util.StringInputStream; +import org.codehaus.plexus.util.cli.CommandLineException; +import org.codehaus.plexus.util.cli.Commandline; +import org.jmock.cglib.Mock; +import org.jmock.core.constraint.IsEqual; +import org.jmock.core.matcher.InvokeOnceMatcher; +import org.jmock.core.stub.ReturnStub; +import org.jmock.core.stub.ThrowStub; + +import java.io.File; + +/** + * Test the forked Maven executor. + * + * @author Brett Porter + */ +public class ForkedMavenExecutorTest + extends PlexusTestCase +{ + private ForkedMavenExecutor executor; + + protected void setUp() + throws Exception + { + super.setUp(); + + executor = (ForkedMavenExecutor) lookup( MavenExecutor.ROLE ); + } + + public void testExecution() + throws MavenExecutorException + { + File workingDirectory = getTestFile( "target/working-directory" ); + + Process process = createMockProcess( 0 ); + + Mock commandLineMock = createMockCommandLine( workingDirectory, process ); + expectDefaultArguments( commandLineMock ); + + Mock mock = new Mock( CommandLineFactory.class ); + + mock.expects( new InvokeOnceMatcher() ).method( "createCommandLine" ).with( new IsEqual( "mvn" ) ).will( + new ReturnStub( commandLineMock.proxy() ) ); + + executor.setCommandLineFactory( (CommandLineFactory) mock.proxy() ); + + executor.executeGoals( workingDirectory, "clean integration-test", false ); + + assertTrue( true ); + } + + public void testExecutionWithArguments() + throws MavenExecutorException + { + File workingDirectory = getTestFile( "target/working-directory" ); + + Process process = createMockProcess( 0 ); + + Mock commandLineMock = createMockCommandLine( workingDirectory, process ); + String arguments = "-DperformRelease=true -Dmaven.test.skip=true"; + commandLineMock.expects( new InvokeOnceMatcher() ).method( "createArgument" ).will( + new ReturnStub( createArgumentLineMock( arguments ) ) ); + + expectDefaultArguments( commandLineMock ); + + Mock mock = new Mock( CommandLineFactory.class ); + + mock.expects( new InvokeOnceMatcher() ).method( "createCommandLine" ).with( new IsEqual( "mvn" ) ).will( + new ReturnStub( commandLineMock.proxy() ) ); + + executor.setCommandLineFactory( (CommandLineFactory) mock.proxy() ); + + executor.executeGoals( workingDirectory, "clean integration-test", false, arguments ); + + assertTrue( true ); + } + + public void testExecutionWithNonZeroExitCode() + throws MavenExecutorException + { + File workingDirectory = getTestFile( "target/working-directory" ); + + Process process = createMockProcess( 1 ); + + Mock commandLineMock = createMockCommandLine( workingDirectory, process ); + + expectDefaultArguments( commandLineMock ); + + Mock mock = new Mock( CommandLineFactory.class ); + + mock.expects( new InvokeOnceMatcher() ).method( "createCommandLine" ).with( new IsEqual( "mvn" ) ).will( + new ReturnStub( commandLineMock.proxy() ) ); + + executor.setCommandLineFactory( (CommandLineFactory) mock.proxy() ); + + try + { + executor.executeGoals( workingDirectory, "clean integration-test", false ); + + fail( "Should have thrown an exception" ); + } + catch ( MavenExecutorException e ) + { + assertEquals( "Check exit code", 1, e.getExitCode() ); + } + } + + public void testExecutionWithCommandLineException() + throws MavenExecutorException + { + File workingDirectory = getTestFile( "target/working-directory" ); + + Mock commandLineMock = new Mock( Commandline.class ); + commandLineMock.expects( new InvokeOnceMatcher() ).method( "setWorkingDirectory" ).with( + new IsEqual( workingDirectory.getAbsolutePath() ) ); + commandLineMock.expects( new InvokeOnceMatcher() ).method( "addEnvironment" ).with( + new IsEqual( "MAVEN_TERMINATE_CMD" ), new IsEqual( "on" ) ); + commandLineMock.expects( new InvokeOnceMatcher() ).method( "execute" ).will( + new ThrowStub( new CommandLineException( "..." ) ) ); + + expectDefaultArguments( commandLineMock ); + + Mock mock = new Mock( CommandLineFactory.class ); + + mock.expects( new InvokeOnceMatcher() ).method( "createCommandLine" ).with( new IsEqual( "mvn" ) ).will( + new ReturnStub( commandLineMock.proxy() ) ); + + executor.setCommandLineFactory( (CommandLineFactory) mock.proxy() ); + + try + { + executor.executeGoals( workingDirectory, "clean integration-test", false ); + + fail( "Should have thrown an exception" ); + } + catch ( MavenExecutorException e ) + { + assertEquals( "Check cause", CommandLineException.class, e.getCause().getClass() ); + } + } + + private static void expectDefaultArguments( Mock commandLineMock ) + { + String[] args = new String[]{"clean", "integration-test", "--no-plugin-updates", "--batch-mode"}; + for ( int i = args.length - 1; i >= 0; i-- ) + { + commandLineMock.expects( new InvokeOnceMatcher() ).method( "createArgument" ).will( + new ReturnStub( createArgumentValueMock( args[i] ) ) ); + } + } + + private static Mock createMockCommandLine( File workingDirectory, Process process ) + { + Mock commandLineMock = new Mock( Commandline.class ); + commandLineMock.expects( new InvokeOnceMatcher() ).method( "setWorkingDirectory" ).with( + new IsEqual( workingDirectory.getAbsolutePath() ) ); + commandLineMock.expects( new InvokeOnceMatcher() ).method( "addEnvironment" ).with( + new IsEqual( "MAVEN_TERMINATE_CMD" ), new IsEqual( "on" ) ); + commandLineMock.expects( new InvokeOnceMatcher() ).method( "execute" ).will( new ReturnStub( process ) ); + + return commandLineMock; + } + + private static Commandline.Argument createArgumentValueMock( String value ) + { + Mock mock = new Mock( Commandline.Argument.class ); + mock.expects( new InvokeOnceMatcher() ).method( "setValue" ).with( new IsEqual( value ) ); + return (Commandline.Argument) mock.proxy(); + } + + private static Commandline.Argument createArgumentLineMock( String value ) + { + Mock mock = new Mock( Commandline.Argument.class ); + mock.expects( new InvokeOnceMatcher() ).method( "setLine" ).with( new IsEqual( value ) ); + return (Commandline.Argument) mock.proxy(); + } + + private static Process createMockProcess( int exitCode ) + { + Mock mockProcess = new Mock( Process.class ); + mockProcess.expects( new InvokeOnceMatcher() ).method( "getInputStream" ).will( + new ReturnStub( new StringInputStream( "" ) ) ); + mockProcess.expects( new InvokeOnceMatcher() ).method( "getErrorStream" ).will( + new ReturnStub( new StringInputStream( "" ) ) ); + mockProcess.expects( new InvokeOnceMatcher() ).method( "waitFor" ).will( + new ReturnStub( Integer.valueOf( exitCode ) ) ); + if ( exitCode != 0 ) + { + mockProcess.expects( new InvokeOnceMatcher() ).method( "exitValue" ).will( + new ReturnStub( Integer.valueOf( exitCode ) ) ); + } + return (Process) mockProcess.proxy(); + } +} Propchange: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutorTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/exec/ForkedMavenExecutorTest.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/RunTestsPhaseTest.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/RunTestsPhaseTest.java?rev=398826&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/RunTestsPhaseTest.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/RunTestsPhaseTest.java Mon May 1 23:43:39 2006 @@ -0,0 +1,145 @@ +package org.apache.maven.plugins.release.phase; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.maven.plugins.release.ReleaseExecutionException; +import org.apache.maven.plugins.release.config.ReleaseConfiguration; +import org.apache.maven.plugins.release.exec.MavenExecutor; +import org.apache.maven.plugins.release.exec.MavenExecutorException; +import org.codehaus.plexus.PlexusTestCase; +import org.jmock.cglib.Mock; +import org.jmock.core.constraint.IsEqual; +import org.jmock.core.constraint.IsSame; +import org.jmock.core.matcher.InvokeOnceMatcher; +import org.jmock.core.stub.ThrowStub; + +import java.io.File; + +/** + * Test the simple test running phase. + * + * @author Brett Porter + */ +public class RunTestsPhaseTest + extends PlexusTestCase +{ + private RunTestsPhase phase; + + protected void setUp() + throws Exception + { + super.setUp(); + + phase = (RunTestsPhase) lookup( ReleasePhase.ROLE, "run-tests" ); + } + + public void testExecute() + throws ReleaseExecutionException + { + File testFile = getTestFile( "target/working-directory" ); + + ReleaseConfiguration config = new ReleaseConfiguration(); + config.setWorkingDirectory( testFile ); + + Mock mock = new Mock( MavenExecutor.class ); + mock.expects( new InvokeOnceMatcher() ).method( "executeGoals" ).with( new IsSame( testFile ), + new IsEqual( "clean integration-test" ), + new IsEqual( Boolean.TRUE ) ); + + phase.setMavenExecutor( (MavenExecutor) mock.proxy() ); + + phase.execute( config ); + + // just needs to survive the mock + assertTrue( true ); + } + + public void testSimulate() + throws ReleaseExecutionException + { + File testFile = getTestFile( "target/working-directory" ); + + ReleaseConfiguration config = new ReleaseConfiguration(); + config.setWorkingDirectory( testFile ); + + Mock mock = new Mock( MavenExecutor.class ); + mock.expects( new InvokeOnceMatcher() ).method( "executeGoals" ).with( new IsSame( testFile ), + new IsEqual( "clean integration-test" ), + new IsEqual( Boolean.TRUE ) ); + + phase.setMavenExecutor( (MavenExecutor) mock.proxy() ); + + phase.simulate( config ); + + // just needs to survive the mock + assertTrue( true ); + } + + public void testExecuteException() + { + File testFile = getTestFile( "target/working-directory" ); + + ReleaseConfiguration config = new ReleaseConfiguration(); + config.setWorkingDirectory( testFile ); + + Mock mock = new Mock( MavenExecutor.class ); + mock.expects( new InvokeOnceMatcher() ).method( "executeGoals" ).with( new IsSame( testFile ), + new IsEqual( "clean integration-test" ), + new IsEqual( Boolean.TRUE ) ).will( + new ThrowStub( new MavenExecutorException( "...", new Exception() ) ) ); + + phase.setMavenExecutor( (MavenExecutor) mock.proxy() ); + + try + { + phase.execute( config ); + + fail( "Should have thrown an exception" ); + } + catch ( ReleaseExecutionException e ) + { + assertEquals( "Check cause", MavenExecutorException.class, e.getCause().getClass() ); + } + } + + public void testSimulateException() + { + File testFile = getTestFile( "target/working-directory" ); + + ReleaseConfiguration config = new ReleaseConfiguration(); + config.setWorkingDirectory( testFile ); + + Mock mock = new Mock( MavenExecutor.class ); + mock.expects( new InvokeOnceMatcher() ).method( "executeGoals" ).with( new IsSame( testFile ), + new IsEqual( "clean integration-test" ), + new IsEqual( Boolean.TRUE ) ).will( + new ThrowStub( new MavenExecutorException( "...", new Exception() ) ) ); + + phase.setMavenExecutor( (MavenExecutor) mock.proxy() ); + + try + { + phase.simulate( config ); + + fail( "Should have thrown an exception" ); + } + catch ( ReleaseExecutionException e ) + { + assertEquals( "Check cause", MavenExecutorException.class, e.getCause().getClass() ); + } + } +} Propchange: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/RunTestsPhaseTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/RunTestsPhaseTest.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision