You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2017/07/12 19:59:53 UTC

svn commit: r1801772 [7/11] - in /maven/plugins/trunk/maven-javadoc-plugin: ./ src/main/java/org/apache/maven/plugin/ src/main/java/org/apache/maven/plugins/ src/main/java/org/apache/maven/plugins/javadoc/ src/main/java/org/apache/maven/plugins/javadoc...

Added: maven/plugins/trunk/maven-javadoc-plugin/src/main/resources/org/apache/maven/plugins/javadoc/java-api-package-list-1.8
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-javadoc-plugin/src/main/resources/org/apache/maven/plugins/javadoc/java-api-package-list-1.8?rev=1801772&view=auto
==============================================================================
--- maven/plugins/trunk/maven-javadoc-plugin/src/main/resources/org/apache/maven/plugins/javadoc/java-api-package-list-1.8 (added)
+++ maven/plugins/trunk/maven-javadoc-plugin/src/main/resources/org/apache/maven/plugins/javadoc/java-api-package-list-1.8 Wed Jul 12 19:59:51 2017
@@ -0,0 +1,217 @@
+java.applet
+java.awt
+java.awt.color
+java.awt.datatransfer
+java.awt.dnd
+java.awt.event
+java.awt.font
+java.awt.geom
+java.awt.im
+java.awt.im.spi
+java.awt.image
+java.awt.image.renderable
+java.awt.print
+java.beans
+java.beans.beancontext
+java.io
+java.lang
+java.lang.annotation
+java.lang.instrument
+java.lang.invoke
+java.lang.management
+java.lang.ref
+java.lang.reflect
+java.math
+java.net
+java.nio
+java.nio.channels
+java.nio.channels.spi
+java.nio.charset
+java.nio.charset.spi
+java.nio.file
+java.nio.file.attribute
+java.nio.file.spi
+java.rmi
+java.rmi.activation
+java.rmi.dgc
+java.rmi.registry
+java.rmi.server
+java.security
+java.security.acl
+java.security.cert
+java.security.interfaces
+java.security.spec
+java.sql
+java.text
+java.text.spi
+java.time
+java.time.chrono
+java.time.format
+java.time.temporal
+java.time.zone
+java.util
+java.util.concurrent
+java.util.concurrent.atomic
+java.util.concurrent.locks
+java.util.function
+java.util.jar
+java.util.logging
+java.util.prefs
+java.util.regex
+java.util.spi
+java.util.stream
+java.util.zip
+javax.accessibility
+javax.activation
+javax.activity
+javax.annotation
+javax.annotation.processing
+javax.crypto
+javax.crypto.interfaces
+javax.crypto.spec
+javax.imageio
+javax.imageio.event
+javax.imageio.metadata
+javax.imageio.plugins.bmp
+javax.imageio.plugins.jpeg
+javax.imageio.spi
+javax.imageio.stream
+javax.jws
+javax.jws.soap
+javax.lang.model
+javax.lang.model.element
+javax.lang.model.type
+javax.lang.model.util
+javax.management
+javax.management.loading
+javax.management.modelmbean
+javax.management.monitor
+javax.management.openmbean
+javax.management.relation
+javax.management.remote
+javax.management.remote.rmi
+javax.management.timer
+javax.naming
+javax.naming.directory
+javax.naming.event
+javax.naming.ldap
+javax.naming.spi
+javax.net
+javax.net.ssl
+javax.print
+javax.print.attribute
+javax.print.attribute.standard
+javax.print.event
+javax.rmi
+javax.rmi.CORBA
+javax.rmi.ssl
+javax.script
+javax.security.auth
+javax.security.auth.callback
+javax.security.auth.kerberos
+javax.security.auth.login
+javax.security.auth.spi
+javax.security.auth.x500
+javax.security.cert
+javax.security.sasl
+javax.sound.midi
+javax.sound.midi.spi
+javax.sound.sampled
+javax.sound.sampled.spi
+javax.sql
+javax.sql.rowset
+javax.sql.rowset.serial
+javax.sql.rowset.spi
+javax.swing
+javax.swing.border
+javax.swing.colorchooser
+javax.swing.event
+javax.swing.filechooser
+javax.swing.plaf
+javax.swing.plaf.basic
+javax.swing.plaf.metal
+javax.swing.plaf.multi
+javax.swing.plaf.nimbus
+javax.swing.plaf.synth
+javax.swing.table
+javax.swing.text
+javax.swing.text.html
+javax.swing.text.html.parser
+javax.swing.text.rtf
+javax.swing.tree
+javax.swing.undo
+javax.tools
+javax.transaction
+javax.transaction.xa
+javax.xml
+javax.xml.bind
+javax.xml.bind.annotation
+javax.xml.bind.annotation.adapters
+javax.xml.bind.attachment
+javax.xml.bind.helpers
+javax.xml.bind.util
+javax.xml.crypto
+javax.xml.crypto.dom
+javax.xml.crypto.dsig
+javax.xml.crypto.dsig.dom
+javax.xml.crypto.dsig.keyinfo
+javax.xml.crypto.dsig.spec
+javax.xml.datatype
+javax.xml.namespace
+javax.xml.parsers
+javax.xml.soap
+javax.xml.stream
+javax.xml.stream.events
+javax.xml.stream.util
+javax.xml.transform
+javax.xml.transform.dom
+javax.xml.transform.sax
+javax.xml.transform.stax
+javax.xml.transform.stream
+javax.xml.validation
+javax.xml.ws
+javax.xml.ws.handler
+javax.xml.ws.handler.soap
+javax.xml.ws.http
+javax.xml.ws.soap
+javax.xml.ws.spi
+javax.xml.ws.spi.http
+javax.xml.ws.wsaddressing
+javax.xml.xpath
+org.ietf.jgss
+org.omg.CORBA
+org.omg.CORBA.DynAnyPackage
+org.omg.CORBA.ORBPackage
+org.omg.CORBA.TypeCodePackage
+org.omg.CORBA.portable
+org.omg.CORBA_2_3
+org.omg.CORBA_2_3.portable
+org.omg.CosNaming
+org.omg.CosNaming.NamingContextExtPackage
+org.omg.CosNaming.NamingContextPackage
+org.omg.Dynamic
+org.omg.DynamicAny
+org.omg.DynamicAny.DynAnyFactoryPackage
+org.omg.DynamicAny.DynAnyPackage
+org.omg.IOP
+org.omg.IOP.CodecFactoryPackage
+org.omg.IOP.CodecPackage
+org.omg.Messaging
+org.omg.PortableInterceptor
+org.omg.PortableInterceptor.ORBInitInfoPackage
+org.omg.PortableServer
+org.omg.PortableServer.CurrentPackage
+org.omg.PortableServer.POAManagerPackage
+org.omg.PortableServer.POAPackage
+org.omg.PortableServer.ServantLocatorPackage
+org.omg.PortableServer.portable
+org.omg.SendingContext
+org.omg.stub.java.rmi
+org.w3c.dom
+org.w3c.dom.bootstrap
+org.w3c.dom.events
+org.w3c.dom.ls
+org.w3c.dom.views
+org.xml.sax
+org.xml.sax.ext
+org.xml.sax.helpers

