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