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.deploy;
20  
21  import java.io.File;
22  import java.util.ArrayList;
23  import java.util.List;
24  import java.util.Objects;
25  
26  import org.apache.maven.execution.MavenSession;
27  import org.apache.maven.model.Model;
28  import org.apache.maven.plugin.testing.AbstractMojoTestCase;
29  import org.apache.maven.project.ProjectBuildingRequest;
30  import org.eclipse.aether.DefaultRepositorySystemSession;
31  import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
32  import org.eclipse.aether.repository.LocalRepository;
33  import org.mockito.InjectMocks;
34  import org.mockito.Mock;
35  import org.mockito.MockitoAnnotations;
36  
37  import static org.mockito.Mockito.mock;
38  import static org.mockito.Mockito.when;
39  
40  /**
41   * @author <a href="mailto:aramirez@apache.org">Allan Ramirez</a>
42   */
43  public class DeployFileMojoTest extends AbstractMojoTestCase {
44      private final String LOCAL_REPO = getBasedir() + "/target/local-repo";
45  
46      private List<String> expectedFiles;
47  
48      private List<String> fileList;
49  
50      private File remoteRepo;
51  
52      @Mock
53      private MavenSession session;
54  
55      @InjectMocks
56      private DeployFileMojo mojo;
57  
58      public void setUp() throws Exception {
59          super.setUp();
60  
61          remoteRepo = new File(getBasedir(), "target/remote-repo");
62  
63          if (!remoteRepo.exists()) {
64              remoteRepo.mkdirs();
65          }
66      }
67  
68      public void testDeployTestEnvironment() throws Exception {
69          File testPom = new File(getBasedir(), "target/test-classes/unit/deploy-file-test/plugin-config.xml");
70  
71          AbstractDeployMojo mojo = (AbstractDeployMojo) lookupMojo("deploy-file", testPom);
72  
73          assertNotNull(mojo);
74      }
75  
76      public void testBasicDeployFile() throws Exception {
77          File testPom = new File(getBasedir(), "target/test-classes/unit/deploy-file-test/plugin-config.xml");
78  
79          mojo = (DeployFileMojo) lookupMojo("deploy-file", testPom);
80  
81          MockitoAnnotations.initMocks(this);
82  
83          assertNotNull(mojo);
84  
85          ProjectBuildingRequest buildingRequest = mock(ProjectBuildingRequest.class);
86          when(buildingRequest.getRepositoryMerging()).thenReturn(ProjectBuildingRequest.RepositoryMerging.POM_DOMINANT);
87          when(session.getProjectBuildingRequest()).thenReturn(buildingRequest);
88          DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
89          repositorySession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
90                  .newInstance(repositorySession, new LocalRepository(LOCAL_REPO)));
91          when(buildingRequest.getRepositorySession()).thenReturn(repositorySession);
92          when(session.getRepositorySession()).thenReturn(repositorySession);
93  
94          String groupId = (String) getVariableValueFromObject(mojo, "groupId");
95  
96          String artifactId = (String) getVariableValueFromObject(mojo, "artifactId");
97  
98          String version = (String) getVariableValueFromObject(mojo, "version");
99  
100         String packaging = (String) getVariableValueFromObject(mojo, "packaging");
101 
102         File file = (File) getVariableValueFromObject(mojo, "file");
103 
104         String repositoryId = (String) getVariableValueFromObject(mojo, "repositoryId");
105 
106         String url = (String) getVariableValueFromObject(mojo, "url");
107 
108         String skip = (String) getVariableValueFromObject(mojo, "skip");
109 
110         assertEquals("org.apache.maven.test", groupId);
111 
112         assertEquals("maven-deploy-file-test", artifactId);
113 
114         assertEquals("1.0", version);
115 
116         assertEquals("jar", packaging);
117 
118         assertEquals("snapshots", skip);
119 
120         assertTrue(file.exists());
121 
122         assertEquals("deploy-test", repositoryId);
123 
124         assertEquals("file://" + getBasedir() + "/target/remote-repo/deploy-file-test", url);
125 
126         mojo.execute();
127 
128         // check the generated pom
129         File pom = new File(
130                 remoteRepo,
131                 "deploy-file-test/" + groupId.replace('.', '/') + "/"
132                         + artifactId + "/" + version + "/" + artifactId + "-"
133                         + version + ".pom");
134 
135         assertTrue(pom.exists());
136 
137         Model model = mojo.readModel(pom);
138 
139         assertEquals("4.0.0", model.getModelVersion());
140 
141         assertEquals(groupId, model.getGroupId());
142 
143         assertEquals(artifactId, model.getArtifactId());
144 
145         assertEquals(version, model.getVersion());
146 
147         assertEquals(packaging, model.getPackaging());
148 
149         assertEquals("POM was created from deploy:deploy-file", model.getDescription());
150 
151         // check the remote-repo
152         expectedFiles = new ArrayList<>();
153         fileList = new ArrayList<>();
154 
155         File repo = new File(remoteRepo, "deploy-file-test");
156 
157         File[] files = repo.listFiles();
158 
159         for (File file1 : Objects.requireNonNull(files)) {
160             addFileToList(file1, fileList);
161         }
162 
163         expectedFiles.add("org");
164         expectedFiles.add("apache");
165         expectedFiles.add("maven");
166         expectedFiles.add("test");
167         expectedFiles.add("maven-deploy-file-test");
168         expectedFiles.add("1.0");
169         expectedFiles.add("maven-metadata.xml");
170         expectedFiles.add("maven-metadata.xml.md5");
171         expectedFiles.add("maven-metadata.xml.sha1");
172         expectedFiles.add("maven-deploy-file-test-1.0.jar");
173         expectedFiles.add("maven-deploy-file-test-1.0.jar.md5");
174         expectedFiles.add("maven-deploy-file-test-1.0.jar.sha1");
175         expectedFiles.add("maven-deploy-file-test-1.0.pom");
176         expectedFiles.add("maven-deploy-file-test-1.0.pom.md5");
177         expectedFiles.add("maven-deploy-file-test-1.0.pom.sha1");
178 
179         assertEquals(expectedFiles.size(), fileList.size());
180 
181         assertEquals(0, getSizeOfExpectedFiles(fileList, expectedFiles));
182     }
183 
184     public void testDeployIfClassifierIsSet() throws Exception {
185         File testPom = new File(getBasedir(), "target/test-classes/unit/deploy-file-classifier/plugin-config.xml");
186 
187         mojo = (DeployFileMojo) lookupMojo("deploy-file", testPom);
188 
189         MockitoAnnotations.initMocks(this);
190 
191         assertNotNull(mojo);
192 
193         ProjectBuildingRequest buildingRequest = mock(ProjectBuildingRequest.class);
194         when(buildingRequest.getRepositoryMerging()).thenReturn(ProjectBuildingRequest.RepositoryMerging.POM_DOMINANT);
195         when(session.getProjectBuildingRequest()).thenReturn(buildingRequest);
196         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
197         repositorySession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
198                 .newInstance(repositorySession, new LocalRepository(LOCAL_REPO)));
199         when(buildingRequest.getRepositorySession()).thenReturn(repositorySession);
200         when(session.getRepositorySession()).thenReturn(repositorySession);
201 
202         String classifier = (String) getVariableValueFromObject(mojo, "classifier");
203 
204         String groupId = (String) getVariableValueFromObject(mojo, "groupId");
205 
206         String artifactId = (String) getVariableValueFromObject(mojo, "artifactId");
207 
208         String version = (String) getVariableValueFromObject(mojo, "version");
209 
210         assertEquals("bin", classifier);
211 
212         mojo.execute();
213 
214         File deployedArtifact = new File(
215                 remoteRepo,
216                 "deploy-file-classifier/" + groupId.replace('.', '/') + "/"
217                         + artifactId + "/" + version + "/" + artifactId + "-"
218                         + version + "-" + classifier + ".jar");
219 
220         assertTrue(deployedArtifact.exists());
221 
222         mojo.setClassifier("prod");
223 
224         assertEquals("prod", mojo.getClassifier());
225 
226         mojo.execute();
227 
228         File prodDeployedArtifact = new File(
229                 remoteRepo,
230                 "deploy-file-classifier/" + groupId.replace('.', '/') + "/"
231                         + artifactId + "/" + version + "/" + artifactId + "-"
232                         + version + "-" + mojo.getClassifier() + ".jar");
233 
234         assertTrue(prodDeployedArtifact.exists());
235     }
236 
237     public void testDeployIfArtifactIsNotJar() throws Exception {
238         File testPom =
239                 new File(getBasedir(), "target/test-classes/unit/deploy-file-artifact-not-jar/plugin-config.xml");
240 
241         mojo = (DeployFileMojo) lookupMojo("deploy-file", testPom);
242 
243         MockitoAnnotations.initMocks(this);
244 
245         assertNotNull(mojo);
246 
247         ProjectBuildingRequest buildingRequest = mock(ProjectBuildingRequest.class);
248         when(buildingRequest.getRepositoryMerging()).thenReturn(ProjectBuildingRequest.RepositoryMerging.POM_DOMINANT);
249         when(session.getProjectBuildingRequest()).thenReturn(buildingRequest);
250         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
251         repositorySession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
252                 .newInstance(repositorySession, new LocalRepository(LOCAL_REPO)));
253         when(buildingRequest.getRepositorySession()).thenReturn(repositorySession);
254         when(session.getRepositorySession()).thenReturn(repositorySession);
255 
256         String groupId = (String) getVariableValueFromObject(mojo, "groupId");
257 
258         String artifactId = (String) getVariableValueFromObject(mojo, "artifactId");
259 
260         String version = (String) getVariableValueFromObject(mojo, "version");
261 
262         assertEquals("org.apache.maven.test", groupId);
263 
264         assertEquals("maven-deploy-file-test", artifactId);
265 
266         assertEquals("1.0", version);
267 
268         mojo.execute();
269 
270         File file = new File(
271                 remoteRepo,
272                 "deploy-file-artifact-not-jar/" + groupId.replace('.', '/') + "/"
273                         + artifactId + "/" + version + "/" + artifactId + "-"
274                         + version + ".zip");
275 
276         assertTrue(file.exists());
277     }
278 
279     private void addFileToList(File file, List<String> fileList) {
280         if (!file.isDirectory()) {
281             fileList.add(file.getName());
282         } else {
283             fileList.add(file.getName());
284 
285             File[] files = file.listFiles();
286 
287             for (File file1 : Objects.requireNonNull(files)) {
288                 addFileToList(file1, fileList);
289             }
290         }
291     }
292 
293     private int getSizeOfExpectedFiles(List<String> fileList, List<String> expectedFiles) {
294         for (String fileName : fileList) {
295             if (expectedFiles.contains(fileName)) {
296                 expectedFiles.remove(fileName);
297             } else {
298                 fail(fileName + " is not included in the expected files");
299             }
300         }
301         return expectedFiles.size();
302     }
303 }