Added: maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AbstractFixJavadocMojoTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AbstractFixJavadocMojoTest.java?rev=1801772&view=auto
==============================================================================
--- maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AbstractFixJavadocMojoTest.java (added)
+++ maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AbstractFixJavadocMojoTest.java Wed Jul 12 19:59:51 2017
@@ -0,0 +1,210 @@
+package org.apache.maven.plugins.javadoc;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import org.apache.maven.plugins.javadoc.AbstractFixJavadocMojo;
+
+import junit.framework.TestCase;
+import junitx.util.PrivateAccessor;
+
+import com.thoughtworks.qdox.model.AbstractInheritableJavaEntity;
+import com.thoughtworks.qdox.model.DocletTag;
+import com.thoughtworks.qdox.model.IndentBuffer;
+import com.thoughtworks.qdox.model.JavaClass;
+
+public class AbstractFixJavadocMojoTest
+    extends TestCase
+{
+
+    public void testReplaceLinkTags_noLinkTag()
+        throws Throwable
+    {
+        String comment = "/** @see ConnectException */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+        assertEquals( "/** @see ConnectException */", newComment );
+    }
+
+    public void testReplaceLinkTags_oneLinkTag()
+        throws Throwable
+    {
+        String comment = "/** {@link ConnectException} */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+        assertEquals( "/** {@link java.net.ConnectException} */", newComment );
+    }
+
+    public void testReplaceLinkTags_missingEndBrace()
+        throws Throwable
+    {
+        String comment = "/** {@link ConnectException */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+
+        assertEquals( "/** {@link ConnectException */", newComment );
+    }
+
+    public void testReplaceLinkTags_spacesAfterLinkTag()
+        throws Throwable
+    {
+        String comment = "/** {@link     ConnectException} */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+
+        assertEquals( "/** {@link java.net.ConnectException} */", newComment );
+    }
+
+    public void testReplaceLinkTags_spacesAfterClassName()
+        throws Throwable
+    {
+        String comment = "/** {@link ConnectException       } */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+
+        assertEquals( "/** {@link java.net.ConnectException} */", newComment );
+    }
+
+    public void testReplaceLinkTags_spacesAfterMethod()
+        throws Throwable
+    {
+        String comment = "/** {@link ConnectException#getMessage()       } */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+
+        assertEquals( "/** {@link java.net.ConnectException#getMessage()} */", newComment );
+    }
+
+    public void testReplaceLinkTags_containingHash()
+        throws Throwable
+    {
+        String comment = "/** {@link ConnectException#getMessage()} */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+
+        assertEquals( "/** {@link java.net.ConnectException#getMessage()} */", newComment );
+    }
+
+    public void testReplaceLinkTags_followedByHash()
+        throws Throwable
+    {
+        String comment = "/** {@link ConnectException} ##important## */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+
+        assertEquals( "/** {@link java.net.ConnectException} ##important## */", newComment );
+    }
+
+    public void testReplaceLinkTags_twoLinks()
+        throws Throwable
+    {
+        String comment = "/** Use {@link ConnectException} instead of {@link Exception} */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        when( clazz.resolveType( "Exception" ) ).thenReturn( "java.lang.Exception" );
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+
+        assertEquals( "/** Use {@link java.net.ConnectException} instead of {@link java.lang.Exception} */", newComment );
+    }
+
+    public void testReplaceLinkTags_OnlyAnchor()
+        throws Throwable
+    {
+        String comment = "/** There's a {@link #getClass()} but no setClass() */";
+        AbstractInheritableJavaEntity entity = spy( new PrivateAbstractInheritableJavaEntity() );
+        JavaClass clazz = mock( JavaClass.class );
+        when( entity.getParentClass() ).thenReturn( clazz );
+        when( clazz.resolveType( "ConnectException" ) ).thenReturn( "java.net.ConnectException" );
+        when( clazz.resolveType( "Exception" ) ).thenReturn( "java.lang.Exception" );
+
+        String newComment =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "replaceLinkTags", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class }, new Object[] { comment, entity } );
+
+        assertEquals( "/** There's a {@link #getClass()} but no setClass() */", newComment );
+    }
+
+    protected class PrivateAbstractInheritableJavaEntity
+        extends AbstractInheritableJavaEntity
+    {
+        public int compareTo( Object o )
+        {
+            return 0;
+        }
+
+        @Override
+        public DocletTag[] getTagsByName( String arg0, boolean arg1 )
+        {
+            return null;
+        }
+
+        @Override
+        protected void writeBody( IndentBuffer arg0 )
+        {
+        }
+    }
+}

Added: maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojoTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojoTest.java?rev=1801772&view=auto
==============================================================================
--- maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojoTest.java (added)
+++ maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojoTest.java Wed Jul 12 19:59:51 2017
@@ -0,0 +1,79 @@
+package org.apache.maven.plugins.javadoc;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.plugins.javadoc.AbstractJavadocMojo;
+
+import junit.framework.TestCase;
+
+public class AbstractJavadocMojoTest
+    extends TestCase
+{
+    AbstractJavadocMojo mojo;
+    
+    @Override
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        mojo = new AbstractJavadocMojo()
+        {
+            @Override
+            public void doExecute()
+                throws MojoExecutionException, MojoFailureException
+            {
+            }
+        };
+    }
+    
+    public void testMJAVADOC432_DetectLinksMessages()
+    {
+        Log log = mock( Log.class );
+        when( log.isErrorEnabled() ).thenReturn( true );
+        mojo.setLog( log );
+        mojo.outputDirectory = new File( "target/test-classes" );
+
+        // first continues after warning, next exits with warning
+        assertFalse( mojo.isValidJavadocLink( new File( "pom.xml" ).getPath(), true ) );
+        assertFalse( mojo.isValidJavadocLink( "file://%%", true ) );
+        assertFalse( mojo.isValidJavadocLink( new File( "pom.xml" ).toURI().toString(), true ) );
+        verify( log, times( 4 ) ).warn( anyString() );
+        verify( log, never() ).error( anyString() );
+
+        // first continues after error, next exits with error
+        assertFalse( mojo.isValidJavadocLink( new File( "pom.xml" ).getPath(), false ) );
+        assertFalse( mojo.isValidJavadocLink( "file://%%", false ) );
+        assertFalse( mojo.isValidJavadocLink( new File( "pom.xml" ).toURI().toString(), false ) );
+        verify( log, times( 4 ) ).error( anyString() );
+        verify( log, times( 4 ) ).warn( anyString() ); // no extra warnings
+    }
+}

