1 package org.apache.maven.plugin;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.util.List;
23
24 import org.apache.maven.AbstractCoreMavenComponentTestCase;
25 import org.apache.maven.artifact.Artifact;
26 import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
27 import org.apache.maven.artifact.repository.RepositoryRequest;
28 import org.apache.maven.execution.MavenSession;
29 import org.apache.maven.model.Plugin;
30 import org.apache.maven.plugin.descriptor.MojoDescriptor;
31 import org.apache.maven.plugin.descriptor.PluginDescriptor;
32 import org.apache.maven.project.MavenProject;
33 import org.codehaus.plexus.classworlds.realm.ClassRealm;
34 import org.codehaus.plexus.component.annotations.Requirement;
35 import org.codehaus.plexus.component.repository.ComponentDescriptor;
36
37 public class PluginManagerTest
38 extends AbstractCoreMavenComponentTestCase
39 {
40 @Requirement
41 private DefaultBuildPluginManager pluginManager;
42
43 protected void setUp()
44 throws Exception
45 {
46 super.setUp();
47 pluginManager = (DefaultBuildPluginManager) lookup( BuildPluginManager.class );
48 }
49
50 @Override
51 protected void tearDown()
52 throws Exception
53 {
54 pluginManager = null;
55 super.tearDown();
56 }
57
58 protected String getProjectsDirectory()
59 {
60 return "src/test/projects/plugin-manager";
61 }
62
63 public void testPluginLoading()
64 throws Exception
65 {
66 MavenSession session = createMavenSession( null );
67 Plugin plugin = new Plugin();
68 plugin.setGroupId( "org.apache.maven.its.plugins" );
69 plugin.setArtifactId( "maven-it-plugin" );
70 plugin.setVersion( "0.1" );
71 PluginDescriptor pluginDescriptor =
72 pluginManager.loadPlugin( plugin, session.getCurrentProject().getRemotePluginRepositories(),
73 session.getRepositorySession() );
74 assertNotNull( pluginDescriptor );
75 }
76
77 public void testMojoDescriptorRetrieval()
78 throws Exception
79 {
80 MavenSession session = createMavenSession( null );
81 String goal = "it";
82 Plugin plugin = new Plugin();
83 plugin.setGroupId( "org.apache.maven.its.plugins" );
84 plugin.setArtifactId( "maven-it-plugin" );
85 plugin.setVersion( "0.1" );
86
87 MojoDescriptor mojoDescriptor =
88 pluginManager.getMojoDescriptor( plugin, goal, session.getCurrentProject().getRemotePluginRepositories(),
89 session.getRepositorySession() );
90 assertNotNull( mojoDescriptor );
91 assertEquals( goal, mojoDescriptor.getGoal() );
92 // igorf: plugin realm comes later
93 // assertNotNull( mojoDescriptor.getRealm() );
94
95 PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
96 assertNotNull( pluginDescriptor );
97 assertEquals( "org.apache.maven.its.plugins", pluginDescriptor.getGroupId() );
98 assertEquals( "maven-it-plugin", pluginDescriptor.getArtifactId() );
99 assertEquals( "0.1", pluginDescriptor.getVersion() );
100 }
101
102 // -----------------------------------------------------------------------------------------------
103 // Tests which exercise the lifecycle executor when it is dealing with individual goals.
104 // -----------------------------------------------------------------------------------------------
105
106 //TODO: These two tests display a lack of symmetry with respect to the input which is a free form string and the
107 // mojo descriptor which comes back. All the free form parsing needs to be done somewhere else, this is
108 // really the function of the CLI, and then the pre-processing of that output still needs to be fed into
109 // a hinting process which helps flesh out the full specification of the plugin. The plugin manager should
110 // only deal in concrete terms -- all version finding mumbo jumbo is a customization to base functionality
111 // the plugin manager provides.
112
113 public void testRemoteResourcesPlugin()
114 throws Exception
115 {
116 //TODO: turn an equivalent back on when the RR plugin is released.
117
118 /*
119
120 This will not work until the RR plugin is released to get rid of the binding to the reporting exception which is a mistake.
121
122 This happpens after removing the reporting API from the core:
123
124 java.lang.NoClassDefFoundError: org/apache/maven/reporting/MavenReportException
125
126 MavenSession session = createMavenSession( getProject( "project-with-inheritance" ) );
127 String goal = "process";
128
129 Plugin plugin = new Plugin();
130 plugin.setGroupId( "org.apache.maven.plugins" );
131 plugin.setArtifactId( "maven-remote-resources-plugin" );
132 plugin.setVersion( "1.0-beta-2" );
133
134 MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor( plugin, goal, session.getCurrentProject(), session.getLocalRepository() );
135 assertPluginDescriptor( mojoDescriptor, "org.apache.maven.plugins", "maven-remote-resources-plugin", "1.0-beta-2" );
136 MojoExecution mojoExecution = new MojoExecution( mojoDescriptor );
137 pluginManager.executeMojo( session, mojoExecution );
138 */
139 }
140
141 //TODO: this will be the basis of the customizable lifecycle execution so need to figure this out quickly.
142 public void testSurefirePlugin()
143 throws Exception
144 {
145 /*
146 MavenSession session = createMavenSession( getProject( "project-with-inheritance" ) );
147 String goal = "test";
148
149 Plugin plugin = new Plugin();
150 plugin.setGroupId( "org.apache.maven.plugins" );
151 plugin.setArtifactId( "maven-surefire-plugin" );
152 plugin.setVersion( "2.4.2" );
153
154 // The project has already been fully interpolated so getting the raw mojoDescriptor is not going to have the processes configuration.
155 MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor( plugin, goal, session.getLocalRepository(), session.getCurrentProject().getPluginArtifactRepositories() );
156 assertPluginDescriptor( mojoDescriptor, "org.apache.maven.plugins", "maven-surefire-plugin", "2.4.2" );
157
158 System.out.println( session.getCurrentProject().getBuild().getPluginsAsMap() );
159
160 Xpp3Dom configuration = (Xpp3Dom) session.getCurrentProject().getBuild().getPluginsAsMap().get( plugin.getKey() ).getExecutions().get( 0 ).getConfiguration();
161 MojoExecution mojoExecution = new MojoExecution( mojoDescriptor, configuration );
162 pluginManager.executeMojo( session, mojoExecution );
163 */
164 }
165
166 public void testMojoConfigurationIsMergedCorrectly()
167 throws Exception
168 {
169 }
170
171 /**
172 * The case where the user wants to specify an alternate version of the underlying tool. Common case
173 * is in the Antlr plugin which comes bundled with a version of Antlr but the user often times needs
174 * to use a specific version. We need to make sure the version that they specify takes precedence.
175 */
176 public void testMojoWhereInternallyStatedDependencyIsOverriddenByProject()
177 throws Exception
178 {
179 }
180
181 /**
182 * The case where you have a plugin in the current build that you want to be used on projects in
183 * the current build.
184 */
185 public void testMojoThatIsPresentInTheCurrentBuild()
186 throws Exception
187 {
188 }
189
190 /**
191 * This is the case where the Mojo wants to execute on every project and then do something at the end
192 * with the results of each project.
193 */
194 public void testAggregatorMojo()
195 throws Exception
196 {
197 }
198
199 /**
200 * This is the case where a Mojo needs the lifecycle run to a certain phase before it can do
201 * anything useful.
202 */
203 public void testMojoThatRequiresExecutionToAGivenPhaseBeforeExecutingItself()
204 throws Exception
205 {
206 }
207
208 // test that mojo which does not require dependency resolution trigger no downloading of dependencies
209
210 // test interpolation of basedir values in mojo configuration
211
212 // test a build where projects use different versions of the same plugin
213
214 public void testThatPluginDependencyThatHasSystemScopeIsResolved()
215 throws Exception
216 {
217 /*
218 File systemPath = new File( getBasedir(), "pom.xml" );
219
220 Plugin plugin = new PluginBuilder( "org.apache.maven", "project-test", "1.0" )
221 .addDependency( "org.apache.maven", "system-dependency", "1.0", Artifact.SCOPE_SYSTEM, systemPath.getAbsolutePath() )
222 .get();
223
224 MavenProject pluginProject = new ProjectBuilder( "org.apache.maven", "project-test", "1.0" )
225 .addPlugin( plugin )
226 .addDependency( "junit", "junit", "3.8.1", Artifact.SCOPE_COMPILE )
227 .get();
228
229 // i'm making this artifact which is assumed to come from a pom in the metadata processor, then it tries to create a POM artifact
230 // and parse it for the dependencies and it blows up.
231 //
232 // we need to pass this through as is so it doesn't get parsed again.
233 Artifact pluginArtifact = new ProjectArtifact( pluginProject );
234
235 Set<Artifact> artifacts = pluginManager.getPluginArtifacts( pluginArtifact, plugin, getLocalRepository(), getPluginArtifactRepositories() );
236 System.out.println( artifacts );
237 */
238
239 MavenSession session = createMavenSession( getProject( "project-contributing-system-scope-plugin-dep" ) );
240 MavenProject project = session.getCurrentProject();
241 Plugin plugin = project.getPlugin( "org.apache.maven.its.plugins:maven-it-plugin" );
242
243 RepositoryRequest repositoryRequest = new DefaultRepositoryRequest();
244 repositoryRequest.setLocalRepository( getLocalRepository() );
245 repositoryRequest.setRemoteRepositories( getPluginArtifactRepositories() );
246
247 PluginDescriptor pluginDescriptor =
248 pluginManager.loadPlugin( plugin, session.getCurrentProject().getRemotePluginRepositories(),
249 session.getRepositorySession() );
250 pluginManager.getPluginRealm( session, pluginDescriptor );
251 List<Artifact> artifacts = pluginDescriptor.getArtifacts();
252
253 for ( Artifact a : artifacts )
254 {
255 if ( a.getGroupId().equals( "org.apache.maven.its.mng3586" ) && a.getArtifactId().equals( "tools" ) )
256 {
257 // The system scoped dependencies will be present in the classloader for the plugin
258 return;
259 }
260 }
261
262 fail( "Can't find the system scoped dependency in the plugin artifacts." );
263 }
264
265 // -----------------------------------------------------------------------------------------------
266 // Testing help
267 // -----------------------------------------------------------------------------------------------
268
269 protected void assertPluginDescriptor( MojoDescriptor mojoDescriptor, String groupId, String artifactId, String version )
270 {
271 assertNotNull( mojoDescriptor );
272 PluginDescriptor pd = mojoDescriptor.getPluginDescriptor();
273 assertNotNull( pd );
274 assertEquals( groupId, pd.getGroupId() );
275 assertEquals( artifactId, pd.getArtifactId() );
276 assertEquals( version, pd.getVersion() );
277 }
278
279 public void testPluginRealmCache()
280 throws Exception
281 {
282 RepositoryRequest repositoryRequest = new DefaultRepositoryRequest();
283 repositoryRequest.setLocalRepository( getLocalRepository() );
284 repositoryRequest.setRemoteRepositories( getPluginArtifactRepositories() );
285
286 // prime realm cache
287 MavenSession session = createMavenSession( getProject( "project-contributing-system-scope-plugin-dep" ) );
288 MavenProject project = session.getCurrentProject();
289 Plugin plugin = project.getPlugin( "org.apache.maven.its.plugins:maven-it-plugin" );
290
291 PluginDescriptor pluginDescriptor =
292 pluginManager.loadPlugin( plugin, session.getCurrentProject().getRemotePluginRepositories(),
293 session.getRepositorySession() );
294 pluginManager.getPluginRealm( session, pluginDescriptor );
295
296 assertEquals( 1, pluginDescriptor.getDependencies().size() );
297
298 for ( ComponentDescriptor<?> descriptor : pluginDescriptor.getComponents() )
299 {
300 assertNotNull( descriptor.getRealm() );
301 assertNotNull( descriptor.getImplementationClass() );
302 }
303
304 // reload plugin realm from cache
305 session = createMavenSession( getProject( "project-contributing-system-scope-plugin-dep" ) );
306 project = session.getCurrentProject();
307 plugin = project.getPlugin( "org.apache.maven.its.plugins:maven-it-plugin" );
308
309 pluginDescriptor =
310 pluginManager.loadPlugin( plugin, session.getCurrentProject().getRemotePluginRepositories(),
311 session.getRepositorySession() );
312 pluginManager.getPluginRealm( session, pluginDescriptor );
313
314 assertEquals( 1, pluginDescriptor.getDependencies().size() );
315
316 for ( ComponentDescriptor<?> descriptor : pluginDescriptor.getComponents() )
317 {
318 assertNotNull( descriptor.getRealm() );
319 assertNotNull( descriptor.getImplementationClass() );
320 }
321 }
322
323 public void testBuildExtensionsPluginLoading()
324 throws Exception
325 {
326 RepositoryRequest repositoryRequest = new DefaultRepositoryRequest();
327 repositoryRequest.setLocalRepository( getLocalRepository() );
328 repositoryRequest.setRemoteRepositories( getPluginArtifactRepositories() );
329
330 // prime realm cache
331 MavenSession session = createMavenSession( getProject( "project-with-build-extensions-plugin" ) );
332 MavenProject project = session.getCurrentProject();
333 Plugin plugin = project.getPlugin( "org.apache.maven.its.plugins:maven-it-plugin" );
334
335 PluginDescriptor pluginDescriptor =
336 pluginManager.loadPlugin( plugin, session.getCurrentProject().getRemotePluginRepositories(),
337 session.getRepositorySession() );
338 ClassRealm pluginRealm = pluginManager.getPluginRealm( session, pluginDescriptor );
339
340 assertEquals(pluginRealm, pluginDescriptor.getComponents().get(0).getRealm());
341 }
342 }