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 JavadocJarMojoTest extends AbstractMojoTestCase {
48  
49      private JavadocJarMojo lookupMojo(File testPom) throws Exception {
50          JavadocJarMojo mojo = (JavadocJarMojo) 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          JavadocJarMojo 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          if (JavaVersion.JAVA_VERSION.isAtLeast("23")) {
99              assertTrue(set.contains("resource-files/stylesheet.css"));
100         } else {
101             assertTrue(set.contains("stylesheet.css"));
102         }
103         JavaVersion javadocVersion = (JavaVersion) getVariableValueFromObject(mojo, "javadocRuntimeVersion");
104         if (javadocVersion.isBefore("1.7")) {
105             assertTrue(set.contains("resources/inherit.gif"));
106         } else if (javadocVersion.isBefore("1.8")) {
107             assertTrue(set.contains("resources/background.gif") /* JDK7 */);
108         } else {
109             // JDK8 has no resources anymore
110             assertFalse(set.contains("resources"));
111         }
112 
113         assertTrue(set.contains("javadocjar/def/package-use.html"));
114         assertTrue(set.contains("javadocjar/def/package-tree.html"));
115         assertTrue(set.contains("javadocjar/def/package-summary.html"));
116         // package frame not generated anymore since Java 11
117         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore("11")) {
118             assertTrue(set.contains("javadocjar/def/package-frame.html"));
119         }
120         assertTrue(set.contains("javadocjar/def/class-use/AppSample.html"));
121         assertTrue(set.contains("index.html"));
122         assertTrue(set.contains("javadocjar/def/App.html"));
123         assertTrue(set.contains("javadocjar/def/AppSample.html"));
124         assertTrue(set.contains("javadocjar/def/class-use/App.html"));
125 
126         assertFalse(set.contains(AbstractJavadocMojo.ARGFILE_FILE_NAME));
127         assertFalse(set.contains(AbstractJavadocMojo.FILES_FILE_NAME));
128         assertFalse(set.contains(AbstractJavadocMojo.OPTIONS_FILE_NAME));
129         assertFalse(set.contains(AbstractJavadocMojo.PACKAGES_FILE_NAME));
130 
131         // check if the javadoc files were created
132         generatedFile = new File(
133                 getBasedir(), "target/test/unit/javadocjar-default/target/site/apidocs/javadocjar/def/App.html");
134         assertThat(generatedFile).exists();
135 
136         generatedFile = new File(
137                 getBasedir(), "target/test/unit/javadocjar-default/target/site/apidocs/javadocjar/def/AppSample.html");
138         assertThat(generatedFile).exists();
139     }
140 
141     public void testContinueIfFailOnErrorIsFalse() throws Exception {
142         File testPom = new File(
143                 getBasedir(),
144                 "src/test/resources/unit/javadocjar-failonerror/javadocjar-failonerror-plugin-config.xml");
145         JavadocJarMojo mojo = lookupMojo(testPom);
146         mojo.execute();
147 
148         // check if the javadoc jar file was generated
149         File generatedFile = new File(
150                 getBasedir(), "target/test/unit/javadocjar-failonerror/target/javadocjar-failonerror-javadoc.jar");
151         assertThat(generatedFile).exists();
152     }
153 
154     public void testIncludeMavenDescriptorWhenExplicitlyConfigured() throws Exception {
155         File testPom = new File(
156                 getBasedir(), "src/test/resources/unit/javadocjar-archive-config/javadocjar-archive-config.xml");
157         JavadocJarMojo mojo = lookupMojo(testPom);
158         mojo.execute();
159 
160         // check if the javadoc jar file was generated
161         File generatedFile = new File(
162                 getBasedir(),
163                 "target/test/unit/javadocjar-archive-config/target/javadocjar-archive-config-javadoc.jar");
164         assertThat(generatedFile).exists();
165 
166         // validate contents of jar file
167         ZipFile jar = new ZipFile(generatedFile);
168         Set<String> set = new HashSet<>();
169         for (Enumeration<? extends ZipEntry> entries = jar.entries(); entries.hasMoreElements(); ) {
170             ZipEntry entry = entries.nextElement();
171             set.add(entry.getName());
172         }
173         jar.close();
174 
175         assertThat(set)
176                 .contains(
177                         "META-INF/",
178                         "META-INF/maven/",
179                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/",
180                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/",
181                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/pom.xml",
182                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/pom.properties");
183     }
184 
185     public void testStale() throws Exception {
186         File testPom = new File(getBasedir(), "src/test/resources/unit/stale-test/stale-test-plugin-config.xml");
187         JavadocJarMojo mojo = lookupMojo(testPom);
188         BufferingLog log = new BufferingLog();
189         mojo.setLog(log);
190 
191         Thread.sleep(500);
192 
193         new File(getBasedir(), "target/test/unit/stale-test/target/maven-javadoc-plugin-stale-data.txt").delete();
194         mojo.execute();
195         assertThat(log.getMessages()).contains("[DEBUG] No previous run data found, generating javadoc.");
196 
197         Thread.sleep(500);
198 
199         log.getMessages().clear();
200         mojo.execute();
201         assertThat(log.getMessages()).contains("[DEBUG] Skipping javadoc generation, everything is up to date.");
202     }
203 
204     private static class BufferingLog implements Log {
205         private final List<String> messages = new ArrayList<>();
206 
207         public List<String> getMessages() {
208             return messages;
209         }
210 
211         @Override
212         public boolean isDebugEnabled() {
213             return true;
214         }
215 
216         @Override
217         public void debug(CharSequence charSequence) {
218             debug(charSequence, null);
219         }
220 
221         @Override
222         public void debug(CharSequence charSequence, Throwable throwable) {
223             message("DEBUG", charSequence, throwable);
224         }
225 
226         @Override
227         public void debug(Throwable throwable) {
228             debug(null, throwable);
229         }
230 
231         @Override
232         public boolean isInfoEnabled() {
233             return true;
234         }
235 
236         @Override
237         public void info(CharSequence charSequence) {
238             info(charSequence, null);
239         }
240 
241         @Override
242         public void info(CharSequence charSequence, Throwable throwable) {
243             message("INFO", charSequence, throwable);
244         }
245 
246         @Override
247         public void info(Throwable throwable) {
248             info(null, throwable);
249         }
250 
251         @Override
252         public boolean isWarnEnabled() {
253             return true;
254         }
255 
256         @Override
257         public void warn(CharSequence charSequence) {
258             warn(charSequence, null);
259         }
260 
261         @Override
262         public void warn(CharSequence charSequence, Throwable throwable) {
263             message("WARN", charSequence, throwable);
264         }
265 
266         @Override
267         public void warn(Throwable throwable) {
268             warn(null, throwable);
269         }
270 
271         @Override
272         public boolean isErrorEnabled() {
273             return true;
274         }
275 
276         @Override
277         public void error(CharSequence charSequence) {
278             error(charSequence, null);
279         }
280 
281         @Override
282         public void error(CharSequence charSequence, Throwable throwable) {
283             message("ERROR", charSequence, throwable);
284         }
285 
286         @Override
287         public void error(Throwable throwable) {
288             error(null, throwable);
289         }
290 
291         private void message(String level, CharSequence message, Throwable throwable) {
292             messages.add("[" + level + "]" + (message != null ? " " + message : "")
293                     + (throwable != null ? " " + throwable : ""));
294         }
295     }
296 }