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.io.IOException;
23  import java.net.HttpURLConnection;
24  import java.net.URL;
25  import java.nio.charset.Charset;
26  import java.nio.charset.StandardCharsets;
27  import java.nio.file.Files;
28  import java.nio.file.Path;
29  import java.nio.file.Paths;
30  import java.util.Collections;
31  import java.util.HashMap;
32  import java.util.List;
33  import java.util.Map;
34  import java.util.Objects;
35  
36  import org.apache.commons.lang3.StringUtils;
37  import org.apache.maven.execution.MavenSession;
38  import org.apache.maven.model.Plugin;
39  import org.apache.maven.plugin.LegacySupport;
40  import org.apache.maven.plugin.MojoExecution;
41  import org.apache.maven.plugin.MojoExecutionException;
42  import org.apache.maven.plugin.MojoFailureException;
43  import org.apache.maven.plugin.testing.AbstractMojoTestCase;
44  import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
45  import org.apache.maven.plugins.javadoc.ProxyServer.AuthAsyncProxyServlet;
46  import org.apache.maven.project.MavenProject;
47  import org.apache.maven.project.ProjectBuildingRequest;
48  import org.apache.maven.project.ProjectBuildingRequest.RepositoryMerging;
49  import org.apache.maven.settings.Proxy;
50  import org.apache.maven.settings.Settings;
51  import org.apache.maven.shared.utils.io.FileUtils;
52  import org.codehaus.plexus.languages.java.version.JavaVersion;
53  import org.eclipse.aether.DefaultRepositorySystemSession;
54  import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
55  import org.eclipse.aether.repository.LocalRepository;
56  import org.hamcrest.MatcherAssert;
57  import org.junit.AssumptionViolatedException;
58  import org.slf4j.Logger;
59  import org.slf4j.LoggerFactory;
60  
61  import static org.apache.commons.io.FileUtils.copyDirectory;
62  import static org.apache.commons.io.FileUtils.deleteDirectory;
63  import static org.assertj.core.api.Assertions.assertThat;
64  import static org.hamcrest.CoreMatchers.anyOf;
65  import static org.hamcrest.CoreMatchers.containsString;
66  import static org.hamcrest.CoreMatchers.is;
67  import static org.junit.Assume.assumeThat;
68  import static org.mockito.Mockito.mock;
69  import static org.mockito.Mockito.spy;
70  import static org.mockito.Mockito.when;
71  
72  /**
73   * Test {@link org.apache.maven.plugins.javadoc.JavadocReport} class.
74   *
75   * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
76   * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
77   */
78  public class JavadocReportTest extends AbstractMojoTestCase {
79  
80      private static final char LINE_SEPARATOR = ' ';
81  
82      public static final String OPTIONS_UMLAUT_ENCODING = "Options Umlaut Encoding ö ä ü ß";
83  
84      private Path unit;
85  
86      private Path tempDirectory;
87  
88      private File localRepo;
89  
90      private static final Logger LOGGER = LoggerFactory.getLogger(JavadocReportTest.class);
91  
92      @Override
93      protected void setUp() throws Exception {
94          super.setUp();
95  
96          tempDirectory = Files.createTempDirectory("JavadocReportTest");
97          localRepo = tempDirectory.resolve(Paths.get("target/local-repo/")).toFile();
98          unit = new File(getBasedir(), "src/test/resources/unit").toPath();
99  
100         createTestRepo();
101     }
102 
103     @Override
104     protected void tearDown() throws Exception {
105         try {
106             deleteDirectory(tempDirectory.toFile());
107         } catch (IOException ex) {
108             // CI servers can have problems deleting files.
109             // It will get cleared out eventually, and since
110             // temporary directories have unique names,
111             // it shouldn't affect subsequent tests.
112         }
113 
114         super.tearDown();
115     }
116 
117     private JavadocReport lookupMojo(Path testPom) throws Exception {
118         JavadocReport mojo = (JavadocReport) lookupMojo("javadoc", testPom.toFile());
119 
120         Plugin p = new Plugin();
121         p.setGroupId("org.apache.maven.plugins");
122         p.setArtifactId("maven-javadoc-plugin");
123         MojoExecution mojoExecution = new MojoExecution(p, "javadoc", null);
124 
125         setVariableValueToObject(mojo, "mojoExecution", mojoExecution);
126 
127         MavenProject currentProject = new MavenProjectStub();
128         currentProject.setGroupId("GROUPID");
129         currentProject.setArtifactId("ARTIFACTID");
130 
131         List<MavenProject> reactorProjects =
132                 mojo.getReactorProjects() != null ? mojo.getReactorProjects() : Collections.emptyList();
133         MavenSession session = newMavenSession(currentProject);
134         setVariableValueToObject(mojo, "session", session);
135         setVariableValueToObject(mojo, "repoSession", session.getRepositorySession());
136         setVariableValueToObject(mojo, "reactorProjects", reactorProjects);
137         return mojo;
138     }
139 
140     /**
141      * Create test repository in target directory.
142      *
143      * @throws IOException if any
144      */
145     private void createTestRepo() throws IOException {
146         assertTrue(localRepo.mkdirs());
147 
148         // ----------------------------------------------------------------------
149         // UMLGraph
150         // ----------------------------------------------------------------------
151 
152         Path sourceDir = unit.resolve("doclet-test/artifact-doclet");
153         assertThat(sourceDir).exists();
154         copyDirectory(sourceDir.toFile(), localRepo);
155 
156         // ----------------------------------------------------------------------
157         // UMLGraph-bis
158         // ----------------------------------------------------------------------
159 
160         sourceDir = unit.resolve("doclet-path-test/artifact-doclet");
161         assertThat(sourceDir).exists();
162         copyDirectory(sourceDir.toFile(), localRepo);
163 
164         // ----------------------------------------------------------------------
165         // commons-attributes-compiler
166         // https://www.tullmann.org/pat/taglets/
167         // ----------------------------------------------------------------------
168 
169         sourceDir = unit.resolve("taglet-test/artifact-taglet");
170         assertThat(sourceDir).exists();
171         copyDirectory(sourceDir.toFile(), localRepo);
172 
173         // ----------------------------------------------------------------------
174         // stylesheetfile-test
175         // ----------------------------------------------------------------------
176 
177         sourceDir = unit.resolve("stylesheetfile-test/artifact-stylesheetfile");
178         assertThat(sourceDir).exists();
179         copyDirectory(sourceDir.toFile(), localRepo);
180 
181         // ----------------------------------------------------------------------
182         // helpfile-test
183         // ----------------------------------------------------------------------
184 
185         sourceDir = unit.resolve("helpfile-test/artifact-helpfile");
186         assertThat(sourceDir).exists();
187         copyDirectory(sourceDir.toFile(), localRepo);
188 
189         // Remove SCM files
190         List<String> files = FileUtils.getFileAndDirectoryNames(
191                 localRepo, FileUtils.getDefaultExcludesAsString(), null, true, true, true, true);
192         for (String filename : files) {
193             File file = new File(filename);
194 
195             if (file.isDirectory()) {
196                 deleteDirectory(file);
197             } else {
198                 file.delete();
199             }
200         }
201     }
202 
203     /**
204      * Convenience method that reads the contents of the specified file object into a string with a
205      * <code>space</code> as line separator.
206      *
207      * @see #LINE_SEPARATOR
208      * @param file the file to be read
209      * @return a String object that contains the contents of the file
210      * @throws IOException if any
211      */
212     private static String readFile(Path file) throws IOException {
213         return readFile(file, StandardCharsets.UTF_8);
214     }
215 
216     /**
217      * Convenience method that reads the contents of the specified file object into a string with a
218      * <code>space</code> as line separator.
219      *
220      * @see #LINE_SEPARATOR
221      * @param file the file to be read
222      * @param cs charset to use
223      * @return a String object that contains the contents of the file
224      * @throws IOException if any
225      */
226     private static String readFile(Path file, Charset cs) throws IOException {
227         StringBuilder str = new StringBuilder((int) Files.size(file));
228 
229         for (String strTmp : Files.readAllLines(file, cs)) {
230             str.append(LINE_SEPARATOR);
231             str.append(strTmp);
232         }
233 
234         return str.toString();
235     }
236 
237     /**
238      * Test when default configuration is provided for the plugin
239      *
240      * @throws Exception if any
241      */
242     public void testDefaultConfiguration() throws Exception {
243         Path testPom = unit.resolve("default-configuration/default-configuration-plugin-config.xml");
244         JavadocReport mojo = lookupMojo(testPom);
245         mojo.execute();
246 
247         // package level generated javadoc files
248         Path apidocs = new File(getBasedir(), "target/test/unit/default-configuration/target/site/apidocs").toPath();
249 
250         String appHtml = "def/configuration/App.html";
251         Path generatedFile = apidocs.resolve(appHtml);
252         assertThat(generatedFile).exists();
253 
254         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore("16")) {
255             String url = Objects.requireNonNull(mojo.getDefaultJavadocApiLink()).getUrl();
256             HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
257             connection.setRequestMethod("HEAD");
258             try {
259                 // only test when URL can be reached
260                 if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
261                     try {
262                         assumeThat(connection.getURL().toString(), is(url));
263 
264                         // https://bugs.openjdk.java.net/browse/JDK-8216497
265                         MatcherAssert.assertThat(
266                                 url + " available, but " + appHtml + " is missing link to java.lang.Object",
267                                 new String(Files.readAllBytes(generatedFile), StandardCharsets.UTF_8),
268                                 anyOf(
269                                         containsString("/docs/api/java/lang/Object.html"),
270                                         containsString("/docs/api/java.base/java/lang/Object.html")));
271                     } catch (AssumptionViolatedException e) {
272                         LOGGER.warn("ignoring defaultAPI check: {}", e.getMessage());
273                     }
274                 }
275             } catch (Exception e) {
276                 LOGGER.error("error connecting to javadoc URL: {}", url);
277                 throw e;
278             }
279         } else {
280             MatcherAssert.assertThat(
281                     new String(Files.readAllBytes(generatedFile), StandardCharsets.UTF_8),
282                     containsString("/docs/api/java.base/java/lang/Object.html"));
283         }
284 
285         assertThat(apidocs.resolve("def/configuration/AppSample.html")).exists();
286         assertThat(apidocs.resolve("def/configuration/package-summary.html")).exists();
287         assertThat(apidocs.resolve("def/configuration/package-tree.html")).exists();
288         assertThat(apidocs.resolve("def/configuration/package-use.html")).exists();
289 
290         // package-frame and allclasses-(no)frame not generated anymore since Java 11
291         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore("11")) {
292             assertThat(apidocs.resolve("def/configuration/package-frame.html")).exists();
293             assertThat(apidocs.resolve("allclasses-frame.html"))
294                     .exists()
295                     .content()
296                     .containsOnlyOnce("def/configuration/App.html")
297                     .containsOnlyOnce("def/configuration/AppSample.html");
298             assertThat(apidocs.resolve("allclasses-noframe.html"))
299                     .exists()
300                     .content()
301                     .containsOnlyOnce("def/configuration/App.html")
302                     .containsOnlyOnce("def/configuration/AppSample.html");
303         }
304 
305         // class level generated javadoc files
306         assertThat(apidocs.resolve("def/configuration/class-use/App.html")).exists();
307         assertThat(apidocs.resolve("def/configuration/class-use/AppSample.html"))
308                 .exists();
309 
310         // project level generated javadoc files
311         assertThat(apidocs.resolve("constant-values.html")).exists();
312         assertThat(apidocs.resolve("deprecated-list.html")).exists();
313         assertThat(apidocs.resolve("help-doc.html")).exists();
314         assertThat(apidocs.resolve("index-all.html")).exists();
315         assertThat(apidocs.resolve("index.html")).exists();
316         assertThat(apidocs.resolve("overview-tree.html")).exists();
317         assertThat(apidocs.resolve("stylesheet.css")).exists();
318 
319         if (JavaVersion.JAVA_VERSION.isAtLeast("10")) {
320             assertThat(apidocs.resolve("element-list")).exists();
321         } else {
322             assertThat(apidocs.resolve("package-list")).exists();
323         }
324     }
325 
326     /**
327      * Method for testing the subpackages and excludePackageNames parameter
328      *
329      * @throws Exception if any
330      */
331     public void testSubpackages() throws Exception {
332         Path testPom = unit.resolve("subpackages-test/subpackages-test-plugin-config.xml");
333         JavadocReport mojo = lookupMojo(testPom);
334         mojo.execute();
335 
336         Path apidocs = new File(getBasedir(), "target/test/unit/subpackages-test/target/site/apidocs").toPath();
337 
338         // check the excluded packages
339         assertThat(apidocs.resolve("subpackages/test/excluded")).doesNotExist();
340         assertThat(apidocs.resolve("subpackages/test/included/exclude")).doesNotExist();
341 
342         // check if the classes in the specified subpackages were included
343         assertThat(apidocs.resolve("subpackages/test/App.html")).exists();
344         assertThat(apidocs.resolve("subpackages/test/AppSample.html")).exists();
345         assertThat(apidocs.resolve("subpackages/test/included/IncludedApp.html"))
346                 .exists();
347         assertThat(apidocs.resolve("subpackages/test/included/IncludedAppSample.html"))
348                 .exists();
349     }
350 
351     public void testIncludesExcludes() throws Exception {
352         Path testPom = unit.resolve("file-include-exclude-test/file-include-exclude-plugin-config.xml");
353         JavadocReport mojo = lookupMojo(testPom);
354         mojo.execute();
355 
356         Path apidocs =
357                 new File(getBasedir(), "target/test/unit/file-include-exclude-test/target/site/apidocs").toPath();
358 
359         // check if the classes in the specified subpackages were included
360         assertThat(apidocs.resolve("subpackages/test/App.html")).exists();
361         assertThat(apidocs.resolve("subpackages/test/AppSample.html")).exists();
362         assertThat(apidocs.resolve("subpackages/test/included/IncludedApp.html"))
363                 .exists();
364         assertThat(apidocs.resolve("subpackages/test/included/IncludedAppSample.html"))
365                 .exists();
366         assertThat(apidocs.resolve("subpackages/test/PariahApp.html")).doesNotExist();
367     }
368 
369     /**
370      * Test the recursion and exclusion of the doc-files subdirectories.
371      *
372      * @throws Exception if any
373      */
374     public void testDocfiles() throws Exception {
375         // Should be an assumption, but not supported by TestCase
376         // Seems like a bug in Javadoc 9 and above
377         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isAtLeast("9")) {
378             return;
379         }
380 
381         Path testPom = unit.resolve("docfiles-test/docfiles-test-plugin-config.xml");
382         JavadocReport mojo = lookupMojo(testPom);
383         mojo.execute();
384 
385         Path apidocs = new File(getBasedir(), "target/test/unit/docfiles-test/target/site/apidocs/").toPath();
386 
387         // check if the doc-files subdirectories were copied
388         assertThat(apidocs.resolve("docfiles/test/doc-files")).exists();
389         assertThat(apidocs.resolve("docfiles/test/doc-files/included-dir1/sample-included1.gif"))
390                 .exists();
391         assertThat(apidocs.resolve("docfiles/test/doc-files/included-dir2/sample-included2.gif"))
392                 .exists();
393         assertThat(apidocs.resolve("docfiles/test/doc-files/excluded-dir1")).doesNotExist();
394         assertThat(apidocs.resolve("docfiles/test/doc-files/excluded-dir2")).doesNotExist();
395 
396         testPom = unit.resolve("docfiles-with-java-test/docfiles-with-java-test-plugin-config.xml");
397         mojo = lookupMojo(testPom);
398         mojo.execute();
399     }
400 
401     /**
402      * Test javadoc plugin using custom configuration. noindex, notree and nodeprecated parameters
403      * were set to true.
404      *
405      * @throws Exception if any
406      */
407     public void testCustomConfiguration() throws Exception {
408         Path testPom = unit.resolve("custom-configuration/custom-configuration-plugin-config.xml");
409         JavadocReport mojo = lookupMojo(testPom);
410         mojo.execute();
411 
412         Path apidocs = new File(getBasedir(), "target/test/unit/custom-configuration/target/site/apidocs").toPath();
413 
414         // check if there is a tree page generated (notree == true)
415         assertThat(apidocs.resolve("overview-tree.html")).doesNotExist();
416         assertThat(apidocs.resolve("custom/configuration/package-tree.html")).doesNotExist();
417 
418         // check if the main index page was generated (noindex == true)
419         assertThat(apidocs.resolve("index-all.html")).doesNotExist();
420 
421         // check if the deprecated list and the deprecated api were generated (nodeprecated == true)
422         // @todo Fix: the class-use of the deprecated api is still created eventhough the deprecated api of that class
423         // is no longer generated
424         assertThat(apidocs.resolve("deprecated-list.html")).doesNotExist();
425         assertThat(apidocs.resolve("custom/configuration/App.html")).doesNotExist();
426 
427         // read the contents of the html files based on some of the parameter values
428         // author == false
429         String str = readFile(apidocs.resolve("custom/configuration/AppSample.html"));
430         assertFalse(str.toLowerCase().contains("author"));
431 
432         // bottom
433         assertTrue(str.toUpperCase().contains("SAMPLE BOTTOM CONTENT"));
434 
435         // offlineLinks
436         if (JavaVersion.JAVA_VERSION.isBefore("11.0.2")) {
437             assertThat(str)
438                     .containsIgnoringCase("href=\"http://java.sun.com/j2se/1.4.2/docs/api/java/lang/string.html");
439         } else {
440             assertTrue(str.toLowerCase()
441                     .contains("href=\"http://java.sun.com/j2se/1.4.2/docs/api/java.base/java/lang/string.html"));
442         }
443 
444         // header
445         assertTrue(str.toUpperCase().contains("MAVEN JAVADOC PLUGIN TEST"));
446 
447         // footer
448         if (JavaVersion.JAVA_VERSION.isBefore("16-ea")
449                 && !System.getProperty("java.vm.name").contains("OpenJ9")) {
450             assertTrue(str.toUpperCase().contains("MAVEN JAVADOC PLUGIN TEST FOOTER"));
451         }
452 
453         // nohelp == true
454         assertFalse(str.toUpperCase().contains("/HELP-DOC.HTML"));
455 
456         // check the wildcard (*) package exclusions -- excludePackageNames parameter
457         assertThat(apidocs.resolve("custom/configuration/exclude1/Exclude1App.html"))
458                 .exists();
459         assertThat(apidocs.resolve("custom/configuration/exclude1/subexclude/SubexcludeApp.html"))
460                 .doesNotExist();
461         assertThat(apidocs.resolve("custom/configuration/exclude2/Exclude2App.html"))
462                 .doesNotExist();
463 
464         assertThat(apidocs.resolve("options")).isRegularFile();
465 
466         String contentOptions = new String(Files.readAllBytes(apidocs.resolve("options")), StandardCharsets.UTF_8);
467 
468         assertNotNull(contentOptions);
469         assertThat(contentOptions).contains("-link").contains("http://java.sun.com/j2se/");
470     }
471 
472     /**
473      * Method to test the doclet artifact configuration
474      *
475      * @throws Exception if any
476      */
477     public void testDoclets() throws Exception {
478         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isAtLeast("13")) {
479             // As of JDK 13, the com.sun.javadoc API is no longer supported.
480             return;
481         }
482 
483         // ----------------------------------------------------------------------
484         // doclet-test: check if the file generated by UmlGraph exists and if
485         // doclet path contains the UmlGraph artifact
486         // ----------------------------------------------------------------------
487 
488         Path testPom = unit.resolve("doclet-test/doclet-test-plugin-config.xml");
489         JavadocReport mojo = lookupMojo(testPom);
490 
491         MavenSession session = spy(newMavenSession(mojo.project));
492         ProjectBuildingRequest buildingRequest = mock(ProjectBuildingRequest.class);
493         when(buildingRequest.getRemoteRepositories()).thenReturn(mojo.project.getRemoteArtifactRepositories());
494         when(session.getProjectBuildingRequest()).thenReturn(buildingRequest);
495         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
496         repositorySession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
497                 .newInstance(repositorySession, new LocalRepository(localRepo)));
498         when(buildingRequest.getRepositorySession()).thenReturn(repositorySession);
499         when(session.getRepositorySession()).thenReturn(repositorySession);
500         LegacySupport legacySupport = lookup(LegacySupport.class);
501         legacySupport.setSession(session);
502 
503         setVariableValueToObject(mojo, "session", session);
504         setVariableValueToObject(mojo, "repoSession", repositorySession);
505         mojo.execute();
506 
507         Path generatedFile =
508                 new File(getBasedir(), "target/test/unit/doclet-test/target/site/apidocs/graph.dot").toPath();
509         assertThat(generatedFile).exists();
510 
511         Path optionsFile = new File(mojo.getOutputDirectory(), "options").toPath();
512         assertThat(optionsFile).exists();
513         String options = readFile(optionsFile);
514         assertThat(options).contains("/target/local-repo/umlgraph/UMLGraph/2.1/UMLGraph-2.1.jar");
515 
516         // ----------------------------------------------------------------------
517         // doclet-path: check if the file generated by UmlGraph exists and if
518         // doclet path contains the twice UmlGraph artifacts
519         // ----------------------------------------------------------------------
520 
521         testPom = unit.resolve("doclet-path-test/doclet-path-test-plugin-config.xml");
522         mojo = lookupMojo(testPom);
523         setVariableValueToObject(mojo, "session", session);
524         setVariableValueToObject(mojo, "repoSession", repositorySession);
525         mojo.execute();
526 
527         generatedFile = new File(getBasedir(), "target/test/unit/doclet-test/target/site/apidocs/graph.dot").toPath();
528         assertThat(generatedFile).exists();
529 
530         optionsFile = new File(mojo.getOutputDirectory(), "options").toPath();
531         assertThat(optionsFile).exists();
532         options = readFile(optionsFile);
533         assertThat(options)
534                 .contains("/target/local-repo/umlgraph/UMLGraph/2.1/UMLGraph-2.1.jar")
535                 .contains("/target/local-repo/umlgraph/UMLGraph-bis/2.1/UMLGraph-bis-2.1.jar");
536     }
537 
538     /**
539      * Method to test when the path to the project sources has an apostrophe (')
540      *
541      * @throws Exception if any
542      */
543     public void testQuotedPath() throws Exception {
544         Path testPom = unit.resolve("quotedpath'test/quotedpath-test-plugin-config.xml");
545         JavadocReport mojo = lookupMojo(testPom);
546         mojo.execute();
547 
548         Path apidocs = new File(getBasedir(), "target/test/unit/quotedpath'test/target/site/apidocs").toPath();
549 
550         // package level generated javadoc files
551         assertThat(apidocs.resolve("quotedpath/test/App.html")).exists();
552         assertThat(apidocs.resolve("quotedpath/test/AppSample.html")).exists();
553 
554         // project level generated javadoc files
555         assertThat(apidocs.resolve("index-all.html")).exists();
556         assertThat(apidocs.resolve("index.html")).exists();
557         assertThat(apidocs.resolve("overview-tree.html")).exists();
558         assertThat(apidocs.resolve("stylesheet.css")).exists();
559 
560         if (JavaVersion.JAVA_VERSION.isBefore("10")) {
561             assertThat(apidocs.resolve("package-list")).exists();
562         } else {
563             assertThat(apidocs.resolve("element-list")).exists();
564         }
565     }
566 
567     /**
568      * Method to test when the options file has umlauts.
569      *
570      * @throws Exception if any
571      */
572     public void testOptionsUmlautEncoding() throws Exception {
573         Path testPom = unit.resolve("optionsumlautencoding-test/optionsumlautencoding-test-plugin-config.xml");
574         JavadocReport mojo = lookupMojo(testPom);
575         mojo.execute();
576 
577         Path optionsFile = new File(mojo.getOutputDirectory(), "options").toPath();
578         assertThat(optionsFile).exists();
579 
580         // check for a part of the window title
581         String content;
582         String expected;
583         if (JavaVersion.JAVA_VERSION.isAtLeast("9") && JavaVersion.JAVA_VERSION.isBefore("12")) {
584             content = readFile(optionsFile, StandardCharsets.UTF_8);
585             expected = OPTIONS_UMLAUT_ENCODING;
586         } else {
587             content = readFile(optionsFile, Charset.defaultCharset());
588             expected = new String(OPTIONS_UMLAUT_ENCODING.getBytes(Charset.defaultCharset()));
589         }
590 
591         assertThat(content).contains(expected);
592 
593         Path apidocs =
594                 new File(getBasedir(), "target/test/unit/optionsumlautencoding-test/target/site/apidocs").toPath();
595 
596         // package level generated javadoc files
597         assertThat(apidocs.resolve("optionsumlautencoding/test/App.html")).exists();
598         assertThat(apidocs.resolve("optionsumlautencoding/test/AppSample.html")).exists();
599 
600         // project level generated javadoc files
601         assertThat(apidocs.resolve("index-all.html")).exists();
602         assertThat(apidocs.resolve("index.html")).exists();
603         assertThat(apidocs.resolve("overview-tree.html")).exists();
604         assertThat(apidocs.resolve("stylesheet.css")).exists();
605 
606         if (JavaVersion.JAVA_VERSION.isBefore("10")) {
607             assertThat(apidocs.resolve("package-list")).exists();
608         } else {
609             assertThat(apidocs.resolve("element-list")).exists();
610         }
611     }
612 
613     /**
614      * Method to test the taglet artifact configuration
615      *
616      * @throws Exception if any
617      */
618     public void testTaglets() throws Exception {
619         // ----------------------------------------------------------------------
620         // taglet-test: check if a taglet is used
621         // ----------------------------------------------------------------------
622 
623         // Should be an assumption, but not supported by TestCase
624         // com.sun.tools.doclets.Taglet not supported by Java9 anymore
625         // Should be refactored with jdk.javadoc.doclet.Taglet
626         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isAtLeast("10")) {
627             return;
628         }
629 
630         Path testPom = unit.resolve("taglet-test/taglet-test-plugin-config.xml");
631         JavadocReport mojo = lookupMojo(testPom);
632 
633         MavenSession session = spy(newMavenSession(mojo.project));
634         ProjectBuildingRequest buildingRequest = mock(ProjectBuildingRequest.class);
635         when(buildingRequest.getRemoteRepositories()).thenReturn(mojo.project.getRemoteArtifactRepositories());
636         when(session.getProjectBuildingRequest()).thenReturn(buildingRequest);
637         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
638         repositorySession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
639                 .newInstance(repositorySession, new LocalRepository(localRepo)));
640         when(buildingRequest.getRepositorySession()).thenReturn(repositorySession);
641         when(session.getRepositorySession()).thenReturn(repositorySession);
642         LegacySupport legacySupport = lookup(LegacySupport.class);
643         legacySupport.setSession(session);
644 
645         setVariableValueToObject(mojo, "session", session);
646         setVariableValueToObject(mojo, "repoSession", repositorySession);
647 
648         mojo.execute();
649 
650         Path apidocs = new File(getBasedir(), "target/test/unit/taglet-test/target/site/apidocs").toPath();
651 
652         assertThat(apidocs.resolve("index.html")).exists();
653 
654         Path appFile = apidocs.resolve("taglet/test/App.html");
655         assertThat(appFile).exists();
656         String appString = readFile(appFile);
657         assertThat(appString).contains("<b>To Do:</b>");
658     }
659 
660     /**
661      * Method to test the jdk5 javadoc
662      *
663      * @throws Exception if any
664      */
665     public void testJdk5() throws Exception {
666         // Should be an assumption, but not supported by TestCase
667         // Java 5 not supported by Java9 anymore
668         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isAtLeast("9")) {
669             return;
670         }
671 
672         Path testPom = unit.resolve("jdk5-test/jdk5-test-plugin-config.xml");
673         JavadocReport mojo = lookupMojo(testPom);
674         mojo.execute();
675 
676         Path apidocs = new File(getBasedir(), "target/test/unit/jdk5-test/target/site/apidocs").toPath();
677 
678         assertThat(apidocs.resolve("index.html")).exists();
679 
680         Path overviewSummary = apidocs.resolve("overview-summary.html");
681         assertThat(overviewSummary).exists();
682         String content = readFile(overviewSummary);
683         assertThat(content).contains("<b>Test the package-info</b>");
684 
685         Path packageSummary = apidocs.resolve("jdk5/test/package-summary.html");
686         assertThat(packageSummary).exists();
687         content = readFile(packageSummary);
688         assertThat(content).contains("<b>Test the package-info</b>");
689     }
690 
691     /**
692      * Test to find the javadoc executable when <code>java.home</code> is not in the JDK_HOME. In this case, try to
693      * use the <code>JAVA_HOME</code> environment variable.
694      *
695      * @throws Exception if any
696      */
697     public void testToFindJavadoc() throws Exception {
698         String oldJreHome = System.getProperty("java.home");
699         System.setProperty("java.home", "foo/bar");
700 
701         Path testPom = unit.resolve("javaHome-test/javaHome-test-plugin-config.xml");
702         JavadocReport mojo = lookupMojo(testPom);
703         mojo.execute();
704 
705         System.setProperty("java.home", oldJreHome);
706     }
707 
708     /**
709      * Test the javadoc resources.
710      *
711      * @throws Exception if any
712      */
713     public void testJavadocResources() throws Exception {
714         Path testPom = unit.resolve("resources-test/resources-test-plugin-config.xml");
715         JavadocReport mojo = lookupMojo(testPom);
716         mojo.execute();
717 
718         Path apidocs = new File(getBasedir(), "target/test/unit/resources-test/target/site/apidocs/").toPath();
719 
720         Path app = apidocs.resolve("resources/test/App.html");
721         assertThat(app).exists();
722         String content = readFile(app);
723         assertThat(content).contains("<img src=\"doc-files/maven-feather.png\" alt=\"Maven\">");
724         assertThat(apidocs.resolve("resources/test/doc-files/maven-feather.png"))
725                 .exists();
726 
727         Path app2 = apidocs.resolve("resources/test2/App2.html");
728         assertThat(app2).exists();
729         content = readFile(app2);
730         assertThat(content).contains("<img src=\"doc-files/maven-feather.png\" alt=\"Maven\">");
731         assertThat(apidocs.resolve("resources/test2/doc-files/maven-feather.png"))
732                 .doesNotExist();
733 
734         // with excludes
735         testPom = unit.resolve("resources-with-excludes-test/resources-with-excludes-test-plugin-config.xml");
736         mojo = lookupMojo(testPom);
737         mojo.execute();
738 
739         apidocs = new File(getBasedir(), "target/test/unit/resources-with-excludes-test/target/site/apidocs").toPath();
740 
741         app = apidocs.resolve("resources/test/App.html");
742         assertThat(app).exists();
743         content = readFile(app);
744         assertThat(content).contains("<img src=\"doc-files/maven-feather.png\" alt=\"Maven\">");
745 
746         JavaVersion javadocVersion = (JavaVersion) getVariableValueFromObject(mojo, "javadocRuntimeVersion");
747         if (javadocVersion.isAtLeast("1.8") /* && javadocVersion.isBefore( "14" ) */) {
748             // https://bugs.openjdk.java.net/browse/JDK-8032205
749             assertThat(apidocs.resolve("resources/test/doc-files/maven-feather.png"))
750                     .as("Javadoc runtime version: " + javadocVersion
751                             + "\nThis bug appeared in JDK8 and was planned to be fixed in JDK9, see JDK-8032205")
752                     .exists();
753         } else {
754             assertThat(apidocs.resolve("resources/test/doc-files/maven-feather.png"))
755                     .doesNotExist();
756         }
757         assertThat(apidocs.resolve("resources/test2/doc-files/maven-feather.png"))
758                 .exists();
759 
760         app2 = apidocs.resolve("resources/test2/App2.html");
761         assertThat(app2).exists();
762         content = readFile(app2);
763         assertThat(content).contains("<img src=\"doc-files/maven-feather.png\" alt=\"Maven\">");
764         assertThat(apidocs.resolve("resources/test2/doc-files/maven-feather.png"))
765                 .exists();
766     }
767 
768     /**
769      * Test the javadoc for a POM project.
770      *
771      * @throws Exception if any
772      */
773     public void testPom() throws Exception {
774         Path testPom = unit.resolve("pom-test/pom-test-plugin-config.xml");
775         JavadocReport mojo = lookupMojo(testPom);
776         mojo.execute();
777 
778         assertThat(new File(getBasedir(), "target/test/unit/pom-test/target/site"))
779                 .doesNotExist();
780     }
781 
782     /**
783      * Test the javadoc with tag.
784      *
785      * @throws Exception if any
786      */
787     public void testTag() throws Exception {
788         Path testPom = unit.resolve("tag-test/tag-test-plugin-config.xml");
789         JavadocReport mojo = lookupMojo(testPom);
790         mojo.execute();
791 
792         Path app = new File(getBasedir(), "target/test/unit/tag-test/target/site/apidocs/tag/test/App.html").toPath();
793         assertThat(app).exists();
794         String readed = readFile(app);
795         assertThat(readed).contains(">To do something:</").contains(">Generator Class:</");
796 
797         // In javadoc-options-javadoc-resources.xml tag 'version' has only a name,
798         // which is not enough for Java 11 anymore
799         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore("11")) {
800             assertThat(readed).contains(">Version:</");
801             assertTrue(readed.toLowerCase().contains("</dt>" + LINE_SEPARATOR + "  <dd>1.0</dd>")
802                     || readed.toLowerCase().contains("</dt>" + LINE_SEPARATOR + "<dd>1.0</dd>" /* JDK 8 */));
803         }
804     }
805 
806     /**
807      * Test newline in the header/footer parameter
808      *
809      * @throws Exception if any
810      */
811     public void testHeaderFooter() throws Exception {
812         Path testPom = unit.resolve("header-footer-test/header-footer-test-plugin-config.xml");
813         JavadocReport mojo = lookupMojo(testPom);
814         try {
815             mojo.execute();
816         } catch (MojoExecutionException e) {
817             fail("Doesnt handle correctly newline for header or footer parameter");
818         }
819     }
820 
821     /**
822      * Test newline in various string parameters
823      *
824      * @throws Exception if any
825      */
826     public void testNewline() throws Exception {
827         Path testPom = unit.resolve("newline-test/newline-test-plugin-config.xml");
828         JavadocReport mojo = lookupMojo(testPom);
829         try {
830             mojo.execute();
831         } catch (MojoExecutionException e) {
832             fail("Doesn't handle correctly newline for string parameters. See options and packages files.");
833         }
834     }
835 
836     /**
837      * Method to test the jdk6 javadoc
838      *
839      * @throws Exception if any
840      */
841     public void testJdk6() throws Exception {
842         // Should be an assumption, but not supported by TestCase
843         // Java 6 not supported by Java 12 anymore
844         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isAtLeast("12")) {
845             return;
846         }
847 
848         Path testPom = unit.resolve("jdk6-test/jdk6-test-plugin-config.xml");
849         JavadocReport mojo = lookupMojo(testPom);
850         mojo.execute();
851 
852         Path apidocs = new File(getBasedir(), "target/test/unit/jdk6-test/target/site/apidocs").toPath();
853         assertThat(apidocs.resolve("index.html")).exists();
854 
855         Path overview;
856         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore("11")) {
857             overview = apidocs.resolve("overview-summary.html");
858         } else {
859             overview = apidocs.resolve("index.html");
860         }
861 
862         assertThat(overview).exists();
863         String content = readFile(overview);
864         assertThat(content)
865                 .contains("Top - Copyright &#169; All rights reserved.")
866                 .contains("Header - Copyright &#169; All rights reserved.");
867         // IBM dist of adopt-openj9 does not support the footer param
868         if (!System.getProperty("java.vm.name").contains("OpenJ9")) {
869             assertThat(content).contains("Footer - Copyright &#169; All rights reserved.");
870         }
871 
872         Path packageSummary = apidocs.resolve("jdk6/test/package-summary.html");
873         assertThat(packageSummary).exists();
874         content = readFile(packageSummary);
875         assertThat(content)
876                 .contains("Top - Copyright &#169; All rights reserved.")
877                 .contains("Header - Copyright &#169; All rights reserved.");
878 
879         // IBM dist of adopt-openj9 does not support the footer param
880         if (!System.getProperty("java.vm.name").contains("OpenJ9")) {
881             assertThat(content).contains("Footer - Copyright &#169; All rights reserved.");
882         }
883     }
884 
885     /**
886      * Method to test proxy support in the javadoc
887      *
888      * @throws Exception if any
889      */
890     public void testProxy() throws Exception {
891         Settings settings = new Settings();
892         Proxy proxy = new Proxy();
893 
894         // dummy proxy
895         proxy.setActive(true);
896         proxy.setHost("127.0.0.1");
897         proxy.setPort(80);
898         proxy.setProtocol("http");
899         proxy.setUsername("toto");
900         proxy.setPassword("toto");
901         proxy.setNonProxyHosts("www.google.com|*.somewhere.com");
902         settings.addProxy(proxy);
903 
904         Path testPom =
905                 new File(getBasedir(), "src/test/resources/unit/proxy-test/proxy-test-plugin-config.xml").toPath();
906         JavadocReport mojo = lookupMojo(testPom);
907 
908         MavenSession session = spy(newMavenSession(mojo.project));
909         ProjectBuildingRequest buildingRequest = mock(ProjectBuildingRequest.class);
910         when(buildingRequest.getRemoteRepositories()).thenReturn(mojo.project.getRemoteArtifactRepositories());
911         when(buildingRequest.getRepositoryMerging()).thenReturn(RepositoryMerging.POM_DOMINANT);
912         when(session.getProjectBuildingRequest()).thenReturn(buildingRequest);
913         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
914         repositorySession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
915                 .newInstance(repositorySession, new LocalRepository(localRepo)));
916         when(buildingRequest.getRepositorySession()).thenReturn(repositorySession);
917         when(session.getRepositorySession()).thenReturn(repositorySession);
918         LegacySupport legacySupport = lookup(LegacySupport.class);
919         legacySupport.setSession(session);
920 
921         setVariableValueToObject(mojo, "settings", settings);
922         setVariableValueToObject(mojo, "session", session);
923         setVariableValueToObject(mojo, "repoSession", repositorySession);
924         mojo.execute();
925 
926         Path commandLine = new File(
927                         getBasedir(),
928                         "target/test/unit/proxy-test/target/site/apidocs/javadoc."
929                                 + (SystemUtils.IS_OS_WINDOWS ? "bat" : "sh"))
930                 .toPath();
931         assertThat(commandLine).exists();
932         String readed = readFile(commandLine);
933         assertThat(readed).contains("-J-Dhttp.proxyHost=127.0.0.1").contains("-J-Dhttp.proxyPort=80");
934         if (SystemUtils.IS_OS_WINDOWS) {
935             assertThat(readed).contains(" -J-Dhttp.nonProxyHosts=\"www.google.com^|*.somewhere.com\" ");
936         } else {
937             assertThat(readed).contains(" \"-J-Dhttp.nonProxyHosts=\\\"www.google.com^|*.somewhere.com\\\"\" ");
938         }
939 
940         Path options = new File(getBasedir(), "target/test/unit/proxy-test/target/site/apidocs/options").toPath();
941         assertThat(options).exists();
942         String optionsContent = readFile(options);
943         // NO -link expected
944         assertThat(optionsContent).doesNotContain("-link");
945 
946         // real proxy
947         ProxyServer proxyServer = null;
948         AuthAsyncProxyServlet proxyServlet;
949         try {
950             proxyServlet = new AuthAsyncProxyServlet();
951             proxyServer = new ProxyServer(proxyServlet);
952             proxyServer.start();
953 
954             settings = new Settings();
955             proxy = new Proxy();
956             proxy.setActive(true);
957             proxy.setHost(proxyServer.getHostName());
958             proxy.setPort(proxyServer.getPort());
959             proxy.setProtocol("http");
960             settings.addProxy(proxy);
961 
962             mojo = lookupMojo(testPom);
963             setVariableValueToObject(mojo, "settings", settings);
964             setVariableValueToObject(mojo, "session", session);
965             setVariableValueToObject(mojo, "repoSession", repositorySession);
966             mojo.execute();
967             readed = readFile(commandLine);
968             assertTrue(readed.contains("-J-Dhttp.proxyHost=" + proxyServer.getHostName()));
969             assertTrue(readed.contains("-J-Dhttp.proxyPort=" + proxyServer.getPort()));
970 
971             optionsContent = readFile(options);
972             // -link expected
973             // TODO: This got disabled for now!
974             // This test fails since the last commit but I actually think it only ever worked by accident.
975             // It did rely on a commons-logging-1.0.4.pom which got resolved by a test which did run previously.
976             // But after updating to commons-logging.1.1.1 there is no pre-resolved artifact available in
977             // target/local-repo anymore, thus the javadoc link info cannot get built and the test fails
978             // I'll for now just disable this line of code, because the test as far as I can see _never_
979             // did go upstream. The remoteRepository list used is always empty!.
980             //
981             //            assertTrue( optionsContent.contains( "-link 'http://commons.apache.org/logging/apidocs'" ) );
982         } finally {
983             if (proxyServer != null) {
984                 proxyServer.stop();
985             }
986         }
987 
988         // auth proxy
989         Map<String, String> authentications = new HashMap<>();
990         authentications.put("foo", "bar");
991         try {
992             proxyServlet = new AuthAsyncProxyServlet(authentications);
993             proxyServer = new ProxyServer(proxyServlet);
994             proxyServer.start();
995 
996             settings = new Settings();
997             proxy = new Proxy();
998             proxy.setActive(true);
999             proxy.setHost(proxyServer.getHostName());
1000             proxy.setPort(proxyServer.getPort());
1001             proxy.setProtocol("http");
1002             proxy.setUsername("foo");
1003             proxy.setPassword("bar");
1004             settings.addProxy(proxy);
1005 
1006             mojo = lookupMojo(testPom);
1007             setVariableValueToObject(mojo, "settings", settings);
1008             setVariableValueToObject(mojo, "session", session);
1009             setVariableValueToObject(mojo, "repoSession", repositorySession);
1010             mojo.execute();
1011             readed = readFile(commandLine);
1012             assertThat(readed)
1013                     .contains("-J-Dhttp.proxyHost=" + proxyServer.getHostName())
1014                     .contains("-J-Dhttp.proxyPort=" + proxyServer.getPort());
1015 
1016             optionsContent = readFile(options);
1017             // -link expected
1018             // see comment above (line 829)
1019             //             assertTrue( optionsContent.contains( "-link 'http://commons.apache.org/logging/apidocs'" ) );
1020         } finally {
1021             if (proxyServer != null) {
1022                 proxyServer.stop();
1023             }
1024         }
1025     }
1026 
1027     /**
1028      * Method to test error or conflict in Javadoc options and in standard doclet options.
1029      *
1030      * @throws Exception if any
1031      */
1032     public void testValidateOptions() throws Exception {
1033         // encoding
1034         Path testPom = unit.resolve("validate-options-test/wrong-encoding-test-plugin-config.xml");
1035         JavadocReport mojo = lookupMojo(testPom);
1036         try {
1037             mojo.execute();
1038             fail("No wrong encoding catch");
1039         } catch (MojoExecutionException e) {
1040             assertTrue("No wrong encoding catch", e.getMessage().contains("Unsupported option <encoding/>"));
1041         }
1042         testPom = unit.resolve("validate-options-test/wrong-docencoding-test-plugin-config.xml");
1043         mojo = lookupMojo(testPom);
1044         try {
1045             mojo.execute();
1046             fail("No wrong docencoding catch");
1047         } catch (MojoExecutionException e) {
1048             assertTrue("No wrong docencoding catch", e.getMessage().contains("Unsupported option <docencoding/>"));
1049         }
1050         testPom = unit.resolve("validate-options-test/wrong-charset-test-plugin-config.xml");
1051         mojo = lookupMojo(testPom);
1052         try {
1053             mojo.execute();
1054             fail("No wrong charset catch");
1055         } catch (MojoExecutionException e) {
1056             assertTrue("No wrong charset catch", e.getMessage().contains("Unsupported option <charset/>"));
1057         }
1058 
1059         // locale
1060         testPom = unit.resolve("validate-options-test/wrong-locale-test-plugin-config.xml");
1061         mojo = lookupMojo(testPom);
1062         try {
1063             mojo.execute();
1064             fail("No wrong locale catch");
1065         } catch (MojoExecutionException e) {
1066             assertTrue("No wrong locale catch", e.getMessage().contains("Unsupported option <locale/>"));
1067         }
1068         testPom = unit.resolve("validate-options-test/wrong-locale-with-variant-test-plugin-config.xml");
1069         mojo = lookupMojo(testPom);
1070         mojo.execute();
1071         assertTrue("No wrong locale catch", true);
1072 
1073         // conflict options
1074         testPom = unit.resolve("validate-options-test/conflict-options-test-plugin-config.xml");
1075         mojo = lookupMojo(testPom);
1076         try {
1077             mojo.execute();
1078             fail("No conflict catch");
1079         } catch (MojoExecutionException e) {
1080             assertTrue("No conflict catch", e.getMessage().contains("Option <nohelp/> conflicts with <helpfile/>"));
1081         }
1082     }
1083 
1084     /**
1085      * Method to test the <code>&lt;tagletArtifacts/&gt;</code> parameter.
1086      *
1087      * @throws Exception if any
1088      */
1089     public void testTagletArtifacts() throws Exception {
1090         // Should be an assumption, but not supported by TestCase
1091         // com.sun.tools.doclets.Taglet not supported by Java 10 anymore
1092         if (JavaVersion.JAVA_SPECIFICATION_VERSION.isAtLeast("10")) {
1093             return;
1094         }
1095 
1096         Path testPom = unit.resolve("tagletArtifacts-test/tagletArtifacts-test-plugin-config.xml");
1097         JavadocReport mojo = lookupMojo(testPom);
1098 
1099         MavenSession session = newMavenSession(mojo.project);
1100         DefaultRepositorySystemSession repoSysSession = (DefaultRepositorySystemSession) session.getRepositorySession();
1101         repoSysSession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
1102                 .newInstance(session.getRepositorySession(), new LocalRepository(new File("target/local-repo"))));
1103         // Ensure remote repo connection uses SSL
1104         LegacySupport legacySupport = lookup(LegacySupport.class);
1105         legacySupport.setSession(session);
1106         setVariableValueToObject(mojo, "session", session);
1107         setVariableValueToObject(mojo, "repoSession", repoSysSession);
1108         mojo.execute();
1109 
1110         Path optionsFile = new File(mojo.getOutputDirectory(), "options").toPath();
1111         assertThat(optionsFile).exists();
1112         String options = readFile(optionsFile);
1113         // count -taglet
1114         assertThat(StringUtils.countMatches(options, LINE_SEPARATOR + "-taglet" + LINE_SEPARATOR))
1115                 .isEqualTo(3);
1116         assertThat(options)
1117                 .contains("org.codehaus.plexus.javadoc.PlexusConfigurationTaglet")
1118                 .contains("org.codehaus.plexus.javadoc.PlexusRequirementTaglet")
1119                 .contains("org.codehaus.plexus.javadoc.PlexusComponentTaglet");
1120     }
1121 
1122     /**
1123      * Method to test the <code>&lt;stylesheetfile/&gt;</code> parameter.
1124      *
1125      * @throws Exception if any
1126      */
1127     public void testStylesheetfile() throws Exception {
1128         Path testPom = unit.resolve("stylesheetfile-test/pom.xml");
1129 
1130         JavadocReport mojo = lookupMojo(testPom);
1131         assertNotNull(mojo);
1132 
1133         MavenSession session = spy(newMavenSession(mojo.project));
1134         ProjectBuildingRequest buildingRequest = mock(ProjectBuildingRequest.class);
1135         when(buildingRequest.getRemoteRepositories()).thenReturn(mojo.project.getRemoteArtifactRepositories());
1136         when(session.getProjectBuildingRequest()).thenReturn(buildingRequest);
1137         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
1138         repositorySession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
1139                 .newInstance(repositorySession, new LocalRepository(localRepo)));
1140         when(buildingRequest.getRepositorySession()).thenReturn(repositorySession);
1141         when(session.getRepositorySession()).thenReturn(repositorySession);
1142         LegacySupport legacySupport = lookup(LegacySupport.class);
1143         legacySupport.setSession(session);
1144         setVariableValueToObject(mojo, "session", session);
1145         setVariableValueToObject(mojo, "repoSession", repositorySession);
1146 
1147         Path apidocs = new File(getBasedir(), "target/test/unit/stylesheetfile-test/target/site/apidocs").toPath();
1148 
1149         Path stylesheetfile = apidocs.resolve("stylesheet.css");
1150         Path options = apidocs.resolve("options");
1151 
1152         // stylesheet == maven OR java
1153         setVariableValueToObject(mojo, "stylesheet", "javamaven");
1154 
1155         try {
1156             mojo.execute();
1157             fail();
1158         } catch (MojoExecutionException | MojoFailureException e) {
1159         }
1160 
1161         // stylesheet == java
1162         setVariableValueToObject(mojo, "stylesheet", "java");
1163         mojo.execute();
1164 
1165         String content = readFile(stylesheetfile);
1166         if (JavaVersion.JAVA_VERSION.isAtLeast("13-ea")) {
1167             assertTrue(content.contains("/*" + LINE_SEPARATOR + " * Javadoc style sheet" + LINE_SEPARATOR + " */"));
1168         } else if (JavaVersion.JAVA_VERSION.isAtLeast("10")) {
1169             assertTrue(content.contains("/* " + LINE_SEPARATOR + " * Javadoc style sheet" + LINE_SEPARATOR + " */"));
1170         } else {
1171             assertTrue(content.contains("/* Javadoc style sheet */"));
1172         }
1173 
1174         String optionsContent = readFile(options);
1175         assertFalse(optionsContent.contains("-stylesheetfile"));
1176 
1177         // stylesheetfile defined as a project resource
1178         setVariableValueToObject(mojo, "stylesheet", null);
1179         setVariableValueToObject(mojo, "stylesheetfile", "com/mycompany/app/javadoc/css/stylesheet.css");
1180         mojo.execute();
1181 
1182         content = readFile(stylesheetfile);
1183         assertTrue(content.contains("/* Custom Javadoc style sheet in project */"));
1184 
1185         optionsContent = readFile(options);
1186         assertTrue(optionsContent.contains("-stylesheetfile"));
1187         Path stylesheetResource =
1188                 unit.resolve("stylesheetfile-test/src/main/resources/com/mycompany/app/javadoc/css/stylesheet.css");
1189         assertTrue(optionsContent.contains(
1190                 "'" + stylesheetResource.toFile().getAbsolutePath().replaceAll("\\\\", "/") + "'"));
1191 
1192         // stylesheetfile defined in a javadoc plugin dependency
1193         setVariableValueToObject(mojo, "stylesheetfile", "com/mycompany/app/javadoc/css2/stylesheet.css");
1194         mojo.execute();
1195 
1196         content = readFile(stylesheetfile);
1197         assertTrue(content.contains("/* Custom Javadoc style sheet in artefact */"));
1198 
1199         optionsContent = readFile(options);
1200         assertTrue(optionsContent.contains("-stylesheetfile"));
1201         assertTrue(optionsContent.contains(
1202                 "'" + stylesheetfile.toFile().getAbsolutePath().replaceAll("\\\\", "/") + "'"));
1203 
1204         // stylesheetfile defined as file
1205         Path css = unit.resolve("stylesheetfile-test/src/main/resources/com/mycompany/app/javadoc/css3/stylesheet.css");
1206         setVariableValueToObject(mojo, "stylesheetfile", css.toFile().getAbsolutePath());
1207         mojo.execute();
1208 
1209         content = readFile(stylesheetfile);
1210         assertTrue(content.contains("/* Custom Javadoc style sheet as file */"));
1211 
1212         optionsContent = readFile(options);
1213         assertTrue(optionsContent.contains("-stylesheetfile"));
1214         stylesheetResource =
1215                 unit.resolve("stylesheetfile-test/src/main/resources/com/mycompany/app/javadoc/css3/stylesheet.css");
1216         assertTrue(optionsContent.contains(
1217                 "'" + stylesheetResource.toFile().getAbsolutePath().replaceAll("\\\\", "/") + "'"));
1218     }
1219 
1220     /**
1221      * Method to test the <code>&lt;helpfile/&gt;</code> parameter.
1222      *
1223      * @throws Exception if any
1224      */
1225     public void testHelpfile() throws Exception {
1226         Path testPom = unit.resolve("helpfile-test/pom.xml");
1227 
1228         JavadocReport mojo = lookupMojo(testPom);
1229         assertNotNull(mojo);
1230 
1231         MavenSession session = spy(newMavenSession(mojo.project));
1232         ProjectBuildingRequest buildingRequest = mock(ProjectBuildingRequest.class);
1233         when(buildingRequest.getRemoteRepositories()).thenReturn(mojo.project.getRemoteArtifactRepositories());
1234         when(session.getProjectBuildingRequest()).thenReturn(buildingRequest);
1235         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
1236         repositorySession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
1237                 .newInstance(repositorySession, new LocalRepository(localRepo)));
1238         when(buildingRequest.getRepositorySession()).thenReturn(repositorySession);
1239         when(session.getRepositorySession()).thenReturn(repositorySession);
1240         LegacySupport legacySupport = lookup(LegacySupport.class);
1241         legacySupport.setSession(session);
1242         setVariableValueToObject(mojo, "session", session);
1243         setVariableValueToObject(mojo, "repoSession", repositorySession);
1244 
1245         Path apidocs = new File(getBasedir(), "target/test/unit/helpfile-test/target/site/apidocs").toPath();
1246 
1247         Path helpfile = apidocs.resolve("help-doc.html");
1248         Path options = apidocs.resolve("options");
1249 
1250         // helpfile by default
1251         mojo.execute();
1252 
1253         String content = readFile(helpfile);
1254         assertTrue(content.contains("<!-- Generated by javadoc"));
1255 
1256         String optionsContent = readFile(options);
1257         assertFalse(optionsContent.contains("-helpfile"));
1258 
1259         // helpfile defined in a javadoc plugin dependency
1260         setVariableValueToObject(mojo, "helpfile", "com/mycompany/app/javadoc/helpfile/help-doc.html");
1261 
1262         setVariableValueToObject(mojo, "session", session);
1263         setVariableValueToObject(mojo, "repoSession", repositorySession);
1264 
1265         mojo.execute();
1266 
1267         content = readFile(helpfile);
1268         assertTrue(content.contains("<!--  Help file from artefact -->"));
1269 
1270         optionsContent = readFile(options);
1271         assertTrue(optionsContent.contains("-helpfile"));
1272         Path help = apidocs.resolve("help-doc.html");
1273         assertTrue(optionsContent.contains("'" + help.toFile().getAbsolutePath().replaceAll("\\\\", "/") + "'"));
1274 
1275         // helpfile defined as a project resource
1276         setVariableValueToObject(mojo, "helpfile", "com/mycompany/app/javadoc/helpfile2/help-doc.html");
1277         mojo.execute();
1278 
1279         content = readFile(helpfile);
1280         assertTrue(content.contains("<!--  Help file from file -->"));
1281 
1282         optionsContent = readFile(options);
1283         assertTrue(optionsContent.contains("-helpfile"));
1284         help = unit.resolve("helpfile-test/src/main/resources/com/mycompany/app/javadoc/helpfile2/help-doc.html");
1285         assertTrue(optionsContent.contains("'" + help.toFile().getAbsolutePath().replaceAll("\\\\", "/") + "'"));
1286 
1287         // helpfile defined as file
1288         help = unit.resolve("helpfile-test/src/main/resources/com/mycompany/app/javadoc/helpfile2/help-doc.html");
1289         setVariableValueToObject(mojo, "helpfile", help.toFile().getAbsolutePath());
1290         mojo.execute();
1291 
1292         content = readFile(helpfile);
1293         assertTrue(content.contains("<!--  Help file from file -->"));
1294 
1295         optionsContent = readFile(options);
1296         assertTrue(optionsContent.contains("-helpfile"));
1297         assertTrue(optionsContent.contains("'" + help.toFile().getAbsolutePath().replaceAll("\\\\", "/") + "'"));
1298     }
1299 }