View Javadoc
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 }