blob: 25686faeedc948ea7de1d7f027868cd859ea5e9e [file] [log] [blame]
package org.apache.archiva.rest.services;
/*
* 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 org.apache.archiva.admin.model.beans.ManagedRepository;
import org.apache.archiva.maven2.model.Artifact;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.redback.rest.api.model.Role;
import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
import org.apache.archiva.rest.api.model.ArtifactContentEntry;
import org.apache.archiva.rest.api.model.BrowseResult;
import org.apache.archiva.rest.api.model.BrowseResultEntry;
import org.apache.archiva.rest.api.model.Entry;
import org.apache.archiva.rest.api.model.MetadataAddRequest;
import org.apache.archiva.rest.api.model.VersionsList;
import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
import org.apache.archiva.rest.api.services.BrowseService;
import org.apache.cxf.jaxrs.client.WebClient;
import org.assertj.core.data.MapEntry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Olivier Lamy
*/
public class BrowseServiceTest
extends AbstractArchivaRestTest
{
private static final String TEST_REPO_ID = "test-repo";
Map<String, String> toMap( List<Entry> entries )
{
Map<String, String> map = new HashMap<>( entries.size() );
for ( Entry entry : entries )
{
map.put( entry.getKey(), entry.getValue() );
}
return map;
}
@Test
public void metadatagetthenadd()
throws Exception
{
scanRepo( TEST_REPO_ID );
waitForScanToComplete( TEST_REPO_ID );
BrowseService browseService = getBrowseService( authorizationHeader, false );
Map<String, String> metadatas =
toMap( browseService.getMetadatas( "commons-cli", "commons-cli", "1.0", TEST_REPO_ID ) );
assertThat( metadatas ).isNotNull().isEmpty();
browseService.addMetadata( "commons-cli", "commons-cli", "1.0", "wine", "bordeaux", TEST_REPO_ID );
metadatas = toMap( browseService.getMetadatas( "commons-cli", "commons-cli", "1.0", TEST_REPO_ID ) );
assertThat( metadatas ).isNotNull().isNotEmpty().contains( MapEntry.entry( "wine", "bordeaux" ) );
}
@Test
public void metadatagetthenaddthendelete()
throws Exception
{
try
{
scanRepo( TEST_REPO_ID );
waitForScanToComplete( TEST_REPO_ID );
BrowseService browseService = getBrowseService( authorizationHeader, false );
Map<String, String> metadatas =
toMap( browseService.getMetadatas( "commons-cli", "commons-cli", "1.0", TEST_REPO_ID ) );
assertThat( metadatas ).isNotNull().isEmpty();
browseService.addMetadata( "commons-cli", "commons-cli", "1.0", "wine", "bordeaux", TEST_REPO_ID );
metadatas = toMap( browseService.getMetadatas( "commons-cli", "commons-cli", "1.0", TEST_REPO_ID ) );
assertThat( metadatas ).isNotNull().isNotEmpty().contains( MapEntry.entry( "wine", "bordeaux" ) );
browseService.deleteMetadata( "commons-cli", "commons-cli", "1.0", "wine", TEST_REPO_ID );
metadatas = toMap( browseService.getMetadatas( "commons-cli", "commons-cli", "1.0", TEST_REPO_ID ) );
assertThat( metadatas ).isNotNull().isEmpty();
}
catch ( ArchivaRestServiceException e )
{
log.error( e.getMessage(), e );
throw e;
}
}
@Test
public void browserootGroups()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, false );
BrowseResult browseResult = browseService.getRootGroups( TEST_REPO_ID );
assertThat( browseResult ).isNotNull();
assertThat( browseResult.getBrowseResultEntries() ) //
.isNotNull() //
.isNotEmpty() //
.hasSize( 3 ) //
.contains( new BrowseResultEntry( "commons-cli", false ), //
new BrowseResultEntry( "commons-logging", false ), //
new BrowseResultEntry( "org.apache", false ) );
}
@Test
public void browsegroupId()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, false );
BrowseResult browseResult = browseService.browseGroupId( "org.apache", TEST_REPO_ID );
assertThat( browseResult ).isNotNull();
assertThat( browseResult.getBrowseResultEntries() ) //
.isNotNull() //
.isNotEmpty() //
.hasSize( 2 ) //
.contains( new BrowseResultEntry( "org.apache.felix", false ), //
new BrowseResultEntry( "org.apache.karaf.features", false ) );
}
@Test
public void listUserRepositories()
throws Exception
{
initSourceTargetRepo();
BrowseService browseService = getBrowseService( authorizationHeader, false );
List<ManagedRepository> browseResult = browseService.getUserRepositories();
assertThat( browseResult )
.isNotNull()
.isNotEmpty()
.hasSize(5);
List<String> repIds = new ArrayList<>();
for(ManagedRepository rep : browseResult) {
repIds.add(rep.getId());
}
assertThat(repIds).contains("internal","snapshots","test-repo","test-copy-target","test-origin-repo");
}
@Test
public void listUserManagableRepositories()
throws Exception
{
initSourceTargetRepo();
// Giving the guest user a manager role
String name = "Repository Manager - internal";
Role role = getRoleManagementService( authorizationHeader ).getRole( name );
role.setUsers( Arrays.asList( getUserService( authorizationHeader ).getUser( "guest" ) ) );
getRoleManagementService( authorizationHeader ).updateRoleUsers( role );
// browseService with guest user
BrowseService browseService = getBrowseService( "", false );
List<ManagedRepository> browseResult = browseService.getUserManagableRepositories();
assertThat( browseResult )
.isNotNull()
.isNotEmpty().hasSize(1);
List<String> repIds = new ArrayList<>();
for(ManagedRepository rep : browseResult) {
repIds.add(rep.getId());
}
assertThat(repIds).contains("internal");
}
@Test
public void browsegroupIdWithReleaseStartNumber()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, false );
BrowseResult browseResult = browseService.browseGroupId( "commons-logging.commons-logging", TEST_REPO_ID );
log.info( "browseResult: {}", browseResult );
}
@Test
public void versionsList()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, false );
VersionsList versions =
browseService.getVersionsList( "org.apache.karaf.features", "org.apache.karaf.features.core",
TEST_REPO_ID );
assertThat( versions ).isNotNull();
assertThat( versions.getVersions() ) //
.isNotNull() //
.isNotEmpty() //
.hasSize( 2 ) //
.contains( "2.2.1", "2.2.2" );
}
@Test
public void getProjectVersionMetadata()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, true );
ProjectVersionMetadata metadata =
browseService.getProjectVersionMetadata( "org.apache.karaf.features", "org.apache.karaf.features.core",
TEST_REPO_ID );
assertThat( metadata ).isNotNull();
}
@Test
public void readArtifactContentEntries()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, true );
List<ArtifactContentEntry> artifactContentEntries =
browseService.getArtifactContentEntries( "commons-logging", "commons-logging", "1.1", null, null, null,
TEST_REPO_ID );
log.info( "artifactContentEntries: {}", artifactContentEntries );
assertThat( artifactContentEntries ).isNotNull() //
.isNotEmpty() //
.hasSize( 2 ) //
.contains( new ArtifactContentEntry( "org", false, 0, TEST_REPO_ID ), //
new ArtifactContentEntry( "META-INF", false, 0, TEST_REPO_ID ) );
}
@Test
public void readArtifactContentEntriesRootPath()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, true );
List<ArtifactContentEntry> artifactContentEntries =
browseService.getArtifactContentEntries( "commons-logging", "commons-logging", "1.1", null, null, "org/",
TEST_REPO_ID );
log.info( "artifactContentEntries: {}", artifactContentEntries );
assertThat( artifactContentEntries ).isNotNull() //
.isNotEmpty() //
.hasSize( 1 ) //
.contains( new ArtifactContentEntry( "org/apache", false, 1, TEST_REPO_ID ) );
}
@Test
public void readArtifactContentEntriesFilesAndDirectories()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, true );
List<ArtifactContentEntry> artifactContentEntries =
browseService.getArtifactContentEntries( "commons-logging", "commons-logging", "1.1", null, null,
"org/apache/commons/logging/", TEST_REPO_ID );
log.info( "artifactContentEntries: {}", artifactContentEntries );
assertThat( artifactContentEntries ).isNotNull().isNotEmpty().hasSize( 10 ).contains(
new ArtifactContentEntry( "org/apache/commons/logging/impl", false, 4, TEST_REPO_ID ),
new ArtifactContentEntry( "org/apache/commons/logging/LogSource.class", true, 4, TEST_REPO_ID ) );
}
@Test
public void getArtifactDownloadInfos()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, true );
List<Artifact> artifactDownloadInfos =
browseService.getArtifactDownloadInfos( "commons-logging", "commons-logging", "1.1", TEST_REPO_ID );
log.info( "artifactDownloadInfos {}", artifactDownloadInfos );
assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 3 );
}
@Test
public void getArtifactsByMetadata()
throws Exception
{
// START SNIPPET: get-artifacts-by-metadata
BrowseService browseService = getBrowseService( authorizationHeader, true );
List<Artifact> artifactDownloadInfos = browseService.getArtifactsByMetadata( "type", "pom", TEST_REPO_ID );
assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 11 );
// END SNIPPET: get-artifacts-by-metadata
}
@Test
public void getArtifactsByProjectVersionMetadata()
throws Exception
{
// START SNIPPET: get-artifacts-by-project-version-metadata
BrowseService browseService = getBrowseService( authorizationHeader, true );
browseService.addMetadata( "commons-cli", "commons-cli", "1.0", "wine", "bordeaux", TEST_REPO_ID );
tryAssert( ( ) -> {
List<Artifact> artifactDownloadInfos =
browseService.getArtifactsByProjectVersionMetadata( "wine", "bordeaux", TEST_REPO_ID );
assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 3 );
// END SNIPPET: get-artifacts-by-project-version-metadata
} );
}
@Test
public void getArtifactsByProjectVersionMetadataWithNoRepository()
throws Exception
{
final BrowseService browseService = getBrowseService( authorizationHeader, true );
browseService.addMetadata( "commons-cli", "commons-cli", "1.0", "wine", "bordeaux", TEST_REPO_ID );
tryAssert( ( ) -> {
List<Artifact> artifactDownloadInfos =
null;
try
{
artifactDownloadInfos = browseService.getArtifactsByProjectVersionMetadata( "wine", "bordeaux", null );
}
catch ( ArchivaRestServiceException e )
{
throw new AssertionError( "ArchivaRestServiceException", e );
}
assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 3 );
});
}
@Test
public void getArtifactsByProperty()
throws Exception
{
// START SNIPPET: get-artifacts-by-property
BrowseService browseService = getBrowseService( authorizationHeader, true );
tryAssert( ( ) -> {
List<Artifact> artifactDownloadInfos =
browseService.getArtifactsByProperty( "org.name", "The Apache Software Foundation", TEST_REPO_ID );
assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 7 );
// END SNIPPET: get-artifacts-by-property
} );
}
@Test
public void searchArtifacts()
throws Exception
{
// START SNIPPET: search-artifacts
BrowseService browseService = getBrowseService( authorizationHeader, true );
tryAssert( ( ) -> {
List<Artifact> artifactDownloadInfos =
browseService.searchArtifacts( "The Apache Software Foundation", TEST_REPO_ID, true );
assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 7 );
} );
// END SNIPPET: search-artifacts
}
@Test
public void searchArtifactsByField()
throws Exception
{
// START SNIPPET: search-artifacts-by-field
BrowseService browseService = getBrowseService( authorizationHeader, true );
List<Artifact> artifactDownloadInfos =
browseService.searchArtifacts( "org.name", "The Apache Software Foundation", TEST_REPO_ID, true );
assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 7 );
// END SNIPPET: search-artifacts-by-field
}
@Test
public void readArtifactContentText()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, true );
WebClient.client( browseService ).accept( MediaType.TEXT_PLAIN );
String text =
browseService.getArtifactContentText( "commons-logging", "commons-logging", "1.1", "sources", null,
"org/apache/commons/logging/LogSource.java",
TEST_REPO_ID ).getContent();
log.debug( "text: {}", text );
assertThat( text ).contains( "package org.apache.commons.logging;" ).contains( "public class LogSource {" );
}
@Test
public void readArtifactContentTextPom()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, true );
WebClient.client( browseService ).accept( MediaType.TEXT_PLAIN );
String text =
browseService.getArtifactContentText( "commons-logging", "commons-logging", "1.1", null, "pom", null,
TEST_REPO_ID ).getContent();
log.info( "text: {}", text );
assertThat( text ).contains(
"<url>http://jakarta.apache.org/commons/${pom.artifactId.substring(8)}/</url>" ).contains(
"<subscribe>commons-dev-subscribe@jakarta.apache.org</subscribe>" );
}
@Test
public void artifactsNumber()
throws Exception
{
BrowseService browseService = getBrowseService( authorizationHeader, true );
//WebClient.client( browseService ).accept( MediaType.TEXT_PLAIN );
int number = browseService.getArtifacts( TEST_REPO_ID ).size();
log.info( "getArtifactsNumber: {}", number );
assertTrue( number > 1 );
}
@Test
public void metadatainbatchmode()
throws Exception
{
scanRepo( TEST_REPO_ID );
waitForScanToComplete( TEST_REPO_ID );
BrowseService browseService = getBrowseService( authorizationHeader, false );
Map<String, String> inputMetadata = new HashMap<>( 3 );
inputMetadata.put( "buildNumber", "1" );
inputMetadata.put( "author", "alecharp" );
inputMetadata.put( "jenkins_version", "1.486" );
MetadataAddRequest metadataAddRequest = new MetadataAddRequest();
metadataAddRequest.setGroupId( "commons-cli" );
metadataAddRequest.setArtifactId( "commons-cli" );
metadataAddRequest.setVersion( "1.0" );
metadataAddRequest.setMetadatas( inputMetadata );
browseService.importMetadata( metadataAddRequest, TEST_REPO_ID );
Map<String, String> metadatas =
toMap( browseService.getMetadatas( "commons-cli", "commons-cli", "1.0", TEST_REPO_ID ) );
assertThat( metadatas ).isNotNull().isNotEmpty().contains( MapEntry.entry( "buildNumber", "1" ) ).contains(
MapEntry.entry( "author", "alecharp" ) ).contains( MapEntry.entry( "jenkins_version", "1.486" ) );
}
@Before
public void initialiseTestRepo()
throws RedbackServiceException, ArchivaRestServiceException, IOException, InterruptedException
{
// force guest user creation if not exists
if ( getUserService( authorizationHeader ).getGuestUser() == null )
{
assertNotNull( getUserService( authorizationHeader ).createGuestUser() );
}
createAndIndexRepo( TEST_REPO_ID, getProjectDirectory().resolve( "src/test/repo-with-osgi" ),
null, false );
waitForScanToComplete( TEST_REPO_ID );
}
@After
public void deleteTestRepo()
throws Exception
{
scanRepo( TEST_REPO_ID );
waitForScanToComplete( TEST_REPO_ID );
deleteTestRepo( TEST_REPO_ID );
}
}