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