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  
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     public void testContinueIfFailOnErrorIsFalse() throws Exception {
139         File testPom = new File(
140                 getBasedir(),
141                 "src/test/resources/unit/javadocjar-failonerror/javadocjar-failonerror-plugin-config.xml");
142         JavadocJarMojo mojo = lookupMojo(testPom);
143         mojo.execute();
144 
145         // check if the javadoc jar file was generated
146         File generatedFile = new File(
147                 getBasedir(), "target/test/unit/javadocjar-failonerror/target/javadocjar-failonerror-javadoc.jar");
148         assertThat(generatedFile).exists();
149     }
150 
151     public void testIncludeMavenDescriptorWhenExplicitlyConfigured() throws Exception {
152         File testPom = new File(
153                 getBasedir(), "src/test/resources/unit/javadocjar-archive-config/javadocjar-archive-config.xml");
154         JavadocJarMojo mojo = lookupMojo(testPom);
155         mojo.execute();
156 
157         // check if the javadoc jar file was generated
158         File generatedFile = new File(
159                 getBasedir(),
160                 "target/test/unit/javadocjar-archive-config/target/javadocjar-archive-config-javadoc.jar");
161         assertThat(generatedFile).exists();
162 
163         // validate contents of jar file
164         ZipFile jar = new ZipFile(generatedFile);
165         Set<String> set = new HashSet<>();
166         for (Enumeration<? extends ZipEntry> entries = jar.entries(); entries.hasMoreElements(); ) {
167             ZipEntry entry = entries.nextElement();
168             set.add(entry.getName());
169         }
170         jar.close();
171 
172         assertThat(set)
173                 .contains(
174                         "META-INF/",
175                         "META-INF/maven/",
176                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/",
177                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/",
178                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/pom.xml",
179                         "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/pom.properties");
180     }
181 
182     public void testStale() throws Exception {
183         File testPom = new File(getBasedir(), "src/test/resources/unit/stale-test/stale-test-plugin-config.xml");
184         JavadocJarMojo mojo = lookupMojo(testPom);
185         BufferingLog log = new BufferingLog();
186         mojo.setLog(log);
187 
188         Thread.sleep(500);
189 
190         new File(getBasedir(), "target/test/unit/stale-test/target/maven-javadoc-plugin-stale-data.txt").delete();
191         mojo.execute();
192         assertThat(log.getMessages()).contains("[INFO] No previous run data found, generating javadoc.");
193 
194         Thread.sleep(500);
195 
196         log.getMessages().clear();
197         mojo.execute();
198         assertThat(log.getMessages()).contains("[INFO] Skipping javadoc generation, everything is up to date.");
199     }
200 
201     private static class BufferingLog implements Log {
202         private final List<String> messages = new ArrayList<>();
203 
204         public List<String> getMessages() {
205             return messages;
206         }
207 
208         @Override
209         public boolean isDebugEnabled() {
210             return true;
211         }
212 
213         @Override
214         public void debug(CharSequence charSequence) {
215             debug(charSequence, null);
216         }
217 
218         @Override
219         public void debug(CharSequence charSequence, Throwable throwable) {
220             message("DEBUG", charSequence, throwable);
221         }
222 
223         @Override
224         public void debug(Throwable throwable) {
225             debug(null, throwable);
226         }
227 
228         @Override
229         public boolean isInfoEnabled() {
230             return true;
231         }
232 
233         @Override
234         public void info(CharSequence charSequence) {
235             info(charSequence, null);
236         }
237 
238         @Override
239         public void info(CharSequence charSequence, Throwable throwable) {
240             message("INFO", charSequence, throwable);
241         }
242 
243         @Override
244         public void info(Throwable throwable) {
245             info(null, throwable);
246         }
247 
248         @Override
249         public boolean isWarnEnabled() {
250             return true;
251         }
252 
253         @Override
254         public void warn(CharSequence charSequence) {
255             warn(charSequence, null);
256         }
257 
258         @Override
259         public void warn(CharSequence charSequence, Throwable throwable) {
260             message("WARN", charSequence, throwable);
261         }
262 
263         @Override
264         public void warn(Throwable throwable) {
265             warn(null, throwable);
266         }
267 
268         @Override
269         public boolean isErrorEnabled() {
270             return true;
271         }
272 
273         @Override
274         public void error(CharSequence charSequence) {
275             error(charSequence, null);
276         }
277 
278         @Override
279         public void error(CharSequence charSequence, Throwable throwable) {
280             message("ERROR", charSequence, throwable);
281         }
282 
283         @Override
284         public void error(Throwable throwable) {
285             error(null, throwable);
286         }
287 
288         private void message(String level, CharSequence message, Throwable throwable) {
289             messages.add("[" + level + "]" + (message != null ? " " + message : "")
290                     + (throwable != null ? " " + throwable : ""));
291         }
292     }
293 }