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