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.shared.release.phase;
20  
21  import java.io.IOException;
22  import java.util.ArrayList;
23  import java.util.Collections;
24  import java.util.List;
25  
26  import org.apache.maven.project.MavenProject;
27  import org.apache.maven.scm.manager.NoSuchScmProviderException;
28  import org.apache.maven.scm.provider.ScmProvider;
29  import org.apache.maven.scm.repository.ScmRepositoryException;
30  import org.apache.maven.shared.release.ReleaseExecutionException;
31  import org.apache.maven.shared.release.ReleaseFailureException;
32  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
33  import org.apache.maven.shared.release.config.ReleaseUtils;
34  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
35  import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
36  import org.apache.maven.shared.release.transform.jdom2.JDomModelETLFactory;
37  import org.apache.maven.shared.release.util.ReleaseUtil;
38  import org.junit.jupiter.api.BeforeEach;
39  import org.junit.jupiter.api.Disabled;
40  import org.junit.jupiter.api.Test;
41  
42  import static org.junit.jupiter.api.Assertions.assertEquals;
43  import static org.junit.jupiter.api.Assertions.assertNull;
44  import static org.junit.jupiter.api.Assertions.assertTrue;
45  import static org.junit.jupiter.api.Assertions.fail;
46  import static org.mockito.Mockito.mock;
47  import static org.mockito.Mockito.verifyNoMoreInteractions;
48  
49  /**
50   * Base class with tests for rewriting POMs.
51   *
52   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
53   */
54  abstract class AbstractRewritingReleasePhaseTestCase extends AbstractReleaseTestCase {
55  
56      protected abstract ReleasePhase getTestedPhase();
57  
58      @BeforeEach
59      public void setUpAbstractRewritingReleasePhaseTestCase() throws Exception {
60          if (getTestedPhase() instanceof AbstractRewritePomsPhase) {
61              ((AbstractRewritePomsPhase) getTestedPhase()).setModelETL(JDomModelETLFactory.NAME);
62              ((AbstractRewritePomsPhase) getTestedPhase()).setStartTime(0);
63          }
64      }
65  
66      @Test
67      public void testRewriteBasicPom() throws Exception {
68          List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
69          ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
70          mapNextVersion(builder, "groupId:artifactId");
71  
72          getTestedPhase()
73                  .execute(
74                          ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
75  
76          comparePomFiles(reactorProjects);
77      }
78  
79      @Test
80      public void testRewriteBasicPomEntities() throws Exception {
81          List<MavenProject> reactorProjects = createReactorProjects("basic-pom-entities");
82          ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom-entities");
83          mapNextVersion(builder, "groupId:artifactId");
84  
85          getTestedPhase()
86                  .execute(
87                          ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
88  
89          comparePomFiles(reactorProjects);
90      }
91  
92      @Test
93      public void testRewriteBasicPomNamespace() throws Exception {
94          List<MavenProject> reactorProjects = createReactorProjects("basic-pom-namespace");
95          ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom-namespace");
96          mapNextVersion(builder, "groupId:artifactId");
97  
98          getTestedPhase()
99                  .execute(
100                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
101 
102         comparePomFiles(reactorProjects);
103     }
104 
105     @Test
106     public void testRewriteBasicPomWithEncoding() throws Exception {
107         List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-encoding");
108         ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom-with-encoding");
109         mapNextVersion(builder, "groupId:artifactId");
110 
111         getTestedPhase()
112                 .execute(
113                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
114 
115         comparePomFiles(reactorProjects);
116     }
117 
118     @Test
119     public void testRewritePomWithParent() throws Exception {
120         List<MavenProject> reactorProjects = createReactorProjects("pom-with-parent");
121         ReleaseDescriptorBuilder builder =
122                 createConfigurationForPomWithParentAlternateNextVersion(reactorProjects, "pom-with-parent");
123 
124         getTestedPhase()
125                 .execute(
126                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
127 
128         comparePomFiles(reactorProjects);
129     }
130 
131     @Test
132     public void testRewritePomWithUnmappedParent() throws Exception {
133 
134         List<MavenProject> reactorProjects = createReactorProjects("pom-with-parent");
135         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "pom-with-parent");
136 
137         // Process the child first
138         reactorProjects = new ArrayList<>(reactorProjects);
139         Collections.reverse(reactorProjects);
140 
141         mapAlternateNextVersion(builder, "groupId:subproject1");
142 
143         try {
144             getTestedPhase()
145                     .execute(
146                             ReleaseUtils.buildReleaseDescriptor(builder),
147                             new DefaultReleaseEnvironment(),
148                             reactorProjects);
149 
150             fail("Should have thrown an exception");
151         } catch (ReleaseFailureException e) {
152             assertTrue(true);
153         }
154     }
155 
156     @Test
157     public void testRewritePomWithReleasedParent() throws Exception {
158 
159         List<MavenProject> reactorProjects = createReactorProjects("pom-with-released-parent");
160         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "pom-with-released-parent");
161 
162         mapAlternateNextVersion(builder, "groupId:subproject1");
163         builder.addReleaseVersion("groupId:artifactId", "1");
164         builder.addDevelopmentVersion("groupId:artifactId", "1");
165 
166         getTestedPhase()
167                 .execute(
168                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
169 
170         comparePomFiles(reactorProjects);
171     }
172 
173     protected abstract void mapAlternateNextVersion(ReleaseDescriptorBuilder config, String projectId);
174 
175     @Test
176     public void testRewritePomWithInheritedVersion() throws Exception {
177         List<MavenProject> reactorProjects = createReactorProjects("pom-with-inherited-version");
178         ReleaseDescriptorBuilder builder =
179                 createConfigurationForWithParentNextVersion(reactorProjects, "pom-with-inherited-version");
180 
181         getTestedPhase()
182                 .execute(
183                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
184 
185         comparePomFiles(reactorProjects);
186     }
187 
188     @Test
189     public void testRewritePomWithChangedInheritedVersion() throws Exception {
190         List<MavenProject> reactorProjects = createReactorProjects("pom-with-inherited-version");
191         ReleaseDescriptorBuilder builder =
192                 createConfigurationForPomWithParentAlternateNextVersion(reactorProjects, "pom-with-inherited-version");
193 
194         getTestedPhase()
195                 .execute(
196                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
197 
198         MavenProject project = getProjectsAsMap(reactorProjects).get("groupId:subproject1");
199         comparePomFiles(project, "-version-changed");
200     }
201 
202     protected abstract ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion(
203             List<MavenProject> reactorProjects, String workingDirectory) throws Exception;
204 
205     @Test
206     public void testRewritePomDependencies() throws Exception {
207         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-dependencies");
208         ReleaseDescriptorBuilder builder =
209                 createDefaultConfiguration(reactorProjects, "internal-snapshot-dependencies");
210         mapNextVersion(builder, "groupId:subsubproject");
211 
212         getTestedPhase()
213                 .execute(
214                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
215 
216         comparePomFiles(reactorProjects);
217     }
218 
219     @Test
220     public void testRewritePomUnmappedDependencies() throws Exception {
221         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-dependencies");
222         ReleaseDescriptorBuilder builder =
223                 createUnmappedConfiguration(reactorProjects, "internal-snapshot-dependencies");
224 
225         try {
226             getTestedPhase()
227                     .execute(
228                             ReleaseUtils.buildReleaseDescriptor(builder),
229                             new DefaultReleaseEnvironment(),
230                             reactorProjects);
231 
232             fail("Should have thrown an exception");
233         } catch (ReleaseFailureException e) {
234             assertTrue(true);
235         }
236     }
237 
238     @Test
239     public void testRewritePomDependenciesDifferentVersion() throws Exception {
240         List<MavenProject> reactorProjects = createReactorProjects("internal-differing-snapshot-dependencies");
241         ReleaseDescriptorBuilder builder =
242                 createDifferingVersionConfiguration(reactorProjects, "internal-differing-snapshot-dependencies");
243 
244         getTestedPhase()
245                 .execute(
246                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
247 
248         comparePomFiles(reactorProjects);
249     }
250 
251     @Test
252     public void testRewriteManagedPomDependencies() throws Exception {
253         List<MavenProject> reactorProjects = createReactorProjects("internal-managed-snapshot-dependency");
254         ReleaseDescriptorBuilder builder =
255                 createMappedConfiguration(reactorProjects, "internal-managed-snapshot-dependency");
256 
257         getTestedPhase()
258                 .execute(
259                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
260 
261         comparePomFiles(reactorProjects);
262     }
263 
264     @Test
265     public void testRewriteManagedPomUnmappedDependencies() throws Exception {
266         List<MavenProject> reactorProjects = createReactorProjects("internal-managed-snapshot-dependency");
267         ReleaseDescriptorBuilder builder =
268                 createUnmappedConfiguration(reactorProjects, "internal-managed-snapshot-dependency");
269 
270         try {
271             getTestedPhase()
272                     .execute(
273                             ReleaseUtils.buildReleaseDescriptor(builder),
274                             new DefaultReleaseEnvironment(),
275                             reactorProjects);
276 
277             fail("Should have thrown an exception");
278         } catch (ReleaseFailureException e) {
279             assertTrue(true);
280         }
281     }
282 
283     @Test
284     public void testRewritePomPlugins() throws Exception {
285         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-plugins");
286         ReleaseDescriptorBuilder builder = createDefaultConfiguration(reactorProjects, "internal-snapshot-plugins");
287 
288         getTestedPhase()
289                 .execute(
290                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
291 
292         comparePomFiles(reactorProjects);
293     }
294 
295     @Test
296     public void testRewritePomUnmappedPlugins() throws Exception {
297         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-plugins");
298         ReleaseDescriptorBuilder builder = createUnmappedConfiguration(reactorProjects, "internal-snapshot-plugins");
299 
300         try {
301             getTestedPhase()
302                     .execute(
303                             ReleaseUtils.buildReleaseDescriptor(builder),
304                             new DefaultReleaseEnvironment(),
305                             reactorProjects);
306 
307             fail("Should have thrown an exception");
308         } catch (ReleaseFailureException e) {
309             assertTrue(true);
310         }
311     }
312 
313     @Test
314     public void testRewritePomPluginsDifferentVersion() throws Exception {
315         List<MavenProject> reactorProjects = createReactorProjects("internal-differing-snapshot-plugins");
316         ReleaseDescriptorBuilder builder =
317                 createDifferingVersionConfiguration(reactorProjects, "internal-differing-snapshot-plugins");
318 
319         getTestedPhase()
320                 .execute(
321                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
322 
323         comparePomFiles(reactorProjects);
324     }
325 
326     @Test
327     public void testRewriteManagedPomPlugins() throws Exception {
328         List<MavenProject> reactorProjects = createReactorProjects("internal-managed-snapshot-plugin");
329         ReleaseDescriptorBuilder builder =
330                 createMappedConfiguration(reactorProjects, "internal-managed-snapshot-plugin");
331 
332         getTestedPhase()
333                 .execute(
334                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
335 
336         comparePomFiles(reactorProjects);
337     }
338 
339     @Test
340     public void testRewriteManagedPomUnmappedPlugins() throws Exception {
341         List<MavenProject> reactorProjects = createReactorProjects("internal-managed-snapshot-plugin");
342         ReleaseDescriptorBuilder builder =
343                 createUnmappedConfiguration(reactorProjects, "internal-managed-snapshot-plugin");
344 
345         try {
346             getTestedPhase()
347                     .execute(
348                             ReleaseUtils.buildReleaseDescriptor(builder),
349                             new DefaultReleaseEnvironment(),
350                             reactorProjects);
351 
352             fail("Should have thrown an exception");
353         } catch (ReleaseFailureException e) {
354             assertTrue(true);
355         }
356     }
357 
358     @Test
359     public void testRewritePomReportPlugins() throws Exception {
360         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-report-plugins");
361         ReleaseDescriptorBuilder builder =
362                 createDefaultConfiguration(reactorProjects, "internal-snapshot-report-plugins");
363 
364         getTestedPhase()
365                 .execute(
366                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
367 
368         comparePomFiles(reactorProjects);
369     }
370 
371     @Test
372     public void testRewritePomUnmappedReportPlugins() throws Exception {
373         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-report-plugins");
374         ReleaseDescriptorBuilder builder =
375                 createUnmappedConfiguration(reactorProjects, "internal-snapshot-report-plugins");
376 
377         try {
378             getTestedPhase()
379                     .execute(
380                             ReleaseUtils.buildReleaseDescriptor(builder),
381                             new DefaultReleaseEnvironment(),
382                             reactorProjects);
383 
384             fail("Should have thrown an exception");
385         } catch (ReleaseFailureException e) {
386             assertTrue(true);
387         }
388     }
389 
390     @Test
391     public void testRewritePomReportPluginsDifferentVersion() throws Exception {
392         List<MavenProject> reactorProjects = createReactorProjects("internal-differing-snapshot-report-plugins");
393         ReleaseDescriptorBuilder builder =
394                 createDifferingVersionConfiguration(reactorProjects, "internal-differing-snapshot-report-plugins");
395 
396         getTestedPhase()
397                 .execute(
398                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
399 
400         comparePomFiles(reactorProjects);
401     }
402 
403     @Test
404     @Disabled("Extensions being part of reactor is not supported anymore")
405     public void testRewritePomExtension() throws Exception {
406         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-extension");
407         ReleaseDescriptorBuilder builder = createDefaultConfiguration(reactorProjects, "internal-snapshot-extension");
408 
409         getTestedPhase()
410                 .execute(
411                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
412 
413         comparePomFiles(reactorProjects);
414     }
415 
416     @Test
417     @Disabled("Extensions being part of reactor is not supported anymore")
418     public void testRewritePomUnmappedExtension() throws Exception {
419         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-extension");
420         ReleaseDescriptorBuilder builder = createUnmappedConfiguration(reactorProjects, "internal-snapshot-extension");
421 
422         try {
423             getTestedPhase()
424                     .execute(
425                             ReleaseUtils.buildReleaseDescriptor(builder),
426                             new DefaultReleaseEnvironment(),
427                             reactorProjects);
428 
429             fail("Should have thrown an exception");
430         } catch (ReleaseFailureException e) {
431             assertTrue(true);
432         }
433     }
434 
435     @Test
436     @Disabled("Extensions being part of reactor is not supported anymore")
437     public void testRewritePomExtensionDifferentVersion() throws Exception {
438         List<MavenProject> reactorProjects = createReactorProjects("internal-differing-snapshot-extension");
439         ReleaseDescriptorBuilder builder =
440                 createDifferingVersionConfiguration(reactorProjects, "internal-differing-snapshot-extension");
441 
442         getTestedPhase()
443                 .execute(
444                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
445 
446         comparePomFiles(reactorProjects);
447     }
448 
449     @Test
450     @Disabled("Extensions being part of reactor is not supported anymore")
451     public void testRewritePomExtensionUndefinedVersion() throws Exception {
452         List<MavenProject> reactorProjects = createReactorProjects("pom-without-extension-version");
453         ReleaseDescriptorBuilder builder = createDefaultConfiguration(reactorProjects, "pom-without-extension-version");
454 
455         getTestedPhase()
456                 .execute(
457                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
458 
459         comparePomFiles(reactorProjects);
460     }
461 
462     @Test
463     public void testRewriteAddSchema() throws Exception {
464         boolean copyFiles = true;
465 
466         // Run a second time to check they are not duplicated
467         for (int i = 0; i < 2; i++) {
468             String path = "basic-pom";
469             List<MavenProject> reactorProjects = prepareReactorProjects(path);
470             ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
471             mapNextVersion(builder, "groupId:artifactId");
472             builder.setAddSchema(true);
473 
474             getTestedPhase()
475                     .execute(
476                             ReleaseUtils.buildReleaseDescriptor(builder),
477                             new DefaultReleaseEnvironment(),
478                             reactorProjects);
479 
480             comparePomFiles(reactorProjects, "-with-schema");
481 
482             copyFiles = false;
483 
484             verifyReactorProjects(path, copyFiles);
485         }
486     }
487 
488     @Test
489     public void testSimulateRewriteEditModeSkipped() throws Exception {
490         // prepare
491         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
492         ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
493         builder.setScmUseEditMode(true);
494         mapNextVersion(builder, "groupId:artifactId");
495 
496         ScmProvider scmProviderMock = mock(ScmProvider.class);
497         scmManager.setScmProvider(scmProviderMock);
498 
499         // execute
500         getTestedPhase()
501                 .simulate(
502                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
503 
504         // verify
505         verifyNoMoreInteractions(scmProviderMock);
506     }
507 
508     @Test
509     public void testRewriteUnmappedPom() throws Exception {
510         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
511         ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
512 
513         try {
514             getTestedPhase()
515                     .execute(
516                             ReleaseUtils.buildReleaseDescriptor(builder),
517                             new DefaultReleaseEnvironment(),
518                             reactorProjects);
519 
520             fail("Should have thrown an exception");
521         } catch (ReleaseFailureException e) {
522             assertTrue(true);
523         }
524     }
525 
526     @Test
527     public void testRewriteBasicPomWithScmRepoException() throws Exception {
528         // prepare
529         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
530         ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
531         builder.setScmUseEditMode(true);
532         builder.setScmSourceUrl("scm:svn:fail");
533         mapNextVersion(builder, "groupId:artifactId");
534 
535         scmManager.setException(new ScmRepositoryException("..."));
536 
537         try {
538             getTestedPhase()
539                     .execute(
540                             ReleaseUtils.buildReleaseDescriptor(builder),
541                             new DefaultReleaseEnvironment(),
542                             reactorProjects);
543 
544             fail("Should have thrown an exception");
545         } catch (ReleaseScmRepositoryException e) {
546             assertNull(e.getCause(), "Check no additional cause");
547         }
548     }
549 
550     @Test
551     public void testRewriteBasicPomWithNoSuchProviderException() throws Exception {
552         // prepare
553         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
554         ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
555         builder.setScmUseEditMode(true);
556         builder.setScmSourceUrl("scm:fail:path");
557         mapNextVersion(builder, "groupId:artifactId");
558 
559         scmManager.setException(new NoSuchScmProviderException("..."));
560 
561         // execute
562         try {
563             getTestedPhase()
564                     .execute(
565                             ReleaseUtils.buildReleaseDescriptor(builder),
566                             new DefaultReleaseEnvironment(),
567                             reactorProjects);
568 
569             fail("Should have thrown an exception");
570         } catch (ReleaseExecutionException e) {
571             // verify
572             assertEquals(NoSuchScmProviderException.class, e.getCause().getClass(), "Check cause");
573         }
574     }
575 
576     @Test
577     public void testRewriteWhitespaceAroundValues() throws Exception {
578         List<MavenProject> reactorProjects = createReactorProjects("whitespace-around-values");
579         ReleaseDescriptorBuilder builder =
580                 createConfigurationForPomWithParentAlternateNextVersion(reactorProjects, "whitespace-around-values");
581         mapNextVersion(builder, "groupId:subproject2");
582 
583         getTestedPhase()
584                 .execute(
585                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
586 
587         comparePomFiles(reactorProjects);
588     }
589 
590     @Test
591     public void testRewriteCommentsAroundValues() throws Exception {
592         List<MavenProject> reactorProjects = createReactorProjects("comments-around-values");
593         ReleaseDescriptorBuilder builder =
594                 createConfigurationForPomWithParentAlternateNextVersion(reactorProjects, "comments-around-values");
595         mapNextVersion(builder, "groupId:subproject2");
596 
597         getTestedPhase()
598                 .execute(
599                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
600 
601         comparePomFiles(reactorProjects);
602     }
603 
604     @Test
605     public void testRewriteCDataAroundValues() throws Exception {
606         List<MavenProject> reactorProjects = createReactorProjects("cdata-around-values");
607         ReleaseDescriptorBuilder builder =
608                 createConfigurationForPomWithParentAlternateNextVersion(reactorProjects, "cdata-around-values");
609         mapNextVersion(builder, "groupId:subproject2");
610 
611         getTestedPhase()
612                 .execute(
613                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
614 
615         comparePomFiles(reactorProjects);
616     }
617 
618     @Test
619     public void testCleanNoProjects() {
620         // This occurs when it is release:perform run standalone. Just check there are no errors.
621         ((ResourceGenerator) getTestedPhase()).clean(Collections.emptyList());
622     }
623 
624     protected ReleaseDescriptorBuilder createUnmappedConfiguration(
625             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
626         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, workingDirectory);
627 
628         unmapNextVersion(builder, "groupId:subproject1");
629         mapNextVersion(builder, "groupId:subproject2");
630         mapNextVersion(builder, "groupId:subproject3");
631         mapNextVersion(builder, "groupId:artifactId");
632         return builder;
633     }
634 
635     protected List<MavenProject> createReactorProjects(String path) throws Exception {
636         return prepareReactorProjects(path);
637     }
638 
639     protected ReleaseDescriptorBuilder createDefaultConfiguration(
640             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
641         ReleaseDescriptorBuilder builder = createMappedConfiguration(reactorProjects, workingDirectory);
642 
643         mapNextVersion(builder, "groupId:subproject4");
644         return builder;
645     }
646 
647     protected ReleaseDescriptorBuilder createMappedConfiguration(
648             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
649         ReleaseDescriptorBuilder builder = createDifferingVersionConfiguration(reactorProjects, workingDirectory);
650 
651         mapNextVersion(builder, "groupId:subproject3");
652         return builder;
653     }
654 
655     private ReleaseDescriptorBuilder createDifferingVersionConfiguration(
656             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
657         ReleaseDescriptorBuilder builder =
658                 createConfigurationForWithParentNextVersion(reactorProjects, workingDirectory);
659 
660         mapNextVersion(builder, "groupId:subproject2");
661         return builder;
662     }
663 
664     protected abstract ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion(
665             List<MavenProject> reactorProjects, String workingDirectory) throws Exception;
666 
667     protected abstract void unmapNextVersion(ReleaseDescriptorBuilder config, String projectId);
668 
669     protected abstract void mapNextVersion(ReleaseDescriptorBuilder config, String projectId);
670 
671     protected ReleaseDescriptorBuilder createDescriptorFromBasicPom(
672             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
673         return createDescriptorFromProjects(reactorProjects, workingDirectory);
674     }
675 
676     protected abstract String readTestProjectFile(String fileName) throws IOException;
677 
678     @Test
679     public void testRewritePomDependenciesWithNamespace() throws Exception {
680         List<MavenProject> reactorProjects = createReactorProjects("pom-with-namespace");
681         ReleaseDescriptorBuilder builder = createDefaultConfiguration(reactorProjects, "pom-with-namespace");
682 
683         getTestedPhase()
684                 .execute(
685                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
686 
687         comparePomFiles(reactorProjects);
688     }
689 
690     protected abstract List<MavenProject> prepareReactorProjects(String path) throws Exception;
691 
692     protected void verifyReactorProjects(String path, boolean copyFiles) throws Exception {}
693 
694     protected ReleaseDescriptorBuilder createDescriptorFromProjects(
695             List<MavenProject> reactorProjects, String workingDirectory) {
696         ReleaseDescriptorBuilder builder =
697                 createDescriptorFromProjects(new ReleaseDescriptorBuilder(), reactorProjects);
698         builder.setWorkingDirectory(getWorkingDirectory(workingDirectory).toString());
699         return builder;
700     }
701 
702     private ReleaseDescriptorBuilder createDescriptorFromProjects(
703             ReleaseDescriptorBuilder builder, List<MavenProject> reactorProjects) {
704         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
705 
706         for (MavenProject project : reactorProjects) {
707             String key = project.getGroupId() + ':' + project.getArtifactId();
708             builder.putOriginalVersion(key, project.getVersion());
709             builder.addOriginalScmInfo(key, project.getScm());
710         }
711 
712         if (rootProject.getScm() == null) {
713             builder.setScmSourceUrl("scm:svn:file://localhost/tmp/scm-repo/trunk");
714         } else {
715             builder.setScmSourceUrl(rootProject.getScm().getConnection());
716         }
717 
718         return builder;
719     }
720 }