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.component.annotations.Requirement;
34
35 public class PluginManagerTest
36 extends AbstractCoreMavenComponentTestCase
37 {
38 @Requirement
39 private DefaultBuildPluginManager pluginManager;
40
41 protected void setUp()
42 throws Exception
43 {
44 super.setUp();
45 pluginManager = (DefaultBuildPluginManager) lookup( BuildPluginManager.class );
46 }
47
48 @Override
49 protected void tearDown()
50 throws Exception
51 {
52 pluginManager = null;
53 super.tearDown();
54 }
55
56 protected String getProjectsDirectory()
57 {
58 return "src/test/projects/plugin-manager";
59 }
60
61 public void testPluginLoading()
62 throws Exception
63 {
64 MavenSession session = createMavenSession( null );
65 Plugin plugin = new Plugin();
66 plugin.setGroupId( "org.apache.maven.its.plugins" );
67 plugin.setArtifactId( "maven-it-plugin" );
68 plugin.setVersion( "0.1" );
69 PluginDescriptor pluginDescriptor =
70 pluginManager.loadPlugin( plugin, session.getCurrentProject().getRemotePluginRepositories(),
71 session.getRepositorySession() );
72 assertNotNull( pluginDescriptor );
73 }
74
75 public void testMojoDescriptorRetrieval()
76 throws Exception
77 {
78 MavenSession session = createMavenSession( null );
79 String goal = "it";
80 Plugin plugin = new Plugin();
81 plugin.setGroupId( "org.apache.maven.its.plugins" );
82 plugin.setArtifactId( "maven-it-plugin" );
83 plugin.setVersion( "0.1" );
84
85 MojoDescriptor mojoDescriptor =
86 pluginManager.getMojoDescriptor( plugin, goal, session.getCurrentProject().getRemotePluginRepositories(),
87 session.getRepositorySession() );
88 assertNotNull( mojoDescriptor );
89 assertEquals( goal, mojoDescriptor.getGoal() );
90 // igorf: plugin realm comes later
91 // assertNotNull( mojoDescriptor.getRealm() );
92
93 PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
94 assertNotNull( pluginDescriptor );
95 assertEquals( "org.apache.maven.its.plugins", pluginDescriptor.getGroupId() );
96 assertEquals( "maven-it-plugin", pluginDescriptor.getArtifactId() );
97 assertEquals( "0.1", pluginDescriptor.getVersion() );
98 }
99
100 // -----------------------------------------------------------------------------------------------
101 // Tests which exercise the lifecycle executor when it is dealing with individual goals.
102 // -----------------------------------------------------------------------------------------------
103
104 //TODO: These two tests display a lack of symmetry with respect to the input which is a free form string and the
105 // mojo descriptor which comes back. All the free form parsing needs to be done somewhere else, this is
106 // really the function of the CLI, and then the pre-processing of that output still needs to be fed into
107 // a hinting process which helps flesh out the full specification of the plugin. The plugin manager should
108 // only deal in concrete terms -- all version finding mumbo jumbo is a customization to base functionality
109 // the plugin manager provides.
110
111 public void testRemoteResourcesPlugin()
112 throws Exception
113 {
114 //TODO: turn an equivalent back on when the RR plugin is released.
115
116 /*
117
118 This will not work until the RR plugin is released to get rid of the binding to the reporting exception which is a mistake.
119
120 This happpens after removing the reporting API from the core:
121
122 java.lang.NoClassDefFoundError: org/apache/maven/reporting/MavenReportException
123
124 MavenSession session = createMavenSession( getProject( "project-with-inheritance" ) );
125 String goal = "process";
126
127 Plugin plugin = new Plugin();
128 plugin.setGroupId( "org.apache.maven.plugins" );
129 plugin.setArtifactId( "maven-remote-resources-plugin" );
130 plugin.setVersion( "1.0-beta-2" );
131
132 MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor( plugin, goal, session.getCurrentProject(), session.getLocalRepository() );
133 assertPluginDescriptor( mojoDescriptor, "org.apache.maven.plugins", "maven-remote-resources-plugin", "1.0-beta-2" );
134 MojoExecution mojoExecution = new MojoExecution( mojoDescriptor );
135 pluginManager.executeMojo( session, mojoExecution );
136 */
137 }
138
139 //TODO: this will be the basis of the customizable lifecycle execution so need to figure this out quickly.
140 public void testSurefirePlugin()
141 throws Exception
142 {
143 /*
144 MavenSession session = createMavenSession( getProject( "project-with-inheritance" ) );
145 String goal = "test";
146
147 Plugin plugin = new Plugin();
148 plugin.setGroupId( "org.apache.maven.plugins" );
149 plugin.setArtifactId( "maven-surefire-plugin" );
150 plugin.setVersion( "2.4.2" );
151
152 // The project has already been fully interpolated so getting the raw mojoDescriptor is not going to have the processes configuration.
153 MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor( plugin, goal, session.getLocalRepository(), session.getCurrentProject().getPluginArtifactRepositories() );
154 assertPluginDescriptor( mojoDescriptor, "org.apache.maven.plugins", "maven-surefire-plugin", "2.4.2" );
155
156 System.out.println( session.getCurrentProject().getBuild().getPluginsAsMap() );
157
158 Xpp3Dom configuration = (Xpp3Dom) session.getCurrentProject().getBuild().getPluginsAsMap().get( plugin.getKey() ).getExecutions().get( 0 ).getConfiguration();
159 MojoExecution mojoExecution = new MojoExecution( mojoDescriptor, configuration );
160 pluginManager.executeMojo( session, mojoExecution );
161 */
162 }
163
164 public void testMojoConfigurationIsMergedCorrectly()
165 throws Exception
166 {
167 }
168
169 /**
170 * The case where the user wants to specify an alternate version of the underlying tool. Common case
171 * is in the Antlr plugin which comes bundled with a version of Antlr but the user often times needs
172 * to use a specific version. We need to make sure the version that they specify takes precedence.
173 */
174 public void testMojoWhereInternallyStatedDependencyIsOverriddenByProject()
175 throws Exception
176 {
177 }
178
179 /**
180 * The case where you have a plugin in the current build that you want to be used on projects in
181 * the current build.
182 */
183 public void testMojoThatIsPresentInTheCurrentBuild()
184 throws Exception
185 {
186 }
187
188 /**
189 * This is the case where the Mojo wants to execute on every project and then do something at the end
190 * with the results of each project.
191 */
192 public void testAggregatorMojo()
193 throws Exception
194 {
195 }
196
197 /**
198 * This is the case where a Mojo needs the lifecycle run to a certain phase before it can do
199 * anything useful.
200 */
201 public void testMojoThatRequiresExecutionToAGivenPhaseBeforeExecutingItself()
202 throws Exception
203 {
204 }
205
206 // test that mojo which does not require dependency resolution trigger no downloading of dependencies
207
208 // test interpolation of basedir values in mojo configuration
209
210 // test a build where projects use different versions of the same plugin
211
212 public void testThatPluginDependencyThatHasSystemScopeIsResolved()
213 throws Exception
214 {
215 /*
216 File systemPath = new File( getBasedir(), "pom.xml" );
217
218 Plugin plugin = new PluginBuilder( "org.apache.maven", "project-test", "1.0" )
219 .addDependency( "org.apache.maven", "system-dependency", "1.0", Artifact.SCOPE_SYSTEM, systemPath.getAbsolutePath() )
220 .get();
221
222 MavenProject pluginProject = new ProjectBuilder( "org.apache.maven", "project-test", "1.0" )
223 .addPlugin( plugin )
224 .addDependency( "junit", "junit", "3.8.1", Artifact.SCOPE_COMPILE )
225 .get();
226
227 // 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
228 // and parse it for the dependencies and it blows up.
229 //
230 // we need to pass this through as is so it doesn't get parsed again.
231 Artifact pluginArtifact = new ProjectArtifact( pluginProject );
232
233 Set<Artifact> artifacts = pluginManager.getPluginArtifacts( pluginArtifact, plugin, getLocalRepository(), getPluginArtifactRepositories() );
234 System.out.println( artifacts );
235 */
236
237 MavenSession session = createMavenSession( getProject( "project-contributing-system-scope-plugin-dep" ) );
238 MavenProject project = session.getCurrentProject();
239 Plugin plugin = project.getPlugin( "org.apache.maven.its.plugins:maven-it-plugin" );
240
241 RepositoryRequest repositoryRequest = new DefaultRepositoryRequest();
242 repositoryRequest.setLocalRepository( getLocalRepository() );
243 repositoryRequest.setRemoteRepositories( getPluginArtifactRepositories() );
244
245 PluginDescriptor pluginDescriptor =
246 pluginManager.loadPlugin( plugin, session.getCurrentProject().getRemotePluginRepositories(),
247 session.getRepositorySession() );
248 pluginManager.getPluginRealm( session, pluginDescriptor );
249 List<Artifact> artifacts = pluginDescriptor.getArtifacts();
250
251 for ( Artifact a : artifacts )
252 {
253 if ( a.getGroupId().equals( "org.apache.maven.its.mng3586" ) && a.getArtifactId().equals( "tools" ) )
254 {
255 // The system scoped dependencies will be present in the classloader for the plugin
256 return;
257 }
258 }
259
260 fail( "Can't find the system scoped dependency in the plugin artifacts." );
261 }
262
263 // -----------------------------------------------------------------------------------------------
264 // Testing help
265 // -----------------------------------------------------------------------------------------------
266
267 protected void assertPluginDescriptor( MojoDescriptor mojoDescriptor, String groupId, String artifactId, String version )
268 {
269 assertNotNull( mojoDescriptor );
270 PluginDescriptor pd = mojoDescriptor.getPluginDescriptor();
271 assertNotNull( pd );
272 assertEquals( groupId, pd.getGroupId() );
273 assertEquals( artifactId, pd.getArtifactId() );
274 assertEquals( version, pd.getVersion() );
275 }
276 }