Added: maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java?rev=1801772&view=auto
==============================================================================
--- maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java (added)
+++ maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java Wed Jul 12 19:59:51 2017
@@ -0,0 +1,238 @@
+package org.apache.maven.plugins.javadoc;
+
+import java.io.BufferedReader;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.testing.AbstractMojoTestCase;
+import org.apache.maven.plugins.javadoc.JavadocReport;
+import org.codehaus.plexus.util.FileUtils;
+
+public class AggregatorJavadocReportTest
+    extends AbstractMojoTestCase
+{
+    private static final char LINE_SEPARATOR = ' ';
+
+    /** flag to copy repo only one time */
+    private static boolean TEST_REPO_CREATED = false;
+
+    private File unit;
+
+    private File localRepo;
+
+    /** {@inheritDoc} */
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        unit = new File( getBasedir(), "src/test/resources/unit" );
+
+        localRepo = new File( getBasedir(), "target/local-repo/" );
+
+        createTestRepo();
+    }
+
+    private JavadocReport lookupMojo( File testPom )
+        throws Exception
+    {
+        JavadocReport mojo = (JavadocReport) lookupMojo( "aggregate", testPom );
+
+        PluginDescriptor pluginDescriptor = new PluginDescriptor();
+        pluginDescriptor.setPlugin( new Plugin() );
+
+        setVariableValueToObject( mojo, "plugin", pluginDescriptor );
+        return mojo;
+    }
+
+    /**
+     * Create test repository in target directory.
+     *
+     * @throws IOException if any
+     */
+    private void createTestRepo()
+        throws IOException
+    {
+        if ( TEST_REPO_CREATED )
+        {
+            return;
+        }
+
+        localRepo.mkdirs();
+
+        // ----------------------------------------------------------------------
+        // UMLGraph
+        // ----------------------------------------------------------------------
+
+        File sourceDir = new File( unit, "doclet-test/artifact-doclet" );
+        assertTrue( sourceDir.exists() );
+        FileUtils.copyDirectoryStructure( sourceDir, localRepo );
+
+        // ----------------------------------------------------------------------
+        // UMLGraph-bis
+        // ----------------------------------------------------------------------
+
+        sourceDir = new File( unit, "doclet-path-test/artifact-doclet" );
+        assertTrue( sourceDir.exists() );
+        FileUtils.copyDirectoryStructure( sourceDir, localRepo );
+
+        // ----------------------------------------------------------------------
+        // commons-attributes-compiler
+        // http://www.tullmann.org/pat/taglets/
+        // ----------------------------------------------------------------------
+
+        sourceDir = new File( unit, "taglet-test/artifact-taglet" );
+        assertTrue( sourceDir.exists() );
+        FileUtils.copyDirectoryStructure( sourceDir, localRepo );
+
+        // ----------------------------------------------------------------------
+        // stylesheetfile-test
+        // ----------------------------------------------------------------------
+
+        sourceDir = new File( unit, "stylesheetfile-test/artifact-stylesheetfile" );
+        assertTrue( sourceDir.exists() );
+        FileUtils.copyDirectoryStructure( sourceDir, localRepo );
+
+        // ----------------------------------------------------------------------
+        // helpfile-test
+        // ----------------------------------------------------------------------
+
+        sourceDir = new File( unit, "helpfile-test/artifact-helpfile" );
+        assertTrue( sourceDir.exists() );
+        FileUtils.copyDirectoryStructure( sourceDir, localRepo );
+
+        // Remove SCM files
+        List<String> files = FileUtils.getFileAndDirectoryNames( localRepo, FileUtils.getDefaultExcludesAsString(),
+                                                                 null, true, true, true, true );
+        for ( String filename : files )
+        {
+            File file = new File( filename );
+
+            if ( file.isDirectory() )
+            {
+                FileUtils.deleteDirectory( file );
+            }
+            else
+            {
+                file.delete();
+            }
+        }
+
+        TEST_REPO_CREATED = true;
+    }
+
+    /**
+     * Convenience method that reads the contents of the specified file object into a string with a <code>space</code>
+     * as line separator.
+     *
+     * @see #LINE_SEPARATOR
+     * @param file the file to be read
+     * @return a String object that contains the contents of the file
+     * @throws IOException if any
+     */
+    private static String readFile( File file )
+        throws IOException
+    {
+        String strTmp;
+        StringBuilder str = new StringBuilder( (int) file.length() );
+        BufferedReader in = new BufferedReader( new FileReader( file ) );
+
+        try
+        {
+            while ( ( strTmp = in.readLine() ) != null )
+            {
+                str.append( LINE_SEPARATOR );
+                str.append( strTmp );
+            }
+        }
+        finally
+        {
+            in.close();
+        }
+
+        return str.toString();
+    }
+
+    /**
+     * Method to test the aggregate parameter
+     *
+     * @throws Exception if any
+     */
+    public void testAggregate()
+        throws Exception
+    {
+        File testPom = new File( unit, "aggregate-test/aggregate-test-plugin-config.xml" );
+        JavadocReport mojo = (JavadocReport) lookupMojo( testPom );
+        mojo.execute();
+
+        File apidocs = new File( getBasedir(), "target/test/unit/aggregate-test/target/site/apidocs/" );
+
+        // check if project1 api files exist
+        assertTrue( new File( apidocs, "aggregate/test/project1/Project1App.html" ).exists() );
+        assertTrue( new File( apidocs, "aggregate/test/project1/Project1AppSample.html" ).exists() );
+        assertTrue( new File( apidocs, "aggregate/test/project1/Project1Sample.html" ).exists() );
+        assertTrue( new File( apidocs, "aggregate/test/project1/Project1Test.html" ).exists() );
+
+        // check if project2 api files exist
+        assertTrue( new File( apidocs, "aggregate/test/project2/Project2App.html" ).exists() );
+        assertTrue( new File( apidocs, "aggregate/test/project2/Project2AppSample.html" ).exists() );
+        assertTrue( new File( apidocs, "aggregate/test/project2/Project2Sample.html" ).exists() );
+        assertTrue( new File( apidocs, "aggregate/test/project2/Project2Test.html" ).exists() );
+    }
+
+    /**
+     * Test the javadoc resources in the aggregation case.
+     *
+     * @throws Exception if any
+     */
+    public void testAggregateJavadocResources()
+        throws Exception
+    {
+        File testPom = new File( unit, "aggregate-resources-test/aggregate-resources-test-plugin-config.xml" );
+        JavadocReport mojo = (JavadocReport) lookupMojo( testPom );
+        mojo.execute();
+
+        File apidocs = new File( getBasedir(), "target/test/unit/aggregate-resources-test/target/site/apidocs" );
+
+        // Test overview
+        File overviewSummary = new File( apidocs, "overview-summary.html" );
+        assertTrue( overviewSummary.exists() );
+        String overview = readFile( overviewSummary ).toLowerCase();
+        assertTrue( overview.contains( "<a href=\"resources/test/package-summary.html\">resources.test</a>" ) );
+        assertTrue( overview.contains( ">blabla</" ) );
+        assertTrue( overview.contains( "<a href=\"resources/test2/package-summary.html\">resources.test2</a>" ) );
+        assertTrue( overview.contains( "<a href=\"resources2/test/package-summary.html\">resources2.test</a>" ) );
+        assertTrue( overview.contains( "<a href=\"resources2/test2/package-summary.html\">resources2.test2</a>" ) );
+
+        // Test doc-files
+        File app = new File( apidocs, "resources/test/App.html" );
+        assertTrue( app.exists() );
+        overview = readFile( app );
+        assertTrue( overview.contains( "<img src=\"doc-files/maven-feather.png\" alt=\"Maven\">" ) );
+        assertTrue( new File( apidocs, "resources/test/doc-files/maven-feather.png" ).exists() );
+    }
+}

