blob: 5abe032bf647d8153efd8bbba6cc2aaa46430772 [file] [log] [blame]
/*
* 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.
*/
package org.apache.maven.repository.legacy;
import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
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.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
import org.apache.maven.wagon.ResourceDoesNotExistException;
import org.apache.maven.wagon.TransferFailedException;
import org.apache.maven.wagon.UnsupportedProtocolException;
import org.apache.maven.wagon.Wagon;
import org.apache.maven.wagon.events.TransferEvent;
import org.apache.maven.wagon.events.TransferListener;
import org.apache.maven.wagon.observers.AbstractTransferListener;
import org.apache.maven.wagon.observers.Debug;
import org.codehaus.plexus.testing.PlexusTest;
import org.codehaus.plexus.util.FileUtils;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
*/
@PlexusTest
class DefaultWagonManagerTest {
@Inject
private WagonManager wagonManager;
private final TransferListener transferListener = new Debug();
@Inject
private ArtifactFactory artifactFactory;
@Inject
private ArtifactRepositoryFactory artifactRepositoryFactory;
@Test
void testUnnecessaryRepositoryLookup() throws Exception {
Artifact artifact = createTestPomArtifact("target/test-data/get-missing-pom");
List<ArtifactRepository> repos = new ArrayList<>();
repos.add(artifactRepositoryFactory.createArtifactRepository(
"repo1", "string://url1", new ArtifactRepositoryLayoutStub(), null, null));
repos.add(artifactRepositoryFactory.createArtifactRepository(
"repo2", "string://url2", new ArtifactRepositoryLayoutStub(), null, null));
StringWagon wagon = (StringWagon) wagonManager.getWagon("string");
wagon.addExpectedContent(repos.get(0).getLayout().pathOf(artifact), "expected");
wagon.addExpectedContent(
repos.get(0).getLayout().pathOf(artifact) + ".md5", "cd26d9e10ce691cc69aa2b90dcebbdac");
wagon.addExpectedContent(repos.get(1).getLayout().pathOf(artifact), "expected");
wagon.addExpectedContent(
repos.get(1).getLayout().pathOf(artifact) + ".md5", "cd26d9e10ce691cc69aa2b90dcebbdac");
class TransferListener extends AbstractTransferListener {
public List<TransferEvent> events = new ArrayList<>();
@Override
public void transferInitiated(TransferEvent transferEvent) {
events.add(transferEvent);
}
}
TransferListener listener = new TransferListener();
wagonManager.getArtifact(artifact, repos, listener, false);
assertEquals(1, listener.events.size());
}
@Test
void testGetMissingJar() throws TransferFailedException, UnsupportedProtocolException, IOException {
Artifact artifact = createTestArtifact("target/test-data/get-missing-jar", "jar");
ArtifactRepository repo = createStringRepo();
assertThrows(ResourceDoesNotExistException.class, () -> wagonManager.getArtifact(artifact, repo, null, false));
assertFalse(artifact.getFile().exists());
}
@Test
void testGetMissingJarForced() throws TransferFailedException, UnsupportedProtocolException, IOException {
Artifact artifact = createTestArtifact("target/test-data/get-missing-jar", "jar");
ArtifactRepository repo = createStringRepo();
assertThrows(ResourceDoesNotExistException.class, () -> wagonManager.getArtifact(artifact, repo, null, true));
assertFalse(artifact.getFile().exists());
}
@Test
void testGetRemoteJar()
throws TransferFailedException, ResourceDoesNotExistException, UnsupportedProtocolException, IOException {
Artifact artifact = createTestArtifact("target/test-data/get-remote-jar", "jar");
ArtifactRepository repo = createStringRepo();
StringWagon wagon = (StringWagon) wagonManager.getWagon("string");
wagon.addExpectedContent(repo.getLayout().pathOf(artifact), "expected");
wagon.addExpectedContent(repo.getLayout().pathOf(artifact) + ".md5", "cd26d9e10ce691cc69aa2b90dcebbdac");
wagonManager.getArtifact(artifact, repo, null, false);
assertTrue(artifact.getFile().exists());
assertEquals("expected", FileUtils.fileRead(artifact.getFile(), "UTF-8"));
}
private Artifact createTestPomArtifact(String directory) throws IOException {
File testData = getTestFile(directory);
FileUtils.deleteDirectory(testData);
testData.mkdirs();
Artifact artifact = artifactFactory.createProjectArtifact("test", "test", "1.0");
artifact.setFile(new File(testData, "test-1.0.pom"));
assertFalse(artifact.getFile().exists());
return artifact;
}
private Artifact createTestArtifact(String directory, String type) throws IOException {
return createTestArtifact(directory, "1.0", type);
}
private Artifact createTestArtifact(String directory, String version, String type) throws IOException {
File testData = getTestFile(directory);
FileUtils.deleteDirectory(testData);
testData.mkdirs();
Artifact artifact = artifactFactory.createBuildArtifact("test", "test", version, type);
artifact.setFile(new File(
testData,
"test-" + version + "." + artifact.getArtifactHandler().getExtension()));
assertFalse(artifact.getFile().exists());
return artifact;
}
private ArtifactRepository createStringRepo() {
return artifactRepositoryFactory.createArtifactRepository(
"id", "string://url", new ArtifactRepositoryLayoutStub(), null, null);
}
/**
* Build an ArtifactRepository object.
*
* @param id
* @param url
* @return
*/
private ArtifactRepository getRepo(String id, String url) {
return artifactRepositoryFactory.createArtifactRepository(id, url, new DefaultRepositoryLayout(), null, null);
}
/**
* Build an ArtifactRepository object.
*
* @param id
* @return
*/
private ArtifactRepository getRepo(String id) {
return getRepo(id, "http://something");
}
@Test
void testDefaultWagonManager() throws Exception {
assertWagon("a");
assertWagon("b");
assertWagon("c");
assertWagon("string");
assertThrows(UnsupportedProtocolException.class, () -> assertWagon("d"));
}
/**
* Check that transfer listeners are properly removed after getArtifact and putArtifact
*/
@Test
void testWagonTransferListenerRemovedAfterGetArtifactAndPutArtifact() throws Exception {
Artifact artifact = createTestArtifact("target/test-data/transfer-listener", "jar");
ArtifactRepository repo = createStringRepo();
StringWagon wagon = (StringWagon) wagonManager.getWagon("string");
wagon.addExpectedContent(repo.getLayout().pathOf(artifact), "expected");
wagon.addExpectedContent(repo.getLayout().pathOf(artifact) + ".md5", "cd26d9e10ce691cc69aa2b90dcebbdac");
/* getArtifact */
assertFalse(
wagon.getTransferEventSupport().hasTransferListener(transferListener),
"Transfer listener is registered before test");
wagonManager.getArtifact(artifact, repo, transferListener, false);
assertFalse(
wagon.getTransferEventSupport().hasTransferListener(transferListener),
"Transfer listener still registered after getArtifact");
/* putArtifact */
File sampleFile = getTestFile("target/test-file");
FileUtils.fileWrite(sampleFile.getAbsolutePath(), "sample file");
assertFalse(
wagon.getTransferEventSupport().hasTransferListener(transferListener),
"Transfer listener is registered before test");
wagonManager.putArtifact(sampleFile, artifact, repo, transferListener);
assertFalse(
wagon.getTransferEventSupport().hasTransferListener(transferListener),
"Transfer listener still registered after putArtifact");
}
/**
* Checks the verification of checksums.
*/
@Disabled
@Test
void testChecksumVerification() throws Exception {
ArtifactRepositoryPolicy policy = new ArtifactRepositoryPolicy(
true, ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS, ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL);
ArtifactRepository repo = artifactRepositoryFactory.createArtifactRepository(
"id", "string://url", new ArtifactRepositoryLayoutStub(), policy, policy);
Artifact artifact = new DefaultArtifact(
"sample.group",
"sample-art",
VersionRange.createFromVersion("1.0"),
"scope",
"jar",
"classifier",
null);
artifact.setFile(getTestFile("target/sample-art"));
StringWagon wagon = (StringWagon) wagonManager.getWagon("string");
wagon.clearExpectedContent();
wagon.addExpectedContent("path", "lower-case-checksum");
wagon.addExpectedContent("path.sha1", "2a25dc564a3b34f68237fc849066cbc7bb7a36a1");
wagonManager.getArtifact(artifact, repo, null, false);
wagon.clearExpectedContent();
wagon.addExpectedContent("path", "upper-case-checksum");
wagon.addExpectedContent("path.sha1", "B7BB97D7D0B9244398D9B47296907F73313663E6");
wagonManager.getArtifact(artifact, repo, null, false);
wagon.clearExpectedContent();
wagon.addExpectedContent("path", "expected-failure");
wagon.addExpectedContent("path.sha1", "b7bb97d7d0b9244398d9b47296907f73313663e6");
assertThrows(
ChecksumFailedException.class,
() -> wagonManager.getArtifact(artifact, repo, null, false),
"Checksum verification did not fail");
wagon.clearExpectedContent();
wagon.addExpectedContent("path", "lower-case-checksum");
wagon.addExpectedContent("path.md5", "50b2cf50a103a965efac62b983035cac");
wagonManager.getArtifact(artifact, repo, null, false);
wagon.clearExpectedContent();
wagon.addExpectedContent("path", "upper-case-checksum");
wagon.addExpectedContent("path.md5", "842F568FCCFEB7E534DC72133D42FFDC");
wagonManager.getArtifact(artifact, repo, null, false);
wagon.clearExpectedContent();
wagon.addExpectedContent("path", "expected-failure");
wagon.addExpectedContent("path.md5", "b7bb97d7d0b9244398d9b47296907f73313663e6");
assertThrows(
ChecksumFailedException.class,
() -> wagonManager.getArtifact(artifact, repo, null, false),
"Checksum verification did not fail");
}
@Test
void testPerLookupInstantiation() throws Exception {
String protocol = "perlookup";
Wagon one = wagonManager.getWagon(protocol);
Wagon two = wagonManager.getWagon(protocol);
assertNotSame(one, two);
}
private void assertWagon(String protocol) throws Exception {
Wagon wagon = wagonManager.getWagon(protocol);
assertNotNull(wagon, "Check wagon, protocol=" + protocol);
}
private final class ArtifactRepositoryLayoutStub implements ArtifactRepositoryLayout {
public String getId() {
return "test";
}
public String pathOfRemoteRepositoryMetadata(ArtifactMetadata metadata) {
return "path";
}
public String pathOfLocalRepositoryMetadata(ArtifactMetadata metadata, ArtifactRepository repository) {
return "path";
}
public String pathOf(Artifact artifact) {
return "path";
}
}
}