View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.plugins.help;
20  
21  import java.lang.reflect.InvocationTargetException;
22  import java.util.Collections;
23  
24  import org.apache.maven.execution.MavenSession;
25  import org.apache.maven.lifecycle.internal.MojoDescriptorCreator;
26  import org.apache.maven.model.Plugin;
27  import org.apache.maven.plugin.MavenPluginManager;
28  import org.apache.maven.plugin.descriptor.MojoDescriptor;
29  import org.apache.maven.plugin.descriptor.Parameter;
30  import org.apache.maven.plugin.descriptor.PluginDescriptor;
31  import org.apache.maven.plugin.version.PluginVersionRequest;
32  import org.apache.maven.plugin.version.PluginVersionResolver;
33  import org.apache.maven.plugin.version.PluginVersionResult;
34  import org.apache.maven.plugins.help.DescribeMojo.PluginInfo;
35  import org.apache.maven.project.MavenProject;
36  import org.eclipse.aether.RepositorySystemSession;
37  import org.junit.Test;
38  import org.mockito.ArgumentCaptor;
39  
40  import static org.apache.commons.lang3.reflect.FieldUtils.writeDeclaredField;
41  import static org.apache.commons.lang3.reflect.FieldUtils.writeField;
42  import static org.apache.commons.lang3.reflect.MethodUtils.invokeMethod;
43  import static org.junit.Assert.*;
44  import static org.mockito.Mockito.*;
45  
46  /**
47   * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
48   */
49  public class DescribeMojoTest {
50      /**
51       * Test method for {@link org.apache.maven.plugins.help.DescribeMojo#toLines(java.lang.String, int, int, int)}.
52       *
53       */
54      @Test
55      public void testGetExpressionsRoot() {
56          try {
57              DescribeMojo describeMojo = new DescribeMojo();
58              invokeMethod(describeMojo, true, "toLines", "", 2, 2, 80);
59          } catch (Throwable e) {
60              fail("The API changes");
61          }
62      }
63  
64      @Test
65      public void testValidExpression() throws Exception {
66          StringBuilder sb = new StringBuilder();
67          MojoDescriptor md = new MojoDescriptor();
68          Parameter parameter = new Parameter();
69          parameter.setName("name");
70          parameter.setExpression("${valid.expression}");
71          md.addParameter(parameter);
72  
73          String ls = System.getProperty("line.separator");
74  
75          try {
76              invokeMethod(new DescribeMojo(), true, "describeMojoParameters", md, sb);
77  
78              assertEquals(
79                      "  Available parameters:" + ls + ls + "    name" + ls + "      User property: valid.expression" + ls
80                              + "      (no description available)" + ls,
81                      sb.toString());
82          } catch (Throwable e) {
83              fail(e.getMessage());
84          }
85      }
86  
87      @Test
88      public void testInvalidExpression() throws Exception {
89          StringBuilder sb = new StringBuilder();
90          MojoDescriptor md = new MojoDescriptor();
91          Parameter parameter = new Parameter();
92          parameter.setName("name");
93          parameter.setExpression("${project.build.directory}/generated-sources/foobar"); // this is a defaultValue
94          md.addParameter(parameter);
95  
96          String ls = System.getProperty("line.separator");
97  
98          try {
99              invokeMethod(new DescribeMojo(), true, "describeMojoParameters", md, sb);
100 
101             assertEquals(
102                     "  Available parameters:" + ls + ls
103                             + "    name"
104                             + ls + "      Expression: ${project.build.directory}/generated-sources/foobar"
105                             + ls + "      (no description available)"
106                             + ls,
107                     sb.toString());
108         } catch (Throwable e) {
109             fail(e.getMessage());
110         }
111     }
112 
113     @Test
114     public void testParsePluginInfoGAV() throws Throwable {
115         DescribeMojo mojo = new DescribeMojo();
116         writeDeclaredField(mojo, "groupId", "org.test", true);
117         writeDeclaredField(mojo, "artifactId", "test", true);
118         writeDeclaredField(mojo, "version", "1.0", true);
119 
120         PluginInfo pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo");
121 
122         assertEquals("org.test", pi.getGroupId());
123         assertEquals("test", pi.getArtifactId());
124         assertEquals("1.0", pi.getVersion());
125         assertNull(pi.getPrefix());
126     }
127 
128     @Test
129     public void testParsePluginInfoPluginPrefix() throws Throwable {
130         DescribeMojo mojo = new DescribeMojo();
131         writeDeclaredField(mojo, "plugin", "help", true);
132 
133         PluginInfo pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo");
134 
135         assertNull(pi.getGroupId());
136         assertNull(pi.getArtifactId());
137         assertNull(pi.getVersion());
138         assertEquals("help", pi.getPrefix());
139 
140         writeDeclaredField(mojo, "plugin", "help2:::", true);
141 
142         pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo");
143 
144         assertEquals("help2", pi.getPrefix());
145     }
146 
147     @Test
148     public void testParsePluginInfoPluginGA() throws Throwable {
149         DescribeMojo mojo = new DescribeMojo();
150         writeDeclaredField(mojo, "plugin", "org.test:test", true);
151 
152         PluginInfo pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo");
153 
154         assertEquals("org.test", pi.getGroupId());
155         assertEquals("test", pi.getArtifactId());
156         assertNull(pi.getVersion());
157         assertNull(pi.getPrefix());
158     }
159 
160     @Test
161     public void testParsePluginInfoPluginGAV() throws Throwable {
162         DescribeMojo mojo = new DescribeMojo();
163         writeDeclaredField(mojo, "plugin", "org.test:test:1.0", true);
164 
165         PluginInfo pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo");
166 
167         assertEquals("org.test", pi.getGroupId());
168         assertEquals("test", pi.getArtifactId());
169         assertEquals("1.0", pi.getVersion());
170         assertNull(pi.getPrefix());
171     }
172 
173     @Test
174     public void testParsePluginInfoPluginIncorrect() throws Throwable {
175         DescribeMojo mojo = new DescribeMojo();
176         writeDeclaredField(mojo, "plugin", "org.test:test:1.0:invalid", true);
177         try {
178             invokeMethod(mojo, "parsePluginLookupInfo");
179             fail();
180         } catch (Exception e) {
181             // expected
182         }
183     }
184 
185     @Test
186     public void testLookupPluginDescriptorPrefixWithVersion() throws Throwable {
187         DescribeMojo mojo = new DescribeMojo();
188 
189         PluginInfo pi = new PluginInfo();
190         pi.setPrefix("help");
191         pi.setVersion("1.0");
192 
193         Plugin plugin = new Plugin();
194         plugin.setGroupId("org.test");
195         plugin.setArtifactId("test");
196 
197         PluginDescriptor pd = new PluginDescriptor();
198 
199         MojoDescriptorCreator mojoDescriptorCreator = mock(MojoDescriptorCreator.class);
200         PluginVersionResolver pluginVersionResolver = mock(PluginVersionResolver.class);
201         MavenPluginManager pluginManager = mock(MavenPluginManager.class);
202         MavenSession session = mock(MavenSession.class);
203         when(session.getRepositorySession()).thenReturn(mock(RepositorySystemSession.class));
204         writeDeclaredField(mojo, "mojoDescriptorCreator", mojoDescriptorCreator, true);
205         writeDeclaredField(mojo, "pluginVersionResolver", pluginVersionResolver, true);
206         writeDeclaredField(mojo, "pluginManager", pluginManager, true);
207         writeField(mojo, "session", session, true);
208         MavenProject mavenProject = new MavenProject();
209         mavenProject.setPluginArtifactRepositories(Collections.emptyList());
210         writeField(mojo, "project", mavenProject, true);
211         when(mojoDescriptorCreator.findPluginForPrefix("help", session)).thenReturn(plugin);
212         when(pluginManager.getPluginDescriptor(any(Plugin.class), anyList(), any()))
213                 .thenReturn(pd);
214 
215         PluginDescriptor returned = (PluginDescriptor) invokeMethod(mojo, true, "lookupPluginDescriptor", pi);
216 
217         assertEquals(pd, returned);
218 
219         verify(mojoDescriptorCreator).findPluginForPrefix("help", session);
220         verify(pluginVersionResolver, never()).resolve(any(PluginVersionRequest.class));
221         ArgumentCaptor<Plugin> argument = ArgumentCaptor.forClass(Plugin.class);
222         verify(pluginManager).getPluginDescriptor(argument.capture(), anyList(), any());
223         Plugin capturedPlugin = argument.getValue();
224         assertEquals("org.test", capturedPlugin.getGroupId());
225         assertEquals("test", capturedPlugin.getArtifactId());
226         assertEquals("1.0", capturedPlugin.getVersion());
227     }
228 
229     @Test
230     public void testLookupPluginDescriptorPrefixWithoutVersion() throws Throwable {
231         DescribeMojo mojo = new DescribeMojo();
232 
233         PluginInfo pi = new PluginInfo();
234         pi.setPrefix("help");
235 
236         Plugin plugin = new Plugin();
237         plugin.setGroupId("org.test");
238         plugin.setArtifactId("test");
239 
240         PluginDescriptor pd = new PluginDescriptor();
241 
242         MojoDescriptorCreator mojoDescriptorCreator = mock(MojoDescriptorCreator.class);
243         PluginVersionResolver pluginVersionResolver = mock(PluginVersionResolver.class);
244         MavenPluginManager pluginManager = mock(MavenPluginManager.class);
245         PluginVersionResult versionResult = mock(PluginVersionResult.class);
246         MavenSession session = mock(MavenSession.class);
247         when(session.getRepositorySession()).thenReturn(mock(RepositorySystemSession.class));
248         writeDeclaredField(mojo, "mojoDescriptorCreator", mojoDescriptorCreator, true);
249         writeDeclaredField(mojo, "pluginVersionResolver", pluginVersionResolver, true);
250         writeDeclaredField(mojo, "pluginManager", pluginManager, true);
251         writeField(mojo, "session", session, true);
252         MavenProject mavenProject = new MavenProject();
253         mavenProject.setPluginArtifactRepositories(Collections.emptyList());
254         writeField(mojo, "project", mavenProject, true);
255         when(mojoDescriptorCreator.findPluginForPrefix("help", session)).thenReturn(plugin);
256         when(pluginVersionResolver.resolve(any(PluginVersionRequest.class))).thenReturn(versionResult);
257         when(versionResult.getVersion()).thenReturn("1.0");
258         when(pluginManager.getPluginDescriptor(any(Plugin.class), anyList(), any()))
259                 .thenReturn(pd);
260 
261         PluginDescriptor returned = (PluginDescriptor) invokeMethod(mojo, true, "lookupPluginDescriptor", pi);
262         assertEquals(pd, returned);
263 
264         verify(mojoDescriptorCreator).findPluginForPrefix("help", session);
265         ArgumentCaptor<PluginVersionRequest> versionArgument = ArgumentCaptor.forClass(PluginVersionRequest.class);
266         verify(pluginVersionResolver).resolve(versionArgument.capture());
267         assertEquals("org.test", versionArgument.getValue().getGroupId());
268         assertEquals("test", versionArgument.getValue().getArtifactId());
269         ArgumentCaptor<Plugin> argument = ArgumentCaptor.forClass(Plugin.class);
270         verify(pluginManager).getPluginDescriptor(argument.capture(), anyList(), any());
271         Plugin capturedPlugin = argument.getValue();
272         assertEquals("org.test", capturedPlugin.getGroupId());
273         assertEquals("test", capturedPlugin.getArtifactId());
274         assertEquals("1.0", capturedPlugin.getVersion());
275     }
276 
277     @Test
278     public void testLookupPluginDescriptorGAV() throws Throwable {
279         DescribeMojo mojo = new DescribeMojo();
280 
281         PluginInfo pi = new PluginInfo();
282         pi.setGroupId("org.test");
283         pi.setArtifactId("test");
284         pi.setVersion("1.0");
285 
286         PluginDescriptor pd = new PluginDescriptor();
287 
288         MojoDescriptorCreator mojoDescriptorCreator = mock(MojoDescriptorCreator.class);
289         PluginVersionResolver pluginVersionResolver = mock(PluginVersionResolver.class);
290         MavenPluginManager pluginManager = mock(MavenPluginManager.class);
291         MavenSession session = mock(MavenSession.class);
292         when(session.getRepositorySession()).thenReturn(mock(RepositorySystemSession.class));
293         writeDeclaredField(mojo, "mojoDescriptorCreator", mojoDescriptorCreator, true);
294         writeDeclaredField(mojo, "pluginVersionResolver", pluginVersionResolver, true);
295         writeDeclaredField(mojo, "pluginManager", pluginManager, true);
296         writeField(mojo, "session", session, true);
297         MavenProject mavenProject = new MavenProject();
298         mavenProject.setPluginArtifactRepositories(Collections.emptyList());
299         writeField(mojo, "project", mavenProject, true);
300         when(pluginManager.getPluginDescriptor(any(Plugin.class), anyList(), any()))
301                 .thenReturn(pd);
302 
303         PluginDescriptor returned = (PluginDescriptor) invokeMethod(mojo, true, "lookupPluginDescriptor", pi);
304 
305         assertEquals(pd, returned);
306 
307         verify(mojoDescriptorCreator, never()).findPluginForPrefix(any(String.class), any(MavenSession.class));
308         verify(pluginVersionResolver, never()).resolve(any(PluginVersionRequest.class));
309         ArgumentCaptor<Plugin> argument = ArgumentCaptor.forClass(Plugin.class);
310         verify(pluginManager).getPluginDescriptor(argument.capture(), anyList(), any());
311         Plugin capturedPlugin = argument.getValue();
312         assertEquals("org.test", capturedPlugin.getGroupId());
313         assertEquals("test", capturedPlugin.getArtifactId());
314         assertEquals("1.0", capturedPlugin.getVersion());
315     }
316 
317     @Test
318     public void testLookupPluginDescriptorGMissingA() {
319         DescribeMojo mojo = new DescribeMojo();
320         PluginInfo pi = new PluginInfo();
321         pi.setGroupId("org.test");
322         try {
323             invokeMethod(mojo, true, "lookupPluginDescriptor", pi);
324             fail();
325         } catch (InvocationTargetException e) {
326             assertTrue(e.getTargetException().getMessage().startsWith("You must specify either"));
327         } catch (NoSuchMethodException | IllegalAccessException e) {
328             fail();
329         }
330     }
331 
332     @Test
333     public void testLookupPluginDescriptorAMissingG() {
334         DescribeMojo mojo = new DescribeMojo();
335         PluginInfo pi = new PluginInfo();
336         pi.setArtifactId("test");
337         try {
338             invokeMethod(mojo, true, "lookupPluginDescriptor", pi);
339             fail();
340         } catch (InvocationTargetException e) {
341             assertTrue(e.getTargetException().getMessage().startsWith("You must specify either"));
342         } catch (Exception e) {
343             fail(e.getMessage());
344         }
345     }
346 }