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.rar;
20  
21  /*
22   * Licensed to the Apache Software Foundation (ASF) under one
23   * or more contributor license agreements.  See the NOTICE file
24   * distributed with this work for additional information
25   * regarding copyright ownership.  The ASF licenses this file
26   * to you under the Apache License, Version 2.0 (the
27   * "License"); you may not use this file except in compliance
28   * with the License.  You may obtain a copy of the License at
29   *
30   *  http://www.apache.org/licenses/LICENSE-2.0
31   *
32   * Unless required by applicable law or agreed to in writing,
33   * software distributed under the License is distributed on an
34   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
35   * KIND, either express or implied.  See the License for the
36   * specific language governing permissions and limitations
37   * under the License.
38   */
39  
40  import java.io.File;
41  import java.util.ArrayList;
42  import java.util.Enumeration;
43  import java.util.List;
44  import java.util.Objects;
45  import java.util.zip.ZipEntry;
46  import java.util.zip.ZipFile;
47  
48  import org.apache.maven.plugin.testing.AbstractMojoTestCase;
49  import org.codehaus.plexus.util.FileUtils;
50  
51  /**
52   * @author <a href="mailto:aramirez@apache.org">Allan Ramirez</a>
53   */
54  public class RarMojoTest extends AbstractMojoTestCase {
55      public void testRarTestEnvironment() throws Exception {
56          File testPom = new File(getBasedir(), "target/test-classes/unit/basic-rar-test/plugin-config.xml");
57  
58          RarMojo mojo = (RarMojo) lookupMojo("rar", testPom);
59  
60          assertNotNull(mojo);
61      }
62  
63      public void testBasicRar() throws Exception {
64          File testPom = new File(getBasedir(), "target/test-classes/unit/basic-rar-test/plugin-config.xml");
65  
66          RarMojo mojo = (RarMojo) lookupMojo("rar", testPom);
67  
68          assertNotNull(mojo);
69  
70          String finalName = (String) getVariableValueFromObject(mojo, "finalName");
71  
72          String workDir = (String) getVariableValueFromObject(mojo, "workDirectory");
73  
74          File outputDir = (File) getVariableValueFromObject(mojo, "outputDirectory");
75  
76          Boolean includeJar = (Boolean) getVariableValueFromObject(mojo, "includeJar");
77  
78          assertTrue(includeJar);
79  
80          // include the project jar to the rar
81          File projectJar = new File(getBasedir(), "src/test/resources/unit/basic-rar-test/target/test-rar.jar");
82  
83          FileUtils.copyFileToDirectory(projectJar, outputDir);
84  
85          mojo.execute();
86  
87          // check the working directory
88          File workDirectory = new File(workDir);
89  
90          assertTrue(workDirectory.exists());
91  
92          assertTrue(workDirectory.isDirectory());
93  
94          File[] fileNames = workDirectory.listFiles();
95          assertNotNull(fileNames);
96  
97          List<String> expectedFiles = new ArrayList<>();
98  
99          expectedFiles.add("maven-artifact01-1.0-SNAPSHOT.jar");
100         expectedFiles.add("maven-artifact02-1.0-SNAPSHOT.jar");
101         expectedFiles.add("test-rar.jar");
102 
103         assertEquals("Files in working directory", expectedFiles.size(), fileNames.length);
104 
105         for (File fileName1 : fileNames) {
106             String fileName = fileName1.getName();
107 
108             assertTrue(expectedFiles.contains(fileName));
109 
110             if (expectedFiles.contains(fileName)) {
111                 expectedFiles.remove(fileName);
112                 assertFalse(expectedFiles.contains(fileName));
113             } else {
114                 fail(fileName + " is not included in expected files.");
115             }
116         }
117 
118         assertEquals(0, expectedFiles.size());
119 
120         // check the generated rar file
121         File rarFile = new File(outputDir.getPath(), finalName + ".rar");
122 
123         assertTrue(rarFile.exists());
124 
125         // expected files/directories inside the rar file
126         expectedFiles = new ArrayList<>();
127 
128         expectedFiles.add("META-INF/maven/org.apache.maven.test/maven-rar-test/pom.properties");
129         expectedFiles.add("META-INF/maven/org.apache.maven.test/maven-rar-test/pom.xml");
130         expectedFiles.add("META-INF/maven/org.apache.maven.test/maven-rar-test/");
131         expectedFiles.add("META-INF/maven/org.apache.maven.test/");
132         expectedFiles.add("META-INF/maven/");
133         expectedFiles.add("META-INF/MANIFEST.MF");
134         expectedFiles.add("META-INF/");
135         expectedFiles.add("maven-artifact01-1.0-SNAPSHOT.jar");
136         expectedFiles.add("maven-artifact02-1.0-SNAPSHOT.jar");
137         expectedFiles.add("test-rar.jar");
138 
139         try (ZipFile rar = new ZipFile(rarFile)) {
140             Enumeration<? extends ZipEntry> entries = rar.entries();
141 
142             assertTrue(entries.hasMoreElements());
143 
144             assertEquals(0, getSizeOfExpectedFiles(entries, expectedFiles));
145         }
146     }
147 
148     public void testBasicRarWithDescriptor() throws Exception {
149         File testPom = new File(getBasedir(), "target/test-classes/unit/basic-rar-with-descriptor/plugin-config.xml");
150 
151         RarMojo mojo = (RarMojo) lookupMojo("rar", testPom);
152 
153         assertNotNull(mojo);
154 
155         String finalName = (String) getVariableValueFromObject(mojo, "finalName");
156 
157         String workDir = (String) getVariableValueFromObject(mojo, "workDirectory");
158 
159         File outputDir = (File) getVariableValueFromObject(mojo, "outputDirectory");
160 
161         mojo.execute();
162 
163         // check the working directory
164         File workDirectory = new File(workDir);
165 
166         assertTrue(workDirectory.exists());
167 
168         assertTrue(workDirectory.isDirectory());
169 
170         File[] fileNames = workDirectory.listFiles();
171         assertNotNull(fileNames);
172 
173         List<String> expectedFiles = new ArrayList<>();
174         List<String> fileList = new ArrayList<>();
175 
176         for (File fileName : fileNames) {
177             addFileToList(fileName, fileList);
178         }
179 
180         expectedFiles.add("ra.xml");
181         expectedFiles.add("maven-artifact01-1.0-SNAPSHOT.jar");
182         expectedFiles.add("maven-artifact02-1.0-SNAPSHOT.jar");
183         expectedFiles.add("META-INF");
184 
185         assertEquals(expectedFiles.size(), fileList.size());
186 
187         assertEquals(0, getSizeOfExpectedFiles(fileList, expectedFiles));
188 
189         // check the generated rar file
190         File rarFile = new File(outputDir.getPath(), finalName + ".rar");
191 
192         assertTrue(rarFile.exists());
193 
194         // expected files/directories inside the rar file
195         expectedFiles = new ArrayList<>();
196 
197         expectedFiles.add("META-INF/maven/org.apache.maven.test/maven-rar-test/pom.properties");
198         expectedFiles.add("META-INF/maven/org.apache.maven.test/maven-rar-test/pom.xml");
199         expectedFiles.add("META-INF/maven/org.apache.maven.test/maven-rar-test/");
200         expectedFiles.add("META-INF/maven/org.apache.maven.test/");
201         expectedFiles.add("META-INF/maven/");
202         expectedFiles.add("META-INF/MANIFEST.MF");
203         expectedFiles.add("META-INF/ra.xml");
204         expectedFiles.add("META-INF/");
205         expectedFiles.add("maven-artifact01-1.0-SNAPSHOT.jar");
206         expectedFiles.add("maven-artifact02-1.0-SNAPSHOT.jar");
207 
208         try (ZipFile rar = new ZipFile(rarFile)) {
209             Enumeration<? extends ZipEntry> entries = rar.entries();
210 
211             assertTrue(entries.hasMoreElements());
212 
213             assertEquals(0, getSizeOfExpectedFiles(entries, expectedFiles));
214         }
215     }
216 
217     public void testBasicRarWithManifest() throws Exception {
218         File testPom = new File(getBasedir(), "target/test-classes/unit/basic-rar-with-manifest/plugin-config.xml");
219 
220         RarMojo mojo = (RarMojo) lookupMojo("rar", testPom);
221 
222         assertNotNull(mojo);
223 
224         String finalName = (String) getVariableValueFromObject(mojo, "finalName");
225 
226         String workDir = (String) getVariableValueFromObject(mojo, "workDirectory");
227 
228         File outputDir = (File) getVariableValueFromObject(mojo, "outputDirectory");
229 
230         mojo.execute();
231 
232         // check the working directory
233         File workDirectory = new File(workDir);
234 
235         assertTrue(workDirectory.exists());
236 
237         assertTrue(workDirectory.isDirectory());
238 
239         File[] fileNames = workDirectory.listFiles();
240         assertNotNull(fileNames);
241 
242         List<String> expectedFiles = new ArrayList<>();
243         List<String> fileList = new ArrayList<>();
244 
245         for (File file : fileNames) {
246             addFileToList(file, fileList);
247         }
248 
249         expectedFiles.add("ra.xml");
250         expectedFiles.add("maven-artifact01-1.0-SNAPSHOT.jar");
251         expectedFiles.add("maven-artifact02-1.0-SNAPSHOT.jar");
252         expectedFiles.add("META-INF");
253         expectedFiles.add("MANIFEST.MF");
254 
255         assertEquals(expectedFiles.size(), fileList.size());
256 
257         assertEquals(0, getSizeOfExpectedFiles(fileList, expectedFiles));
258 
259         // check the generated rar file
260         File rarFile = new File(outputDir.getPath(), finalName + ".rar");
261 
262         assertTrue(rarFile.exists());
263 
264         // expected files/directories inside the rar file
265         expectedFiles = new ArrayList<>();
266 
267         expectedFiles.add("META-INF/maven/org.apache.maven.test/maven-rar-test/pom.properties");
268         expectedFiles.add("META-INF/maven/org.apache.maven.test/maven-rar-test/pom.xml");
269         expectedFiles.add("META-INF/maven/org.apache.maven.test/maven-rar-test/");
270         expectedFiles.add("META-INF/maven/org.apache.maven.test/");
271         expectedFiles.add("META-INF/maven/");
272         expectedFiles.add("META-INF/MANIFEST.MF");
273         expectedFiles.add("META-INF/ra.xml");
274         expectedFiles.add("META-INF/");
275         expectedFiles.add("maven-artifact01-1.0-SNAPSHOT.jar");
276         expectedFiles.add("maven-artifact02-1.0-SNAPSHOT.jar");
277 
278         try (ZipFile rar = new ZipFile(rarFile)) {
279             Enumeration<? extends ZipEntry> entries = rar.entries();
280 
281             assertTrue(entries.hasMoreElements());
282 
283             assertEquals(0, getSizeOfExpectedFiles(entries, expectedFiles));
284         }
285     }
286 
287     private int getSizeOfExpectedFiles(Enumeration<? extends ZipEntry> entries, List<String> expectedFiles) {
288         while (entries.hasMoreElements()) {
289             ZipEntry entry = entries.nextElement();
290 
291             if (expectedFiles.contains(entry.getName())) {
292                 expectedFiles.remove(entry.getName());
293                 assertFalse(expectedFiles.contains(entry.getName()));
294             } else {
295                 fail(entry.getName() + " is not included in the expected files");
296             }
297         }
298         return expectedFiles.size();
299     }
300 
301     private int getSizeOfExpectedFiles(List<String> fileList, List<String> expectedFiles) {
302         for (String fileName : fileList) {
303             if (expectedFiles.contains(fileName)) {
304                 expectedFiles.remove(fileName);
305                 assertFalse(expectedFiles.contains(fileName));
306             } else {
307                 fail(fileName + " is not included in the expected files");
308             }
309         }
310         return expectedFiles.size();
311     }
312 
313     private void addFileToList(File file, List<String> fileList) {
314         if (!file.isDirectory()) {
315             fileList.add(file.getName());
316         } else {
317             fileList.add(file.getName());
318 
319             File[] files = file.listFiles();
320 
321             for (File file1 : Objects.requireNonNull(files)) {
322                 addFileToList(file1, fileList);
323             }
324         }
325     }
326 }