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.BufferedReader;
22  import java.io.File;
23  import java.io.StringReader;
24  import java.util.ArrayList;
25  import java.util.Collections;
26  import java.util.Iterator;
27  import java.util.List;
28  
29  import org.apache.maven.project.MavenProject;
30  import org.apache.maven.scm.ScmFile;
31  import org.apache.maven.scm.ScmFileSet;
32  import org.apache.maven.scm.ScmFileStatus;
33  import org.apache.maven.scm.command.remove.RemoveScmResult;
34  import org.apache.maven.scm.manager.ScmManager;
35  import org.apache.maven.scm.manager.ScmManagerStub;
36  import org.apache.maven.scm.provider.ScmProvider;
37  import org.apache.maven.scm.repository.ScmRepository;
38  import org.apache.maven.shared.release.ReleaseResult;
39  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
40  import org.apache.maven.shared.release.config.ReleaseUtils;
41  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
42  import org.apache.maven.shared.release.util.ReleaseUtil;
43  import org.junit.Test;
44  
45  import static org.junit.Assert.assertEquals;
46  import static org.mockito.Matchers.argThat;
47  import static org.mockito.Matchers.isA;
48  import static org.mockito.Mockito.mock;
49  import static org.mockito.Mockito.verify;
50  import static org.mockito.Mockito.verifyNoMoreInteractions;
51  import static org.mockito.Mockito.when;
52  
53  /**
54   * Test the remove release POMs phase.
55   *
56   * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
57   */
58  public class RemoveReleasePomsPhaseTest extends AbstractReleaseTestCase {
59      @Override
60      public void setUp() throws Exception {
61          super.setUp();
62  
63          phase = lookup(ReleasePhase.class, "remove-release-poms");
64      }
65  
66      @Test
67      public void testExecuteBasicPom() throws Exception {
68          // prepare
69          File workingDirectory = getTestFile("target/test/checkout");
70          List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
71          ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder(workingDirectory);
72          MavenProject project = ReleaseUtil.getRootProject(reactorProjects);
73  
74          File releasePom = ReleaseUtil.getReleasePom(project);
75          ScmFileSet fileSet = new ScmFileSet(workingDirectory, releasePom);
76  
77          ScmProvider scmProviderMock = mock(ScmProvider.class);
78          when(scmProviderMock.remove(
79                          isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet)), isA(String.class)))
80                  .thenReturn(new RemoveScmResult(
81                          "...", Collections.singletonList(new ScmFile("pom.xml", ScmFileStatus.DELETED))));
82  
83          ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
84          stub.setScmProvider(scmProviderMock);
85  
86          // execute
87          phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
88  
89          // verify
90          verify(scmProviderMock)
91                  .remove(isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet)), isA(String.class));
92          verifyNoMoreInteractions(scmProviderMock);
93      }
94  
95      @Test
96      public void testExecutePomWithModules() throws Exception {
97          // prepare
98          File workingDirectory = getTestFile("target/test/checkout");
99          List<MavenProject> reactorProjects = createReactorProjects("pom-with-modules");
100         ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
101 
102         List<File> releasePoms = new ArrayList<>();
103         for (Iterator<MavenProject> iterator = reactorProjects.iterator(); iterator.hasNext(); ) {
104             MavenProject project = iterator.next();
105             File releasePom = ReleaseUtil.getReleasePom(project);
106             releasePoms.add(releasePom);
107         }
108 
109         ScmFileSet fileSet = new ScmFileSet(workingDirectory, releasePoms);
110 
111         ScmProvider scmProviderMock = mock(ScmProvider.class);
112         when(scmProviderMock.remove(
113                         isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet)), isA(String.class)))
114                 .thenReturn(new RemoveScmResult(
115                         "...", Collections.singletonList(new ScmFile("pom.xml", ScmFileStatus.DELETED))));
116 
117         ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
118         stub.setScmProvider(scmProviderMock);
119 
120         // execute
121         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
122 
123         // verify
124         verify(scmProviderMock)
125                 .remove(isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet)), isA(String.class));
126         verifyNoMoreInteractions(scmProviderMock);
127     }
128 
129     @Test
130     public void testSimulateBasicPom() throws Exception {
131         // prepare
132         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
133         ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
134 
135         ScmProvider scmProviderMock = mock(ScmProvider.class);
136 
137         ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
138         stub.setScmProvider(scmProviderMock);
139 
140         // execute
141         phase.simulate(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
142 
143         // never invoke scmProviderMock
144         verifyNoMoreInteractions(scmProviderMock);
145     }
146 
147     @Test
148     public void testExecuteWithSuppressCommitBeforeTag() throws Exception {
149         // prepare
150         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
151         ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
152         builder.setSuppressCommitBeforeTagOrBranch(true);
153         builder.setGenerateReleasePoms(true);
154 
155         ScmProvider scmProviderMock = mock(ScmProvider.class);
156 
157         ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
158         stub.setScmProvider(scmProviderMock);
159 
160         // execute
161         ReleaseResult result = phase.execute(
162                 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
163 
164         try (BufferedReader reader = new BufferedReader(new StringReader(result.getOutput()))) {
165             assertEquals("[INFO] Removing release POM for 'artifactId'...", reader.readLine());
166             assertEquals("Expected EOF", null, reader.readLine());
167         }
168 
169         // never invoke scmProviderMock
170         verifyNoMoreInteractions(scmProviderMock);
171     }
172 
173     @Test
174     public void testSimulateWithSuppressCommitBeforeTag() throws Exception {
175         // prepare
176         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
177         ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder();
178         builder.setSuppressCommitBeforeTagOrBranch(true);
179         builder.setGenerateReleasePoms(true);
180 
181         ScmProvider scmProviderMock = mock(ScmProvider.class);
182 
183         ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
184         stub.setScmProvider(scmProviderMock);
185 
186         // execute
187         ReleaseResult result = phase.simulate(
188                 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
189 
190         try (BufferedReader reader = new BufferedReader(new StringReader(result.getOutput()))) {
191             assertEquals("[INFO] Removing release POM for 'artifactId'...", reader.readLine());
192             assertEquals(
193                     "[INFO] Full run would be removing ["
194                             + reactorProjects.get(0).getFile().getParent() + File.separator + "release-pom.xml]",
195                     reader.readLine());
196             assertEquals("Expected EOF", null, reader.readLine());
197         }
198 
199         // never invoke scmProviderMock
200         verifyNoMoreInteractions(scmProviderMock);
201     }
202 
203     protected List<MavenProject> createReactorProjects(String path) throws Exception {
204         String dir = "remove-release-poms/" + path;
205         return createReactorProjects(dir, dir, null);
206     }
207 
208     private ReleaseDescriptorBuilder createReleaseDescriptorBuilder() {
209         return createReleaseDescriptorBuilder(getTestFile("target/test/checkout"));
210     }
211 
212     private ReleaseDescriptorBuilder createReleaseDescriptorBuilder(File workingDirectory) {
213         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
214         builder.setGenerateReleasePoms(true);
215         builder.setWorkingDirectory(workingDirectory.getAbsolutePath());
216         return builder;
217     }
218 }