package org.apache.archiva.converter.artifact; /* * 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 junit.framework.TestCase; import org.apache.archiva.common.plexusbridge.PlexusSisuBridge; import org.apache.archiva.common.utils.FileUtil; import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner; import org.apache.commons.io.FileUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.metadata.ArtifactMetadata; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata; import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ContextConfiguration; import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; /** * LegacyToDefaultConverterTest */ @RunWith (ArchivaSpringJUnit4ClassRunner.class) @ContextConfiguration (locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" }) public class LegacyToDefaultConverterTest extends TestCase { private ArtifactRepository sourceRepository; private ArtifactRepository targetRepository; private ArtifactConverter artifactConverter; private ArtifactFactory artifactFactory; @Inject private PlexusSisuBridge plexusSisuBridge; @Inject private ApplicationContext applicationContext; private static final int SLEEP_MILLIS = 100; @Before public void init() throws Exception { super.setUp(); ArtifactRepositoryFactory factory = plexusSisuBridge.lookup( ArtifactRepositoryFactory.class ); Map<String, ArtifactRepositoryLayout> layoutsMap = plexusSisuBridge.lookupMap( ArtifactRepositoryLayout.class ); System.out.println( "hints " + layoutsMap.keySet().toString() ); ArtifactRepositoryLayout layout = plexusSisuBridge.lookup( ArtifactRepositoryLayout.class, "legacy" ); File sourceBase = getTestFile( "src/test/source-repository" ); sourceRepository = factory.createArtifactRepository( "source", sourceBase.toURL().toString(), layout, null, null ); layout = plexusSisuBridge.lookup( ArtifactRepositoryLayout.class, "default" ); File targetBase = getTestFile( "target/test-target-repository" ); copyDirectoryStructure( getTestFile( "src/test/target-repository" ), targetBase ); targetRepository = factory.createArtifactRepository( "target", targetBase.toURL().toString(), layout, null, null ); artifactConverter = applicationContext.getBean( "artifactConverter#legacy-to-default", ArtifactConverter.class ); artifactConverter.clearWarnings(); artifactFactory = (ArtifactFactory) plexusSisuBridge.lookup( ArtifactFactory.class ); } public static File getTestFile( String path ) { return new File( FileUtil.getBasedir(), path ); } private void copyDirectoryStructure( File sourceDirectory, File destinationDirectory ) throws IOException { if ( !sourceDirectory.exists() ) { throw new IOException( "Source directory doesn't exists (" + sourceDirectory.getAbsolutePath() + ")." ); } File[] files = sourceDirectory.listFiles(); String sourcePath = sourceDirectory.getAbsolutePath(); for ( int i = 0; i < files.length; i++ ) { File file = files[i]; String dest = file.getAbsolutePath(); dest = dest.substring( sourcePath.length() + 1 ); File destination = new File( destinationDirectory, dest ); if ( file.isFile() ) { destination = destination.getParentFile(); FileUtils.copyFileToDirectory( file, destination ); } else if ( file.isDirectory() ) { if ( !".svn".equals( file.getName() ) ) { if ( !destination.exists() && !destination.mkdirs() ) { throw new IOException( "Could not create destination directory '" + destination.getAbsolutePath() + "'." ); } copyDirectoryStructure( file, destination ); } } else { throw new IOException( "Unknown file type: " + file.getAbsolutePath() ); } } } @Test public void testV4PomConvert() throws Exception { // test that it is copied as is Artifact artifact = createArtifact( "test", "v4artifact", "1.0.0" ); ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact ); File artifactMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) ); artifactMetadataFile.delete(); ArtifactMetadata versionMetadata = new SnapshotArtifactRepositoryMetadata( artifact ); File versionMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( versionMetadata ) ); versionMetadataFile.delete(); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); artifactFile.delete(); artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ); assertTrue( "Check POM created", pomFile.exists() ); compareFiles( sourcePomFile, pomFile ); assertTrue( "Check artifact metadata created", artifactMetadataFile.exists() ); File expectedMetadataFile = getTestFile( "src/test/expected-files/v4-artifact-metadata.xml" ); compareFiles( expectedMetadataFile, artifactMetadataFile ); assertTrue( "Check snapshot metadata created", versionMetadataFile.exists() ); expectedMetadataFile = getTestFile( "src/test/expected-files/v4-version-metadata.xml" ); compareFiles( expectedMetadataFile, versionMetadataFile ); } @Test public void testV3PomConvert() throws Exception { // test that the pom is coverted Artifact artifact = createArtifact( "test", "v3artifact", "1.0.0" ); ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact ); File artifactMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) ); artifactMetadataFile.delete(); ArtifactMetadata versionMetadata = new SnapshotArtifactRepositoryMetadata( artifact ); File versionMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( versionMetadata ) ); versionMetadataFile.delete(); artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File expectedPomFile = getTestFile( "src/test/expected-files/converted-v3.pom" ); assertTrue( "Check POM created", pomFile.exists() ); compareFiles( expectedPomFile, pomFile ); assertTrue( "Check artifact metadata created", artifactMetadataFile.exists() ); File expectedMetadataFile = getTestFile( "src/test/expected-files/v3-artifact-metadata.xml" ); compareFiles( expectedMetadataFile, artifactMetadataFile ); assertTrue( "Check snapshot metadata created", versionMetadataFile.exists() ); expectedMetadataFile = getTestFile( "src/test/expected-files/v3-version-metadata.xml" ); compareFiles( expectedMetadataFile, versionMetadataFile ); } @Test public void testV3PomConvertWithRelocation() throws Exception { Artifact artifact = createArtifact( "test", "relocated-v3artifact", "1.0.0" ); ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact ); File artifactMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) ); artifactMetadataFile.delete(); ArtifactMetadata versionMetadata = new SnapshotArtifactRepositoryMetadata( artifact ); File versionMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( versionMetadata ) ); versionMetadataFile.delete(); artifactConverter.convert( artifact, targetRepository ); //checkSuccess(); --> commented until MNG-2100 is fixed File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check if relocated artifact created", artifactFile.exists() ); assertTrue( "Check if relocated artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); Artifact pomArtifact = createArtifact( "relocated-test", "relocated-v3artifact", "1.0.0", "1.0.0", "pom" ); File pomFile = getTestFile( "src/test/expected-files/" + targetRepository.pathOf( pomArtifact ) ); File testFile = getTestFile( "target/test-target-repository/" + targetRepository.pathOf( pomArtifact ) ); compareFiles( pomFile, testFile ); Artifact orig = createArtifact( "test", "relocated-v3artifact", "1.0.0", "1.0.0", "pom" ); artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( orig ) ); assertTrue( "Check if relocation artifact pom is created", artifactFile.exists() ); testFile = getTestFile( "src/test/expected-files/" + targetRepository.pathOf( orig ) ); compareFiles( artifactFile, testFile ); } @Test public void testV3PomWarningsOnConvert() throws Exception { // test that the pom is converted but that warnings are reported Artifact artifact = createArtifact( "test", "v3-warnings-artifact", "1.0.0" ); ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact ); File artifactMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) ); artifactMetadataFile.delete(); ArtifactMetadata versionMetadata = new SnapshotArtifactRepositoryMetadata( artifact ); File versionMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( versionMetadata ) ); versionMetadataFile.delete(); artifactConverter.convert( artifact, targetRepository ); checkWarnings( artifactConverter, 2 ); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File expectedPomFile = getTestFile( "src/test/expected-files/converted-v3-warnings.pom" ); assertTrue( "Check POM created", pomFile.exists() ); compareFiles( expectedPomFile, pomFile ); // TODO: check 2 warnings (extend and versions) matched on i18n key } private void doTestV4SnapshotPomConvert( String version, String expectedMetadataFileName ) throws Exception { // test that it is copied as is Artifact artifact = createArtifact( "test", "v4artifact", version ); ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact ); File artifactMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) ); artifactMetadataFile.delete(); ArtifactMetadata snapshotMetadata = new SnapshotArtifactRepositoryMetadata( artifact ); File snapshotMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( snapshotMetadata ) ); snapshotMetadataFile.delete(); artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ); assertTrue( "Check POM created", pomFile.exists() ); compareFiles( sourcePomFile, pomFile ); assertTrue( "Check artifact metadata created", artifactMetadataFile.exists() ); File expectedMetadataFile = getTestFile( "src/test/expected-files/v4-snapshot-artifact-metadata.xml" ); compareFiles( expectedMetadataFile, artifactMetadataFile ); assertTrue( "Check snapshot metadata created", snapshotMetadataFile.exists() ); expectedMetadataFile = getTestFile( expectedMetadataFileName ); compareFiles( expectedMetadataFile, snapshotMetadataFile ); } @Test public void testV3SnapshotPomConvert() throws Exception { // test that the pom is coverted Artifact artifact = createArtifact( "test", "v3artifact", "1.0.0-SNAPSHOT" ); ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact ); File artifactMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) ); artifactMetadataFile.delete(); ArtifactMetadata snapshotMetadata = new SnapshotArtifactRepositoryMetadata( artifact ); File snapshotMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( snapshotMetadata ) ); snapshotMetadataFile.delete(); artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File expectedPomFile = getTestFile( "src/test/expected-files/converted-v3-snapshot.pom" ); assertTrue( "Check POM created", pomFile.exists() ); compareFiles( expectedPomFile, pomFile ); assertTrue( "Check artifact metadata created", artifactMetadataFile.exists() ); File expectedMetadataFile = getTestFile( "src/test/expected-files/v3-snapshot-artifact-metadata.xml" ); compareFiles( expectedMetadataFile, artifactMetadataFile ); assertTrue( "Check snapshot metadata created", snapshotMetadataFile.exists() ); expectedMetadataFile = getTestFile( "src/test/expected-files/v3-snapshot-metadata.xml" ); compareFiles( expectedMetadataFile, snapshotMetadataFile ); } @Test public void testV4SnapshotPomConvert() throws Exception { doTestV4SnapshotPomConvert( "1.0.0-SNAPSHOT", "src/test/expected-files/v4-snapshot-metadata.xml" ); assertTrue( true ); } @Test public void testV4TimestampedSnapshotPomConvert() throws Exception { doTestV4SnapshotPomConvert( "1.0.0-20060111.120115-1", "src/test/expected-files/v4-timestamped-snapshot-metadata.xml" ); assertTrue( true ); } @Test public void testMavenOnePluginConversion() throws Exception { Artifact artifact = createArtifact( "org.apache.maven.plugins", "maven-foo-plugin", "1.0", "1.0", "maven-plugin" ); artifact.setFile( new File( FileUtil.getBasedir(), "src/test/source-repository/test/plugins/maven-foo-plugin-1.0.jar" ) ); artifactConverter.convert( artifact, targetRepository ); // There is a warning but I can't figure out how to look at it. Eyeballing the results it appears // the plugin is being coverted correctly. //checkSuccess(); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); /* The POM isn't needed for Maven 1.x plugins but the raw conversion for artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File expectedPomFile = getTestFile( "src/test/expected-files/maven-foo-plugin-1.0.pom" ); assertTrue( "Check POM created", pomFile.exists() ); compareFiles( expectedPomFile, pomFile ); */ } @Test public void testV3TimestampedSnapshotPomConvert() throws Exception { // test that the pom is coverted Artifact artifact = createArtifact( "test", "v3artifact", "1.0.0-20060105.130101-3" ); ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact ); File artifactMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) ); artifactMetadataFile.delete(); ArtifactMetadata snapshotMetadata = new SnapshotArtifactRepositoryMetadata( artifact ); File snapshotMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( snapshotMetadata ) ); snapshotMetadataFile.delete(); artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File expectedPomFile = getTestFile( "src/test/expected-files/converted-v3-timestamped-snapshot.pom" ); assertTrue( "Check POM created", pomFile.exists() ); compareFiles( expectedPomFile, pomFile ); assertTrue( "Check artifact snapshotMetadata created", artifactMetadataFile.exists() ); File expectedMetadataFile = getTestFile( "src/test/expected-files/v3-snapshot-artifact-metadata.xml" ); compareFiles( expectedMetadataFile, artifactMetadataFile ); assertTrue( "Check snapshot snapshotMetadata created", snapshotMetadataFile.exists() ); expectedMetadataFile = getTestFile( "src/test/expected-files/v3-timestamped-snapshot-metadata.xml" ); compareFiles( expectedMetadataFile, snapshotMetadataFile ); } @Test public void testNoPomConvert() throws Exception { // test that a POM is not created when there was none at the source Artifact artifact = createArtifact( "test", "noPomArtifact", "1.0.0" ); artifactConverter.convert( artifact, targetRepository ); checkWarnings( artifactConverter, 1 ); assertHasWarningReason( artifactConverter, Messages.getString( "warning.missing.pom" ) ); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ); assertFalse( "Check no POM created", pomFile.exists() ); assertFalse( "No source POM", sourcePomFile.exists() ); } @Test public void testIncorrectSourceChecksumMd5() throws Exception { // test that it fails when the source md5 is wrong Artifact artifact = createArtifact( "test", "incorrectMd5Artifact", "1.0.0" ); File file = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); file.delete(); artifactConverter.convert( artifact, targetRepository ); checkWarnings( artifactConverter, 2 ); assertHasWarningReason( artifactConverter, Messages.getString( "failure.incorrect.md5" ) ); assertFalse( "Check artifact not created", file.exists() ); ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact ); File metadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( metadata ) ); assertFalse( "Check metadata not created", metadataFile.exists() ); } @Test public void testIncorrectSourceChecksumSha1() throws Exception { // test that it fails when the source sha1 is wrong Artifact artifact = createArtifact( "test", "incorrectSha1Artifact", "1.0.0" ); File file = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); file.delete(); artifactConverter.convert( artifact, targetRepository ); checkWarnings( artifactConverter, 2 ); assertHasWarningReason( artifactConverter, Messages.getString( "failure.incorrect.sha1" ) ); assertFalse( "Check artifact not created", file.exists() ); ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact ); File metadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( metadata ) ); assertFalse( "Check metadata not created", metadataFile.exists() ); } @Test public void testUnmodifiedArtifact() throws Exception, InterruptedException { // test the unmodified artifact is untouched Artifact artifact = createArtifact( "test", "unmodified-artifact", "1.0.0" ); Artifact pomArtifact = createPomArtifact( artifact ); File sourceFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ); File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( pomArtifact ) ); File targetFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File targetPomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( pomArtifact ) ); assertTrue( "Check target file exists", targetFile.exists() ); assertTrue( "Check target POM exists", targetPomFile.exists() ); sourceFile.setLastModified( System.currentTimeMillis() ); sourcePomFile.setLastModified( System.currentTimeMillis() ); long origTime = targetFile.lastModified(); long origPomTime = targetPomFile.lastModified(); // Need to guarantee last modified is not equal Thread.sleep( SLEEP_MILLIS ); artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); compareFiles( sourceFile, targetFile ); compareFiles( sourcePomFile, targetPomFile ); assertEquals( "Check artifact unmodified", origTime, targetFile.lastModified() ); assertEquals( "Check POM unmodified", origPomTime, targetPomFile.lastModified() ); } @Test public void testModifedArtifactFails() throws Exception { // test that it fails when the source artifact has changed and is different to the existing artifact in the // target repository Artifact artifact = createArtifact( "test", "modified-artifact", "1.0.0" ); Artifact pomArtifact = createPomArtifact( artifact ); File sourceFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ); File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( pomArtifact ) ); File targetFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File targetPomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( pomArtifact ) ); assertTrue( "Check target file exists", targetFile.exists() ); assertTrue( "Check target POM exists", targetPomFile.exists() ); sourceFile.setLastModified( System.currentTimeMillis() ); sourcePomFile.setLastModified( System.currentTimeMillis() ); long origTime = targetFile.lastModified(); long origPomTime = targetPomFile.lastModified(); // Need to guarantee last modified is not equal Thread.sleep( SLEEP_MILLIS ); artifactConverter.convert( artifact, targetRepository ); checkWarnings( artifactConverter, 2 ); assertHasWarningReason( artifactConverter, Messages.getString( "failure.target.already.exists" ) ); assertEquals( "Check unmodified", origTime, targetFile.lastModified() ); assertEquals( "Check unmodified", origPomTime, targetPomFile.lastModified() ); ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact ); File metadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( metadata ) ); assertFalse( "Check metadata not created", metadataFile.exists() ); } @Test public void testForcedUnmodifiedArtifact() throws Exception { // test unmodified artifact is still converted when set to force artifactConverter = applicationContext.getBean( "artifactConverter#force-repository-converter", ArtifactConverter.class ); Artifact artifact = createArtifact( "test", "unmodified-artifact", "1.0.0" ); Artifact pomArtifact = createPomArtifact( artifact ); File sourceFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ); File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( pomArtifact ) ); File targetFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File targetPomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( pomArtifact ) ); SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd", Locale.getDefault() ); long origTime = dateFormat.parse( "2006-03-03" ).getTime(); targetFile.setLastModified( origTime ); targetPomFile.setLastModified( origTime ); sourceFile.setLastModified( dateFormat.parse( "2006-01-01" ).getTime() ); sourcePomFile.setLastModified( dateFormat.parse( "2006-02-02" ).getTime() ); artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); compareFiles( sourceFile, targetFile ); compareFiles( sourcePomFile, targetPomFile ); assertFalse( "Check modified", origTime == targetFile.lastModified() ); assertFalse( "Check modified", origTime == targetPomFile.lastModified() ); ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact ); File metadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( metadata ) ); assertTrue( "Check metadata created", metadataFile.exists() ); } @Test public void testDryRunSuccess() throws Exception { // test dry run does nothing on a run that will be successful, and returns success artifactConverter = applicationContext.getBean( "artifactConverter#dryrun-repository-converter", ArtifactConverter.class ); Artifact artifact = createArtifact( "test", "dryrun-artifact", "1.0.0" ); Artifact pomArtifact = createPomArtifact( artifact ); File sourceFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ); File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( pomArtifact ) ); File targetFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File targetPomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( pomArtifact ) ); // clear warning before test related to MRM-1638 artifactConverter.clearWarnings(); artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); assertTrue( "Check source file exists", sourceFile.exists() ); assertTrue( "Check source POM exists", sourcePomFile.exists() ); assertFalse( "Check target file doesn't exist", targetFile.exists() ); assertFalse( "Check target POM doesn't exist", targetPomFile.exists() ); ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact ); File metadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( metadata ) ); assertFalse( "Check metadata not created", metadataFile.exists() ); } @Test public void testDryRunFailure() throws Exception { // test dry run does nothing on a run that will fail, and returns failure artifactConverter = applicationContext.getBean( "artifactConverter#dryrun-repository-converter", ArtifactConverter.class ); Artifact artifact = createArtifact( "test", "modified-artifact", "1.0.0" ); Artifact pomArtifact = createPomArtifact( artifact ); File sourceFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ); File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( pomArtifact ) ); File targetFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File targetPomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( pomArtifact ) ); assertTrue( "Check target file exists", targetFile.exists() ); assertTrue( "Check target POM exists", targetPomFile.exists() ); sourceFile.setLastModified( System.currentTimeMillis() ); sourcePomFile.setLastModified( System.currentTimeMillis() ); long origTime = targetFile.lastModified(); long origPomTime = targetPomFile.lastModified(); // Need to guarantee last modified is not equal Thread.sleep( SLEEP_MILLIS ); // clear warning before test related to MRM-1638 artifactConverter.clearWarnings(); artifactConverter.convert( artifact, targetRepository ); checkWarnings( artifactConverter, 2 ); assertHasWarningReason( artifactConverter, Messages.getString( "failure.target.already.exists" ) ); assertEquals( "Check unmodified", origTime, targetFile.lastModified() ); assertEquals( "Check unmodified", origPomTime, targetPomFile.lastModified() ); ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact ); File metadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( metadata ) ); assertFalse( "Check metadata not created", metadataFile.exists() ); } @Test public void testRollbackArtifactCreated() throws Exception { // test rollback can remove a created artifact, including checksums Artifact artifact = createArtifact( "test", "rollback-created-artifact", "1.0.0" ); ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact ); File artifactMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) ); FileUtils.deleteDirectory( artifactMetadataFile.getParentFile() ); ArtifactMetadata versionMetadata = new SnapshotArtifactRepositoryMetadata( artifact ); File versionMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( versionMetadata ) ); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); artifactConverter.convert( artifact, targetRepository ); checkWarnings( artifactConverter, 2 ); boolean found = false; String pattern = "^" + Messages.getString( "invalid.source.pom" ).replaceFirst( "\\{0\\}", ".*" ) + "$"; for ( List<String> messages : artifactConverter.getWarnings().values() ) { for ( String message : messages ) { if ( message.matches( pattern ) ) { found = true; break; } } if ( found ) { break; } } assertTrue( "Check failure message.", found ); assertFalse( "check artifact rolled back", artifactFile.exists() ); assertFalse( "check metadata rolled back", artifactMetadataFile.exists() ); assertFalse( "check metadata rolled back", versionMetadataFile.exists() ); } @Test public void testMultipleArtifacts() throws Exception { // test multiple artifacts are converted List<Artifact> artifacts = new ArrayList<>(); artifacts.add( createArtifact( "test", "artifact-one", "1.0.0" ) ); artifacts.add( createArtifact( "test", "artifact-two", "1.0.0" ) ); artifacts.add( createArtifact( "test", "artifact-three", "1.0.0" ) ); for ( Artifact artifact : artifacts ) { artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); } for ( Artifact artifact : artifacts ) { File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File expectedPomFile = getTestFile( "src/test/expected-files/converted-" + artifact.getArtifactId() + ".pom" ); assertTrue( "Check POM created", pomFile.exists() ); compareFiles( expectedPomFile, pomFile ); } } @Test public void testInvalidSourceArtifactMetadata() throws Exception { // test artifact is not converted when source metadata is invalid, and returns failure createModernSourceRepository(); Artifact artifact = createArtifact( "test", "incorrectArtifactMetadata", "1.0.0" ); File file = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); file.delete(); artifactConverter.convert( artifact, targetRepository ); checkWarnings( artifactConverter, 2 ); assertHasWarningReason( artifactConverter, Messages.getString( "failure.incorrect.artifactMetadata.versions" ) ); assertFalse( "Check artifact not created", file.exists() ); ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact ); File metadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( metadata ) ); assertFalse( "Check metadata not created", metadataFile.exists() ); } @Test public void testInvalidSourceSnapshotMetadata() throws Exception { // test artifact is not converted when source snapshot metadata is invalid and returns failure createModernSourceRepository(); Artifact artifact = createArtifact( "test", "incorrectSnapshotMetadata", "1.0.0-20060102.030405-6" ); File file = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); file.delete(); artifactConverter.convert( artifact, targetRepository ); checkWarnings( artifactConverter, 2 ); assertHasWarningReason( artifactConverter, Messages.getString( "failure.incorrect.snapshotMetadata.snapshot" ) ); assertFalse( "Check artifact not created", file.exists() ); ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact ); File metadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( metadata ) ); assertFalse( "Check metadata not created", metadataFile.exists() ); } @Test public void testMergeArtifactMetadata() throws Exception { // test artifact level metadata is merged when it already exists on successful conversion Artifact artifact = createArtifact( "test", "newversion-artifact", "1.0.1" ); artifactConverter.convert( artifact, targetRepository ); checkSuccess( artifactConverter ); File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); assertTrue( "Check artifact created", artifactFile.exists() ); assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) ); artifact = createPomArtifact( artifact ); File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) ); File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ); assertTrue( "Check POM created", pomFile.exists() ); compareFiles( sourcePomFile, pomFile ); ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact ); File artifactMetadataFile = new File( targetRepository.getBasedir(), targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) ); assertTrue( "Check artifact metadata created", artifactMetadataFile.exists() ); File expectedMetadataFile = getTestFile( "src/test/expected-files/newversion-artifact-metadata.xml" ); compareFiles( expectedMetadataFile, artifactMetadataFile ); } @Test public void testSourceAndTargetRepositoriesMatch() throws Exception { // test that it fails if the same ArtifactRepositoryFactory factory = plexusSisuBridge.lookup( ArtifactRepositoryFactory.class ); sourceRepository = factory.createArtifactRepository( "source", targetRepository.getUrl(), targetRepository.getLayout(), null, null ); Artifact artifact = createArtifact( "test", "repository-artifact", "1.0" ); try { artifactConverter.convert( artifact, targetRepository ); fail( "Should have failed trying to convert within the same repository" ); } catch ( ArtifactConversionException e ) { // expected assertEquals( "check message", Messages.getString( "exception.repositories.match" ), e.getMessage() ); assertNull( "Check no additional cause", e.getCause() ); } } private Artifact createArtifact( String groupId, String artifactId, String version ) { Matcher matcher = Artifact.VERSION_FILE_PATTERN.matcher( version ); String baseVersion; if ( matcher.matches() ) { baseVersion = matcher.group( 1 ) + "-SNAPSHOT"; } else { baseVersion = version; } return createArtifact( groupId, artifactId, baseVersion, version, "jar" ); } private Artifact createArtifact( String groupId, String artifactId, String baseVersion, String version, String type ) { Artifact artifact = artifactFactory.createArtifact( groupId, artifactId, version, null, type ); artifact.setBaseVersion( baseVersion ); artifact.setRepository( sourceRepository ); artifact.setFile( new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ) ); return artifact; } private Artifact createPomArtifact( Artifact artifact ) { return createArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion(), artifact.getVersion(), "pom" ); } private static void compareFiles( File expectedPomFile, File pomFile ) throws IOException { String expectedContent = normalizeString( org.apache.commons.io.FileUtils.readFileToString( expectedPomFile, Charset.defaultCharset() ) ); String targetContent = normalizeString( org.apache.commons.io.FileUtils.readFileToString( pomFile, Charset.defaultCharset() ) ); assertEquals( "Check file match between " + expectedPomFile + " and " + pomFile, expectedContent, targetContent ); } private static String normalizeString( String path ) { return path.trim().replaceAll( "\r\n", "\n" ).replace( '\r', '\n' ).replaceAll( "<\\?xml .+\\?>", "" ).replaceAll( "^\\s+", "" ); } private void checkSuccess( ArtifactConverter converter ) { assertNotNull( "Warnings should never be null.", converter.getWarnings() ); assertEquals( "Should have no warnings. " + converter.getWarnings(), 0, countWarningMessages( converter ) ); } private void checkWarnings( ArtifactConverter converter, int count ) { assertNotNull( "Warnings should never be null.", converter.getWarnings() ); assertEquals( "Should have some warnings.", count, countWarningMessages( converter ) ); } private int countWarningMessages( ArtifactConverter converter ) { int count = 0; for ( List<String> values : converter.getWarnings().values() ) { count += values.size(); } return count; } private void assertHasWarningReason( ArtifactConverter converter, String reason ) { assertNotNull( "Warnings should never be null.", converter.getWarnings() ); assertTrue( "Expecting 1 or more Warnings", countWarningMessages( converter ) > 0 ); for ( List<String> messages : converter.getWarnings().values() ) { if ( messages.contains( reason ) ) { /* No need to check any further */ return; } } /* didn't find it. */ for ( Map.Entry<Artifact, List<String>> entry : converter.getWarnings().entrySet() ) { Artifact artifact = (Artifact) entry.getKey(); System.out.println( "-Artifact: " + artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion() ); List<String> messages = entry.getValue(); for ( String message : messages ) { System.out.println( " " + message ); } } fail( "Unable to find message <" + reason + "> in warnings." ); } private void createModernSourceRepository() throws Exception { ArtifactRepositoryFactory factory = plexusSisuBridge.lookup( ArtifactRepositoryFactory.class ); ArtifactRepositoryLayout layout = plexusSisuBridge.lookup( ArtifactRepositoryLayout.class, "default" ); File sourceBase = getTestFile( "src/test/source-modern-repository" ); sourceRepository = factory.createArtifactRepository( "source", sourceBase.toURL().toString(), layout, null, null ); } }