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.source;
20  
21  import java.io.File;
22  import java.nio.file.Paths;
23  import java.util.Collections;
24  
25  import org.apache.maven.api.Project;
26  import org.apache.maven.api.ProjectScope;
27  import org.apache.maven.api.di.Provides;
28  import org.apache.maven.api.plugin.testing.Basedir;
29  import org.apache.maven.api.plugin.testing.InjectMojo;
30  import org.apache.maven.api.plugin.testing.MojoParameter;
31  import org.apache.maven.api.plugin.testing.MojoTest;
32  import org.apache.maven.api.plugin.testing.stubs.SessionMock;
33  import org.apache.maven.api.services.ProjectManager;
34  import org.apache.maven.internal.impl.InternalSession;
35  import org.junit.jupiter.api.Test;
36  
37  import static org.apache.maven.api.plugin.testing.MojoExtension.getBasedir;
38  import static org.junit.jupiter.api.Assertions.assertFalse;
39  import static org.mockito.ArgumentMatchers.any;
40  import static org.mockito.ArgumentMatchers.eq;
41  import static org.mockito.Mockito.mock;
42  import static org.mockito.Mockito.when;
43  
44  /**
45   * @author <a href="mailto:oching@exist.com">Maria Odea Ching</a>
46   */
47  @MojoTest
48  public class TestSourceJarMojoTest extends AbstractSourcePluginTestCase {
49  
50      @Test
51      @InjectMojo(goal = "test-jar")
52      @Basedir("${basedir}/target/test-classes/unit/project-001")
53      @MojoParameter(name = "classifier", value = "test-sources")
54      public void testDefaultConfiguration(AbstractSourceJarMojo mojo) throws Exception {
55          mojo.execute();
56  
57          File target = new File(getBasedir(), "target");
58          assertTestSourceArchive(target, "project-001");
59          assertJarContent(getTestSourceArchive(target, "project-001"), new String[] {
60              "test-default-configuration.properties",
61              "foo/project001/AppTest.java",
62              "foo/project001/",
63              "foo/",
64              "META-INF/MANIFEST.MF",
65              "META-INF/",
66              "META-INF/maven/",
67              "META-INF/maven/source/",
68              "META-INF/maven/source/maven-source-plugin-test-project-001/",
69              "META-INF/maven/source/maven-source-plugin-test-project-001/pom.properties",
70              "META-INF/maven/source/maven-source-plugin-test-project-001/pom.xml"
71          });
72      }
73  
74      @Test
75      @InjectMojo(goal = "test-jar")
76      @Basedir("${basedir}/target/test-classes/unit/project-003")
77      @MojoParameter(name = "classifier", value = "test-sources")
78      public void testExcludes(AbstractSourceJarMojo mojo) throws Exception {
79          mojo.execute();
80  
81          File target = new File(getBasedir(), "target");
82          assertTestSourceArchive(target, "project-003");
83          assertJarContent(getTestSourceArchive(target, "project-003"), new String[] {
84              "test-default-configuration.properties",
85              "foo/project003/AppTest.java",
86              "foo/project003/",
87              "foo/",
88              "META-INF/MANIFEST.MF",
89              "META-INF/",
90              "META-INF/maven/",
91              "META-INF/maven/source/",
92              "META-INF/maven/source/maven-source-plugin-test-project-003/",
93              "META-INF/maven/source/maven-source-plugin-test-project-003/pom.properties",
94              "META-INF/maven/source/maven-source-plugin-test-project-003/pom.xml"
95          });
96      }
97  
98      @Test
99      @InjectMojo(goal = "test-jar")
100     @Basedir("${basedir}/target/test-classes/unit/project-005")
101     @MojoParameter(name = "classifier", value = "test-sources")
102     public void testNoSources(AbstractSourceJarMojo mojo) throws Exception {
103         mojo.execute();
104 
105         // Now make sure that no archive got created
106         final File expectedFile = getTestTargetDir("project-005");
107         assertFalse(
108                 expectedFile.exists(),
109                 "Test source archive should not have been created[" + expectedFile.getAbsolutePath() + "]");
110     }
111 
112     @Test
113     @InjectMojo(goal = "test-jar")
114     @Basedir("${basedir}/target/test-classes/unit/project-010")
115     @MojoParameter(name = "classifier", value = "test-sources")
116     public void testIncludeMavenDescriptorWhenExplicitlyConfigured(AbstractSourceJarMojo mojo) throws Exception {
117         mojo.execute();
118 
119         File target = new File(getBasedir(), "target");
120         assertTestSourceArchive(target, "project-010");
121         assertJarContent(getTestSourceArchive(target, "project-010"), new String[] {
122             "test-default-configuration.properties",
123             "foo/project010/AppTest.java",
124             "foo/project010/",
125             "foo/",
126             "META-INF/MANIFEST.MF",
127             "META-INF/",
128             "META-INF/maven/",
129             "META-INF/maven/source/",
130             "META-INF/maven/source/maven-source-plugin-test-project-010/",
131             "META-INF/maven/source/maven-source-plugin-test-project-010/pom.xml",
132             "META-INF/maven/source/maven-source-plugin-test-project-010/pom" + ".properties"
133         });
134     }
135 
136     @Provides
137     InternalSession createSession() {
138         InternalSession session = SessionMock.getMockSession("target/local-repo");
139         ProjectManager projectManager = mock(ProjectManager.class);
140         when(session.getService(ProjectManager.class)).thenReturn(projectManager);
141         when(projectManager.getCompileSourceRoots(any(), eq(ProjectScope.TEST))).thenAnswer(iom -> {
142             Project p = iom.getArgument(0, Project.class);
143             return Collections.singletonList(
144                     Paths.get(getBasedir()).resolve(p.getModel().getBuild().getTestSourceDirectory()));
145         });
146         when(projectManager.getResources(any(), eq(ProjectScope.TEST))).thenAnswer(iom -> {
147             Project p = iom.getArgument(0, Project.class);
148             return p.getBuild().getTestResources().stream()
149                     .map(r -> r.withDirectory(
150                             Paths.get(getBasedir()).resolve(r.getDirectory()).toString()))
151                     .toList();
152         });
153         return session;
154     }
155 }