blob: ed44abf4708cee099097bf989588e6883e0fb80c [file] [log] [blame]
package org.apache.archiva.webdav;
/*
* 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 com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.WebResponse;
import org.apache.archiva.common.utils.FileUtils;
import org.apache.archiva.configuration.Configuration;
import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.maven2.metadata.MavenMetadataReader;
import org.apache.archiva.model.ArchivaRepositoryMetadata;
import org.apache.commons.lang3.StringUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* RepositoryServletRepositoryGroupTest
* <p/>
* Test Case 1. Accessing a valid repository group root url (e.g. http://machine.com/repository/repository-group/) returns a Bad Request (HTTP 400)
* Test Case 2. Accessing an invalid repository group root url is forwarded to managed repository checking (this is not covered here)
* Test Case 3. Accessing an artifact in a valid repository group will iterate over the managed repositories in the repository group
* Test Case 3.a. If an invalid managed repository is encountered (managed repository doesn't exist),
* a Not Found (HTTP 404) is returned and the iteration is broken
* Test Case 3.b. If an artifact is not found in a valid managed repository (after proxying, etc.),
* a Not Found (HTTP 404) is set but not returned yet, the iteration continues to the next managed repository.
* The Not Found (HTTP 404) is returned after exhausting all valid managed repositories
* Test Case 3.c. If an artifact is found in a valid managed repository,
* the artifact is returned, the iteration is broken and any Not Found (HTTP 404) is disregarded
* Test Case 4. Accessing a valid repository group with any http write method returns a Bad Request (HTTP 400)
*/
public class RepositoryServletRepositoryGroupTest
extends AbstractRepositoryServletTestCase
{
protected Path repoRootFirst;
protected Path repoRootLast;
protected Path repoRootInvalid;
protected static final String MANAGED_REPO_FIRST = "first";
protected static final String MANAGED_REPO_LAST = "last";
protected static final String MANAGED_REPO_INVALID = "invalid";
protected static final String REPO_GROUP_WITH_VALID_REPOS = "group-with-valid-repos";
protected static final String REPO_GROUP_WITH_INVALID_REPOS = "group-with-invalid-repos";
@Override
@Before
public void setUp()
throws Exception
{
super.setUp();
String appserverBase = getAppserverBase().toAbsolutePath().toString();
log.debug( "Appserver Base {}", appserverBase );
Configuration configuration = archivaConfiguration.getConfiguration();
repoRootFirst = Paths.get( appserverBase, "data/repositories/" + MANAGED_REPO_FIRST );
repoRootLast = Paths.get( appserverBase, "data/repositories/" + MANAGED_REPO_LAST );
configuration.addManagedRepository(
createManagedRepository( MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
configuration.addManagedRepository(
createManagedRepository( MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
List<String> managedRepoIds = new ArrayList<>();
managedRepoIds.add( MANAGED_REPO_FIRST );
managedRepoIds.add( MANAGED_REPO_LAST );
configuration.addRepositoryGroup( createRepositoryGroup( REPO_GROUP_WITH_VALID_REPOS, managedRepoIds ) );
// Create the repository group with an invalid managed repository
repoRootInvalid = Paths.get( appserverBase, "data/repositories/" + MANAGED_REPO_INVALID );
ManagedRepositoryConfiguration managedRepositoryConfiguration =
createManagedRepository( MANAGED_REPO_INVALID, "Invalid Test Repo", repoRootInvalid, true );
configuration.addManagedRepository( managedRepositoryConfiguration );
List<String> invalidManagedRepoIds = new ArrayList<>();
invalidManagedRepoIds.add( MANAGED_REPO_FIRST );
invalidManagedRepoIds.add( MANAGED_REPO_INVALID );
invalidManagedRepoIds.add( MANAGED_REPO_LAST );
configuration.addRepositoryGroup(
createRepositoryGroup( REPO_GROUP_WITH_INVALID_REPOS, invalidManagedRepoIds ) );
configuration.removeManagedRepository( managedRepositoryConfiguration );
org.apache.archiva.common.utils.FileUtils.deleteDirectory( repoRootInvalid );
repositoryRegistry.reload();
saveConfiguration( archivaConfiguration );
startRepository();
}
@Override
@After
public void tearDown()
throws Exception
{
setupCleanRepo( repoRootFirst );
setupCleanRepo( repoRootLast );
repositoryRegistry.destroy();
super.tearDown();
String appserverBase = System.getProperty( "appserver.base" );
if ( StringUtils.isNotEmpty( appserverBase ) )
{
FileUtils.deleteDirectory( Paths.get( appserverBase ) );
}
}
/*
* Test Case 3.c
*/
@Test
public void testGetFromFirstManagedRepositoryReturnOk()
throws Exception
{
String resourceName = "dummy/dummy-first-resource/1.0/dummy-first-resource-1.0.txt";
Path dummyInternalResourceFile = repoRootFirst.resolve( resourceName );
Files.createDirectories( dummyInternalResourceFile.getParent() );
org.apache.archiva.common.utils.FileUtils.writeStringToFile( dummyInternalResourceFile, Charset.defaultCharset(), "first" );
WebRequest request = new GetMethodWebRequest(
"http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
WebResponse response = getServletUnitClient().getResponse( request );
assertResponseOK( response );
assertThat( response.getContentAsString() ).isEqualTo( "first" );
}
/*
* Test Case 3.c
*/
@Test
public void testGetFromLastManagedRepositoryReturnOk()
throws Exception
{
String resourceName = "dummy/dummy-last-resource/1.0/dummy-last-resource-1.0.txt";
Path dummyReleasesResourceFile = repoRootLast.resolve( resourceName );
Files.createDirectories(dummyReleasesResourceFile.getParent());
org.apache.archiva.common.utils.FileUtils.writeStringToFile(dummyReleasesResourceFile, Charset.defaultCharset(), "last");
WebRequest request = new GetMethodWebRequest(
"http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
WebResponse response = getServletUnitClient().getResponse( request );
assertResponseOK( response );
assertThat( response.getContentAsString() ).isEqualTo( "last" );
}
/*
* Test Case 3.b
*/
@Test
public void testGetFromValidRepositoryGroupReturnNotFound()
throws Exception
{
String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";
WebRequest request = new GetMethodWebRequest(
"http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
WebResponse response = getServletUnitClient().getResponse( request );
assertResponseNotFound( response );
}
/*
* Test Case 4
*/
@Test
public void testPutValidRepositoryGroupReturnBadRequest()
throws Exception
{
String resourceName = "dummy/dummy-put-resource/1.0/dummy-put-resource-1.0.txt";
String putUrl = "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName;
InputStream is = getClass().getResourceAsStream( "/artifact.jar" );
WebRequest request = new PutMethodWebRequest( putUrl, is, "text/plain" );
WebResponse response = getServletUnitClient().getResponse( request );
assertResponseMethodNotAllowed( response );
}
// MRM-872
@Test
public void testGetMergedMetadata()
throws Exception
{
// first metadata file
String resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";
Path dummyInternalResourceFile = repoRootFirst.resolve( resourceName );
Files.createDirectories(dummyInternalResourceFile.getParent());
org.apache.archiva.common.utils.FileUtils.writeStringToFile( dummyInternalResourceFile,
Charset.defaultCharset(), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<metadata>\n<groupId>dummy</groupId>\n<artifactId>dummy-merged-metadata-resource</artifactId>\n"
+ "<versioning>\n<latest>1.0</latest>\n<release>1.0</release>\n<versions>\n<version>1.0</version>\n"
+ "<version>2.5</version>\n</versions>\n<lastUpdated>20080708095554</lastUpdated>\n</versioning>\n</metadata>" );
//second metadata file
resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";
dummyInternalResourceFile = repoRootLast.resolve( resourceName );
Files.createDirectories(dummyInternalResourceFile.getParent());
org.apache.archiva.common.utils.FileUtils.writeStringToFile( dummyInternalResourceFile, Charset.defaultCharset(), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<metadata><groupId>dummy</groupId><artifactId>dummy-merged-metadata-resource</artifactId>"
+ "<versioning><latest>2.0</latest><release>2.0</release><versions><version>1.0</version>"
+ "<version>1.5</version><version>2.0</version></versions><lastUpdated>20080709095554</lastUpdated>"
+ "</versioning></metadata>" );
WebRequest request = new GetMethodWebRequest(
"http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
+ "dummy-merged-metadata-resource/maven-metadata.xml" );
WebResponse response = getServletUnitClient().getResource( request );
Path returnedMetadata = getProjectBase().resolve( "target/test-classes/retrievedMetadataFile.xml" );
org.apache.archiva.common.utils.FileUtils.writeStringToFile( returnedMetadata, Charset.defaultCharset(), response.getContentAsString() );
MavenMetadataReader metadataReader = new MavenMetadataReader( );
ArchivaRepositoryMetadata metadata = metadataReader.read( returnedMetadata );
assertResponseOK( response );
assertThat( metadata.getAvailableVersions() ).isNotNull()
.hasSize( 4 ).contains( "1.0", "1.5", "2.0", "2.5" );
//check if the checksum files were generated
Path checksumFileSha1 = repoRootFirst.resolve( resourceName + ".sha1" );
Files.createDirectories(checksumFileSha1.getParent());
org.apache.archiva.common.utils.FileUtils.writeStringToFile(checksumFileSha1, Charset.defaultCharset(), "3290853214d3687134");
Path checksumFileMd5 = repoRootFirst.resolve( resourceName + ".md5" );
Files.createDirectories(checksumFileMd5.getParent());
org.apache.archiva.common.utils.FileUtils.writeStringToFile(checksumFileMd5, Charset.defaultCharset(), "98745897234eda12836423");
// request the sha1 checksum of the metadata
request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
+ "dummy-merged-metadata-resource/maven-metadata.xml.sha1" );
response = getServletUnitClient().getResource( request );
assertResponseOK( response );
assertThat( response.getContentAsString() )
.startsWith( "f8a7a858a46887368adf0b30874de1f807d91453" );
// request the md5 checksum of the metadata
request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
+ "dummy-merged-metadata-resource/maven-metadata.xml.md5" );
response = getServletUnitClient().getResource( request );
assertResponseOK( response );
assertThat( response.getContentAsString() )
.startsWith( "cec864b66849153dd45fddb7cdde12b2" );
}
// MRM-901
@Test
public void testBrowseWithTwoArtifactsWithSameGroupIdInRepos()
throws Exception
{
String resourceName = "dummy/dummy-artifact/1.0/dummy-artifact-1.0.txt";
Path dummyInternalResourceFile = repoRootFirst.resolve( resourceName );
Files.createDirectories(dummyInternalResourceFile.getParent());
org.apache.archiva.common.utils.FileUtils.writeStringToFile(dummyInternalResourceFile, Charset.defaultCharset(), "first");
resourceName = "dummy/dummy-artifact/2.0/dummy-artifact-2.0.txt";
Path dummyReleasesResourceFile = repoRootLast.resolve( resourceName );
Files.createDirectories(dummyReleasesResourceFile.getParent());
org.apache.archiva.common.utils.FileUtils.writeStringToFile(dummyReleasesResourceFile, Charset.defaultCharset(), "last");
WebRequest request = new GetMethodWebRequest(
"http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/dummy-artifact/" );
WebResponse response = getServletUnitClient().getResource( request );
assertResponseOK( response );
assertThat( response.getContentAsString() ).contains( "Collection" )
.contains( "dummy/dummy-artifact" )
.contains( "1.0" )
.contains( "2.0" );
}
protected void assertResponseMethodNotAllowed( WebResponse response )
{
assertThat( response ).isNotNull();
assertThat( response.getStatusCode() ).isEqualTo( HttpServletResponse.SC_METHOD_NOT_ALLOWED );
}
protected RepositoryGroupConfiguration createRepositoryGroup( String id, List<String> repositories )
{
RepositoryGroupConfiguration repoGroupConfiguration = new RepositoryGroupConfiguration();
repoGroupConfiguration.setId( id );
repoGroupConfiguration.setRepositories( repositories );
return repoGroupConfiguration;
}
}