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 javax.inject.Singleton;
22  
23  import java.io.File;
24  import java.io.IOException;
25  import java.util.ArrayList;
26  import java.util.Collections;
27  import java.util.Iterator;
28  import java.util.List;
29  
30  import com.google.inject.AbstractModule;
31  import com.google.inject.Module;
32  import com.google.inject.name.Names;
33  import org.apache.maven.project.MavenProject;
34  import org.apache.maven.scm.ScmFile;
35  import org.apache.maven.scm.ScmFileSet;
36  import org.apache.maven.scm.ScmFileStatus;
37  import org.apache.maven.scm.command.add.AddScmResult;
38  import org.apache.maven.scm.manager.ScmManager;
39  import org.apache.maven.scm.manager.ScmManagerStub;
40  import org.apache.maven.scm.provider.ScmProvider;
41  import org.apache.maven.scm.repository.ScmRepository;
42  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
43  import org.apache.maven.shared.release.config.ReleaseUtils;
44  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
45  import org.apache.maven.shared.release.scm.ScmTranslator;
46  import org.apache.maven.shared.release.util.ReleaseUtil;
47  import org.junit.Test;
48  
49  import static org.junit.Assert.assertTrue;
50  import static org.mockito.Matchers.argThat;
51  import static org.mockito.Matchers.isA;
52  import static org.mockito.Mockito.mock;
53  import static org.mockito.Mockito.verify;
54  import static org.mockito.Mockito.verifyNoMoreInteractions;
55  import static org.mockito.Mockito.when;
56  
57  /**
58   * Test the generate release POMs phase.
59   *
60   * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
61   */
62  public class GenerateReleasePomsPhaseTest extends AbstractRewritingReleasePhaseTestCase {
63      private static final String NEXT_VERSION = "1.0";
64  
65      private static final String ALTERNATIVE_NEXT_VERSION = "2.0";
66  
67      private ScmProvider scmProviderMock;
68  
69      public GenerateReleasePomsPhaseTest(String modelETL) {
70          super(modelETL);
71      }
72  
73      @Override
74      public void setUp() throws Exception {
75          super.setUp();
76  
77          scmProviderMock = null;
78      }
79  
80      @Override
81      protected Module[] getCustomModules() {
82          return new Module[] {
83              new AbstractModule() {
84                  @Override
85                  protected void configure() {
86                      bind(ScmManager.class)
87                              .to(org.apache.maven.shared.release.stubs.ScmManagerStub.class)
88                              .in(Singleton.class);
89                      bind(ScmTranslator.class)
90                              .annotatedWith(Names.named("stub-provider"))
91                              .to(org.apache.maven.shared.release.scm.SubversionScmTranslator.class)
92                              .in(Singleton.class);
93                  }
94              }
95          };
96      }
97  
98      @Override
99      protected String getRoleHint() {
100         return "generate-release-poms";
101     }
102 
103     // TODO: MRELEASE-262
104     // @Test public void testRewriteInternalRangeDependency() throws Exception
105     // {
106     // List reactorProjects = createReactorProjects( "internal-snapshot-range-dependency" );
107     // ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
108     //
109     // phase.execute( config, null, reactorProjects );
110     //
111     // compareFiles( reactorProjects );
112     // }
113 
114     @Test
115     public void testRewriteExternalRangeDependency() throws Exception {
116         List<MavenProject> reactorProjects = createReactorProjects("external-range-dependency");
117         ReleaseDescriptorBuilder builder = createMappedConfiguration(reactorProjects, "external-range-dependency");
118 
119         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
120 
121         comparePomFiles(reactorProjects);
122     }
123 
124     // MRELEASE-787
125     @Test
126     public void testSuppressCommitBeforeTagOrBranch() throws Exception {
127         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
128         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
129         builder.setGenerateReleasePoms(true);
130         builder.setSuppressCommitBeforeTagOrBranch(true);
131         builder.setRemoteTagging(false);
132         builder.setPinExternals(false);
133         mapNextVersion(builder, "groupId:artifactId");
134 
135         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
136 
137         verify(scmProviderMock).add(isA(ScmRepository.class), isA(ScmFileSet.class));
138 
139         verifyNoMoreInteractions(scmProviderMock);
140     }
141 
142     @Test
143     public void testSuppressCommitBeforeTagOrBranchAndReomoteTagging() throws Exception {
144         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
145         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
146         builder.setGenerateReleasePoms(true);
147         builder.setSuppressCommitBeforeTagOrBranch(true);
148         builder.setRemoteTagging(true);
149         builder.setPinExternals(false);
150         mapNextVersion(builder, "groupId:artifactId");
151 
152         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
153 
154         verify(scmProviderMock).add(isA(ScmRepository.class), isA(ScmFileSet.class));
155 
156         verifyNoMoreInteractions(scmProviderMock);
157     }
158 
159     // MRELEASE-808
160     @Test
161     public void testFinalName() throws Exception {
162         List<MavenProject> reactorProjects = createReactorProjects("pom-with-finalname");
163         ReleaseDescriptorBuilder builder =
164                 createConfigurationForWithParentNextVersion(reactorProjects, "pom-with-finalname");
165         builder.setGenerateReleasePoms(true);
166 
167         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
168 
169         assertTrue(comparePomFiles(reactorProjects));
170     }
171 
172     /*
173      * @see
174      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#createDescriptorFromProjects(java.
175      * util.List)
176      */
177     @Override
178     protected ReleaseDescriptorBuilder createDescriptorFromProjects(
179             List<MavenProject> reactorProjects, String workingDirectory) {
180         ReleaseDescriptorBuilder builder = super.createDescriptorFromProjects(reactorProjects, workingDirectory);
181         builder.setScmReleaseLabel("release-label");
182         builder.setGenerateReleasePoms(true);
183         return builder;
184     }
185 
186     /*
187      * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#createReactorProjects(java.lang.
188      * String, boolean)
189      */
190     @Override
191     protected List<MavenProject> prepareReactorProjects(String path) throws Exception {
192         String dir = "generate-release-poms/" + path;
193         List<MavenProject> reactorProjects = createReactorProjects(dir, dir, null);
194 
195         scmProviderMock = mock(ScmProvider.class);
196 
197         List<File> releasePoms = new ArrayList<>();
198 
199         for (MavenProject project : reactorProjects) {
200             releasePoms.add(ReleaseUtil.getReleasePom(project));
201         }
202 
203         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
204         ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile(), releasePoms);
205 
206         when(scmProviderMock.add(isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet))))
207                 .thenReturn(new AddScmResult(
208                         "...", Collections.singletonList(new ScmFile("pom.xml", ScmFileStatus.ADDED))));
209 
210         ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
211         stub.setScmProvider(scmProviderMock);
212 
213         return reactorProjects;
214     }
215 
216     @Override
217     protected void verifyReactorProjects(String path, boolean copyFiles) throws Exception {
218         String dir = "generate-release-poms/" + path;
219         List<MavenProject> reactorProjects = createReactorProjects(dir, dir, null);
220 
221         List<File> releasePoms = new ArrayList<>();
222 
223         for (Iterator<MavenProject> iterator = reactorProjects.iterator(); iterator.hasNext(); ) {
224             MavenProject project = iterator.next();
225 
226             releasePoms.add(ReleaseUtil.getReleasePom(project));
227         }
228 
229         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
230         ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile(), releasePoms);
231 
232         verify(scmProviderMock).add(isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet)));
233         verifyNoMoreInteractions(scmProviderMock);
234     }
235 
236     @Override
237     protected void mapNextVersion(ReleaseDescriptorBuilder config, String projectId) {
238         config.addReleaseVersion(projectId, NEXT_VERSION);
239     }
240 
241     /*
242      * @see
243      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#mapAlternateNextVersion(org.apache.
244      * maven.shared.release.config.ReleaseDescriptor, java.lang.String)
245      */
246     @Override
247     protected void mapAlternateNextVersion(ReleaseDescriptorBuilder config, String projectId) {
248         config.addReleaseVersion(projectId, ALTERNATIVE_NEXT_VERSION);
249     }
250 
251     /*
252      * @see
253      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#unmapNextVersion(org.apache.maven.
254      * shared.release.config.ReleaseDescriptor, java.lang.String)
255      */
256     @Override
257     protected void unmapNextVersion(ReleaseDescriptorBuilder config, String projectId) {
258         // nothing to do
259     }
260 
261     /*
262      * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#
263      * createConfigurationForPomWithParentAlternateNextVersion(java.util.List)
264      */
265     @Override
266     protected ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion(
267             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
268         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, workingDirectory);
269 
270         builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
271         builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
272 
273         return builder;
274     }
275 
276     /*
277      * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#
278      * createConfigurationForWithParentNextVersion(java.util.List)
279      */
280     @Override
281     protected ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion(
282             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
283         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, workingDirectory);
284 
285         builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
286         builder.addReleaseVersion("groupId:subproject1", NEXT_VERSION);
287 
288         return builder;
289     }
290 
291     /*
292      * @see
293      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#readTestProjectFile(java.lang.String)
294      */
295     @Override
296     protected String readTestProjectFile(String fileName) throws IOException {
297         return ReleaseUtil.readXmlFile(getTestFile("target/test-classes/projects/generate-release-poms/" + fileName));
298     }
299 
300     /*
301      * @see
302      * org.apache.maven.shared.release.phase.AbstractReleaseTestCase#compareFiles(org.apache.maven.project.MavenProject,
303      * java.lang.String)
304      */
305     // @Override
306     @Override
307     protected void comparePomFiles(MavenProject project, String expectedFileSuffix, boolean normalizeLineEndings)
308             throws IOException {
309         File actualFile = ReleaseUtil.getReleasePom(project);
310         File expectedFile = new File(actualFile.getParentFile(), "expected-release-pom" + expectedFileSuffix + ".xml");
311 
312         comparePomFiles(expectedFile, actualFile, normalizeLineEndings, true);
313     }
314 }