Added: maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/FixJavadocMojoTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/FixJavadocMojoTest.java?rev=1801772&view=auto
==============================================================================
--- maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/FixJavadocMojoTest.java (added)
+++ maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/FixJavadocMojoTest.java Wed Jul 12 19:59:51 2017
@@ -0,0 +1,759 @@
+package org.apache.maven.plugins.javadoc;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junitx.util.PrivateAccessor;
+
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.plugin.testing.AbstractMojoTestCase;
+import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
+import org.apache.maven.plugins.javadoc.AbstractFixJavadocMojo;
+import org.apache.maven.plugins.javadoc.FixJavadocMojo;
+import org.apache.maven.plugins.javadoc.JavadocUtil;
+import org.apache.maven.plugins.javadoc.AbstractFixJavadocMojo.JavaEntityTags;
+import org.apache.maven.shared.invoker.MavenInvocationException;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.ReaderFactory;
+import org.codehaus.plexus.util.StringUtils;
+
+import com.thoughtworks.qdox.JavaDocBuilder;
+import com.thoughtworks.qdox.model.AbstractInheritableJavaEntity;
+import com.thoughtworks.qdox.model.AbstractJavaEntity;
+import com.thoughtworks.qdox.model.DocletTag;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaMethod;
+
+/**
+ * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
+ * @version $Id: FixJavadocMojoTest.java 1752069 2016-07-10 09:58:59Z rfscholte $
+ */
+public class FixJavadocMojoTest
+    extends AbstractMojoTestCase
+{
+    /** The vm line separator */
+    private static final String EOL = System.getProperty( "line.separator" );
+
+    /** flag to copy repo only one time */
+    private static boolean TEST_REPO_CREATED = false;
+
+    /** {@inheritDoc} */
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        createTestRepo();
+    }
+
+    /**
+     * Create test repository in target directory.
+     *
+     * @throws IOException if any
+     */
+    private void createTestRepo()
+        throws IOException
+    {
+        if ( TEST_REPO_CREATED )
+        {
+            return;
+        }
+
+        File localRepo = new File( getBasedir(), "target/local-repo/" );
+        localRepo.mkdirs();
+
+        // ----------------------------------------------------------------------
+        // fix-test-1.0.jar
+        // ----------------------------------------------------------------------
+
+        File sourceDir = new File( getBasedir(), "src/test/resources/unit/fix-test/repo/" );
+        assertTrue( sourceDir.exists() );
+        FileUtils.copyDirectoryStructure( sourceDir, localRepo );
+
+        // ----------------------------------------------------------------------
+        // fix-jdk5-test-1.0.jar
+        // ----------------------------------------------------------------------
+
+        sourceDir = new File( getBasedir(), "src/test/resources/unit/fix-jdk5-test/repo/" );
+        assertTrue( sourceDir.exists() );
+        FileUtils.copyDirectoryStructure( sourceDir, localRepo );
+
+        // ----------------------------------------------------------------------
+        // fix-jdk6-test-1.0.jar
+        // ----------------------------------------------------------------------
+
+        sourceDir = new File( getBasedir(), "src/test/resources/unit/fix-jdk6-test/repo/" );
+        assertTrue( sourceDir.exists() );
+        FileUtils.copyDirectoryStructure( sourceDir, localRepo );
+
+        // Remove SCM files
+        List<String> files =
+            FileUtils.getFileAndDirectoryNames( localRepo, FileUtils.getDefaultExcludesAsString(), null, true,
+                                                true, true, true );
+        for ( String filename : files )
+        {
+            File file = new File( filename );
+
+            if ( file.isDirectory() )
+            {
+                FileUtils.deleteDirectory( file );
+            }
+            else
+            {
+                file.delete();
+            }
+        }
+
+        TEST_REPO_CREATED = true;
+    }
+
+    /**
+     * @throws Exception if any
+     */
+    public void testFix()
+        throws Exception
+    {
+        File testPomBasedir = new File( getBasedir(), "target/test/unit/fix-test" );
+
+        executeMojoAndTest( testPomBasedir, new String[] { "ClassWithJavadoc.java", "ClassWithNoJavadoc.java",
+            "InterfaceWithJavadoc.java", "InterfaceWithNoJavadoc.java" } );
+    }
+
+    /**
+     * @throws Exception if any
+     */
+    public void testFixJdk5()
+        throws Exception
+    {
+        File testPomBasedir = new File( getBasedir(), "target/test/unit/fix-jdk5-test" );
+        executeMojoAndTest( testPomBasedir, new String[] { "ClassWithJavadoc.java", "ClassWithNoJavadoc.java",
+            "InterfaceWithJavadoc.java", "InterfaceWithNoJavadoc.java", "SubClassWithJavadoc.java" } );
+    }
+
+    /**
+     * @throws Exception if any
+     */
+    public void testFixJdk6()
+        throws Exception
+    {
+        File testPomBasedir = new File( getBasedir(), "target/test/unit/fix-jdk6-test" );
+        executeMojoAndTest( testPomBasedir, new String[] { "ClassWithJavadoc.java", "InterfaceWithJavadoc.java" } );
+    }
+
+    // ----------------------------------------------------------------------
+    // Test private static methods
+    // ----------------------------------------------------------------------
+
+    /**
+     * @throws Throwable if any
+     */
+    public void testAutodetectIndentation()
+        throws Throwable
+    {
+        String s = null;
+        assertEquals( "", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "autodetectIndentation",
+                                                  new Class[] { String.class }, new Object[] { s } ) );
+
+        s = "no indentation";
+        assertEquals( "", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "autodetectIndentation",
+                                                  new Class[] { String.class }, new Object[] { s } ) );
+
+        s = "no indentation with right spaces  ";
+        assertEquals( "", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "autodetectIndentation",
+                                                  new Class[] { String.class }, new Object[] { s } ) );
+
+        s = "    indentation";
+        assertEquals( "    ", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "autodetectIndentation",
+                                                      new Class[] { String.class }, new Object[] { s } ) );
+
+        s = "    indentation with right spaces  ";
+        assertEquals( "    ", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "autodetectIndentation",
+                                                      new Class[] { String.class }, new Object[] { s } ) );
+
+        s = "\ttab indentation";
+        assertEquals( "\t", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "autodetectIndentation",
+                                                    new Class[] { String.class }, new Object[] { s } ) );
+
+        s = "  \n  indentation with right spaces  ";
+        assertEquals( "  \n  ", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "autodetectIndentation",
+                                                        new Class[] { String.class }, new Object[] { s } ) );
+    }
+
+    /**
+     * @throws Throwable if any
+     */
+    public void testTrimLeft()
+        throws Throwable
+    {
+        assertEquals( "", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimLeft",
+                                                  new Class[] { String.class }, new Object[] { null } ) );
+        assertEquals( "", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimLeft",
+                                                  new Class[] { String.class }, new Object[] { "  " } ) );
+        assertEquals( "", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimLeft",
+                                                  new Class[] { String.class }, new Object[] { "  \t  " } ) );
+        assertEquals( "a", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimLeft",
+                                                   new Class[] { String.class }, new Object[] { "a" } ) );
+        assertEquals( "a", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimLeft",
+                                                   new Class[] { String.class }, new Object[] { "  a" } ) );
+        assertEquals( "a", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimLeft",
+                                                   new Class[] { String.class }, new Object[] { "\ta" } ) );
+        assertEquals( "a  ", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimLeft",
+                                                     new Class[] { String.class }, new Object[] { "  a  " } ) );
+        assertEquals( "a\t", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimLeft",
+                                                     new Class[] { String.class }, new Object[] { "\ta\t" } ) );
+    }
+
+    /**
+     * @throws Throwable if any
+     */
+    public void testTrimRight()
+        throws Throwable
+    {
+        assertEquals( "", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimRight",
+                                                  new Class[] { String.class }, new Object[] { null } ) );
+        assertEquals( "", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimRight",
+                                                  new Class[] { String.class }, new Object[] { "  " } ) );
+        assertEquals( "", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimRight",
+                                                  new Class[] { String.class }, new Object[] { "  \t  " } ) );
+        assertEquals( "a", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimRight",
+                                                   new Class[] { String.class }, new Object[] { "a" } ) );
+        assertEquals( "a", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimRight",
+                                                   new Class[] { String.class }, new Object[] { "a  " } ) );
+        assertEquals( "a", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimRight",
+                                                   new Class[] { String.class }, new Object[] { "a\t" } ) );
+        assertEquals( "  a", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimRight",
+                                                     new Class[] { String.class }, new Object[] { "  a  " } ) );
+        assertEquals( "\ta", PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "trimRight",
+                                                     new Class[] { String.class }, new Object[] { "\ta\t" } ) );
+    }
+
+    /**
+     * @throws Throwable if any
+     */
+    public void testHasInheritedTag()
+        throws Throwable
+    {
+        String content = "/** {@inheritDoc} */";
+        Boolean has =
+            (Boolean) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "hasInheritedTag",
+                                              new Class[] { String.class }, new Object[] { content } );
+        assertEquals( Boolean.TRUE, has );
+
+        content = "/**{@inheritDoc}*/";
+        has =
+            (Boolean) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "hasInheritedTag",
+                                              new Class[] { String.class }, new Object[] { content } );
+        assertEquals( Boolean.TRUE, has );
+
+        content = "/**{@inheritDoc  }  */";
+        has =
+            (Boolean) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "hasInheritedTag",
+                                              new Class[] { String.class }, new Object[] { content } );
+        assertEquals( Boolean.TRUE, has );
+
+        content = "/**  {@inheritDoc  }  */";
+        has =
+            (Boolean) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "hasInheritedTag",
+                                              new Class[] { String.class }, new Object[] { content } );
+        assertEquals( Boolean.TRUE, has );
+
+        content = "/** */";
+        has =
+            (Boolean) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "hasInheritedTag",
+                                              new Class[] { String.class }, new Object[] { content } );
+        assertEquals( Boolean.FALSE, has );
+
+        content = "/**{  @inheritDoc  }*/";
+        has =
+            (Boolean) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "hasInheritedTag",
+                                              new Class[] { String.class }, new Object[] { content } );
+        assertEquals( Boolean.FALSE, has );
+
+        content = "/**{@ inheritDoc}*/";
+        has =
+            (Boolean) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "hasInheritedTag",
+                                              new Class[] { String.class }, new Object[] { content } );
+        assertEquals( Boolean.FALSE, has );
+    }
+
+    /**
+     * @throws Throwable if any
+     */
+    public void testJavadocComment()
+        throws Throwable
+    {
+        String content = "/**" + EOL +
+                " * Dummy Class." + EOL +
+                " */" + EOL +
+                "public class DummyClass" + EOL +
+                "{" + EOL +
+                "    /**" + EOL +
+                "     *" + EOL +
+                "     * Dummy" + EOL +
+                "     *" + EOL +
+                "     *      Method." + EOL +
+                "     *" + EOL +
+                "     * @param args not" + EOL +
+                "     *" + EOL +
+                "     * null" + EOL +
+                "     * @param i non negative" + EOL +
+                "     * @param object could" + EOL +
+                "     * be" + EOL +
+                "     *      null" + EOL +
+                "     * @return a" + EOL +
+                "     * String" + EOL +
+                "     *" + EOL +
+                "     * @throws Exception if" + EOL +
+                "     * any" + EOL +
+                "     *" + EOL +
+                "     */" + EOL +
+                "    public static String dummyMethod( String[] args, int i, Object object )" + EOL +
+                "        throws Exception" + EOL +
+                "    {" + EOL +
+                "        return null;" + EOL +
+                "    }" + EOL +
+                "}";
+
+        JavaDocBuilder builder = new JavaDocBuilder();
+        builder.setEncoding( "UTF-8" );
+        builder.addSource( new StringReader( content ) );
+
+        JavaClass[] classes = builder.getClasses();
+        JavaClass clazz = classes[0];
+
+        JavaMethod javaMethod = clazz.getMethods()[0];
+
+        String javadoc =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "extractOriginalJavadoc", new Class[] {
+                String.class, AbstractJavaEntity.class }, new Object[] { content, javaMethod } );
+        assertEquals( "    /**" + EOL +
+                "     *" + EOL +
+                "     * Dummy" + EOL +
+                "     *" + EOL +
+                "     *      Method." + EOL +
+                "     *" + EOL +
+                "     * @param args not" + EOL +
+                "     *" + EOL +
+                "     * null" + EOL +
+                "     * @param i non negative" + EOL +
+                "     * @param object could" + EOL +
+                "     * be" + EOL +
+                "     *      null" + EOL +
+                "     * @return a" + EOL +
+                "     * String" + EOL +
+                "     *" + EOL +
+                "     * @throws Exception if" + EOL +
+                "     * any" + EOL +
+                "     *" + EOL +
+                "     */", javadoc );
+
+        String javadocContent =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "extractOriginalJavadocContent",
+                                             new Class[] { String.class, AbstractJavaEntity.class }, new Object[] {
+                                                 content, javaMethod } );
+        assertEquals( "     *" + EOL +
+                      "     * Dummy" + EOL +
+                      "     *" + EOL +
+                      "     *      Method." + EOL +
+                      "     *" + EOL +
+                      "     * @param args not" + EOL +
+                      "     *" + EOL +
+                      "     * null" + EOL +
+                      "     * @param i non negative" + EOL +
+                      "     * @param object could" + EOL +
+                      "     * be" + EOL +
+                      "     *      null" + EOL +
+                      "     * @return a" + EOL +
+                      "     * String" + EOL +
+                      "     *" + EOL +
+                      "     * @throws Exception if" + EOL +
+                      "     * any" + EOL +
+                      "     *", javadocContent );
+
+        String withoutEmptyJavadocLines =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "removeLastEmptyJavadocLines",
+                                             new Class[] { String.class }, new Object[] { javadocContent } );
+        assertTrue( withoutEmptyJavadocLines.endsWith( "any" ) );
+
+        String methodJavadoc =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "getJavadocComment", new Class[] {
+                String.class, AbstractJavaEntity.class }, new Object[] { content, javaMethod } );
+        assertEquals( "     *" + EOL +
+                "     * Dummy" + EOL +
+                "     *" + EOL +
+                "     *      Method." + EOL +
+                "     *", methodJavadoc );
+        withoutEmptyJavadocLines =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "removeLastEmptyJavadocLines",
+                                             new Class[] { String.class }, new Object[] { methodJavadoc } );
+        assertTrue( withoutEmptyJavadocLines.endsWith( "Method." ) );
+
+        assertEquals( 5, javaMethod.getTags().length );
+
+        AbstractFixJavadocMojo mojoInstance = new FixJavadocMojo();
+        setVariableValueToObject( mojoInstance, "fixTagsSplitted", new String[] { "all" } );
+
+        DocletTag tag = javaMethod.getTags()[0];
+        String tagJavadoc =
+            (String) PrivateAccessor.invoke( mojoInstance, "getJavadocComment", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class, DocletTag.class }, new Object[] { content,
+                javaMethod, tag } );
+        assertEquals( "     * @param args not" + EOL +
+                "     *" + EOL +
+                "     * null", tagJavadoc );
+        withoutEmptyJavadocLines =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "removeLastEmptyJavadocLines",
+                                             new Class[] { String.class }, new Object[] { tagJavadoc } );
+        assertTrue( withoutEmptyJavadocLines.endsWith( "null" ) );
+
+        tag = javaMethod.getTags()[1];
+        tagJavadoc =
+            (String) PrivateAccessor.invoke( mojoInstance, "getJavadocComment", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class, DocletTag.class }, new Object[] { content,
+                javaMethod, tag } );
+        assertEquals( "     * @param i non negative", tagJavadoc );
+        withoutEmptyJavadocLines =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "removeLastEmptyJavadocLines",
+                                             new Class[] { String.class }, new Object[] { tagJavadoc } );
+        assertTrue( withoutEmptyJavadocLines.endsWith( "negative" ) );
+
+        tag = javaMethod.getTags()[2];
+        tagJavadoc =
+            (String) PrivateAccessor.invoke( mojoInstance, "getJavadocComment", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class, DocletTag.class }, new Object[] { content,
+                javaMethod, tag } );
+        assertEquals( "     * @param object could" + EOL +
+                "     * be" + EOL +
+                "     *      null", tagJavadoc );
+        withoutEmptyJavadocLines =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "removeLastEmptyJavadocLines",
+                                             new Class[] { String.class }, new Object[] { tagJavadoc } );
+        assertTrue( withoutEmptyJavadocLines.endsWith( "null" ) );
+
+        tag = javaMethod.getTags()[3];
+        tagJavadoc =
+            (String) PrivateAccessor.invoke( mojoInstance, "getJavadocComment", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class, DocletTag.class }, new Object[] { content,
+                javaMethod, tag } );
+        assertEquals( "     * @return a" + EOL +
+                "     * String" + EOL +
+                "     *", tagJavadoc );
+        withoutEmptyJavadocLines =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "removeLastEmptyJavadocLines",
+                                             new Class[] { String.class }, new Object[] { tagJavadoc } );
+        assertTrue( withoutEmptyJavadocLines.endsWith( "String" ) );
+
+        tag = javaMethod.getTags()[4];
+        tagJavadoc =
+            (String) PrivateAccessor.invoke( mojoInstance, "getJavadocComment", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class, DocletTag.class }, new Object[] { content,
+                javaMethod, tag } );
+        assertEquals( "     * @throws Exception if" + EOL +
+                "     * any" + EOL +
+                "     *", tagJavadoc );
+        withoutEmptyJavadocLines =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "removeLastEmptyJavadocLines",
+                                             new Class[] { String.class }, new Object[] { tagJavadoc } );
+        assertTrue( withoutEmptyJavadocLines.endsWith( "any" ) );
+    }
+
+    /**
+     * @throws Throwable if any
+     */
+    public void testJavadocCommentJdk5()
+        throws Throwable
+    {
+        String content = "/**" + EOL +
+                " * Dummy Class." + EOL +
+                " */" + EOL +
+                "public class DummyClass" + EOL +
+                "{" + EOL +
+                "    /**" + EOL +
+                "     * Dummy method." + EOL +
+                "     *" + EOL +
+                "     * @param <K>  The Key type for the method" + EOL +
+                "     * @param <V>  The Value type for the method" + EOL +
+                "     * @param name The name." + EOL +
+                "     * @return A map configured." + EOL +
+                "     */" + EOL +
+                "    public <K, V> java.util.Map<K, V> dummyMethod( String name )" + EOL +
+                "    {" + EOL +
+                "        return null;" + EOL +
+                "    }" + EOL +
+                "}";
+
+        JavaDocBuilder builder = new JavaDocBuilder();
+        builder.setEncoding( "UTF-8" );
+        builder.addSource( new StringReader( content ) );
+
+        JavaClass[] classes = builder.getClasses();
+        JavaClass clazz = classes[0];
+
+        JavaMethod javaMethod = clazz.getMethods()[0];
+
+        String methodJavadoc =
+            (String) PrivateAccessor.invoke( AbstractFixJavadocMojo.class, "getJavadocComment", new Class[] {
+                String.class, AbstractJavaEntity.class }, new Object[] { content, javaMethod } );
+        assertEquals( "     * Dummy method." + EOL +
+                "     *", methodJavadoc );
+
+        assertEquals( 4, javaMethod.getTags().length );
+
+        AbstractFixJavadocMojo mojoInstance = new FixJavadocMojo();
+        setVariableValueToObject( mojoInstance, "fixTagsSplitted", new String[] { "all" } );
+
+        DocletTag tag = javaMethod.getTags()[0];
+        String tagJavadoc =
+            (String) PrivateAccessor.invoke( mojoInstance, "getJavadocComment", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class, DocletTag.class }, new Object[] { content,
+                javaMethod, tag } );
+        assertEquals( "     * @param <K>  The Key type for the method", tagJavadoc );
+
+        tag = javaMethod.getTags()[1];
+        tagJavadoc =
+            (String) PrivateAccessor.invoke( mojoInstance, "getJavadocComment", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class, DocletTag.class }, new Object[] { content,
+                javaMethod, tag } );
+        assertEquals( "     * @param <V>  The Value type for the method", tagJavadoc );
+
+        tag = javaMethod.getTags()[2];
+        tagJavadoc =
+            (String) PrivateAccessor.invoke( mojoInstance, "getJavadocComment", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class, DocletTag.class }, new Object[] { content,
+                javaMethod, tag } );
+        assertEquals( "     * @param name The name.", tagJavadoc );
+
+        tag = javaMethod.getTags()[3];
+        tagJavadoc =
+            (String) PrivateAccessor.invoke( mojoInstance, "getJavadocComment", new Class[] {
+                String.class, AbstractInheritableJavaEntity.class, DocletTag.class }, new Object[] { content,
+                javaMethod, tag } );
+        assertEquals( "     * @return A map configured.", tagJavadoc );
+    }
+    
+    public void testInitParameters() 
+        throws Throwable
+    {
+        AbstractFixJavadocMojo mojoInstance = new FixJavadocMojo();
+        setVariableValueToObject( mojoInstance, "fixTags", "author, version, since, param, return, throws, link" );
+        setVariableValueToObject(mojoInstance, "defaultSince", "1.0");
+        setVariableValueToObject(mojoInstance, "level", "protected");
+        
+        PrivateAccessor.invoke( mojoInstance, "init", new Class[] { }, new String[] { } );
+        
+        String[] fixTags = (String[]) getVariableValueFromObject(mojoInstance, "fixTagsSplitted");
+        
+        assertEquals("author", fixTags[0]);
+        assertEquals("version", fixTags[1]);
+        assertEquals("since", fixTags[2]);
+        assertEquals("param", fixTags[3]);
+        assertEquals("return", fixTags[4]);
+        assertEquals("throws", fixTags[5]);
+        assertEquals("link", fixTags[6]);
+        assertEquals(7, fixTags.length);
+        
+        setVariableValueToObject( mojoInstance, "fixTags", "return, fake_value" );
+        PrivateAccessor.invoke( mojoInstance, "init", new Class[] { }, new String[] { } );
+        fixTags = (String[]) getVariableValueFromObject(mojoInstance, "fixTagsSplitted");
+        
+        assertEquals("return", fixTags[0]);
+        assertEquals(1, fixTags.length);
+    }
+    
+    public void testRemoveUnknownExceptions() throws Exception
+    {
+        AbstractFixJavadocMojo mojoInstance = new FixJavadocMojo();
+        setVariableValueToObject( mojoInstance, "fixTagsSplitted", new String[] { "all" } );
+        setVariableValueToObject( mojoInstance, "project", new MavenProjectStub() );
+
+        String source = "package a.b.c;" + EOL
+                        + "public class Clazz {" + EOL
+                        + " /**" + EOL
+                        + " * @throws java.lang.RuntimeException" + EOL
+                        + " * @throws NumberFormatException" + EOL
+                        + " * @throws java.lang.Exception" + EOL // not thrown and no RTE -> remove
+                        + " * @throws com.foo.FatalException" + EOL // not on classpath (?!) -> see removeUnknownThrows
+                        + " */" + EOL
+                        + " public void method() {}" + EOL                        
+                        + "}";
+
+        JavaDocBuilder builder = new JavaDocBuilder();
+        JavaMethod javaMethod = builder.addSource( new StringReader( source ) ).getClasses()[0].getMethods()[0];
+        
+        JavaEntityTags javaEntityTags = mojoInstance.parseJavadocTags( source, javaMethod, "", true );
+        
+        StringBuilder sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "java.lang.RuntimeException" } );
+        assertEquals( " * @throws java.lang.RuntimeException", sb.toString() );
+
+        sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "NumberFormatException" } );
+        assertEquals( " * @throws java.lang.NumberFormatException", sb.toString() );
+
+        sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "java.lang.Exception" } );
+        assertEquals( "", sb.toString() );
+        
+        setVariableValueToObject( mojoInstance, "removeUnknownThrows", true );
+        sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "com.foo.FatalException" } );
+        assertEquals( "", sb.toString() );
+
+        setVariableValueToObject( mojoInstance, "removeUnknownThrows", false );
+        sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "com.foo.FatalException" } );
+        assertEquals( " * @throws com.foo.FatalException if any.", sb.toString() );
+    }
+
+    // ----------------------------------------------------------------------
+    // private methods
+    // ----------------------------------------------------------------------
+
+    /**
+     * @param testPomBasedir the basedir for the test project
+     * @param clazzToCompare an array of the classes name to compare
+     * @throws Exception if any
+     */
+    private void executeMojoAndTest( File testPomBasedir, String[] clazzToCompare )
+        throws Exception
+    {
+        prepareTestProjects( testPomBasedir.getName() );
+
+        File testPom = new File( testPomBasedir, "pom.xml" );
+        assertTrue( testPom.getAbsolutePath() + " should exist", testPom.exists() );
+
+        FixJavadocMojo mojo = (FixJavadocMojo) lookupMojo( "fix", testPom );
+        assertNotNull( mojo );
+
+        // compile the test project
+        invokeCompileGoal( testPom, mojo.getLog() );
+        assertTrue( new File( testPomBasedir, "target/classes" ).exists() );
+
+        mojo.execute();
+
+        File expectedDir = new File( testPomBasedir, "expected/src/main/java/fix/test" );
+        assertTrue( expectedDir.exists() );
+
+        File generatedDir = new File( testPomBasedir, "target/generated/fix/test" );
+        assertTrue( generatedDir.exists() );
+
+        for (String className : clazzToCompare) {
+            assertEquals(new File(expectedDir, className), new File(generatedDir, className));
+        }
+    }
+
+    /**
+     * Invoke the compilation on the given pom file.
+     *
+     * @param testPom not null
+     * @param log not null
+     * @throws MavenInvocationException if any
+     */
+    private void invokeCompileGoal( File testPom, Log log )
+        throws MavenInvocationException
+    {
+        List<String> goals = new ArrayList<String>();
+        goals.add( "clean" );
+        goals.add( "compile" );
+        File invokerDir = new File( getBasedir(), "target/invoker" );
+        invokerDir.mkdirs();
+        File invokerLogFile = FileUtils.createTempFile( "FixJavadocMojoTest", ".txt", invokerDir );
+        JavadocUtil.invokeMaven( log, new File( getBasedir(), "target/local-repo" ), testPom, goals, null,
+                                 invokerLogFile );
+    }
+
+    // ----------------------------------------------------------------------
+    // static methods
+    // ----------------------------------------------------------------------
+
+    /**
+     * Asserts that files are equal. If they are not an AssertionFailedError is thrown.
+     *
+     * @throws IOException if any
+     */
+    private static void assertEquals( File expected, File actual )
+        throws IOException
+    {
+        assertTrue( " Expected file DNE: " + expected, expected.exists() );
+        String expectedContent = StringUtils.unifyLineSeparators( readFile( expected ) );
+
+        assertTrue( " Actual file DNE: " + actual, actual.exists() );
+        String actualContent = StringUtils.unifyLineSeparators( readFile( actual ) );
+
+        assertEquals( "Expected file: " + expected.getAbsolutePath() + ", actual file: "
+            + actual.getAbsolutePath(), expectedContent, actualContent );
+    }
+
+    /**
+     * @param testProjectDirName not null
+     * @throws IOException if any
+     */
+    private static void prepareTestProjects( String testProjectDirName )
+        throws IOException
+    {
+        File testPomBasedir = new File( getBasedir(), "target/test/unit/" + testProjectDirName );
+
+        // Using unit test dir
+        FileUtils
+                 .copyDirectoryStructure(
+                                          new File( getBasedir(), "src/test/resources/unit/" + testProjectDirName ),
+                                          testPomBasedir );
+        List<String> scmFiles = FileUtils.getDirectoryNames( testPomBasedir, "**/.svn", null, true );
+        for ( String filename : scmFiles )
+        {
+            File dir = new File( filename );
+
+            if ( dir.isDirectory() )
+            {
+                FileUtils.deleteDirectory( dir );
+            }
+        }
+    }
+
+    /**
+     * @param file not null
+     * @return the content of the given file
+     * @throws IOException if any
+     */
+    private static String readFile( File file )
+        throws IOException
+    {
+        Reader fileReader = null;
+        try
+        {
+            fileReader = ReaderFactory.newReader( file, "UTF-8" );
+            final String content = IOUtil.toString( fileReader );
+            fileReader.close();
+            fileReader = null;
+            return content;
+        }
+        finally
+        {
+            IOUtil.close( fileReader );
+        }
+    }
+}

