blob: 39f76e687b00eb8bd18cd02da17c824c619fbd6f [file] [log] [blame]
package org.eclipse.aether.internal.impl;
/*
* 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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositoryEvent;
import org.eclipse.aether.RepositoryEvent.EventType;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.installation.InstallRequest;
import org.eclipse.aether.installation.InstallResult;
import org.eclipse.aether.installation.InstallationException;
import org.eclipse.aether.internal.test.util.TestFileProcessor;
import org.eclipse.aether.internal.test.util.TestFileUtils;
import org.eclipse.aether.internal.test.util.TestLocalRepositoryManager;
import org.eclipse.aether.internal.test.util.TestUtils;
import org.eclipse.aether.metadata.DefaultMetadata;
import org.eclipse.aether.metadata.Metadata;
import org.eclipse.aether.metadata.Metadata.Nature;
import org.eclipse.aether.transform.TransformException;
import org.eclipse.aether.transform.FileTransformer;
import org.eclipse.aether.util.artifact.SubArtifact;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class DefaultInstallerTest
{
private Artifact artifact;
private Metadata metadata;
private DefaultRepositorySystemSession session;
private String localArtifactPath;
private String localMetadataPath;
private DefaultInstaller installer;
private InstallRequest request;
private RecordingRepositoryListener listener;
private File localArtifactFile;
private TestLocalRepositoryManager lrm;
@Before
public void setup()
throws IOException
{
artifact = new DefaultArtifact( "gid", "aid", "jar", "ver" );
artifact = artifact.setFile( TestFileUtils.createTempFile( "artifact".getBytes(), 1 ) );
metadata =
new DefaultMetadata( "gid", "aid", "ver", "type", Nature.RELEASE_OR_SNAPSHOT,
TestFileUtils.createTempFile( "metadata".getBytes(), 1 ) );
session = TestUtils.newSession();
localArtifactPath = session.getLocalRepositoryManager().getPathForLocalArtifact( artifact );
localMetadataPath = session.getLocalRepositoryManager().getPathForLocalMetadata( metadata );
localArtifactFile = new File( session.getLocalRepository().getBasedir(), localArtifactPath );
installer = new DefaultInstaller();
installer.setFileProcessor( new TestFileProcessor() );
installer.setRepositoryEventDispatcher( new StubRepositoryEventDispatcher() );
installer.setSyncContextFactory( new StubSyncContextFactory() );
request = new InstallRequest();
listener = new RecordingRepositoryListener();
session.setRepositoryListener( listener );
lrm = (TestLocalRepositoryManager) session.getLocalRepositoryManager();
TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() );
}
@After
public void teardown()
throws Exception
{
TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() );
}
@Test
public void testSuccessfulInstall()
throws InstallationException, IOException
{
File artifactFile =
new File( session.getLocalRepositoryManager().getRepository().getBasedir(), localArtifactPath );
File metadataFile =
new File( session.getLocalRepositoryManager().getRepository().getBasedir(), localMetadataPath );
artifactFile.delete();
metadataFile.delete();
request.addArtifact( artifact );
request.addMetadata( metadata );
InstallResult result = installer.install( session, request );
assertTrue( artifactFile.exists() );
assertEquals( "artifact", TestFileUtils.readString( artifactFile ) );
assertTrue( metadataFile.exists() );
assertEquals( "metadata", TestFileUtils.readString( metadataFile ) );
assertEquals( result.getRequest(), request );
assertEquals( result.getArtifacts().size(), 1 );
assertTrue( result.getArtifacts().contains( artifact ) );
assertEquals( result.getMetadata().size(), 1 );
assertTrue( result.getMetadata().contains( metadata ) );
assertEquals( 1, lrm.getMetadataRegistration().size() );
assertTrue( lrm.getMetadataRegistration().contains( metadata ) );
assertEquals( 1, lrm.getArtifactRegistration().size() );
assertTrue( lrm.getArtifactRegistration().contains( artifact ) );
}
@Test( expected = InstallationException.class )
public void testNullArtifactFile()
throws InstallationException
{
InstallRequest request = new InstallRequest();
request.addArtifact( artifact.setFile( null ) );
installer.install( session, request );
}
@Test( expected = InstallationException.class )
public void testNullMetadataFile()
throws InstallationException
{
InstallRequest request = new InstallRequest();
request.addMetadata( metadata.setFile( null ) );
installer.install( session, request );
}
@Test( expected = InstallationException.class )
public void testNonExistentArtifactFile()
throws InstallationException
{
InstallRequest request = new InstallRequest();
request.addArtifact( artifact.setFile( new File( "missing.txt" ) ) );
installer.install( session, request );
}
@Test( expected = InstallationException.class )
public void testNonExistentMetadataFile()
throws InstallationException
{
InstallRequest request = new InstallRequest();
request.addMetadata( metadata.setFile( new File( "missing.xml" ) ) );
installer.install( session, request );
}
@Test( expected = InstallationException.class )
public void testArtifactExistsAsDir()
throws InstallationException
{
String path = session.getLocalRepositoryManager().getPathForLocalArtifact( artifact );
File file = new File( session.getLocalRepository().getBasedir(), path );
assertFalse( file.getAbsolutePath() + " is a file, not directory", file.isFile() );
assertFalse( file.getAbsolutePath() + " already exists", file.exists() );
assertTrue( "failed to setup test: could not create " + file.getAbsolutePath(),
file.mkdirs() || file.isDirectory() );
request.addArtifact( artifact );
installer.install( session, request );
}
@Test( expected = InstallationException.class )
public void testMetadataExistsAsDir()
throws InstallationException
{
String path = session.getLocalRepositoryManager().getPathForLocalMetadata( metadata );
assertTrue( "failed to setup test: could not create " + path,
new File( session.getLocalRepository().getBasedir(), path ).mkdirs() );
request.addMetadata( metadata );
installer.install( session, request );
}
@Test( expected = InstallationException.class )
public void testArtifactDestinationEqualsSource()
throws Exception
{
String path = session.getLocalRepositoryManager().getPathForLocalArtifact( artifact );
File file = new File( session.getLocalRepository().getBasedir(), path );
artifact = artifact.setFile( file );
TestFileUtils.writeString( file, "test" );
request.addArtifact( artifact );
installer.install( session, request );
}
@Test( expected = InstallationException.class )
public void testMetadataDestinationEqualsSource()
throws Exception
{
String path = session.getLocalRepositoryManager().getPathForLocalMetadata( metadata );
File file = new File( session.getLocalRepository().getBasedir(), path );
metadata = metadata.setFile( file );
TestFileUtils.writeString( file, "test" );
request.addMetadata( metadata );
installer.install( session, request );
}
@Test
public void testSuccessfulArtifactEvents()
throws InstallationException
{
InstallRequest request = new InstallRequest();
request.addArtifact( artifact );
installer.install( session, request );
checkEvents( "Repository Event problem", artifact, false );
}
@Test
public void testSuccessfulMetadataEvents()
throws InstallationException
{
InstallRequest request = new InstallRequest();
request.addMetadata( metadata );
installer.install( session, request );
checkEvents( "Repository Event problem", metadata, false );
}
@Test
public void testFailingEventsNullArtifactFile()
{
checkFailedEvents( "null artifact file", this.artifact.setFile( null ) );
}
@Test
public void testFailingEventsNullMetadataFile()
{
checkFailedEvents( "null metadata file", this.metadata.setFile( null ) );
}
@Test
public void testFailingEventsArtifactExistsAsDir()
{
String path = session.getLocalRepositoryManager().getPathForLocalArtifact( artifact );
assertTrue( "failed to setup test: could not create " + path,
new File( session.getLocalRepository().getBasedir(), path ).mkdirs() );
checkFailedEvents( "target exists as dir", artifact );
}
@Test
public void testFailingEventsMetadataExistsAsDir()
{
String path = session.getLocalRepositoryManager().getPathForLocalMetadata( metadata );
assertTrue( "failed to setup test: could not create " + path,
new File( session.getLocalRepository().getBasedir(), path ).mkdirs() );
checkFailedEvents( "target exists as dir", metadata );
}
private void checkFailedEvents( String msg, Metadata metadata )
{
InstallRequest request = new InstallRequest().addMetadata( metadata );
msg = "Repository events problem (case: " + msg + ")";
try
{
installer.install( session, request );
fail( "expected exception" );
}
catch ( InstallationException e )
{
checkEvents( msg, metadata, true );
}
}
private void checkEvents( String msg, Metadata metadata, boolean failed )
{
List<RepositoryEvent> events = listener.getEvents();
assertEquals( msg, 2, events.size() );
RepositoryEvent event = events.get( 0 );
assertEquals( msg, EventType.METADATA_INSTALLING, event.getType() );
assertEquals( msg, metadata, event.getMetadata() );
assertNull( msg, event.getException() );
event = events.get( 1 );
assertEquals( msg, EventType.METADATA_INSTALLED, event.getType() );
assertEquals( msg, metadata, event.getMetadata() );
if ( failed )
{
assertNotNull( msg, event.getException() );
}
else
{
assertNull( msg, event.getException() );
}
}
private void checkFailedEvents( String msg, Artifact artifact )
{
InstallRequest request = new InstallRequest().addArtifact( artifact );
msg = "Repository events problem (case: " + msg + ")";
try
{
installer.install( session, request );
fail( "expected exception" );
}
catch ( InstallationException e )
{
checkEvents( msg, artifact, true );
}
}
private void checkEvents( String msg, Artifact artifact, boolean failed )
{
List<RepositoryEvent> events = listener.getEvents();
assertEquals( msg, 2, events.size() );
RepositoryEvent event = events.get( 0 );
assertEquals( msg, EventType.ARTIFACT_INSTALLING, event.getType() );
assertEquals( msg, artifact, event.getArtifact() );
assertNull( msg, event.getException() );
event = events.get( 1 );
assertEquals( msg, EventType.ARTIFACT_INSTALLED, event.getType() );
assertEquals( msg, artifact, event.getArtifact() );
if ( failed )
{
assertNotNull( msg + " > expected exception", event.getException() );
}
else
{
assertNull( msg + " > " + event.getException(), event.getException() );
}
}
@Test
public void testDoNotUpdateUnchangedArtifact()
throws InstallationException
{
request.addArtifact( artifact );
installer.install( session, request );
installer.setFileProcessor( new DefaultFileProcessor()
{
@Override
public long copy( File src, File target, ProgressListener listener )
throws IOException
{
throw new IOException( "copy called" );
}
} );
request = new InstallRequest();
request.addArtifact( artifact );
installer.install( session, request );
}
@Test
public void testSetArtifactTimestamps()
throws InstallationException
{
artifact.getFile().setLastModified( artifact.getFile().lastModified() - 60000 );
request.addArtifact( artifact );
installer.install( session, request );
assertEquals( "artifact timestamp was not set to src file", artifact.getFile().lastModified(),
localArtifactFile.lastModified() );
request = new InstallRequest();
request.addArtifact( artifact );
artifact.getFile().setLastModified( artifact.getFile().lastModified() - 60000 );
installer.install( session, request );
assertEquals( "artifact timestamp was not set to src file", artifact.getFile().lastModified(),
localArtifactFile.lastModified() );
}
@Test
public void testFileTransformer() throws Exception
{
final Artifact transformedArtifact = new SubArtifact( artifact, null, "raj" );
FileTransformer transformer = new FileTransformer()
{
@Override
public InputStream transformData( File file )
throws IOException, TransformException
{
return new ByteArrayInputStream( "transformed data".getBytes( StandardCharsets.UTF_8 ) );
}
@Override
public Artifact transformArtifact( Artifact artifact )
{
return transformedArtifact;
}
};
StubFileTransformerManager fileTransformerManager = new StubFileTransformerManager();
fileTransformerManager.addFileTransformer( "jar", transformer );
session.setFileTransformerManager( fileTransformerManager );
request = new InstallRequest();
request.addArtifact( artifact );
installer.install( session, request );
assertFalse( localArtifactFile.exists() );
String transformedArtifactPath = session.getLocalRepositoryManager().getPathForLocalArtifact( transformedArtifact );
File transformedArtifactFile = new File( session.getLocalRepository().getBasedir(), transformedArtifactPath );
assertTrue( transformedArtifactFile.exists() );
try ( BufferedReader r = new BufferedReader( new FileReader( transformedArtifactFile ) ) )
{
assertEquals( "transformed data", r.readLine() );
}
}
}