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;
    }

}
