1 package org.apache.maven.script.ant;
2
3 import org.apache.maven.artifact.Artifact;
4 import org.apache.maven.execution.MavenSession;
5 import org.apache.maven.model.Build;
6 import org.apache.maven.model.Model;
7 import org.apache.maven.plugin.MojoExecution;
8 import org.apache.maven.plugin.MojoExecutionException;
9 import org.apache.maven.plugin.descriptor.MojoDescriptor;
10 import org.apache.maven.plugin.descriptor.PluginDescriptor;
11 import org.apache.maven.plugin.descriptor.PluginDescriptorBuilder;
12 import org.apache.maven.project.MavenProject;
13 import org.apache.maven.project.path.PathTranslator;
14 import org.apache.tools.ant.BuildEvent;
15 import org.apache.tools.ant.BuildListener;
16 import org.codehaus.plexus.archiver.ArchiverException;
17 import org.codehaus.plexus.archiver.jar.JarArchiver;
18 import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
19 import org.codehaus.plexus.component.factory.ComponentInstantiationException;
20 import org.codehaus.plexus.component.factory.ant.AntScriptInvoker;
21 import org.codehaus.plexus.component.repository.ComponentRequirement;
22 import org.codehaus.plexus.configuration.PlexusConfigurationException;
23 import org.codehaus.plexus.logging.Logger;
24 import org.codehaus.plexus.logging.console.ConsoleLogger;
25 import org.codehaus.plexus.util.IOUtil;
26 import org.codehaus.plexus.util.StringUtils;
27 import org.easymock.MockControl;
28
29 import java.io.ByteArrayOutputStream;
30 import java.io.File;
31 import java.io.IOException;
32 import java.io.InputStreamReader;
33 import java.io.PrintStream;
34 import java.io.Reader;
35 import java.net.URL;
36 import java.util.ArrayList;
37 import java.util.Collections;
38 import java.util.HashMap;
39 import java.util.Iterator;
40 import java.util.List;
41 import java.util.Map;
42
43 import junit.framework.TestCase;
44
45 public class AntMojoWrapperTest
46 extends TestCase
47 {
48
49 public void test2xStylePlugin()
50 throws PlexusConfigurationException, IOException, ComponentInstantiationException, MojoExecutionException,
51 ComponentConfigurationException, ArchiverException
52 {
53 String pluginXml = "META-INF/maven/plugin-2.1.xml";
54
55 List messages = run( pluginXml, true );
56
57 assertPresence( messages, "Unpacked Ant build scripts (in Maven build directory).", false );
58 assertPresence( messages, "Maven parameter expression evaluator for Ant properties.", false );
59 assertPresence( messages, "Maven standard project-based classpath references.", false );
60 assertPresence( messages, "Maven standard plugin-based classpath references.", false );
61 assertPresence( messages,
62 "Maven project, session, mojo-execution, or path-translation parameter information is", false );
63 assertPresence( messages, "maven-script-ant < 2.1.0, or used maven-plugin-tools-ant < 2.2 during release",
64 false );
65
66 assertPresence( messages, "path-is-missing", false );
67 }
68
69 public void test20StylePlugin()
70 throws PlexusConfigurationException, IOException, ComponentInstantiationException, MojoExecutionException,
71 ComponentConfigurationException, ArchiverException
72 {
73 String pluginXml = "META-INF/maven/plugin-2.0.xml";
74
75 List messages = run( pluginXml, false );
76
77 assertPresence( messages, "Unpacked Ant build scripts (in Maven build directory).", true );
78 assertPresence( messages, "Maven parameter expression evaluator for Ant properties.", true );
79 assertPresence( messages, "Maven standard project-based classpath references.", true );
80 assertPresence( messages, "Maven standard plugin-based classpath references.", true );
81 assertPresence( messages,
82 "Maven project, session, mojo-execution, or path-translation parameter information is", true );
83 assertPresence( messages, "maven-script-ant < 2.1.0, or used maven-plugin-tools-ant < 2.2 during release", true );
84
85 assertPresence( messages, "path-is-missing", true );
86 }
87
88 private void assertPresence( List messages, String test, boolean shouldBePresent )
89 {
90 boolean found = false;
91
92 for ( Iterator it = messages.iterator(); it.hasNext(); )
93 {
94 String message = (String) it.next();
95 if ( message.indexOf( test ) > -1 )
96 {
97 found = true;
98 break;
99 }
100 }
101
102 if ( !shouldBePresent && found )
103 {
104 fail( "Test string: '" + test + "' was found in output, but SHOULD NOT BE THERE." );
105 }
106 else if ( shouldBePresent && !found )
107 {
108 fail( "Test string: '" + test + "' was NOT found in output, but SHOULD BE THERE." );
109 }
110 }
111
112 private List run( String pluginXml, boolean includeImplied )
113 throws PlexusConfigurationException, IOException, ComponentInstantiationException, MojoExecutionException,
114 ComponentConfigurationException, ArchiverException
115 {
116 StackTraceElement stack = new Throwable().getStackTrace()[1];
117 System.out.println( "\n\nRunning: " + stack.getMethodName() + "\n\n" );
118
119 URL resource = Thread.currentThread().getContextClassLoader().getResource( pluginXml );
120
121 if ( resource == null )
122 {
123 fail( "plugin descriptor not found: '" + pluginXml + "'." );
124 }
125
126 Reader reader = null;
127 PluginDescriptor pd;
128 try
129 {
130 reader = new InputStreamReader( resource.openStream() );
131 pd = new PluginDescriptorBuilder().build( reader, pluginXml );
132 }
133 finally
134 {
135 IOUtil.close( reader );
136 }
137
138 Map config = new HashMap();
139 config.put( "basedir", new File( "." ).getAbsoluteFile() );
140 config.put( "messageLevel", "info" );
141
142 MojoDescriptor md = pd.getMojo( "test" );
143
144 AntMojoWrapper wrapper =
145 new AntMojoWrapper( new AntScriptInvoker( md, Thread.currentThread().getContextClassLoader() ) );
146
147 wrapper.enableLogging( new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) );
148
149 MockControl artifactCtl = null;
150 MockControl pathTranslatorCtl = null;
151 if ( includeImplied )
152 {
153 File pluginXmlFile = new File( StringUtils.replace( resource.getPath(), "%20", " " ) );
154
155 File jarFile = File.createTempFile( "AntMojoWrapperTest.", ".test.jar" );
156 jarFile.deleteOnExit();
157
158 JarArchiver archiver = new JarArchiver();
159 archiver.enableLogging( new ConsoleLogger( Logger.LEVEL_ERROR, "archiver" ) );
160 archiver.setDestFile( jarFile );
161 archiver.addFile( pluginXmlFile, pluginXml );
162 archiver.createArchive();
163
164 artifactCtl = MockControl.createControl( Artifact.class );
165 Artifact artifact = (Artifact) artifactCtl.getMock();
166
167 artifact.getFile();
168 artifactCtl.setReturnValue( jarFile, MockControl.ZERO_OR_MORE );
169
170 artifact.getGroupId();
171 artifactCtl.setReturnValue( "groupId", MockControl.ZERO_OR_MORE );
172
173 artifact.getArtifactId();
174 artifactCtl.setReturnValue( "artifactId", MockControl.ZERO_OR_MORE );
175
176 artifact.getVersion();
177 artifactCtl.setReturnValue( "1", MockControl.ZERO_OR_MORE );
178
179 artifact.getId();
180 artifactCtl.setReturnValue( "groupId:artifactId:jar:1", MockControl.ZERO_OR_MORE );
181
182 artifact.getClassifier();
183 artifactCtl.setReturnValue( null, MockControl.ZERO_OR_MORE );
184
185 pathTranslatorCtl = MockControl.createControl( PathTranslator.class );
186 PathTranslator pt = (PathTranslator) pathTranslatorCtl.getMock();
187
188 Model model = new Model();
189
190 Build build = new Build();
191 build.setDirectory( "target" );
192
193 model.setBuild( build );
194
195 MavenProject project = new MavenProject( model );
196 project.setFile( new File( "pom.xml" ).getAbsoluteFile() );
197
198 artifactCtl.replay();
199 pathTranslatorCtl.replay();
200
201 pd.setPluginArtifact( artifact );
202 pd.setArtifacts( Collections.singletonList( artifact ) );
203
204 config.put( "project", project );
205 config.put( "session", new MavenSession( null, null, null, null, null, null, null, null, null, null ) );
206 config.put( "mojoExecution", new MojoExecution( md ) );
207
208 ComponentRequirement cr = new ComponentRequirement();
209 cr.setRole( PathTranslator.class.getName() );
210
211 wrapper.addComponentRequirement( cr, pt );
212 }
213
214 wrapper.setComponentConfiguration( config );
215
216 TestBuildListener tbl = new TestBuildListener();
217 wrapper.getAntProject().addBuildListener( tbl );
218
219 PrintStream oldOut = System.out;
220
221 ByteArrayOutputStream baos = new ByteArrayOutputStream();
222 try
223 {
224 System.setOut( new PrintStream( baos ) );
225
226 wrapper.execute();
227 }
228 finally
229 {
230 System.setOut( oldOut );
231 }
232
233 System.out.println( "\n\n" + stack.getMethodName() + " executed; verifying...\n\n" );
234
235 if ( includeImplied )
236 {
237 artifactCtl.verify();
238 pathTranslatorCtl.verify();
239 }
240
241 List messages = new ArrayList();
242 if ( !tbl.messages.isEmpty() )
243 {
244 messages.addAll( tbl.messages );
245 }
246
247 messages.add( new String( baos.toByteArray() ) );
248
249 return messages;
250 }
251
252 private static final class TestBuildListener
253 implements BuildListener
254 {
255 private List messages = new ArrayList();
256
257 public void buildFinished( BuildEvent arg0 )
258 {
259 }
260
261 public void buildStarted( BuildEvent arg0 )
262 {
263 }
264
265 public void messageLogged( BuildEvent event )
266 {
267 messages.add( event.getMessage() );
268 }
269
270 public void targetFinished( BuildEvent arg0 )
271 {
272 }
273
274 public void targetStarted( BuildEvent arg0 )
275 {
276 }
277
278 public void taskFinished( BuildEvent arg0 )
279 {
280 }
281
282 public void taskStarted( BuildEvent arg0 )
283 {
284 }
285 };
286
287 }