/******************************************************************************* * Copyright (c) 2010, 2013 Sonatype, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Sonatype, Inc. - initial API and implementation *******************************************************************************/ package io.takari.aether.localrepo; 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 java.io.File; import java.io.IOException; import java.net.URI; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.DefaultArtifact; 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.repository.LocalArtifactRegistration; import org.eclipse.aether.repository.LocalArtifactRequest; import org.eclipse.aether.repository.LocalArtifactResult; import org.eclipse.aether.repository.LocalMetadataRequest; import org.eclipse.aether.repository.LocalMetadataResult; import org.eclipse.aether.repository.RemoteRepository; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.google.common.collect.Lists; public class TakariLocalRepositoryManagerTest { private Artifact artifact; private Artifact snapshot; private File basedir; private TakariLocalRepositoryManager manager; private File artifactFile; private RemoteRepository repository; private String testContext = "project/compile"; private RepositorySystemSession session; private Metadata metadata; private Metadata noVerMetadata; @Before public void setup() throws Exception { String url = TestFileUtils.createTempDir("enhanced-remote-repo").toURI().toURL().toString(); repository = new RemoteRepository.Builder("enhanced-remote-repo", "default", url).setRepositoryManager(true).build(); artifact = new DefaultArtifact("gid", "aid", "", "jar", "1-test", Collections.<String, String> emptyMap(), TestFileUtils.createTempFile("artifact")); snapshot = new DefaultArtifact("gid", "aid", "", "jar", "1.0-20120710.231549-9", Collections.<String, String> emptyMap(), TestFileUtils.createTempFile("artifact")); metadata = new DefaultMetadata("gid", "aid", "1-test", "maven-metadata.xml", Nature.RELEASE, TestFileUtils.createTempFile("metadata")); noVerMetadata = new DefaultMetadata("gid", "aid", null, "maven-metadata.xml", Nature.RELEASE, TestFileUtils.createTempFile("metadata")); basedir = TestFileUtils.createTempDir("enhanced-repo"); session = TestUtils.newSession(); manager = new TakariLocalRepositoryManager(basedir, session, Lists.<ArtifactValidator> newArrayList()); artifactFile = new File(basedir, manager.getPathForLocalArtifact(artifact)); } @After public void tearDown() throws Exception { TestFileUtils.delete(basedir); TestFileUtils.delete(new File(new URI(repository.getUrl()))); session = null; manager = null; repository = null; artifact = null; } private long addLocalArtifact(Artifact artifact) throws IOException { manager.add(session, new LocalArtifactRegistration(artifact)); String path = manager.getPathForLocalArtifact(artifact); return copy(artifact, path); } private long addRemoteArtifact(Artifact artifact) throws IOException { Collection<String> contexts = Arrays.asList(testContext); manager.add(session, new LocalArtifactRegistration(artifact, repository, contexts)); String path = manager.getPathForRemoteArtifact(artifact, repository, testContext); return copy(artifact, path); } private long copy(Metadata metadata, String path) throws IOException { if (metadata.getFile() == null) { return -1; } return TestFileUtils.copy(metadata.getFile(), new File(basedir, path)); } private long copy(Artifact artifact, String path) throws IOException { if (artifact.getFile() == null) { return -1; } File artifactFile = new File(basedir, path); return TestFileUtils.copy(artifact.getFile(), artifactFile); } @Test public void testGetPathForLocalArtifact() { Artifact artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-SNAPSHOT"); assertEquals("1.0-SNAPSHOT", artifact.getBaseVersion()); assertEquals("g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-SNAPSHOT.jar", manager.getPathForLocalArtifact(artifact)); artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-20110329.221805-4"); assertEquals("1.0-SNAPSHOT", artifact.getBaseVersion()); assertEquals("g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-SNAPSHOT.jar", manager.getPathForLocalArtifact(artifact)); } @Test public void testGetPathForRemoteArtifact() { RemoteRepository remoteRepo = new RemoteRepository.Builder("repo", "default", "ram:/void").build(); Artifact artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-SNAPSHOT"); assertEquals("1.0-SNAPSHOT", artifact.getBaseVersion()); assertEquals("g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-SNAPSHOT.jar", manager.getPathForRemoteArtifact(artifact, remoteRepo, "")); artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-20110329.221805-4"); assertEquals("1.0-SNAPSHOT", artifact.getBaseVersion()); assertEquals("g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-20110329.221805-4.jar", manager.getPathForRemoteArtifact(artifact, remoteRepo, "")); } @Test public void testFindLocalArtifact() throws Exception { addLocalArtifact(artifact); LocalArtifactRequest request = new LocalArtifactRequest(artifact, null, null); LocalArtifactResult result = manager.find(session, request); assertTrue(result.isAvailable()); assertEquals(null, result.getRepository()); snapshot = snapshot.setVersion(snapshot.getBaseVersion()); addLocalArtifact(snapshot); request = new LocalArtifactRequest(snapshot, null, null); result = manager.find(session, request); assertTrue(result.isAvailable()); assertEquals(null, result.getRepository()); } @Test public void testFindRemoteArtifact() throws Exception { addRemoteArtifact(artifact); LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), testContext); LocalArtifactResult result = manager.find(session, request); assertTrue(result.isAvailable()); assertEquals(repository, result.getRepository()); addRemoteArtifact(snapshot); request = new LocalArtifactRequest(snapshot, Arrays.asList(repository), testContext); result = manager.find(session, request); assertTrue(result.isAvailable()); assertEquals(repository, result.getRepository()); } /* So this makes sure that if the artifact is found in a different repo it fails, but we want to start providing better checks such that we will accept the artifact if it has the same SHA1. @Test public void testDoNotFindDifferentContext() throws Exception { addRemoteArtifact(artifact); LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), "different"); LocalArtifactResult result = manager.find(session, request); assertFalse(result.isAvailable()); } */ @Test public void testDoNotFindNullFile() throws Exception { artifact = artifact.setFile(null); addLocalArtifact(artifact); LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), testContext); LocalArtifactResult result = manager.find(session, request); assertFalse(result.isAvailable()); } @Test public void testDoNotFindDeletedFile() throws Exception { addLocalArtifact(artifact); assertTrue("could not delete artifact file", artifactFile.delete()); LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), testContext); LocalArtifactResult result = manager.find(session, request); assertFalse(result.isAvailable()); } @Test public void testFindUntrackedFile() throws Exception { copy(artifact, manager.getPathForLocalArtifact(artifact)); LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), testContext); LocalArtifactResult result = manager.find(session, request); assertTrue(result.isAvailable()); } private long addMetadata(Metadata metadata, RemoteRepository repo) throws IOException { String path; if (repo == null) { path = manager.getPathForLocalMetadata(metadata); } else { path = manager.getPathForRemoteMetadata(metadata, repo, testContext); } System.err.println(path); return copy(metadata, path); } @Test public void testFindLocalMetadata() throws Exception { addMetadata(metadata, null); LocalMetadataRequest request = new LocalMetadataRequest(metadata, null, testContext); LocalMetadataResult result = manager.find(session, request); assertNotNull(result.getFile()); } @Test public void testFindLocalMetadataNoVersion() throws Exception { addMetadata(noVerMetadata, null); LocalMetadataRequest request = new LocalMetadataRequest(noVerMetadata, null, testContext); LocalMetadataResult result = manager.find(session, request); assertNotNull(result.getFile()); } @Test public void testDoNotFindRemoteMetadataDifferentContext() throws Exception { addMetadata(noVerMetadata, repository); addMetadata(metadata, repository); LocalMetadataRequest request = new LocalMetadataRequest(noVerMetadata, repository, "different"); LocalMetadataResult result = manager.find(session, request); assertNull(result.getFile()); request = new LocalMetadataRequest(metadata, repository, "different"); result = manager.find(session, request); assertNull(result.getFile()); } @Test public void testFindArtifactUsesTimestampedVersion() throws Exception { Artifact artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-SNAPSHOT"); File file = new File(basedir, manager.getPathForLocalArtifact(artifact)); TestFileUtils.write("test", file); addLocalArtifact(artifact); artifact = artifact.setVersion("1.0-20110329.221805-4"); LocalArtifactRequest request = new LocalArtifactRequest(); request.setArtifact(artifact); LocalArtifactResult result = manager.find(session, request); assertNull(result.toString(), result.getFile()); assertFalse(result.toString(), result.isAvailable()); } }