View Javadoc
1   package org.apache.maven.shared.release.config;
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 org.apache.maven.shared.release.phase.AbstractReleaseTestCase;
23  import org.apache.maven.shared.release.scm.IdentifiedScm;
24  import org.codehaus.plexus.PlexusTestCase;
25  import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
26  
27  import java.io.File;
28  import java.io.IOException;
29  
30  /**
31   * Test the properties store.
32   *
33   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
34   */
35  public class PropertiesReleaseDescriptorStoreTest
36      extends PlexusTestCase
37  {
38      private PropertiesReleaseDescriptorStore store;
39      
40      private SecDispatcher secDispatcher;
41  
42      protected void setUp()
43          throws Exception
44      {
45          super.setUp();
46          store = (PropertiesReleaseDescriptorStore) lookup( ReleaseDescriptorStore.ROLE, "properties" );
47          secDispatcher = (SecDispatcher) lookup( SecDispatcher.ROLE, "mng-4384" );
48      }
49  
50      public void testReadFromFile()
51          throws ReleaseDescriptorStoreException
52      {
53          File file = getTestFile( "target/test-classes/release.properties" );
54  
55          ReleaseDescriptor config = store.read( file );
56  
57          ReleaseDescriptor expected = createExpectedReleaseConfiguration();
58  
59          assertEquals( "check matches", expected, config );
60      }
61  
62      public void testReadFromFileUsingWorkingDirectory()
63          throws Exception
64      {
65          ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
66          releaseDescriptor.setWorkingDirectory( AbstractReleaseTestCase.getPath(  getTestFile( "target/test-classes" ) ) );
67          ReleaseDescriptor config = store.read( releaseDescriptor );
68  
69          ReleaseDescriptor expected = createExpectedReleaseConfiguration();
70          expected.setWorkingDirectory( releaseDescriptor.getWorkingDirectory() );
71  
72          assertEquals( "check matches", expected, config );
73      }
74  
75      public void testReadFromEmptyFile()
76          throws ReleaseDescriptorStoreException
77      {
78          File file = getTestFile( "target/test-classes/empty-release.properties" );
79  
80          ReleaseDescriptor config = store.read( file );
81  
82          assertDefaultReleaseConfiguration( config );
83      }
84  
85      public void testReadMissingFile()
86          throws ReleaseDescriptorStoreException
87      {
88          File file = getTestFile( "target/test-classes/no-release.properties" );
89  
90          ReleaseDescriptor config = store.read( file );
91  
92          assertDefaultReleaseConfiguration( config );
93      }
94  
95      public void testMergeFromEmptyFile()
96          throws ReleaseDescriptorStoreException, IOException
97      {
98          File file = getTestFile( "target/test-classes/empty-release.properties" );
99  
100         ReleaseDescriptor mergeDescriptor = createMergeConfiguration();
101         ReleaseDescriptor config = store.read( mergeDescriptor, file );
102 
103         assertEquals( "Check configurations merged", mergeDescriptor, config );
104     }
105 
106     public void testMergeFromMissingFile()
107         throws ReleaseDescriptorStoreException, IOException
108     {
109         File file = getTestFile( "target/test-classes/no-release.properties" );
110 
111         ReleaseDescriptor mergeDescriptor = createMergeConfiguration();
112         ReleaseDescriptor config = store.read( mergeDescriptor, file );
113 
114         assertEquals( "Check configurations merged", mergeDescriptor, config );
115     }
116 
117     public void testWriteToNewFile()
118         throws Exception
119     {
120         File file = getTestFile( "target/test-classes/new-release.properties" );
121         file.delete();
122         assertFalse( "Check file doesn't exist", file.exists() );
123 
124         ReleaseDescriptor config = createReleaseConfigurationForWriting();
125 
126         store.write( config, file );
127 
128         ReleaseDescriptor rereadDescriptor = store.read( file );
129         
130         assertAndAdjustScmPassword( config, rereadDescriptor );
131         assertAndAdjustScmPrivateKeyPassPhrase( config, rereadDescriptor );
132 
133         assertEquals( "compare configuration", config, rereadDescriptor );
134     }
135 
136     public void testWriteToWorkingDirectory()
137         throws Exception
138     {
139         File file = getTestFile( "target/test-classes/new/release.properties" );
140         file.delete();
141         assertFalse( "Check file doesn't exist", file.exists() );
142         file.getParentFile().mkdirs();
143 
144         ReleaseDescriptor config = createReleaseConfigurationForWriting();
145         config.setWorkingDirectory( AbstractReleaseTestCase.getPath( file.getParentFile() ) );
146 
147         store.write( config );
148 
149         ReleaseDescriptor rereadDescriptor = store.read( file );
150         rereadDescriptor.setWorkingDirectory( AbstractReleaseTestCase.getPath( file.getParentFile() ) );
151         
152         assertAndAdjustScmPassword( config, rereadDescriptor );
153         assertAndAdjustScmPrivateKeyPassPhrase( config, rereadDescriptor );
154         
155         assertEquals( "compare configuration", config, rereadDescriptor );
156     }
157 
158     public void testWriteToNewFileRequiredOnly()
159         throws ReleaseDescriptorStoreException
160     {
161         File file = getTestFile( "target/test-classes/new-release.properties" );
162         file.delete();
163         assertFalse( "Check file doesn't exist", file.exists() );
164 
165         ReleaseDescriptor config = new ReleaseDescriptor();
166         config.setCompletedPhase( "completed-phase-write" );
167         config.setScmSourceUrl( "url-write" );
168 
169         store.write( config, file );
170 
171         ReleaseDescriptor rereadDescriptor = store.read( file );
172 
173         assertEquals( "compare configuration", config, rereadDescriptor );
174     }
175 
176     public void testWriteToNewFileDottedIds()
177         throws ReleaseDescriptorStoreException
178     {
179         File file = getTestFile( "target/test-classes/new-release.properties" );
180         file.delete();
181         assertFalse( "Check file doesn't exist", file.exists() );
182 
183         ReleaseDescriptor config = new ReleaseDescriptor();
184         config.setCompletedPhase( "completed-phase-write" );
185         config.setScmSourceUrl( "url-write" );
186 
187         config.mapReleaseVersion( "group.id:artifact.id", "1.1" );
188         config.mapDevelopmentVersion( "group.id:artifact.id", "1.2-SNAPSHOT" );
189 
190         IdentifiedScm scm = new IdentifiedScm();
191         scm.setId( "id" );
192         scm.setConnection( "connection" );
193         scm.setDeveloperConnection( "devConnection" );
194         scm.setTag( "tag" );
195         scm.setUrl( "url" );
196         config.mapOriginalScmInfo( "group.id:artifact.id", scm );
197 
198         store.write( config, file );
199 
200         ReleaseDescriptor rereadDescriptor = store.read( file );
201 
202         assertEquals( "compare configuration", config, rereadDescriptor );
203     }
204 
205     public void testWriteToNewFileNullMappedScm()
206         throws ReleaseDescriptorStoreException
207     {
208         File file = getTestFile( "target/test-classes/new-release.properties" );
209         file.delete();
210         assertFalse( "Check file doesn't exist", file.exists() );
211 
212         ReleaseDescriptor config = new ReleaseDescriptor();
213         config.setCompletedPhase( "completed-phase-write" );
214         config.setScmSourceUrl( "url-write" );
215 
216         config.mapReleaseVersion( "group.id:artifact.id", "1.1" );
217         config.mapDevelopmentVersion( "group.id:artifact.id", "1.2-SNAPSHOT" );
218 
219         config.mapOriginalScmInfo( "group.id:artifact.id", null );
220 
221         store.write( config, file );
222 
223         ReleaseDescriptor rereadDescriptor = store.read( file );
224 
225         assertNull( "check null scm is mapped correctly",
226                     rereadDescriptor.getOriginalScmInfo().get( "group.id:artifact.id" ) );
227 
228         assertEquals( "compare configuration", config, rereadDescriptor );
229     }
230 
231     public void testOverwriteFile()
232         throws Exception
233     {
234         File file = getTestFile( "target/test-classes/rewrite-release.properties" );
235         assertTrue( "Check file already exists", file.exists() );
236 
237         ReleaseDescriptor config = createReleaseConfigurationForWriting();
238 
239         store.write( config, file );
240 
241         ReleaseDescriptor rereadDescriptor = store.read( file );
242         
243         assertAndAdjustScmPassword( config, rereadDescriptor );
244         assertAndAdjustScmPrivateKeyPassPhrase( config, rereadDescriptor );
245 
246         assertEquals( "compare configuration", config, rereadDescriptor );
247     }
248 
249     public void testDeleteFile()
250         throws ReleaseDescriptorStoreException, IOException
251     {
252         File file = getTestFile( "target/test-classes/delete/release.properties" );
253         file.getParentFile().mkdirs();
254         file.createNewFile();
255         assertTrue( "Check file already exists", file.exists() );
256 
257         ReleaseDescriptor config = createReleaseConfigurationForWriting();
258         config.setWorkingDirectory( AbstractReleaseTestCase.getPath( file.getParentFile() ) );
259 
260         store.delete( config );
261 
262         assertFalse( "Check file already exists", file.exists() );
263     }
264 
265     public void testMissingDeleteFile()
266         throws ReleaseDescriptorStoreException, IOException
267     {
268         File file = getTestFile( "target/test-classes/delete/release.properties" );
269         file.getParentFile().mkdirs();
270         file.delete();
271         assertFalse( "Check file already exists", file.exists() );
272 
273         ReleaseDescriptor config = createReleaseConfigurationForWriting();
274         config.setWorkingDirectory( AbstractReleaseTestCase.getPath( file.getParentFile() ) );
275 
276         store.delete( config );
277 
278         assertFalse( "Check file already exists", file.exists() );
279     }
280 
281     private ReleaseDescriptor createReleaseConfigurationForWriting()
282     {
283         ReleaseDescriptor config = new ReleaseDescriptor();
284         config.setCompletedPhase( "completed-phase-write" );
285         config.setCommitByProject( true );
286         config.setScmSourceUrl( "url-write" );
287         config.setScmId( "id-write" );
288         config.setScmUsername( "username-write" );
289         config.setScmPassword( "password-write" );
290         config.setScmPrivateKey( "private-key-write" );
291         config.setScmPrivateKeyPassPhrase( "passphrase-write" );
292         config.setScmTagBase( "tag-base-write" );
293         config.setScmBranchBase( "branch-base-write" );
294         config.setScmReleaseLabel( "tag-write" );
295         config.setAdditionalArguments( "additional-args-write" );
296         config.setPreparationGoals( "preparation-goals-write" );
297         config.setCompletionGoals( "completion-goals-write" );
298         config.setPomFileName( "pom-file-name-write" );
299 
300         config.mapReleaseVersion( "groupId:artifactId", "1.0" );
301         config.mapDevelopmentVersion( "groupId:artifactId", "1.1-SNAPSHOT" );
302 
303         IdentifiedScm scm = new IdentifiedScm();
304         scm.setId( "id-write" );
305         scm.setConnection( "connection-write" );
306         scm.setDeveloperConnection( "developerConnection-write" );
307         scm.setUrl( "url-write" );
308         scm.setTag( "tag-write" );
309         config.mapOriginalScmInfo( "groupId:artifactId", scm );
310 
311         scm = new IdentifiedScm();
312         scm.setConnection( "connection-write" );
313         // omit optional elements
314         config.mapOriginalScmInfo( "groupId:subproject1", scm );
315 
316         return config;
317     }
318 
319     private static void assertDefaultReleaseConfiguration( ReleaseDescriptor config )
320     {
321         assertNull( "Expected no completedPhase", config.getCompletedPhase() );
322         assertFalse( "Expected no commitPerProject", config.isCommitByProject() );
323         assertNull( "Expected no id", config.getScmId() );
324         assertNull( "Expected no url", config.getScmSourceUrl() );
325         assertNull( "Expected no username", config.getScmUsername() );
326         assertNull( "Expected no password", config.getScmPassword() );
327         assertNull( "Expected no privateKey", config.getScmPrivateKey() );
328         assertNull( "Expected no passphrase", config.getScmPrivateKeyPassPhrase() );
329         assertNull( "Expected no tagBase", config.getScmTagBase() );
330         assertNull( "Expected no tag", config.getScmReleaseLabel() );
331         assertNull( "Expected no additional arguments", config.getAdditionalArguments() );
332         assertNull( "Expected no preparation goals", config.getPreparationGoals() );
333         assertNull( "Expected no completion goals", config.getCompletionGoals() );
334         assertNull( "Expected no pom file name", config.getPomFileName() );
335 
336         assertNull( "Expected no workingDirectory", config.getWorkingDirectory() );
337         assertFalse( "Expected no generateReleasePoms", config.isGenerateReleasePoms() );
338         assertFalse( "Expected no useEditMode", config.isScmUseEditMode() );
339         assertTrue( "Expected default interactive", config.isInteractive() );
340         assertFalse( "Expected no addScema", config.isAddSchema() );
341 
342         assertTrue( "Expected no release version mappings", config.getReleaseVersions().isEmpty() );
343         assertTrue( "Expected no dev version mappings", config.getDevelopmentVersions().isEmpty() );
344         assertTrue( "Expected no scm mappings", config.getOriginalScmInfo().isEmpty() );
345         assertNotNull( "Expected resolved snapshot dependencies map", config.getResolvedSnapshotDependencies() );
346     }
347 
348     public ReleaseDescriptor createMergeConfiguration()
349         throws IOException
350     {
351         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
352 
353         releaseDescriptor.setScmSourceUrl( "scm-url" );
354         releaseDescriptor.setScmUsername( "username" );
355         // Not setting other optional SCM settings for brevity
356         releaseDescriptor.setWorkingDirectory( AbstractReleaseTestCase.getPath( getTestFile( "target/test-working-directory" ) ) );
357         // Not setting non-override setting completedPhase
358 
359         return releaseDescriptor;
360     }
361     
362     private void assertAndAdjustScmPassword( ReleaseDescriptor expected, ReleaseDescriptor original )
363         throws Exception
364     {
365         String expectedPassword = expected.getScmPassword();
366         String originalPassword = original.getScmPassword();
367 
368         // encrypting the same password twice doesn't have to be the same result
369         if ( expectedPassword != null ? !expectedPassword.equals( originalPassword ) : originalPassword != null )
370         {
371             assertEquals( secDispatcher.decrypt( expectedPassword ), secDispatcher.decrypt( originalPassword ) );
372 
373             expected.setScmPassword( originalPassword );
374         }
375         assertEquals( expected.getScmPassword(), original.getScmPassword() );
376     }
377 
378     private void assertAndAdjustScmPrivateKeyPassPhrase( ReleaseDescriptor expected, ReleaseDescriptor original )
379         throws Exception
380     {
381         String expectedPassPhrase = expected.getScmPrivateKeyPassPhrase();
382         String originalPassPhrase = original.getScmPrivateKeyPassPhrase();
383 
384         // encrypting the same passphrase twice doesn't have to be the same result
385         if ( expectedPassPhrase != null ? !expectedPassPhrase.equals( originalPassPhrase ) : originalPassPhrase != null )
386         {
387             assertEquals( secDispatcher.decrypt( expectedPassPhrase ), secDispatcher.decrypt( originalPassPhrase ) );
388 
389             expected.setScmPrivateKeyPassPhrase( originalPassPhrase );
390         }
391         assertEquals( expected.getScmPrivateKeyPassPhrase(), original.getScmPrivateKeyPassPhrase() );
392     }
393 
394     private ReleaseDescriptor createExpectedReleaseConfiguration()
395     {
396         ReleaseDescriptor expected = new ReleaseDescriptor();
397         expected.setCompletedPhase( "step1" );
398         expected.setCommitByProject( true );
399         expected.setScmId( "scm-id" );
400         expected.setScmSourceUrl( "scm-url" );
401         expected.setScmUsername( "username" );
402         expected.setScmPassword( "password" );
403         expected.setScmPrivateKey( "private-key" );
404         expected.setScmPrivateKeyPassPhrase( "passphrase" );
405         expected.setScmTagBase( "tagBase" );
406         expected.setScmTagNameFormat( "expectedTagNameFormat" );
407         expected.setScmBranchBase( "branchBase" );
408         expected.setScmReleaseLabel( "tag" );
409         expected.setAdditionalArguments( "additional-arguments" );
410         expected.setPreparationGoals( "preparation-goals" );
411         expected.setCompletionGoals( "completion-goals" );
412         expected.setPomFileName( "pom-file-name" );
413         expected.setWorkingDirectory( null );
414         expected.setGenerateReleasePoms( false );
415         expected.setScmUseEditMode( false );
416         expected.setInteractive( true );
417         expected.setAddSchema( false );
418         expected.mapReleaseVersion( "groupId:artifactId1", "2.0" );
419         expected.mapReleaseVersion( "groupId:artifactId2", "3.0" );
420         expected.mapDevelopmentVersion( "groupId:artifactId1", "2.1-SNAPSHOT" );
421         expected.mapDevelopmentVersion( "groupId:artifactId2", "3.0.1-SNAPSHOT" );
422         IdentifiedScm scm = new IdentifiedScm();
423         scm.setId( "id" );
424         scm.setConnection( "connection" );
425         scm.setDeveloperConnection( "developerConnection" );
426         scm.setUrl( "url" );
427         scm.setTag( "tag" );
428         expected.mapOriginalScmInfo( "groupId:artifactId1", scm );
429         scm = new IdentifiedScm();
430         scm.setId( null );
431         scm.setConnection( "connection2" );
432         scm.setUrl( "url2" );
433         scm.setTag( null );
434         scm.setDeveloperConnection( null );
435         expected.mapOriginalScmInfo( "groupId:artifactId2", scm );
436         expected.mapResolvedSnapshotDependencies( "external:artifactId", "1.0", "1.1-SNAPSHOT" );
437 
438         return expected;
439     }
440 
441 }