View Javadoc

1   package org.apache.maven.shared.release.phase;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import static org.mockito.Mockito.*;
23  
24  import java.util.Collections;
25  import java.util.List;
26  
27  import org.apache.maven.project.MavenProject;
28  import org.apache.maven.scm.ScmFile;
29  import org.apache.maven.scm.ScmFileSet;
30  import org.apache.maven.scm.ScmFileStatus;
31  import org.apache.maven.scm.ScmVersion;
32  import org.apache.maven.scm.command.checkin.CheckInScmResult;
33  import org.apache.maven.scm.manager.ScmManager;
34  import org.apache.maven.scm.manager.ScmManagerStub;
35  import org.apache.maven.scm.provider.ScmProvider;
36  import org.apache.maven.scm.repository.ScmRepository;
37  import org.apache.maven.shared.release.config.ReleaseDescriptor;
38  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
39  import org.apache.maven.shared.release.util.ReleaseUtil;
40  
41  /**
42   * Test the SCM development commit phase.
43   *
44   * @author <a href="mailto:me@lcorneliussen.de">Lars Corneliussen</a>
45   */
46  public class ScmCommitDevelopmentPhaseTest
47      extends AbstractReleaseTestCase
48  {
49      private static final String COMMIT_MESSAGE = "[maven-release-manager] prepare for next development iteration";
50  
51      private static final String ROLLBACK_PREFIX =
52          "[maven-release-manager] rollback changes from release preparation of ";
53  
54      private List<MavenProject> reactorProjects;
55  
56      private MavenProject rootProject;
57  
58      private ReleaseDescriptor descriptor;
59      
60      private ScmProvider scmProviderMock;
61  
62      protected void setUp()
63          throws Exception
64      {
65          super.setUp();
66  
67          phase = (ReleasePhase) lookup( ReleasePhase.ROLE, "scm-commit-development" );
68  
69          reactorProjects = createReactorProjects();
70          rootProject = ReleaseUtil.getRootProject( reactorProjects );
71          descriptor = createReleaseDescriptor( rootProject );
72      }
73  
74      public void testIsCorrectImplementation()
75      {
76          assertEquals( ScmCommitDevelopmentPhase.class, phase.getClass() );
77      }
78  
79      public void testNoCommitOrRollbackRequired()
80          throws Exception
81      {
82          ReleaseDescriptor descriptor = createReleaseDescriptor( rootProject );
83          List<MavenProject> reactorProjects = createReactorProjects();
84  
85          descriptor.setRemoteTagging( false );
86          descriptor.setSuppressCommitBeforeTagOrBranch( true );
87          descriptor.setUpdateWorkingCopyVersions( false );
88  
89          prepareNoCheckin();
90  
91          phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
92  
93          verifyNoCheckin();
94      }
95  
96      public void testCommitsNextVersions()
97          throws Exception
98      {
99          descriptor.setUpdateWorkingCopyVersions( true );
100 
101         prepareCheckin( COMMIT_MESSAGE );
102 
103         phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
104 
105         verifyCheckin( COMMIT_MESSAGE );
106     }
107 
108     public void testCommitsRollbackPrepare()
109         throws Exception
110     {
111         descriptor.setUpdateWorkingCopyVersions( false );
112 
113         String message = ROLLBACK_PREFIX + descriptor.getScmReleaseLabel();
114         
115         prepareCheckin( message );
116 
117         phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
118 
119         verifyCheckin( message );
120     }
121 
122     private void prepareCheckin( String message )
123         throws Exception
124     {
125         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), rootProject.getFile() );
126         scmProviderMock = mock( ScmProvider.class );
127         when( scmProviderMock.checkIn( isA( ScmRepository.class ),
128                                        argThat( new IsScmFileSetEquals( fileSet ) ),
129                                        isNull( ScmVersion.class ),
130                                        eq( message ) ) ).thenReturn( new CheckInScmResult( "...", Collections.singletonList( new ScmFile( rootProject
131                                                                                                                                           .getFile().getPath(), ScmFileStatus.CHECKED_IN ) ) ) );
132         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
133         stub.setScmProvider( scmProviderMock );
134     }
135     
136     private void verifyCheckin( String message ) throws Exception
137     {
138         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), rootProject.getFile() );
139         verify( scmProviderMock ).checkIn( isA( ScmRepository.class ),
140                                            argThat( new IsScmFileSetEquals( fileSet ) ),
141                                            isNull( ScmVersion.class ),
142                                            eq( message ) );
143         verifyNoMoreInteractions( scmProviderMock );
144     }
145 
146     private void prepareNoCheckin()
147         throws Exception
148     {
149         scmProviderMock = mock( ScmProvider.class );
150         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
151         stub.setScmProvider( scmProviderMock );
152     }
153     
154     private void verifyNoCheckin()
155     {
156         verifyNoMoreInteractions( scmProviderMock );
157     }
158 
159     private List<MavenProject> createReactorProjects()
160         throws Exception
161     {
162         return createReactorProjects( "scm-commit/", "single-pom" );
163     }
164 
165     private static ReleaseDescriptor createReleaseDescriptor( MavenProject rootProject )
166     {
167         ReleaseDescriptor descriptor = new ReleaseDescriptor();
168         descriptor.setScmSourceUrl( "scm-url" );
169         descriptor.setScmReleaseLabel( "release-label" );
170         descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
171         return descriptor;
172     }
173 }