blob: 2b50e997c58d7b6f21c43482cb1ce7064405aef6 [file] [log] [blame]
package org.apache.maven.script.ant;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.hamcrest.CoreMatchers.endsWith;
import static org.hamcrest.CoreMatchers.startsWith;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.Reader;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptorBuilder;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.path.PathTranslator;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildListener;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.jar.JarArchiver;
import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
import org.codehaus.plexus.component.factory.ComponentInstantiationException;
import org.codehaus.plexus.component.factory.ant.AntScriptInvoker;
import org.codehaus.plexus.component.repository.ComponentRequirement;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.console.ConsoleLogger;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
public class AntMojoWrapperTest
{
private BuildListener buildListener;
@Before
public void setUp()
{
buildListener = mock( BuildListener.class );
}
@Test
public void test2xStylePlugin()
throws PlexusConfigurationException, IOException, ComponentInstantiationException, MojoExecutionException,
ComponentConfigurationException, ArchiverException, URISyntaxException
{
String pluginXml = "META-INF/maven/plugin-2.1.xml";
List<String> messages = run( pluginXml, true );
assertPresence( messages, "Unpacked Ant build scripts (in Maven build directory).", false );
assertPresence( messages, "Maven parameter expression evaluator for Ant properties.", false );
assertPresence( messages, "Maven standard project-based classpath references.", false );
assertPresence( messages, "Maven standard plugin-based classpath references.", false );
assertPresence( messages,
"Maven project, session, mojo-execution, or path-translation parameter information is", false );
assertPresence( messages, "maven-script-ant < 2.1.0, or used maven-plugin-tools-ant < 2.2 during release",
false );
ArgumentCaptor<BuildEvent> buildEvent = ArgumentCaptor.forClass(BuildEvent.class);
verify( buildListener, atLeastOnce() ).messageLogged( buildEvent.capture() );
// last message
assertThat( buildEvent.getValue().getMessage(), startsWith( "plugin classpath is: " ) );
assertThat( buildEvent.getValue().getMessage(), endsWith( ".test.jar" ) );
}
@Test
public void test20StylePlugin()
throws PlexusConfigurationException, IOException, ComponentInstantiationException, MojoExecutionException,
ComponentConfigurationException, ArchiverException, URISyntaxException
{
String pluginXml = "META-INF/maven/plugin-2.0.xml";
List<String> messages = run( pluginXml, false );
assertPresence( messages, "Unpacked Ant build scripts (in Maven build directory).", true );
assertPresence( messages, "Maven parameter expression evaluator for Ant properties.", true );
assertPresence( messages, "Maven standard project-based classpath references.", true );
assertPresence( messages, "Maven standard plugin-based classpath references.", true );
assertPresence( messages,
"Maven project, session, mojo-execution, or path-translation parameter information is", true );
assertPresence( messages, "maven-script-ant < 2.1.0, or used maven-plugin-tools-ant < 2.2 during release", true );
ArgumentCaptor<BuildEvent> buildEvent = ArgumentCaptor.forClass(BuildEvent.class);
verify( buildListener, atLeastOnce() ).messageLogged( buildEvent.capture() );
// last message
assertThat( buildEvent.getValue().getMessage(), startsWith( "plugin classpath is: " ) );
assertThat( buildEvent.getValue().getMessage(), endsWith( "path-is-missing" ) );
}
private void assertPresence( List<String> messages, String test, boolean shouldBePresent )
{
for ( String message : messages )
{
if ( message.contains( test ) )
{
if ( !shouldBePresent )
{
fail( "Test string: '" + test + "' was found in output, but SHOULD NOT BE THERE." );
}
return;
}
}
if ( shouldBePresent )
{
fail( "Test string: '" + test + "' was NOT found in output, but SHOULD BE THERE." );
}
}
private List<String> run( String pluginXml, boolean includeImplied )
throws PlexusConfigurationException, IOException, ComponentInstantiationException, MojoExecutionException,
ComponentConfigurationException, ArchiverException, URISyntaxException
{
StackTraceElement stack = new Throwable().getStackTrace()[1];
System.out.println( "\n\nRunning: " + stack.getMethodName() + "\n\n" );
URL resource = Thread.currentThread().getContextClassLoader().getResource( pluginXml );
if ( resource == null )
{
fail( "plugin descriptor not found: '" + pluginXml + "'." );
}
PluginDescriptor pd;
try ( Reader reader = new InputStreamReader( resource.openStream() ) )
{
pd = new PluginDescriptorBuilder().build( reader, pluginXml );
}
Map<String, Object> config = new HashMap<>();
config.put( "basedir", new File( "." ).getAbsoluteFile() );
config.put( "messageLevel", "info" );
MojoDescriptor md = pd.getMojo( "test" );
AntMojoWrapper wrapper =
new AntMojoWrapper( new AntScriptInvoker( md, Thread.currentThread().getContextClassLoader() ) );
wrapper.enableLogging( new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) );
Artifact artifact = mock( Artifact.class );
PathTranslator pt = mock( PathTranslator.class );
if ( includeImplied )
{
File pluginXmlFile = Paths.get( resource.toURI() ).toFile();
File jarFile = File.createTempFile( "AntMojoWrapperTest.", ".test.jar" );
jarFile.deleteOnExit();
JarArchiver archiver = new JarArchiver();
archiver.enableLogging( new ConsoleLogger( Logger.LEVEL_ERROR, "archiver" ) );
archiver.setDestFile( jarFile );
archiver.addFile( pluginXmlFile, pluginXml );
archiver.createArchive();
when( artifact.getFile() ).thenReturn( jarFile );
Model model = new Model();
Build build = new Build();
build.setDirectory( "target" );
model.setBuild( build );
MavenProject project = new MavenProject( model );
project.setFile( new File( "pom.xml" ).getAbsoluteFile() );
pd.setPluginArtifact( artifact );
pd.setArtifacts( Collections.singletonList( artifact ) );
config.put( "project", project );
config.put( "session", new MavenSession( null, null, null, null, null, null, null, null, null, null ) );
config.put( "mojoExecution", new MojoExecution( md ) );
ComponentRequirement cr = new ComponentRequirement();
cr.setRole( PathTranslator.class.getName() );
wrapper.addComponentRequirement( cr, pt );
}
wrapper.setComponentConfiguration( config );
TestBuildListener tbl = new TestBuildListener();
wrapper.getAntProject().addBuildListener( buildListener );
PrintStream oldOut = System.out;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try
{
System.setOut( new PrintStream( baos ) );
wrapper.execute();
}
finally
{
System.setOut( oldOut );
}
System.out.println( "\n\n" + stack.getMethodName() + " executed; verifying...\n\n" );
List<String> messages = new ArrayList<>();
if ( !tbl.messages.isEmpty() )
{
messages.addAll( tbl.messages );
}
messages.add( new String( baos.toByteArray() ) );
return messages;
}
private static final class TestBuildListener
implements BuildListener
{
private List<String> messages = new ArrayList<>();
public void buildFinished( BuildEvent arg0 )
{
}
public void buildStarted( BuildEvent arg0 )
{
}
public void messageLogged( BuildEvent event )
{
messages.add( event.getMessage() );
}
public void targetFinished( BuildEvent arg0 )
{
}
public void targetStarted( BuildEvent arg0 )
{
}
public void taskFinished( BuildEvent arg0 )
{
}
public void taskStarted( BuildEvent arg0 )
{
}
}
}