View Javadoc
1   package org.apache.maven.plugins.help;
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 static org.mockito.Mockito.any;
23  import static org.mockito.Mockito.eq;
24  import static org.mockito.Mockito.mock;
25  import static org.mockito.Mockito.never;
26  import static org.mockito.Mockito.verify;
27  import static org.mockito.Mockito.when;
28  
29  import org.apache.maven.execution.MavenSession;
30  import org.apache.maven.lifecycle.internal.MojoDescriptorCreator;
31  import org.apache.maven.model.Plugin;
32  import org.apache.maven.plugin.descriptor.MojoDescriptor;
33  import org.apache.maven.plugin.descriptor.Parameter;
34  import org.apache.maven.plugin.descriptor.PluginDescriptor;
35  import org.apache.maven.plugin.version.PluginVersionRequest;
36  import org.apache.maven.plugin.version.PluginVersionResolver;
37  import org.apache.maven.plugin.version.PluginVersionResult;
38  import org.apache.maven.plugins.help.DescribeMojo.PluginInfo;
39  import org.apache.maven.project.MavenProject;
40  import org.apache.maven.reporting.exec.MavenPluginManagerHelper;
41  import org.mockito.ArgumentCaptor;
42  
43  import junit.framework.Assert;
44  import junit.framework.TestCase;
45  import junitx.util.PrivateAccessor;
46  /**
47   * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
48   */
49  public class DescribeMojoTest
50      extends TestCase
51  {
52      /**
53       * Test method for {@link org.apache.maven.plugins.help.DescribeMojo#toLines(java.lang.String, int, int, int)}.
54       *
55       * @throws Exception if any
56       */
57      public void testGetExpressionsRoot()
58          throws Exception
59      {
60          try
61          {
62              PrivateAccessor.invoke( DescribeMojo.class, "toLines", new Class[] { String.class, Integer.TYPE,
63                  Integer.TYPE, Integer.TYPE }, new Object[] { "", 2, 2,
64                      80} );
65              assertTrue( true );
66          }
67          catch ( Throwable e )
68          {
69              Assert.fail( "The API changes" );
70          }
71      }
72      
73      public void testValidExpression()
74          throws Exception
75      {
76          StringBuilder sb = new StringBuilder();
77          MojoDescriptor md = new MojoDescriptor();
78          Parameter parameter = new Parameter();
79          parameter.setName( "name" );
80          parameter.setExpression( "${valid.expression}" );
81          md.addParameter( parameter );
82          
83          String ls = System.getProperty( "line.separator" );
84          
85          try
86          {
87              PrivateAccessor.invoke( new DescribeMojo(), "describeMojoParameters", new Class[] { MojoDescriptor.class,
88                  StringBuilder.class }, new Object[] { md, sb } );
89              
90              assertEquals( "  Available parameters:" + ls
91              		      + ls +
92              		      "    name" + ls +
93              		      "      User property: valid.expression" + ls +
94              		      "      (no description available)" + ls, sb.toString() );
95          }
96          catch ( Throwable e )
97          {
98              fail( e.getMessage() );
99          }
100     }
101     
102     public void testInvalidExpression()
103         throws Exception
104     {
105         StringBuilder sb = new StringBuilder();
106         MojoDescriptor md = new MojoDescriptor();
107         Parameter parameter = new Parameter();
108         parameter.setName( "name" );
109         parameter.setExpression( "${project.build.directory}/generated-sources/foobar" ); //this is a defaultValue
110         md.addParameter( parameter );
111         
112         String ls = System.getProperty( "line.separator" );
113         
114         try
115         {
116             PrivateAccessor.invoke( new DescribeMojo(), "describeMojoParameters", new Class[] { MojoDescriptor.class,
117                 StringBuilder.class }, new Object[] { md, sb } );
118             
119             assertEquals( "  Available parameters:" + ls +
120                           ls +
121                           "    name" + ls +
122                           "      Expression: ${project.build.directory}/generated-sources/foobar" + ls +
123                           "      (no description available)" + ls, sb.toString() );
124         }
125         catch ( Throwable e )
126         {
127             fail( e.getMessage() );
128         }
129         
130     }
131     
132     public void testParsePluginInfoGAV()
133         throws Throwable
134     {
135         DescribeMojo mojo = new DescribeMojo();
136         PrivateAccessor.setField( mojo, "groupId", "org.test" );
137         PrivateAccessor.setField( mojo, "artifactId", "test" );
138         PrivateAccessor.setField( mojo, "version", "1.0" );
139         PluginInfo pi = (PluginInfo) PrivateAccessor.invoke( mojo, "parsePluginLookupInfo", null, null );
140         assertEquals( pi.getGroupId(), "org.test" );
141         assertEquals( pi.getArtifactId(), "test" );
142         assertEquals( pi.getVersion(), "1.0" );
143         assertNull( pi.getPrefix() );
144     }
145     
146     public void testParsePluginInfoPluginPrefix()
147         throws Throwable
148     {
149         DescribeMojo mojo = new DescribeMojo();
150         PrivateAccessor.setField( mojo, "plugin", "help" );
151         PluginInfo pi = (PluginInfo) PrivateAccessor.invoke( mojo, "parsePluginLookupInfo", null, null );
152         assertNull( pi.getGroupId() );
153         assertNull( pi.getArtifactId() );
154         assertNull( pi.getVersion() );
155         assertEquals( "help", pi.getPrefix() );
156         
157         PrivateAccessor.setField( mojo, "plugin", "help2:::" );
158         pi = (PluginInfo) PrivateAccessor.invoke( mojo, "parsePluginLookupInfo", null, null );
159         assertEquals( "help2", pi.getPrefix() );
160     }
161     
162     public void testParsePluginInfoPluginGA()
163         throws Throwable
164     {
165         DescribeMojo mojo = new DescribeMojo();
166         PrivateAccessor.setField( mojo, "plugin", "org.test:test" );
167         PluginInfo pi = (PluginInfo) PrivateAccessor.invoke( mojo, "parsePluginLookupInfo", null, null );
168         assertEquals( "org.test", pi.getGroupId() );
169         assertEquals( "test", pi.getArtifactId() );
170         assertNull( pi.getVersion() );
171         assertNull( pi.getPrefix() );
172     }
173     
174     public void testParsePluginInfoPluginGAV()
175         throws Throwable
176     {
177         DescribeMojo mojo = new DescribeMojo();
178         PrivateAccessor.setField( mojo, "plugin", "org.test:test:1.0" );
179         PluginInfo pi = (PluginInfo) PrivateAccessor.invoke( mojo, "parsePluginLookupInfo", null, null );
180         assertEquals( "org.test", pi.getGroupId() );
181         assertEquals( "test", pi.getArtifactId() );
182         assertEquals( "1.0", pi.getVersion() );
183         assertNull( pi.getPrefix() );
184     }
185     
186     public void testParsePluginInfoPluginIncorrect()
187         throws Throwable
188     {
189         DescribeMojo mojo = new DescribeMojo();
190         PrivateAccessor.setField( mojo, "plugin", "org.test:test:1.0:invalid" );
191         try
192         {
193             PrivateAccessor.invoke( mojo, "parsePluginLookupInfo", null, null );
194             fail();
195         }
196         catch ( Exception e )
197         {
198             // expected
199         }
200     }
201     
202     public void testLookupPluginDescriptorPrefixWithVersion()
203         throws Throwable
204     {
205         DescribeMojo mojo = new DescribeMojo();
206 
207         PluginInfo pi = new PluginInfo();
208         pi.setPrefix( "help" );
209         pi.setVersion( "1.0" );
210 
211         Plugin plugin = new Plugin();
212         plugin.setGroupId( "org.test" );
213         plugin.setArtifactId( "test" );
214         
215         PluginDescriptor pd = new PluginDescriptor();
216 
217         MojoDescriptorCreator mojoDescriptorCreator = mock( MojoDescriptorCreator.class );
218         PluginVersionResolver pluginVersionResolver = mock( PluginVersionResolver.class );
219         MavenPluginManagerHelper pluginManager = mock( MavenPluginManagerHelper.class );
220         MavenSession session = mock( MavenSession.class );
221         PrivateAccessor.setField( mojo, "mojoDescriptorCreator", mojoDescriptorCreator );
222         PrivateAccessor.setField( mojo, "pluginVersionResolver", pluginVersionResolver );
223         PrivateAccessor.setField( mojo, "pluginManager", pluginManager );
224         PrivateAccessor.setField( mojo, "session", session );
225         when( mojoDescriptorCreator.findPluginForPrefix( "help", session ) ).thenReturn( plugin );
226         when( pluginManager.getPluginDescriptor( any( Plugin.class ), eq( session ) ) ).thenReturn( pd );
227 
228         PluginDescriptor returned =
229             (PluginDescriptor) PrivateAccessor.invoke( mojo, "lookupPluginDescriptor", new Class[] { PluginInfo.class },
230                                                        new Object[] { pi } );
231         assertEquals( pd, returned );
232 
233         verify( mojoDescriptorCreator ).findPluginForPrefix( "help", session );
234         verify( pluginVersionResolver, never() ).resolve( any( PluginVersionRequest.class ) );
235         ArgumentCaptor<Plugin> argument = ArgumentCaptor.forClass( Plugin.class );
236         verify( pluginManager ).getPluginDescriptor( argument.capture(), eq( session ) );
237         Plugin capturedPlugin = argument.getValue();
238         assertEquals( "org.test", capturedPlugin.getGroupId() );
239         assertEquals( "test", capturedPlugin.getArtifactId() );
240         assertEquals( "1.0", capturedPlugin.getVersion() );
241     }
242     
243     public void testLookupPluginDescriptorPrefixWithoutVersion()
244         throws Throwable
245     {
246         DescribeMojo mojo = new DescribeMojo();
247 
248         PluginInfo pi = new PluginInfo();
249         pi.setPrefix( "help" );
250 
251         Plugin plugin = new Plugin();
252         plugin.setGroupId( "org.test" );
253         plugin.setArtifactId( "test" );
254         
255         PluginDescriptor pd = new PluginDescriptor();
256 
257         MojoDescriptorCreator mojoDescriptorCreator = mock( MojoDescriptorCreator.class );
258         PluginVersionResolver pluginVersionResolver = mock( PluginVersionResolver.class );
259         MavenPluginManagerHelper pluginManager = mock( MavenPluginManagerHelper.class );
260         PluginVersionResult versionResult = mock( PluginVersionResult.class );
261         MavenSession session = mock( MavenSession.class );
262         PrivateAccessor.setField( mojo, "mojoDescriptorCreator", mojoDescriptorCreator );
263         PrivateAccessor.setField( mojo, "pluginVersionResolver", pluginVersionResolver );
264         PrivateAccessor.setField( mojo, "pluginManager", pluginManager );
265         PrivateAccessor.setField( mojo, "session", session );
266         PrivateAccessor.setField( mojo, "project", new MavenProject() );
267         when( mojoDescriptorCreator.findPluginForPrefix( "help", session ) ).thenReturn( plugin );
268         when( pluginVersionResolver.resolve( any( PluginVersionRequest.class ) ) ).thenReturn( versionResult );
269         when( versionResult.getVersion() ).thenReturn( "1.0" );
270         when( pluginManager.getPluginDescriptor( any( Plugin.class ), eq( session ) ) ).thenReturn( pd );
271 
272         PluginDescriptor returned =
273             (PluginDescriptor) PrivateAccessor.invoke( mojo, "lookupPluginDescriptor", new Class[] { PluginInfo.class },
274                                                        new Object[] { pi } );
275         assertEquals( pd, returned );
276 
277         verify( mojoDescriptorCreator ).findPluginForPrefix( "help", session );
278         ArgumentCaptor<PluginVersionRequest> versionArgument = ArgumentCaptor.forClass( PluginVersionRequest.class );
279         verify( pluginVersionResolver ).resolve( versionArgument.capture() );
280         assertEquals( "org.test", versionArgument.getValue().getGroupId() );
281         assertEquals( "test", versionArgument.getValue().getArtifactId() );
282         ArgumentCaptor<Plugin> argument = ArgumentCaptor.forClass( Plugin.class );
283         verify( pluginManager ).getPluginDescriptor( argument.capture(), eq( session ) );
284         Plugin capturedPlugin = argument.getValue();
285         assertEquals( "org.test", capturedPlugin.getGroupId() );
286         assertEquals( "test", capturedPlugin.getArtifactId() );
287         assertEquals( "1.0", capturedPlugin.getVersion() );
288     }
289     
290     public void testLookupPluginDescriptorGAV()
291         throws Throwable
292     {
293         DescribeMojo mojo = new DescribeMojo();
294 
295         PluginInfo pi = new PluginInfo();
296         pi.setGroupId( "org.test" );
297         pi.setArtifactId( "test" );
298         pi.setVersion( "1.0" );
299 
300         PluginDescriptor pd = new PluginDescriptor();
301 
302         MojoDescriptorCreator mojoDescriptorCreator = mock( MojoDescriptorCreator.class );
303         PluginVersionResolver pluginVersionResolver = mock( PluginVersionResolver.class );
304         MavenPluginManagerHelper pluginManager = mock( MavenPluginManagerHelper.class );
305         MavenSession session = mock( MavenSession.class );
306         PrivateAccessor.setField( mojo, "mojoDescriptorCreator", mojoDescriptorCreator );
307         PrivateAccessor.setField( mojo, "pluginVersionResolver", pluginVersionResolver );
308         PrivateAccessor.setField( mojo, "pluginManager", pluginManager );
309         PrivateAccessor.setField( mojo, "session", session );
310         when( pluginManager.getPluginDescriptor( any( Plugin.class ), eq( session ) ) ).thenReturn( pd );
311 
312         PluginDescriptor returned =
313             (PluginDescriptor) PrivateAccessor.invoke( mojo, "lookupPluginDescriptor", new Class[] { PluginInfo.class },
314                                                        new Object[] { pi } );
315         assertEquals( pd, returned );
316 
317         verify( mojoDescriptorCreator, never() ).findPluginForPrefix( any( String.class ), any( MavenSession.class ) );
318         verify( pluginVersionResolver, never() ).resolve( any( PluginVersionRequest.class ) );
319         ArgumentCaptor<Plugin> argument = ArgumentCaptor.forClass( Plugin.class );
320         verify( pluginManager ).getPluginDescriptor( argument.capture(), eq( session ) );
321         Plugin capturedPlugin = argument.getValue();
322         assertEquals( "org.test", capturedPlugin.getGroupId() );
323         assertEquals( "test", capturedPlugin.getArtifactId() );
324         assertEquals( "1.0", capturedPlugin.getVersion() );
325     }
326 
327     public void testLookupPluginDescriptorGMissingA()
328         throws Throwable
329     {
330         DescribeMojo mojo = new DescribeMojo();
331         PluginInfo pi = new PluginInfo();
332         pi.setGroupId( "org.test" );
333         try
334         {
335             PrivateAccessor.invoke( mojo, "lookupPluginDescriptor", new Class[] { PluginInfo.class },
336                                     new Object[] { pi } );
337             fail();
338         }
339         catch ( Exception e )
340         {
341             assertTrue( e.getMessage().startsWith( "You must specify either" ) );
342         }
343     }
344     
345     public void testLookupPluginDescriptorAMissingG()
346         throws Throwable
347     {
348         DescribeMojo mojo = new DescribeMojo();
349         PluginInfo pi = new PluginInfo();
350         pi.setArtifactId( "test" );
351         try
352         {
353             PrivateAccessor.invoke( mojo, "lookupPluginDescriptor", new Class[] { PluginInfo.class },
354                                     new Object[] { pi } );
355             fail();
356         }
357         catch ( Exception e )
358         {
359             assertTrue( e.getMessage().startsWith( "You must specify either" ) );
360         }
361     }
362 
363 }