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.assembly.utils;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.util.ArrayList;
24  import java.util.Collections;
25  import java.util.Iterator;
26  import java.util.List;
27  import java.util.Set;
28  
29  import org.apache.maven.model.Model;
30  import org.apache.maven.project.MavenProject;
31  import org.junit.Test;
32  import org.slf4j.Logger;
33  import org.slf4j.LoggerFactory;
34  
35  import static org.junit.Assert.assertEquals;
36  import static org.junit.Assert.assertNotNull;
37  import static org.junit.Assert.assertTrue;
38  import static org.junit.Assert.fail;
39  
40  public class ProjectUtilsTest {
41      private final Logger logger = LoggerFactory.getLogger(getClass());
42  
43      private MavenProject createTestProject(final String artifactId, final String groupId, final String version) {
44          final Model model = new Model();
45          model.setArtifactId(artifactId);
46          model.setGroupId(groupId);
47          model.setVersion(version);
48  
49          return new MavenProject(model);
50      }
51  
52      @Test
53      public void testGetProjectModules_ShouldIncludeDirectModuleOfMasterProject() throws IOException {
54          final MavenProject master = createTestProject("test", "testGroup", "1.0");
55  
56          master.setFile(new File("pom.xml"));
57  
58          master.getModel().addModule("module");
59  
60          final MavenProject module = createTestProject("module", "testGroup", "1.0");
61  
62          module.setFile(new File("module/pom.xml"));
63  
64          final List<MavenProject> projects = new ArrayList<>(2);
65  
66          projects.add(master);
67          projects.add(module);
68  
69          final Set<MavenProject> result = ProjectUtils.getProjectModules(master, projects, true, logger);
70  
71          assertNotNull(result);
72          assertEquals(1, result.size());
73          assertEquals(module.getId(), result.iterator().next().getId());
74      }
75  
76      @Test
77      public void testGetProjectModules_ShouldNotIncludeMasterProject() throws IOException {
78          final MavenProject master = createTestProject("test", "testGroup", "1.0");
79  
80          final Set<MavenProject> result =
81                  ProjectUtils.getProjectModules(master, Collections.singletonList(master), true, logger);
82  
83          assertNotNull(result);
84          assertTrue(result.isEmpty());
85      }
86  
87      @Test
88      public void testGetProjectModules_ShouldIncludeInDirectModuleOfMasterWhenIncludeSubModulesIsTrue()
89              throws IOException {
90          final MavenProject master = createTestProject("test", "testGroup", "1.0");
91  
92          master.setFile(new File("project/pom.xml"));
93  
94          master.getModel().addModule("module");
95  
96          final MavenProject module = createTestProject("module", "testGroup", "1.0");
97  
98          module.getModel().addModule("submodule");
99  
100         module.setFile(new File("project/module/pom.xml"));
101 
102         final MavenProject subModule = createTestProject("sub-module", "testGroup", "1.0");
103 
104         subModule.setFile(new File("project/module/submodule/pom.xml"));
105 
106         final List<MavenProject> projects = new ArrayList<>(3);
107 
108         projects.add(master);
109         projects.add(module);
110         projects.add(subModule);
111 
112         final Set<MavenProject> result = ProjectUtils.getProjectModules(master, projects, true, logger);
113 
114         assertNotNull(result);
115         assertEquals(2, result.size());
116 
117         final List<MavenProject> verify = new ArrayList<>(projects);
118         verify.remove(master);
119 
120         verifyProjectsPresent(verify, result);
121     }
122 
123     @Test
124     public void testGetProjectModules_ShouldExcludeInDirectModuleOfMasterWhenIncludeSubModulesIsFalse()
125             throws IOException {
126         final MavenProject master = createTestProject("test", "testGroup", "1.0");
127 
128         master.setFile(new File("project/pom.xml"));
129 
130         master.getModel().addModule("module");
131 
132         final MavenProject module = createTestProject("module", "testGroup", "1.0");
133 
134         module.getModel().addModule("submodule");
135 
136         module.setFile(new File("project/module/pom.xml"));
137 
138         final MavenProject subModule = createTestProject("sub-module", "testGroup", "1.0");
139 
140         subModule.setFile(new File("project/module/submodule/pom.xml"));
141 
142         final List<MavenProject> projects = new ArrayList<>(3);
143 
144         projects.add(master);
145         projects.add(module);
146         projects.add(subModule);
147 
148         final Set<MavenProject> result = ProjectUtils.getProjectModules(master, projects, false, logger);
149 
150         assertNotNull(result);
151         assertEquals(1, result.size());
152 
153         final List<MavenProject> verify = new ArrayList<>(projects);
154         verify.remove(master);
155         verify.remove(subModule);
156 
157         verifyProjectsPresent(verify, result);
158     }
159 
160     @Test
161     public void testGetProjectModules_ShouldExcludeNonModuleOfMasterProject() throws IOException {
162         final MavenProject master = createTestProject("test", "testGroup", "1.0");
163 
164         master.setFile(new File("project/pom.xml"));
165 
166         final MavenProject other = createTestProject("other", "testGroup", "1.0");
167 
168         other.setFile(new File("other/pom.xml"));
169 
170         final List<MavenProject> projects = new ArrayList<>(3);
171 
172         projects.add(master);
173         projects.add(other);
174 
175         final Set<MavenProject> result = ProjectUtils.getProjectModules(master, projects, true, logger);
176 
177         assertNotNull(result);
178         assertTrue(result.isEmpty());
179     }
180 
181     private void verifyProjectsPresent(final List<MavenProject> verify, final Set<MavenProject> result) {
182         final List<MavenProject> verifyCopy = new ArrayList<>(verify);
183 
184         final List<MavenProject> unexpected = new ArrayList<>();
185 
186         for (final MavenProject project : result) {
187             boolean removed = false;
188 
189             for (final Iterator<MavenProject> verifyIterator = verifyCopy.iterator(); verifyIterator.hasNext(); ) {
190                 final MavenProject verification = verifyIterator.next();
191 
192                 if (verification.getId().equals(project.getId())) {
193                     verifyIterator.remove();
194                     removed = true;
195                 }
196             }
197 
198             if (!removed) {
199                 unexpected.add(project);
200             }
201         }
202 
203         if (!verifyCopy.isEmpty()) {
204             fail("Failed to verify presence of: " + verifyCopy);
205         }
206 
207         if (!unexpected.isEmpty()) {
208             fail("Found unexpected projects in result: " + unexpected);
209         }
210     }
211 
212     // private void verifyProjectsNotPresent( List verify, Set result )
213     // {
214     // List verifyCopy = new ArrayList( verify );
215     //
216     // for ( Iterator it = result.iterator(); it.hasNext(); )
217     // {
218     // MavenProject project = (MavenProject) it.next();
219     //
220     // for ( Iterator verifyIterator = verifyCopy.iterator(); verifyIterator.hasNext(); )
221     // {
222     // MavenProject verification = (MavenProject) verifyIterator.next();
223     //
224     // if ( verification.getId().equals( project.getId() ) )
225     // {
226     // verifyIterator.remove();
227     // }
228     // }
229     // }
230     //
231     // if ( verifyCopy.size() != verify.size() )
232     // {
233     // List found = new ArrayList( verify );
234     // found.removeAll( verifyCopy );
235     //
236     // fail( "Failed to verify absence of: " + found );
237     // }
238     // }
239 
240 }