blob: cf8de1ce82e3892d62bd79f9e54c139e8ab4c8ad [file] [log] [blame]
package org.apache.archiva.repository.base.group;
/*
* 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.common.filelock.DefaultFileLockManager;
import org.apache.archiva.common.filelock.FileLockManager;
import org.apache.archiva.configuration.ArchivaConfiguration;
import org.apache.archiva.configuration.Configuration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
import org.apache.archiva.repository.EditableRepositoryGroup;
import org.apache.archiva.repository.Repository;
import org.apache.archiva.repository.RepositoryException;
import org.apache.archiva.repository.RepositoryGroup;
import org.apache.archiva.repository.RepositoryState;
import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.base.ArchivaRepositoryRegistry;
import org.apache.archiva.repository.base.ConfigurationHandler;
import org.apache.archiva.repository.storage.fs.FilesystemStorage;
import org.apache.archiva.repository.validation.CheckedResult;
import org.apache.archiva.repository.validation.RepositoryValidator;
import org.apache.archiva.repository.validation.ValidationError;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import javax.inject.Inject;
import javax.inject.Named;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.apache.archiva.repository.validation.ErrorKeys.ISEMPTY;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
@ExtendWith( {MockitoExtension.class, SpringExtension.class} )
@ContextConfiguration( locations = {"classpath*:/META-INF/spring-context.xml", "classpath:/spring-context-group.xml"} )
class RepositoryGroupHandlerTest
{
@Inject
@Named( "repositoryRegistry" )
ArchivaRepositoryRegistry repositoryRegistry;
@Inject
ConfigurationHandler configurationHandler;
@Mock
// @Named( "mergedRemoteIndexesScheduler#default" )
MergedRemoteIndexesScheduler mergedRemoteIndexesScheduler;
@Inject
List<RepositoryValidator<? extends Repository>> repositoryValidatorList;
@Inject
ArchivaConfiguration archivaConfiguration;
Path repoBaseDir;
private RepositoryGroupHandler createHandler( )
{
RepositoryGroupHandler groupHandler = new RepositoryGroupHandler( repositoryRegistry, configurationHandler, mergedRemoteIndexesScheduler, repositoryValidatorList );
groupHandler.init( );
return groupHandler;
}
private Path getRepoBaseDir() throws IOException
{
if (repoBaseDir==null) {
this.repoBaseDir = archivaConfiguration.getRepositoryBaseDir( ).resolve( "group" );
Files.createDirectories( this.repoBaseDir );
}
return repoBaseDir;
}
protected EditableRepositoryGroup createRepository( String id, String name, Path location ) throws IOException
{
FileLockManager lockManager = new DefaultFileLockManager();
FilesystemStorage storage = new FilesystemStorage(location.toAbsolutePath(), lockManager);
BasicRepositoryGroup repo = new BasicRepositoryGroup(id, name, storage);
repo.setLocation( location.toAbsolutePath().toUri());
return repo;
}
protected EditableRepositoryGroup createRepository( String id, String name) throws IOException
{
Path dir = getRepoBaseDir( ).resolve( id );
Files.createDirectories( dir );
return createRepository( id, name, dir );
}
@Test
void initializeFromConfig( )
{
RepositoryGroupHandler groupHandler = createHandler( );
groupHandler.initializeFromConfig( );
assertEquals( 1, groupHandler.getAll( ).size( ) );
assertNotNull( groupHandler.get( "test-group-01" ).getRepositories( ) );
assertEquals( "internal", groupHandler.get( "test-group-01" ).getRepositories( ).get( 0 ).getId( ) );
}
@Test
void activateRepository( ) throws RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
RepositoryGroup repo = groupHandler.newInstance( RepositoryType.MAVEN, "test-group-02" );
groupHandler.activateRepository( repo );
verify( mergedRemoteIndexesScheduler ).schedule( eq( repo ), any( ) );
assertEquals( RepositoryState.INITIALIZED, repo.getLastState( ) );
}
@Test
void newInstancesFromConfig( )
{
RepositoryGroupHandler groupHandler = new RepositoryGroupHandler( repositoryRegistry, configurationHandler, mergedRemoteIndexesScheduler, repositoryValidatorList );
Map<String, RepositoryGroup> instances = groupHandler.newInstancesFromConfig( );
assertFalse( groupHandler.hasRepository( "test-group-01" ) );
assertTrue( instances.containsKey( "test-group-01" ) );
assertEquals( RepositoryState.REFERENCES_SET, instances.get( "test-group-01" ).getLastState( ) );
}
@Test
void newInstance( ) throws RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
RepositoryGroup instance = groupHandler.newInstance( RepositoryType.MAVEN, "test-group-03" );
assertNotNull( instance );
assertEquals( "test-group-03", instance.getId( ) );
assertFalse( groupHandler.hasRepository( "test-group-03" ) );
assertEquals( RepositoryState.REFERENCES_SET, instance.getLastState( ) );
}
@Test
void put( ) throws IOException, RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
EditableRepositoryGroup repositoryGroup = createRepository( "test-group-04", "n-test-group-04" );
groupHandler.put( repositoryGroup );
RepositoryGroup storedGroup = groupHandler.get( "test-group-04" );
assertNotNull( storedGroup );
assertEquals( "test-group-04", storedGroup.getId( ) );
assertEquals( "n-test-group-04", storedGroup.getName( ) );
EditableRepositoryGroup repositoryGroup2 = createRepository( "test-group-04", "n2-test-group-04" );
groupHandler.put( repositoryGroup2 );
storedGroup = groupHandler.get( "test-group-04" );
assertNotNull( storedGroup );
assertEquals( "test-group-04", storedGroup.getId( ) );
assertEquals( "n2-test-group-04", storedGroup.getName( ) );
assertNotNull( configurationHandler.getBaseConfiguration().getRepositoryGroups( ) );
assertTrue( configurationHandler.getBaseConfiguration().getRepositoryGroups( ).stream( ).anyMatch( g -> g!=null && "test-group-04".equals( g.getId( ) ) ) );
}
@Test
void testPut( ) throws RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
RepositoryGroupConfiguration configuration = new RepositoryGroupConfiguration( );
configuration.setId( "test-group-05" );
configuration.setName( "n-test-group-05" );
ArrayList<String> repos = new ArrayList<>( );
repos.add( "internal" );
configuration.setRepositories( repos );
groupHandler.put( configuration );
RepositoryGroup repo = groupHandler.get( "test-group-05" );
assertNotNull( repo );
assertEquals( "test-group-05", repo.getId( ) );
assertEquals( "n-test-group-05", repo.getName( ) );
assertNotNull( repo.getRepositories( ) );
assertEquals( 1, repo.getRepositories( ).size( ) );
assertEquals( "internal", repo.getRepositories( ).get( 0 ).getId( ) );
assertNotNull( configurationHandler.getBaseConfiguration().getRepositoryGroups( ) );
assertTrue( configurationHandler.getBaseConfiguration().getRepositoryGroups( ).stream( ).anyMatch( g -> g!=null && "test-group-05".equals( g.getId( ) ) ) );
}
@Test
void testPutWithoutRegister( ) throws RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
Configuration aCfg = new Configuration( );
RepositoryGroupConfiguration configuration = new RepositoryGroupConfiguration( );
configuration.setId( "test-group-06" );
configuration.setName( "n-test-group-06" );
ArrayList<String> repos = new ArrayList<>( );
repos.add( "internal" );
configuration.setRepositories( repos );
groupHandler.put( configuration, aCfg );
RepositoryGroup repo = groupHandler.get( "test-group-06" );
assertNull( repo );
assertNotNull( configurationHandler.getBaseConfiguration().getRepositoryGroups( ) );
assertTrue( configurationHandler.getBaseConfiguration().getRepositoryGroups( ).stream( ).noneMatch( g -> g!=null && "test-group-06".equals( g.getId( ) ) ) );
assertTrue( aCfg.getRepositoryGroups( ).stream( ).anyMatch( g -> g!=null && "test-group-06".equals( g.getId( ) ) ) );
}
@Test
void putWithCheck( ) throws RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
BasicRepositoryGroupValidator checker = new BasicRepositoryGroupValidator( configurationHandler );
RepositoryGroupConfiguration configuration = new RepositoryGroupConfiguration( );
configuration.setId( "" );
configuration.setName( "n-test-group-07" );
ArrayList<String> repos = new ArrayList<>( );
repos.add( "internal" );
configuration.setRepositories( repos );
CheckedResult<RepositoryGroup, Map<String, List<ValidationError>>> result = groupHandler.putWithCheck( configuration, checker );
assertNull( groupHandler.get( "test-group-07" ) );
assertNotNull( result.getResult( ) );
assertNotNull( result.getResult( ).get( "id" ) );
assertEquals( 1, result.getResult( ).get( "id" ).size( ) );
assertEquals( ISEMPTY, result.getResult( ).get( "id" ).get( 0 ).getType( ) );
}
@Test
void remove( ) throws RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
RepositoryGroupConfiguration configuration = new RepositoryGroupConfiguration( );
configuration.setId( "test-group-08" );
configuration.setName( "n-test-group-08" );
groupHandler.put( configuration );
assertNotNull( groupHandler.get( "test-group-08" ) );
groupHandler.remove( "test-group-08" );
assertNull( groupHandler.get( "test-group-08" ) );
}
@Test
void testRemove( ) throws RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
Configuration aCfg = new Configuration( );
RepositoryGroupConfiguration configuration = new RepositoryGroupConfiguration( );
configuration.setId( "test-group-09" );
configuration.setName( "n-test-group-09" );
ArrayList<String> repos = new ArrayList<>( );
repos.add( "internal" );
configuration.setRepositories( repos );
groupHandler.put( configuration, aCfg );
assertTrue( aCfg.getRepositoryGroups( ).stream( ).anyMatch( g -> g != null && "test-group-09".equals( g.getId( ) ) ) );
groupHandler.remove( "test-group-09", aCfg );
assertNull( groupHandler.get( "test-group-09" ) );
assertTrue( aCfg.getRepositoryGroups( ).stream( ).noneMatch( g -> g != null && "test-group-09".equals( g.getId( ) ) ) );
assertNull( groupHandler.get( "test-group-09" ) );
}
@Test
void validateRepository( ) throws IOException
{
RepositoryGroupHandler groupHandler = createHandler( );
EditableRepositoryGroup repositoryGroup = createRepository( "test-group-10", "n-test-group-10" );
repositoryGroup.setMergedIndexTTL( 5 );
CheckedResult<RepositoryGroup, Map<String, List<ValidationError>>> result = groupHandler.validateRepository( repositoryGroup );
assertNotNull( result );
assertEquals( 0, result.getResult( ).size( ) );
repositoryGroup = createRepository( "test-group-10", "n-test-group-10###" );
result = groupHandler.validateRepository( repositoryGroup );
assertNotNull( result );
assertEquals( 2, result.getResult( ).size( ) );
assertNotNull( result.getResult().get( "merged_index_ttl" ) );
assertNotNull( result.getResult().get( "name" ) );
}
@Test
void validateRepositoryIfExisting( ) throws IOException, RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
EditableRepositoryGroup repositoryGroup = createRepository( "test-group-11", "n-test-group-11" );
repositoryGroup.setMergedIndexTTL( 5 );
groupHandler.put( repositoryGroup );
CheckedResult<RepositoryGroup, Map<String, List<ValidationError>>> result = groupHandler.validateRepository( repositoryGroup );
assertNotNull( result );
assertEquals( 1, result.getResult( ).size( ) );
}
@Test
void validateRepositoryForUpdate( ) throws IOException, RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
EditableRepositoryGroup repositoryGroup = createRepository( "test-group-12", "n-test-group-12" );
repositoryGroup.setMergedIndexTTL( 5 );
groupHandler.put( repositoryGroup );
CheckedResult<RepositoryGroup, Map<String, List<ValidationError>>> result = groupHandler.validateRepositoryForUpdate( repositoryGroup );
assertNotNull( result );
assertEquals( 0, result.getResult( ).size( ) );
}
@Test
void has( ) throws IOException, RepositoryException
{
RepositoryGroupHandler groupHandler = createHandler( );
EditableRepositoryGroup repositoryGroup = createRepository( "test-group-13", "n-test-group-13" );
repositoryGroup.setMergedIndexTTL( 5 );
assertFalse( groupHandler.hasRepository( "test-group-13" ) );
groupHandler.put( repositoryGroup );
assertTrue( groupHandler.hasRepository( "test-group-13" ) );
}
}