blob: 0b93bbf6a11e85d301ea3c6d027f293e5e5bceb5 [file] [log] [blame]
package org.apache.maven.shared.release.config;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.maven.shared.release.phase.AbstractReleaseTestCase;
import org.apache.maven.shared.release.scm.IdentifiedScm;
import org.codehaus.plexus.PlexusTestCase;
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
import java.io.File;
import java.io.IOException;
/**
* Test the properties store.
*
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
*/
public class PropertiesReleaseDescriptorStoreTest
extends PlexusTestCase
{
private PropertiesReleaseDescriptorStore store;
private SecDispatcher secDispatcher;
@Override
protected void setUp()
throws Exception
{
super.setUp();
store = (PropertiesReleaseDescriptorStore) lookup( ReleaseDescriptorStore.class, "properties" );
secDispatcher = (SecDispatcher) lookup( SecDispatcher.class, "mng-4384" );
}
public void testReadFromFile()
throws ReleaseDescriptorStoreException
{
File file = getTestFile( "target/test-classes/release.properties" );
ReleaseDescriptor config = store.read( file );
ReleaseDescriptor expected = createExpectedReleaseConfiguration();
assertEquals( "check matches", expected, config );
}
public void testReadFromFileUsingWorkingDirectory()
throws Exception
{
ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
releaseDescriptor.setWorkingDirectory( AbstractReleaseTestCase.getPath( getTestFile( "target/test-classes" ) ) );
ReleaseDescriptor config = store.read( releaseDescriptor );
ReleaseDescriptor expected = createExpectedReleaseConfiguration();
expected.setWorkingDirectory( releaseDescriptor.getWorkingDirectory() );
assertEquals( "check matches", expected, config );
}
public void testReadFromEmptyFile()
throws ReleaseDescriptorStoreException
{
File file = getTestFile( "target/test-classes/empty-release.properties" );
ReleaseDescriptor config = store.read( file );
assertDefaultReleaseConfiguration( config );
}
public void testReadMissingFile()
throws ReleaseDescriptorStoreException
{
File file = getTestFile( "target/test-classes/no-release.properties" );
ReleaseDescriptor config = store.read( file );
assertDefaultReleaseConfiguration( config );
}
public void testMergeFromEmptyFile()
throws ReleaseDescriptorStoreException, IOException
{
File file = getTestFile( "target/test-classes/empty-release.properties" );
ReleaseDescriptor mergeDescriptor = createMergeConfiguration();
ReleaseDescriptor config = store.read( mergeDescriptor, file );
assertEquals( "Check configurations merged", mergeDescriptor, config );
}
public void testMergeFromMissingFile()
throws ReleaseDescriptorStoreException, IOException
{
File file = getTestFile( "target/test-classes/no-release.properties" );
ReleaseDescriptor mergeDescriptor = createMergeConfiguration();
ReleaseDescriptor config = store.read( mergeDescriptor, file );
assertEquals( "Check configurations merged", mergeDescriptor, config );
}
public void testWriteToNewFile()
throws Exception
{
File file = getTestFile( "target/test-classes/new-release.properties" );
file.delete();
assertFalse( "Check file doesn't exist", file.exists() );
ReleaseDescriptor config = createReleaseConfigurationForWriting();
store.write( config, file );
ReleaseDescriptor rereadDescriptor = store.read( file );
assertAndAdjustScmPassword( config, rereadDescriptor );
assertAndAdjustScmPrivateKeyPassPhrase( config, rereadDescriptor );
assertEquals( "compare configuration", config, rereadDescriptor );
}
public void testWriteToWorkingDirectory()
throws Exception
{
File file = getTestFile( "target/test-classes/new/release.properties" );
file.delete();
assertFalse( "Check file doesn't exist", file.exists() );
file.getParentFile().mkdirs();
ReleaseDescriptor config = createReleaseConfigurationForWriting();
config.setWorkingDirectory( AbstractReleaseTestCase.getPath( file.getParentFile() ) );
store.write( config );
ReleaseDescriptor rereadDescriptor = store.read( file );
rereadDescriptor.setWorkingDirectory( AbstractReleaseTestCase.getPath( file.getParentFile() ) );
assertAndAdjustScmPassword( config, rereadDescriptor );
assertAndAdjustScmPrivateKeyPassPhrase( config, rereadDescriptor );
assertEquals( "compare configuration", config, rereadDescriptor );
}
public void testWriteToNewFileRequiredOnly()
throws ReleaseDescriptorStoreException
{
File file = getTestFile( "target/test-classes/new-release.properties" );
file.delete();
assertFalse( "Check file doesn't exist", file.exists() );
ReleaseDescriptor config = new ReleaseDescriptor();
config.setCompletedPhase( "completed-phase-write" );
config.setScmSourceUrl( "url-write" );
store.write( config, file );
ReleaseDescriptor rereadDescriptor = store.read( file );
assertEquals( "compare configuration", config, rereadDescriptor );
}
public void testWriteToNewFileDottedIds()
throws ReleaseDescriptorStoreException
{
File file = getTestFile( "target/test-classes/new-release.properties" );
file.delete();
assertFalse( "Check file doesn't exist", file.exists() );
ReleaseDescriptor config = new ReleaseDescriptor();
config.setCompletedPhase( "completed-phase-write" );
config.setScmSourceUrl( "url-write" );
config.mapReleaseVersion( "group.id:artifact.id", "1.1" );
config.mapDevelopmentVersion( "group.id:artifact.id", "1.2-SNAPSHOT" );
IdentifiedScm scm = new IdentifiedScm();
scm.setId( "id" );
scm.setConnection( "connection" );
scm.setDeveloperConnection( "devConnection" );
scm.setTag( "tag" );
scm.setUrl( "url" );
config.mapOriginalScmInfo( "group.id:artifact.id", scm );
store.write( config, file );
ReleaseDescriptor rereadDescriptor = store.read( file );
assertEquals( "compare configuration", config, rereadDescriptor );
}
public void testWriteToNewFileNullMappedScm()
throws ReleaseDescriptorStoreException
{
File file = getTestFile( "target/test-classes/new-release.properties" );
file.delete();
assertFalse( "Check file doesn't exist", file.exists() );
ReleaseDescriptor config = new ReleaseDescriptor();
config.setCompletedPhase( "completed-phase-write" );
config.setScmSourceUrl( "url-write" );
config.mapReleaseVersion( "group.id:artifact.id", "1.1" );
config.mapDevelopmentVersion( "group.id:artifact.id", "1.2-SNAPSHOT" );
config.mapOriginalScmInfo( "group.id:artifact.id", null );
store.write( config, file );
ReleaseDescriptor rereadDescriptor = store.read( file );
assertNull( "check null scm is mapped correctly",
rereadDescriptor.getOriginalScmInfo().get( "group.id:artifact.id" ) );
assertEquals( "compare configuration", config, rereadDescriptor );
}
public void testOverwriteFile()
throws Exception
{
File file = getTestFile( "target/test-classes/rewrite-release.properties" );
assertTrue( "Check file already exists", file.exists() );
ReleaseDescriptor config = createReleaseConfigurationForWriting();
store.write( config, file );
ReleaseDescriptor rereadDescriptor = store.read( file );
assertAndAdjustScmPassword( config, rereadDescriptor );
assertAndAdjustScmPrivateKeyPassPhrase( config, rereadDescriptor );
assertEquals( "compare configuration", config, rereadDescriptor );
}
public void testDeleteFile()
throws ReleaseDescriptorStoreException, IOException
{
File file = getTestFile( "target/test-classes/delete/release.properties" );
file.getParentFile().mkdirs();
file.createNewFile();
assertTrue( "Check file already exists", file.exists() );
ReleaseDescriptor config = createReleaseConfigurationForWriting();
config.setWorkingDirectory( AbstractReleaseTestCase.getPath( file.getParentFile() ) );
store.delete( config );
assertFalse( "Check file already exists", file.exists() );
}
public void testMissingDeleteFile()
throws ReleaseDescriptorStoreException, IOException
{
File file = getTestFile( "target/test-classes/delete/release.properties" );
file.getParentFile().mkdirs();
file.delete();
assertFalse( "Check file already exists", file.exists() );
ReleaseDescriptor config = createReleaseConfigurationForWriting();
config.setWorkingDirectory( AbstractReleaseTestCase.getPath( file.getParentFile() ) );
store.delete( config );
assertFalse( "Check file already exists", file.exists() );
}
private ReleaseDescriptor createReleaseConfigurationForWriting()
{
ReleaseDescriptor config = new ReleaseDescriptor();
config.setCompletedPhase( "completed-phase-write" );
config.setCommitByProject( true );
config.setScmSourceUrl( "url-write" );
config.setScmId( "id-write" );
config.setScmUsername( "username-write" );
config.setScmPassword( "password-write" );
config.setScmPrivateKey( "private-key-write" );
config.setScmPrivateKeyPassPhrase( "passphrase-write" );
config.setScmTagBase( "tag-base-write" );
config.setScmBranchBase( "branch-base-write" );
config.setScmReleaseLabel( "tag-write" );
config.setAdditionalArguments( "additional-args-write" );
config.setPreparationGoals( "preparation-goals-write" );
config.setCompletionGoals( "completion-goals-write" );
config.setPomFileName( "pom-file-name-write" );
config.mapReleaseVersion( "groupId:artifactId", "1.0" );
config.mapDevelopmentVersion( "groupId:artifactId", "1.1-SNAPSHOT" );
IdentifiedScm scm = new IdentifiedScm();
scm.setId( "id-write" );
scm.setConnection( "connection-write" );
scm.setDeveloperConnection( "developerConnection-write" );
scm.setUrl( "url-write" );
scm.setTag( "tag-write" );
config.mapOriginalScmInfo( "groupId:artifactId", scm );
scm = new IdentifiedScm();
scm.setConnection( "connection-write" );
// omit optional elements
config.mapOriginalScmInfo( "groupId:subproject1", scm );
return config;
}
private static void assertDefaultReleaseConfiguration( ReleaseDescriptor config )
{
assertNull( "Expected no completedPhase", config.getCompletedPhase() );
assertFalse( "Expected no commitPerProject", config.isCommitByProject() );
assertNull( "Expected no id", config.getScmId() );
assertNull( "Expected no url", config.getScmSourceUrl() );
assertNull( "Expected no username", config.getScmUsername() );
assertNull( "Expected no password", config.getScmPassword() );
assertNull( "Expected no privateKey", config.getScmPrivateKey() );
assertNull( "Expected no passphrase", config.getScmPrivateKeyPassPhrase() );
assertNull( "Expected no tagBase", config.getScmTagBase() );
assertNull( "Expected no tag", config.getScmReleaseLabel() );
assertNull( "Expected no additional arguments", config.getAdditionalArguments() );
assertNull( "Expected no preparation goals", config.getPreparationGoals() );
assertNull( "Expected no completion goals", config.getCompletionGoals() );
assertNull( "Expected no pom file name", config.getPomFileName() );
assertNull( "Expected no workingDirectory", config.getWorkingDirectory() );
assertFalse( "Expected no generateReleasePoms", config.isGenerateReleasePoms() );
assertFalse( "Expected no useEditMode", config.isScmUseEditMode() );
assertTrue( "Expected default interactive", config.isInteractive() );
assertFalse( "Expected no addScema", config.isAddSchema() );
assertTrue( "Expected no release version mappings", config.getReleaseVersions().isEmpty() );
assertTrue( "Expected no dev version mappings", config.getDevelopmentVersions().isEmpty() );
assertTrue( "Expected no scm mappings", config.getOriginalScmInfo().isEmpty() );
assertNotNull( "Expected resolved snapshot dependencies map", config.getResolvedSnapshotDependencies() );
}
public ReleaseDescriptor createMergeConfiguration()
throws IOException
{
ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
releaseDescriptor.setScmSourceUrl( "scm-url" );
releaseDescriptor.setScmUsername( "username" );
// Not setting other optional SCM settings for brevity
releaseDescriptor.setWorkingDirectory( AbstractReleaseTestCase.getPath( getTestFile( "target/test-working-directory" ) ) );
// Not setting non-override setting completedPhase
return releaseDescriptor;
}
private void assertAndAdjustScmPassword( ReleaseDescriptor expected, ReleaseDescriptor original )
throws Exception
{
String expectedPassword = expected.getScmPassword();
String originalPassword = original.getScmPassword();
// encrypting the same password twice doesn't have to be the same result
if ( expectedPassword != null ? !expectedPassword.equals( originalPassword ) : originalPassword != null )
{
assertEquals( secDispatcher.decrypt( expectedPassword ), secDispatcher.decrypt( originalPassword ) );
expected.setScmPassword( originalPassword );
}
assertEquals( expected.getScmPassword(), original.getScmPassword() );
}
private void assertAndAdjustScmPrivateKeyPassPhrase( ReleaseDescriptor expected, ReleaseDescriptor original )
throws Exception
{
String expectedPassPhrase = expected.getScmPrivateKeyPassPhrase();
String originalPassPhrase = original.getScmPrivateKeyPassPhrase();
// encrypting the same passphrase twice doesn't have to be the same result
if ( expectedPassPhrase != null ? !expectedPassPhrase.equals( originalPassPhrase ) : originalPassPhrase != null )
{
assertEquals( secDispatcher.decrypt( expectedPassPhrase ), secDispatcher.decrypt( originalPassPhrase ) );
expected.setScmPrivateKeyPassPhrase( originalPassPhrase );
}
assertEquals( expected.getScmPrivateKeyPassPhrase(), original.getScmPrivateKeyPassPhrase() );
}
private ReleaseDescriptor createExpectedReleaseConfiguration()
{
ReleaseDescriptor expected = new ReleaseDescriptor();
expected.setCompletedPhase( "step1" );
expected.setCommitByProject( true );
expected.setScmId( "scm-id" );
expected.setScmSourceUrl( "scm-url" );
expected.setScmUsername( "username" );
expected.setScmPassword( "password" );
expected.setScmPrivateKey( "private-key" );
expected.setScmPrivateKeyPassPhrase( "passphrase" );
expected.setScmTagBase( "tagBase" );
expected.setScmTagNameFormat( "expectedTagNameFormat" );
expected.setScmBranchBase( "branchBase" );
expected.setScmReleaseLabel( "tag" );
expected.setAdditionalArguments( "additional-arguments" );
expected.setPreparationGoals( "preparation-goals" );
expected.setCompletionGoals( "completion-goals" );
expected.setPomFileName( "pom-file-name" );
expected.setWorkingDirectory( null );
expected.setGenerateReleasePoms( false );
expected.setScmUseEditMode( false );
expected.setInteractive( true );
expected.setAddSchema( false );
expected.mapReleaseVersion( "groupId:artifactId1", "2.0" );
expected.mapReleaseVersion( "groupId:artifactId2", "3.0" );
expected.mapDevelopmentVersion( "groupId:artifactId1", "2.1-SNAPSHOT" );
expected.mapDevelopmentVersion( "groupId:artifactId2", "3.0.1-SNAPSHOT" );
IdentifiedScm scm = new IdentifiedScm();
scm.setId( "id" );
scm.setConnection( "connection" );
scm.setDeveloperConnection( "developerConnection" );
scm.setUrl( "url" );
scm.setTag( "tag" );
expected.mapOriginalScmInfo( "groupId:artifactId1", scm );
scm = new IdentifiedScm();
scm.setId( null );
scm.setConnection( "connection2" );
scm.setUrl( "url2" );
scm.setTag( null );
scm.setDeveloperConnection( null );
expected.mapOriginalScmInfo( "groupId:artifactId2", scm );
expected.mapResolvedSnapshotDependencies( "external:artifactId", "1.0", "1.1-SNAPSHOT" );
return expected;
}
}