Added: maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/JavadocJarTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/JavadocJarTest.java?rev=1801772&view=auto
==============================================================================
--- maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/JavadocJarTest.java (added)
+++ maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugins/javadoc/JavadocJarTest.java Wed Jul 12 19:59:51 2017
@@ -0,0 +1,196 @@
+package org.apache.maven.plugins.javadoc;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.testing.AbstractMojoTestCase;
+import org.apache.maven.plugins.javadoc.AbstractJavadocMojo;
+import org.apache.maven.plugins.javadoc.JavadocJar;
+import org.apache.maven.plugins.javadoc.JavadocVersion;
+import org.codehaus.plexus.util.FileUtils;
+
+/**
+ * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
+ */
+public class JavadocJarTest
+    extends AbstractMojoTestCase
+{
+    
+    private JavadocJar lookupMojo( File testPom )
+                    throws Exception
+    {
+        JavadocJar mojo = (JavadocJar) lookupMojo( "jar", testPom );
+        
+        PluginDescriptor pluginDescriptor = new PluginDescriptor();
+        pluginDescriptor.setPlugin( new Plugin() );
+        
+        setVariableValueToObject( mojo, "plugin", pluginDescriptor );
+        return mojo;
+    }
+
+
+    /**
+     * Test when default configuration is provided
+     *
+     * @throws Exception if any
+     */
+    public void testDefaultConfig()
+        throws Exception
+    {
+        File testPom =
+            new File( getBasedir(), "src/test/resources/unit/javadocjar-default/javadocjar-default-plugin-config.xml" );
+        JavadocJar mojo = lookupMojo( testPom );
+        mojo.execute();
+
+        //check if the javadoc jar file was generated
+        File generatedFile =
+            new File( getBasedir(), "target/test/unit/javadocjar-default/target/javadocjar-default-javadoc.jar" );
+        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+
+        //validate contents of jar file
+        ZipFile jar = new ZipFile( generatedFile );
+        Set<String> set = new HashSet<String>();
+        for( Enumeration<? extends ZipEntry> entries = jar.entries(); entries.hasMoreElements(); )
+        {
+            ZipEntry entry = entries.nextElement();
+            set.add( entry.getName() );
+        }
+
+        assertTrue( set.contains( "stylesheet.css" ) );
+        JavadocVersion javadocVersion = (JavadocVersion) getVariableValueFromObject( mojo, "javadocRuntimeVersion" );
+        if ( javadocVersion.compareTo( JavadocVersion.parse( "1.7" ) ) < 0 )
+        {
+            assertTrue( set.contains( "resources/inherit.gif" ) );
+        }
+        else if ( javadocVersion.compareTo( JavadocVersion.parse( "1.8" ) ) < 0 )
+        {
+            assertTrue( set.contains( "resources/background.gif" ) /* JDK7 */);
+        }
+        else
+        {
+            // JDK8 has no resources anymore
+            assertFalse( set.contains( "resources" ) );
+        }
+
+        assertTrue( set.contains( "javadocjar/def/package-use.html" ) );
+        assertTrue( set.contains( "javadocjar/def/package-tree.html" ) );
+        assertTrue( set.contains( "javadocjar/def/package-summary.html" ) );
+        assertTrue( set.contains( "javadocjar/def/package-frame.html" ) );
+        assertTrue( set.contains( "javadocjar/def/class-use/AppSample.html" ) );
+        assertTrue( set.contains( "index.html" ) );
+        assertTrue( set.contains( "javadocjar/def/App.html" ) );
+        assertTrue( set.contains( "javadocjar/def/AppSample.html" ) );
+        assertTrue( set.contains( "javadocjar/def/class-use/App.html" ) );
+
+        assertFalse( set.contains( AbstractJavadocMojo.ARGFILE_FILE_NAME ) );
+        assertFalse( set.contains( AbstractJavadocMojo.FILES_FILE_NAME ) );
+        assertFalse( set.contains( AbstractJavadocMojo.OPTIONS_FILE_NAME ) );
+        assertFalse( set.contains( AbstractJavadocMojo.PACKAGES_FILE_NAME ) );
+
+        //check if the javadoc files were created
+        generatedFile =
+            new File( getBasedir(), "target/test/unit/javadocjar-default/target/site/apidocs/javadocjar/def/App.html" );
+        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+
+        generatedFile = new File( getBasedir(),
+                                  "target/test/unit/javadocjar-default/target/site/apidocs/javadocjar/def/AppSample.html" );
+        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+    }
+
+    /**
+     * Test when the specified destDir parameter has an invalid value
+     *
+     * @throws Exception if any
+     */
+    public void testInvalidDestdir()
+        throws Exception
+    {
+        File testPom = new File( getBasedir(),
+                                 "src/test/resources/unit/javadocjar-invalid-destdir/javadocjar-invalid-destdir-plugin-config.xml" );
+        JavadocJar mojo = lookupMojo( testPom );
+        mojo.execute();
+
+        //check if the javadoc jar file was generated
+        File generatedFile = new File( getBasedir(),
+                                       "target/test/unit/javadocjar-invalid-destdir/target/javadocjar-invalid-destdir-javadoc.jar" );
+        assertTrue( !FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+    }
+
+    public void testContinueIfFailOnErrorIsFalse() throws Exception
+    {
+        File testPom =
+                new File( getBasedir(), "src/test/resources/unit/javadocjar-failonerror/javadocjar-failonerror-plugin-config.xml" );
+        JavadocJar mojo = lookupMojo( testPom );
+        mojo.execute();
+
+        //check if the javadoc jar file was generated
+        File generatedFile =
+                new File( getBasedir(), "target/test/unit/javadocjar-failonerror/target/javadocjar-failonerror-javadoc.jar" );
+        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+    }
+
+    public void testIncludeMavenDescriptorWhenExplicitlyConfigured() throws Exception
+    {
+        File testPom =
+                new File( getBasedir(), "src/test/resources/unit/javadocjar-archive-config/javadocjar-archive-config.xml" );
+        JavadocJar mojo = lookupMojo( testPom );
+        mojo.execute();
+
+        //check if the javadoc jar file was generated
+        File generatedFile =
+                new File( getBasedir(), "target/test/unit/javadocjar-archive-config/target/javadocjar-archive-config-javadoc.jar" );
+        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+
+        //validate contents of jar file
+        ZipFile jar = new ZipFile( generatedFile );
+        Set<String> set = new HashSet<String>();
+        for (Enumeration<? extends ZipEntry> entries = jar.entries(); entries.hasMoreElements(); )
+        {
+            ZipEntry entry = entries.nextElement();
+            set.add( entry.getName() );
+        }
+        jar.close();
+
+        List<String> expected = new ArrayList();
+        expected.add( "META-INF/" );
+        expected.add( "META-INF/maven/" );
+        expected.add( "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/" );
+        expected.add( "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/" );
+        expected.add( "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/pom.xml" );
+        expected.add( "META-INF/maven/org.apache.maven.plugins.maven-javadoc-plugin.unit/javadocjar-archive-config/pom.properties" );
+
+        for (int i = 0; i < expected.size(); i++)
+        {
+            String entry = expected.get( i );
+            assertTrue( "Expected jar to contain " + entry, set.contains( entry ) );
+        }
+    }
+}