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.javadoc;
20  
21  import java.io.File;
22  import java.util.ArrayList;
23  import java.util.Enumeration;
24  import java.util.HashSet;
25  import java.util.List;
26  import java.util.Set;
27  import java.util.zip.ZipEntry;
28  import java.util.zip.ZipFile;
29  
30  import org.apache.maven.execution.MavenSession;
31  import org.apache.maven.model.Plugin;
32  import org.apache.maven.plugin.MojoExecution;
33  import org.apache.maven.plugin.logging.Log;
34  import org.apache.maven.plugin.testing.AbstractMojoTestCase;
35  import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
36  import org.apache.maven.project.MavenProject;
37  import org.codehaus.plexus.languages.java.version.JavaVersion;
38  import org.eclipse.aether.DefaultRepositorySystemSession;
39  import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
40  import org.eclipse.aether.repository.LocalRepository;
41  
42  import static org.assertj.core.api.Assertions.assertThat;
43  
44  /**
45   * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
46   */
47  public class JavadocJarTest extends AbstractMojoTestCase {
48  
49      private JavadocJar lookupMojo(File testPom) throws Exception {
50          JavadocJar mojo = (JavadocJar) lookupMojo("jar", testPom);
51  
52          MojoExecution mojoExec = new MojoExecution(new Plugin(), "javadoc", null);
53  
54          setVariableValueToObject(mojo, "mojo", mojoExec);
55  
56          MavenProject currentProject = new MavenProjectStub();
57          currentProject.setGroupId("GROUPID");
58          currentProject.setArtifactId("ARTIFACTID");
59  
60          MavenSession session = newMavenSession(currentProject);
61          ((DefaultRepositorySystemSession) session.getRepositorySession())
62                  .setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
63                          .newInstance(
64                                  session.getRepositorySession(), new LocalRepository(new File("target/local-repo"))));
65          setVariableValueToObject(mojo, "session", session);
66  
67          return mojo;
68      }
69  
70      /**
71       * Test when default configuration is provided
72       *
73       * @throws Exception if any
74       */
75      public void testDefaultConfig() throws Exception {
76          File testPom = new File(
77                  getBasedir(), "src/test/resources/unit/javadocjar-default/javadocjar-default-plugin-config.xml");
78          JavadocJar mojo = lookupMojo(testPom);
79          mojo.execute();
80  
81          // check if the javadoc jar file was generated
82          File generatedFile =
83                  new File(getBasedir(), "target/test/unit/javadocjar-default/target/javadocjar-default-javadoc.jar");
84          assertThat(generatedFile).exists();
85  
86          Set<String> set = new HashSet<>();
87  
88          // validate contents of jar file
89          try (ZipFile jar = new ZipFile(generatedFile)) {
90              for (Enumeration<? extends ZipEntry> entries = jar.entries(); entries.hasMoreElements(); ) {
91                  ZipEntry entry = entries.nextElement();
92                  set.add(entry.getName());
93              }
94          }
95  
96          assertTrue(set.contains("stylesheet.css"));
97          JavaVersion javadocVersion = (JavaVersion) getVariableValueFromObject(mojo, "javadocRuntimeVersion");
98          if (javadocVersion.isBefore("1.7")) {
99              assertTrue(set.contains("resources/inherit.gif"));
100         } else if (javadocVersion.isBefore("1.8")) {
101             assertTrue(set.contains("resources/background.gif") /* JDK7 */);
102         } else {
103             // JDK8 has no resources anymore
104             assertFalse(set.contains("resources"));
105         }
106 
107         assertTrue(set.contains("javadocjar/def/package-use.html"));
108         assertTrue(set.contains("javadocjar/def/package-tree.html"));
109         assertTrue(set.contains("javadocjar/def/package-summary.html"));
110         // package frame not generated anymore since Java 11
111         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore("11")) {
112             assertTrue(set.contains("javadocjar/def/package-frame.html"));
113         }
114         assertTrue(set.contains("javadocjar/def/class-use/AppSample.html"));
115         assertTrue(set.contains("index.html"));
116         assertTrue(set.contains("javadocjar/def/App.html"));
117         assertTrue(set.contains("javadocjar/def/AppSample.html"));
118         assertTrue(set.contains("javadocjar/def/class-use/App.html"));
119 
120         assertFalse(set.contains(AbstractJavadocMojo.ARGFILE_FILE_NAME));
121         assertFalse(set.contains(AbstractJavadocMojo.FILES_FILE_NAME));
122         assertFalse(set.contains(AbstractJavadocMojo.OPTIONS_FILE_NAME));
123         assertFalse(set.contains(AbstractJavadocMojo.PACKAGES_FILE_NAME));
124 
125         // check if the javadoc files were created
126         generatedFile = new File(
127                 getBasedir(), "target/test/unit/javadocjar-default/target/site/apidocs/javadocjar/def/App.html");
128         assertThat(generatedFile).exists();
129 
130         generatedFile = new File(
131                 getBasedir(), "target/test/unit/javadocjar-default/target/site/apidocs/javadocjar/def/AppSample.html");
132         assertThat(generatedFile).exists();
133     }
134 
135     /**
136      * Test when the specified destDir parameter has an invalid value
137      *
138      * @throws Exception if any
139      */
140     public void testInvalidDestdir() throws Exception {
141         File testPom = new File(
142                 getBasedir(),
143                 "src/test/resources/unit/javadocjar-invalid-destdir/javadocjar-invalid-destdir-plugin-config.xml");
144         JavadocJar mojo = lookupMojo(testPom);
145         mojo.execute();
146 
147         // check if the javadoc jar file was generated
148         File generatedFile = new File(
149                 getBasedir(),
150                 "target/test/unit/javadocjar-invalid-destdir/target/javadocjar-invalid-destdir-javadoc.jar");
151         assertThat(generatedFile).doesNotExist();
152     }
153 
154     public void testContinueIfFailOnErrorIsFalse() throws Exception {
155         File testPom = new File(
156                 getBasedir(),
157                 "src/test/resources/unit/javadocjar-failonerror/javadocjar-failonerror-plugin-config.xml");
158         JavadocJar mojo = lookupMojo(testPom);
159         mojo.execute();
160 
161         // check if the javadoc jar file was generated
162         File generatedFile = new File(
163                 getBasedir(), "target/test/unit/javadocjar-failonerror/target/javadocjar-failonerror-javadoc.jar");
164         assertThat(generatedFile).exists();
165     }
166 
167     public void testIncludeMavenDescriptorWhenExplicitlyConfigured() throws Exception {
168         File testPom = new File(
169                 getBasedir(), "src/test/resources/unit/javadocjar-archive-config/javadocjar-archive-config.xml");
170         JavadocJar mojo = lookupMojo(testPom);
171         mojo.execute();
172 
173         // check if the javadoc jar file was generated
174         File generatedFile = new File(
175                 getBasedir(),
176                 "target/test/unit/javadocjar-archive-config/target/javadocjar-archive-config-javadoc.jar");
177         assertThat(generatedFile).exists();
178 
179         // validate contents of jar file
180         ZipFile jar = new ZipFile(generatedFile);
181         Set<String> set = new HashSet<>();
182         for (Enumeration<? extends ZipEntry> entries = jar.entries(); entries.hasMoreElements(); ) {
183             ZipEntry entry = entries.nextElement();
184             set.add(entry.getName());
185         }
186         jar.close();
187 
188         assertThat(set)
189                 .contains(
190                         "META-INF/",
191                         "META-INF/maven/",
192                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/",
193                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/",
194                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/pom.xml",
195                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/pom.properties");
196     }
197 
198     public void testStale() throws Exception {
199         File testPom = new File(getBasedir(), "src/test/resources/unit/stale-test/stale-test-plugin-config.xml");
200         JavadocJar mojo = lookupMojo(testPom);
201         BufferingLog log = new BufferingLog();
202         mojo.setLog(log);
203 
204         Thread.sleep(500);
205 
206         new File(getBasedir(), "target/test/unit/stale-test/target/maven-javadoc-plugin-stale-data.txt").delete();
207         mojo.execute();
208         assertThat(log.getMessages()).contains("[INFO] No previous run data found, generating javadoc.");
209 
210         Thread.sleep(500);
211 
212         log.getMessages().clear();
213         mojo.execute();
214         assertThat(log.getMessages()).contains("[INFO] Skipping javadoc generation, everything is up to date.");
215     }
216 
217     private static class BufferingLog implements Log {
218         private final List<String> messages = new ArrayList<>();
219 
220         public List<String> getMessages() {
221             return messages;
222         }
223 
224         @Override
225         public boolean isDebugEnabled() {
226             return true;
227         }
228 
229         @Override
230         public void debug(CharSequence charSequence) {
231             debug(charSequence, null);
232         }
233 
234         @Override
235         public void debug(CharSequence charSequence, Throwable throwable) {
236             message("DEBUG", charSequence, throwable);
237         }
238 
239         @Override
240         public void debug(Throwable throwable) {
241             debug(null, throwable);
242         }
243 
244         @Override
245         public boolean isInfoEnabled() {
246             return true;
247         }
248 
249         @Override
250         public void info(CharSequence charSequence) {
251             info(charSequence, null);
252         }
253 
254         @Override
255         public void info(CharSequence charSequence, Throwable throwable) {
256             message("INFO", charSequence, throwable);
257         }
258 
259         @Override
260         public void info(Throwable throwable) {
261             info(null, throwable);
262         }
263 
264         @Override
265         public boolean isWarnEnabled() {
266             return true;
267         }
268 
269         @Override
270         public void warn(CharSequence charSequence) {
271             warn(charSequence, null);
272         }
273 
274         @Override
275         public void warn(CharSequence charSequence, Throwable throwable) {
276             message("WARN", charSequence, throwable);
277         }
278 
279         @Override
280         public void warn(Throwable throwable) {
281             warn(null, throwable);
282         }
283 
284         @Override
285         public boolean isErrorEnabled() {
286             return true;
287         }
288 
289         @Override
290         public void error(CharSequence charSequence) {
291             error(charSequence, null);
292         }
293 
294         @Override
295         public void error(CharSequence charSequence, Throwable throwable) {
296             message("ERROR", charSequence, throwable);
297         }
298 
299         @Override
300         public void error(Throwable throwable) {
301             error(null, throwable);
302         }
303 
304         private void message(String level, CharSequence message, Throwable throwable) {
305             messages.add("[" + level + "]" + (message != null ? " " + message : "")
306                     + (throwable != null ? " " + throwable : ""));
307         }
308     }
309 }