blob: cafc8ebc5d345673465db97896db0a2e3d6e55e2 [file] [log] [blame]
package org.apache.maven.archiva.web.action.admin.connectors.proxy;
/*
* 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.opensymphony.xwork2.Action;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.Configuration;
import org.apache.maven.archiva.configuration.IndeterminateConfigurationException;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
import org.apache.maven.archiva.policies.CachedFailuresPolicy;
import org.apache.maven.archiva.policies.ChecksumPolicy;
import org.apache.maven.archiva.policies.PropagateErrorsDownloadPolicy;
import org.apache.maven.archiva.policies.PropagateErrorsOnUpdateDownloadPolicy;
import org.apache.maven.archiva.policies.ReleasesPolicy;
import org.apache.maven.archiva.policies.SnapshotsPolicy;
import org.apache.maven.archiva.web.action.AbstractWebworkTestCase;
import org.codehaus.plexus.redback.struts2.interceptor.SecureActionBundle;
import org.codehaus.plexus.registry.RegistryException;
import org.easymock.MockControl;
import java.util.List;
import java.util.Map;
/**
* EditProxyConnectorActionTest
*
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
* @version $Id$
*/
public class EditProxyConnectorActionTest
extends AbstractWebworkTestCase
{
private static final String TEST_TARGET_ID = "central";
private static final String TEST_SOURCE_ID = "corporate";
private EditProxyConnectorAction action;
private MockControl archivaConfigurationControl;
private ArchivaConfiguration archivaConfiguration;
public void testAddBlackListPattern()
throws Exception
{
expectConfigurationRequests( 7 );
archivaConfigurationControl.replay();
// Prepare Test.
action.setSource( TEST_SOURCE_ID );
action.setTarget( TEST_TARGET_ID );
action.prepare();
ProxyConnectorConfiguration connector = action.getConnector();
assertInitialProxyConnector( connector );
// Perform Test w/no values.
preRequest( action );
String status = action.addBlackListPattern();
assertEquals( Action.INPUT, status );
// Should have returned an error, with no blacklist pattern added.
assertHasErrors( action );
assertEquals( 0, connector.getBlackListPatterns().size() );
// Try again, but now with a pattern to add.
action.setBlackListPattern( "**/*-javadoc.jar" );
preRequest( action );
status = action.addBlackListPattern();
assertEquals( Action.INPUT, status );
// Should have no error, and 1 blacklist pattern added.
assertNoErrors( action );
assertEquals( 1, connector.getBlackListPatterns().size() );
}
public void testAddProperty()
throws Exception
{
expectConfigurationRequests( 7 );
archivaConfigurationControl.replay();
// Prepare Test.
action.setSource( TEST_SOURCE_ID );
action.setTarget( TEST_TARGET_ID );
action.prepare();
ProxyConnectorConfiguration connector = action.getConnector();
assertInitialProxyConnector( connector );
// Perform Test w/no values.
preRequest( action );
String status = action.addProperty();
assertEquals( Action.INPUT, status );
// Should have returned an error, with no property pattern added.
assertHasErrors( action );
assertEquals( 0, connector.getProperties().size() );
// Try again, but now with a property key/value to add.
action.setPropertyKey( "eat-a" );
action.setPropertyValue( "gramov-a-bits" );
preRequest( action );
status = action.addProperty();
assertEquals( Action.INPUT, status );
// Should have no error, and 1 property added.
assertNoErrors( action );
assertEquals( 1, connector.getProperties().size() );
assertEquals( "gramov-a-bits", connector.getProperties().get( "eat-a" ) );
}
public void testAddWhiteListPattern()
throws Exception
{
expectConfigurationRequests( 7 );
archivaConfigurationControl.replay();
// Prepare Test.
action.setSource( TEST_SOURCE_ID );
action.setTarget( TEST_TARGET_ID );
action.prepare();
ProxyConnectorConfiguration connector = action.getConnector();
assertInitialProxyConnector( connector );
// Perform Test w/no values.
preRequest( action );
String status = action.addWhiteListPattern();
assertEquals( Action.INPUT, status );
// Should have returned an error, with no whitelist pattern added.
assertHasErrors( action );
assertEquals( 0, connector.getWhiteListPatterns().size() );
// Try again, but now with a pattern to add.
action.setWhiteListPattern( "**/*.jar" );
preRequest( action );
status = action.addWhiteListPattern();
assertEquals( Action.INPUT, status );
// Should have no error, and 1 whitelist pattern added.
assertNoErrors( action );
assertEquals( 1, connector.getWhiteListPatterns().size() );
}
public void testEditProxyConnectorCommit()
throws Exception
{
expectConfigurationRequests( 7 );
archivaConfigurationControl.replay();
// Prepare Test.
action.setSource( TEST_SOURCE_ID );
action.setTarget( TEST_TARGET_ID );
action.prepare();
ProxyConnectorConfiguration connector = action.getConnector();
assertInitialProxyConnector( connector );
// forms will use an array
connector.getProperties().put( "eat-a", new String[] { "gramov-a-bits" } );
// Create the input screen.
assertRequestStatus( action, Action.SUCCESS, "commit" );
assertNoErrors( action );
// Test configuration.
List<ProxyConnectorConfiguration> proxyConfigs = archivaConfiguration.getConfiguration().getProxyConnectors();
assertNotNull( proxyConfigs );
assertEquals( 1, proxyConfigs.size() );
ProxyConnectorConfiguration actualConnector = proxyConfigs.get( 0 );
assertNotNull( actualConnector );
// The use of "(direct connection)" should result in a proxyId which is <null>.
assertNull( actualConnector.getProxyId() );
assertEquals( "corporate", actualConnector.getSourceRepoId() );
assertEquals( "central", actualConnector.getTargetRepoId() );
}
public void testEditProxyConnectorInitialPage()
throws Exception
{
expectConfigurationRequests( 3 );
archivaConfigurationControl.replay();
action.setSource( TEST_SOURCE_ID );
action.setTarget( TEST_TARGET_ID );
action.prepare();
ProxyConnectorConfiguration connector = action.getConnector();
assertInitialProxyConnector( connector );
String status = action.input();
assertEquals( Action.INPUT, status );
}
public void testRemoveBlackListPattern()
throws Exception
{
expectConfigurationRequests( 7 );
archivaConfigurationControl.replay();
// Prepare Test.
action.setSource( TEST_SOURCE_ID );
action.setTarget( TEST_TARGET_ID );
action.prepare();
ProxyConnectorConfiguration connector = action.getConnector();
assertInitialProxyConnector( connector );
// Add some arbitrary blacklist patterns.
connector.addBlackListPattern( "**/*-javadoc.jar" );
connector.addBlackListPattern( "**/*.war" );
// Perform Test w/no pattern value.
preRequest( action );
String status = action.removeBlackListPattern();
assertEquals( Action.INPUT, status );
// Should have returned an error, with no blacklist pattern removed.
assertHasErrors( action );
assertEquals( 2, connector.getBlackListPatterns().size() );
// Perform test w/invalid (non-existant) pattern value to remove.
preRequest( action );
action.setPattern( "**/*oops*" );
status = action.removeBlackListPattern();
assertEquals( Action.INPUT, status );
// Should have returned an error, with no blacklist pattern removed.
assertHasErrors( action );
assertEquals( 2, connector.getBlackListPatterns().size() );
// Try again, but now with a valid pattern to remove.
action.setPattern( "**/*-javadoc.jar" );
preRequest( action );
status = action.removeBlackListPattern();
assertEquals( Action.INPUT, status );
// Should have no error, and 1 blacklist pattern left.
assertNoErrors( action );
assertEquals( 1, connector.getBlackListPatterns().size() );
assertEquals( "Should have left 1 blacklist pattern", "**/*.war", connector.getBlackListPatterns().get( 0 ) );
}
public void testRemoveProperty()
throws Exception
{
expectConfigurationRequests( 7 );
archivaConfigurationControl.replay();
// Prepare Test.
action.setSource( TEST_SOURCE_ID );
action.setTarget( TEST_TARGET_ID );
action.prepare();
ProxyConnectorConfiguration connector = action.getConnector();
assertInitialProxyConnector( connector );
// Add some arbitrary properties.
connector.addProperty( "username", "general-tso" );
connector.addProperty( "password", "chicken" );
// Perform Test w/no property key.
preRequest( action );
String status = action.removeProperty();
assertEquals( Action.INPUT, status );
// Should have returned an error, with no properties removed.
assertHasErrors( action );
assertEquals( 2, connector.getProperties().size() );
// Perform test w/invalid (non-existant) property key to remove.
preRequest( action );
action.setPropertyKey( "slurm" );
status = action.removeProperty();
assertEquals( Action.INPUT, status );
// Should have returned an error, with no properties removed.
assertHasErrors( action );
assertEquals( 2, connector.getProperties().size() );
// Try again, but now with a valid property to remove.
preRequest( action );
action.setPropertyKey( "password" );
status = action.removeProperty();
assertEquals( Action.INPUT, status );
// Should have no error, and 1 property left.
assertNoErrors( action );
assertEquals( 1, connector.getProperties().size() );
assertEquals( "Should have left 1 property", "general-tso", connector.getProperties().get( "username" ) );
}
public void testRemoveWhiteListPattern()
throws Exception
{
expectConfigurationRequests( 7 );
archivaConfigurationControl.replay();
// Prepare Test.
action.setSource( TEST_SOURCE_ID );
action.setTarget( TEST_TARGET_ID );
action.prepare();
ProxyConnectorConfiguration connector = action.getConnector();
assertInitialProxyConnector( connector );
// Add some arbitrary whitelist patterns.
connector.addWhiteListPattern( "javax/**/*" );
connector.addWhiteListPattern( "com/sun/**/*" );
// Perform Test w/no pattern value.
preRequest( action );
String status = action.removeWhiteListPattern();
assertEquals( Action.INPUT, status );
// Should have returned an error, with no whitelist pattern removed.
assertHasErrors( action );
assertEquals( 2, connector.getWhiteListPatterns().size() );
// Perform test w/invalid (non-existant) pattern value to remove.
preRequest( action );
action.setPattern( "**/*oops*" );
status = action.removeWhiteListPattern();
assertEquals( Action.INPUT, status );
// Should have returned an error, with no whitelist pattern removed.
assertHasErrors( action );
assertEquals( 2, connector.getWhiteListPatterns().size() );
// Try again, but now with a valid pattern to remove.
action.setPattern( "com/sun/**/*" );
preRequest( action );
status = action.removeWhiteListPattern();
assertEquals( Action.INPUT, status );
// Should have no error, and 1 whitelist pattern left.
assertNoErrors( action );
assertEquals( 1, connector.getWhiteListPatterns().size() );
assertEquals( "Should have left 1 whitelist pattern", "javax/**/*", connector.getWhiteListPatterns().get( 0 ) );
}
public void testSecureActionBundle()
throws Exception
{
archivaConfigurationControl.replay();
action.prepare();
SecureActionBundle bundle = action.getSecureActionBundle();
assertTrue( bundle.requiresAuthentication() );
assertEquals( 1, bundle.getAuthorizationTuples().size() );
}
private void assertInitialProxyConnector( ProxyConnectorConfiguration connector )
{
assertNotNull( connector );
assertNotNull( connector.getBlackListPatterns() );
assertNotNull( connector.getWhiteListPatterns() );
assertNotNull( connector.getProperties() );
assertEquals( TEST_SOURCE_ID, connector.getSourceRepoId() );
assertEquals( TEST_TARGET_ID, connector.getTargetRepoId() );
}
private Configuration createInitialConfiguration()
{
Configuration config = new Configuration();
ManagedRepositoryConfiguration managedRepo = new ManagedRepositoryConfiguration();
managedRepo.setId( TEST_SOURCE_ID );
managedRepo.setLayout( "${java.io.tmpdir}/archiva-test/managed-repo" );
managedRepo.setReleases( true );
config.addManagedRepository( managedRepo );
RemoteRepositoryConfiguration remoteRepo = new RemoteRepositoryConfiguration();
remoteRepo.setId( TEST_TARGET_ID );
remoteRepo.setUrl( "http://repo1.maven.org/maven2/" );
config.addRemoteRepository( remoteRepo );
ProxyConnectorConfiguration connector = new ProxyConnectorConfiguration();
connector.setSourceRepoId( TEST_SOURCE_ID );
connector.setTargetRepoId( TEST_TARGET_ID );
// TODO: Set these options programatically via list of available policies.
Map<String, String> policies = connector.getPolicies();
policies.put( "releases", new ReleasesPolicy().getDefaultOption() );
policies.put( "snapshots", new SnapshotsPolicy().getDefaultOption() );
policies.put( "checksum", new ChecksumPolicy().getDefaultOption() );
policies.put( "cache-failures", new CachedFailuresPolicy().getDefaultOption() );
policies.put( "propagate-errors", new PropagateErrorsDownloadPolicy().getDefaultOption() );
policies.put( "propagate-errors-on-update", new PropagateErrorsOnUpdateDownloadPolicy().getDefaultOption() );
config.addProxyConnector( connector );
return config;
}
private void expectConfigurationRequests( int requestConfigCount )
throws RegistryException, IndeterminateConfigurationException
{
Configuration config = createInitialConfiguration();
for ( int i = 0; i < requestConfigCount; i++ )
{
archivaConfiguration.getConfiguration();
archivaConfigurationControl.setReturnValue( config );
}
archivaConfiguration.save( config );
}
@Override
protected void setUp()
throws Exception
{
super.setUp();
action = (EditProxyConnectorAction) lookup( Action.class.getName(), "editProxyConnectorAction" );
archivaConfigurationControl = MockControl.createControl( ArchivaConfiguration.class );
archivaConfiguration = (ArchivaConfiguration) archivaConfigurationControl.getMock();
action.setArchivaConfiguration( archivaConfiguration );
/* Configuration will be requested at least 3 times. */
for ( int i = 0; i < 3; i++ )
{
archivaConfiguration.getConfiguration();
archivaConfigurationControl.setReturnValue( new Configuration() );
}
}
}