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.tools.plugin.generator;
20  
21  import java.io.File;
22  import java.lang.reflect.Constructor;
23  import java.nio.file.Files;
24  import java.util.ArrayList;
25  import java.util.Collections;
26  import java.util.List;
27  
28  import org.apache.maven.model.Build;
29  import org.apache.maven.plugin.descriptor.DuplicateParameterException;
30  import org.apache.maven.plugin.descriptor.MojoDescriptor;
31  import org.apache.maven.plugin.descriptor.Parameter;
32  import org.apache.maven.plugin.descriptor.PluginDescriptor;
33  import org.apache.maven.plugin.logging.Log;
34  import org.apache.maven.plugin.logging.SystemStreamLog;
35  import org.apache.maven.project.MavenProject;
36  import org.apache.maven.tools.plugin.DefaultPluginToolsRequest;
37  import org.codehaus.plexus.component.repository.ComponentDependency;
38  import org.codehaus.plexus.util.FileUtils;
39  import org.junit.jupiter.api.Disabled;
40  import org.junit.jupiter.api.Test;
41  
42  /**
43   * @author <a href="mailto:jason@maven.org">Jason van Zyl </a>
44   */
45  public abstract class AbstractGeneratorTestCase {
46      protected Generator generator;
47  
48      protected String basedir = System.getProperty("basedir");
49  
50      @Test
51      public void generator() throws Exception {
52          setupGenerator();
53  
54          MojoDescriptor mojoDescriptor = new MojoDescriptor();
55          mojoDescriptor.setGoal("testGoal");
56          mojoDescriptor.setImplementation("org.apache.maven.tools.plugin.generator.TestMojo");
57          mojoDescriptor.setDependencyResolutionRequired("compile");
58          mojoDescriptor.setSince("mojoSince");
59  
60          List<Parameter> params = new ArrayList<>();
61  
62          Parameter param = new Parameter();
63          param.setExpression("${project.build.directory}");
64          param.setDefaultValue("</markup-must-be-escaped>");
65          param.setName("dir");
66          param.setRequired(true);
67          param.setType("java.lang.String");
68          param.setDescription("Test parameter description");
69          param.setAlias("some.alias");
70          param.setSince("paramDirSince");
71          params.add(param);
72  
73          param = new Parameter();
74          param.setName("withoutSince");
75          param.setType("java.lang.String");
76          params.add(param);
77  
78          mojoDescriptor.setParameters(params);
79  
80          PluginDescriptor pluginDescriptor = new PluginDescriptor();
81          mojoDescriptor.setPluginDescriptor(pluginDescriptor);
82  
83          pluginDescriptor.addMojo(mojoDescriptor);
84  
85          pluginDescriptor.setArtifactId("maven-unitTesting-plugin");
86          pluginDescriptor.setGoalPrefix("test");
87  
88          ComponentDependency dependency = new ComponentDependency();
89          dependency.setGroupId("testGroup");
90          dependency.setArtifactId("testArtifact");
91          dependency.setVersion("0.0.0");
92  
93          pluginDescriptor.setDependencies(Collections.singletonList(dependency));
94  
95          File destinationDirectory =
96                  Files.createTempDirectory("testGenerator-outDir").toFile();
97          destinationDirectory.mkdir();
98  
99          MavenProject mavenProject = new MavenProject();
100         mavenProject.setGroupId("foo");
101         mavenProject.setArtifactId("bar");
102         Build build = new Build();
103         build.setDirectory(basedir + "/target");
104         build.setOutputDirectory(basedir + "/target");
105         mavenProject.setBuild(build);
106         extendPluginDescriptor(pluginDescriptor);
107         generator.execute(destinationDirectory, new DefaultPluginToolsRequest(mavenProject, pluginDescriptor));
108 
109         validate(destinationDirectory, false);
110 
111         FileUtils.deleteDirectory(destinationDirectory);
112     }
113 
114     @Test
115     @Disabled
116     public void generatorV4() throws Exception {
117         setupGenerator();
118 
119         MojoDescriptor mojoDescriptor = new MojoDescriptor();
120         mojoDescriptor.setGoal("testGoal");
121         mojoDescriptor.setImplementation("org.apache.maven.tools.plugin.generator.TestMojo");
122         mojoDescriptor.setDependencyResolutionRequired("compile");
123         mojoDescriptor.setSince("mojoSince");
124 
125         List<Parameter> params = new ArrayList<>();
126 
127         Parameter param = new Parameter();
128         param.setExpression("${project.build.directory}");
129         param.setDefaultValue("</markup-must-be-escaped>");
130         param.setName("dir");
131         param.setRequired(true);
132         param.setType("java.lang.String");
133         param.setDescription("Test parameter description");
134         param.setAlias("some.alias");
135         param.setSince("paramDirSince");
136         params.add(param);
137 
138         param = new Parameter();
139         param.setName("withoutSince");
140         param.setType("java.lang.String");
141         params.add(param);
142 
143         mojoDescriptor.setParameters(params);
144 
145         PluginDescriptor pluginDescriptor = new PluginDescriptor();
146         mojoDescriptor.setPluginDescriptor(pluginDescriptor);
147 
148         pluginDescriptor.addMojo(mojoDescriptor);
149 
150         pluginDescriptor.setArtifactId("maven-unitTesting-plugin");
151         pluginDescriptor.setGoalPrefix("test");
152 
153         ComponentDependency dependency = new ComponentDependency();
154         dependency.setGroupId("testGroup");
155         dependency.setArtifactId("testArtifact");
156         dependency.setVersion("0.0.0");
157 
158         pluginDescriptor.setDependencies(Collections.singletonList(dependency));
159 
160         File destinationDirectory =
161                 Files.createTempDirectory("testGenerator-outDir").toFile();
162         destinationDirectory.mkdir();
163 
164         MavenProject mavenProject = new MavenProject();
165         mavenProject.setGroupId("foo");
166         mavenProject.setArtifactId("bar");
167         Build build = new Build();
168         build.setDirectory(basedir + "/target");
169         build.setOutputDirectory(basedir + "/target");
170         mavenProject.setBuild(build);
171         extendPluginDescriptor(pluginDescriptor);
172         DefaultPluginToolsRequest request = new DefaultPluginToolsRequest(mavenProject, pluginDescriptor);
173         pluginDescriptor.setRequiredMavenVersion("4.0.0");
174         generator.execute(destinationDirectory, request);
175 
176         validate(destinationDirectory, true);
177 
178         FileUtils.deleteDirectory(destinationDirectory);
179     }
180 
181     protected void extendPluginDescriptor(PluginDescriptor pluginDescriptor) throws DuplicateParameterException {
182         // may be overwritten
183     }
184 
185     // ----------------------------------------------------------------------
186     //
187     // ----------------------------------------------------------------------
188 
189     protected void setupGenerator() throws Exception {
190         String generatorClassName = getClass().getName();
191 
192         generatorClassName = generatorClassName.substring(0, generatorClassName.length() - 4);
193 
194         try {
195             Class<?> generatorClass =
196                     Thread.currentThread().getContextClassLoader().loadClass(generatorClassName);
197 
198             Log log = new SystemStreamLog();
199             try {
200                 Constructor<?> constructor = generatorClass.getConstructor(Log.class);
201                 generator = (Generator) constructor.newInstance(log);
202             } catch (NoSuchMethodException ignore) {
203                 generator = (Generator) generatorClass.newInstance();
204             }
205         } catch (Exception e) {
206             throw new Exception("Cannot find " + generatorClassName
207                     + "! Make sure your test case is named in the form ${generatorClassName}Test "
208                     + "or override the setupPlugin() method to instantiate the mojo yourself.");
209         }
210     }
211 
212     // ----------------------------------------------------------------------
213     //
214     // ----------------------------------------------------------------------
215 
216     protected void validate(File destinationDirectory, boolean isV4) throws Exception {
217         // empty
218     }
219 }