blob: ac48636bdbd32ce4368aa4336c448badf67c4241 [file] [log] [blame]
package org.apache.maven.wagon.tck.http;
/*
* 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.maven.wagon.ConnectionException;
import org.apache.maven.wagon.ResourceDoesNotExistException;
import org.apache.maven.wagon.StreamWagon;
import org.apache.maven.wagon.TransferFailedException;
import org.apache.maven.wagon.authentication.AuthenticationException;
import org.apache.maven.wagon.authentication.AuthenticationInfo;
import org.apache.maven.wagon.authorization.AuthorizationException;
import org.apache.maven.wagon.proxy.ProxyInfo;
import org.apache.maven.wagon.tck.http.fixture.ErrorCodeServlet;
import org.apache.maven.wagon.tck.http.fixture.LatencyServlet;
import org.apache.maven.wagon.tck.http.fixture.ProxyConnectionVerifierFilter;
import org.apache.maven.wagon.tck.http.fixture.RedirectionServlet;
import org.apache.maven.wagon.tck.http.fixture.ServerFixture;
import org.apache.maven.wagon.tck.http.fixture.ServletExceptionServlet;
import org.apache.maven.wagon.tck.http.util.ValueHolder;
import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
import org.junit.Ignore;
import org.junit.Test;
import javax.servlet.Servlet;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import static org.apache.maven.wagon.tck.http.Assertions.NO_RESPONSE_STATUS_CODE;
import static org.apache.maven.wagon.tck.http.Assertions.assertFileContentsFromResource;
import static org.apache.maven.wagon.tck.http.Assertions.assertWagonExceptionMessage;
/**
*
*/
public class GetWagonTests
extends HttpWagonTests
{
private static final int TWO_SECONDS = 2000;
private static final int ONE_MINUTE = 60000;
@Test
public void basic()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
testSuccessfulGet( "base.txt" );
}
@Test
@Ignore( "FIX ME!" )
public void proxied()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
getServerFixture().addFilter( "*", new ProxyConnectionVerifierFilter() );
ProxyInfo info = newProxyInfo();
if ( !initTest( null, info ) )
{
return;
}
File target = newTempFile();
getWagon().get( "base.txt", target );
assertFileContentsFromResource( ServerFixture.SERVER_ROOT_RESOURCE_PATH, "base.txt", target,
"Downloaded file doesn't match original." );
}
@Test
public void highLatencyHighTimeout()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
getServerFixture().addServlet( "/slow/*", new LatencyServlet( TWO_SECONDS ) );
testSuccessfulGet( "slow/large.txt", "large.txt" );
}
@Test
public void highLatencyLowTimeout()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
Servlet servlet = new LatencyServlet( TWO_SECONDS );
getServerFixture().addServlet( "/slow/*", servlet );
testSuccessfulGet( "slow/large.txt", "large.txt" );
}
@Test
public void inifiniteLatencyTimeout()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
if ( !isSupported() )
{
return;
}
final ValueHolder<TransferFailedException> holder = new ValueHolder<>( null );
Runnable r = new Runnable()
{
public void run()
{
Servlet servlet = new LatencyServlet( -1 );
addNotificationTarget( servlet );
getServerFixture().addServlet( "/infinite/*", servlet );
try
{
if ( !initTest( null, null ) )
{
return;
}
if ( getWagon() instanceof StreamWagon )
{
logger.info( "Connection timeout is: " + getWagon().getTimeout() );
}
File target = newTempFile();
getWagon().get( "infinite/", target );
fail( "Should have failed to transfer due to transaction timeout." );
}
catch ( ConnectionException | AuthenticationException | ResourceDoesNotExistException
| AuthorizationException | ComponentConfigurationException | IOException e )
{
throw new IllegalStateException( e );
}
catch ( TransferFailedException e )
{
// expected
holder.setValue( e );
}
}
};
Thread t = new Thread( r );
t.start();
try
{
logger.info( "Waiting 60 seconds for wagon timeout." );
t.join( ONE_MINUTE );
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
logger.info( "Interrupting thread." );
t.interrupt();
assertTrue( "TransferFailedException should have been thrown.", holder.getValue() != null );
assertWagonExceptionMessage( holder.getValue(), NO_RESPONSE_STATUS_CODE, getBaseUrl() + "infinite/",
"", null );
}
@Test
public void nonExistentHost()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
ResourceDoesNotExistException, AuthorizationException
{
// we use a invalid localhost URL since some Internet Service Providers lately
// use funny 'search-DNS' which don't handle explicitly marked testing DNS properly.
// According to RFC-2606 .test, .invalid TLDs etc should work, but in practice it doesn't :(
if ( !initTest( "http://localhost:65520", null, null ) )
{
return;
}
File target = newTempFile();
try
{
getWagon().get( "base.txt", target );
fail( "Expected error related to host lookup failure." );
}
catch ( TransferFailedException e )
{
// expected
assertWagonExceptionMessage( e, NO_RESPONSE_STATUS_CODE, "http://localhost:65520/base.txt",
null, null );
}
}
@Test
public void oneLevelPermanentMove()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
getServerFixture().addServlet( "/moved.txt",
new RedirectionServlet( HttpServletResponse.SC_MOVED_PERMANENTLY,
"/base.txt" ) );
testSuccessfulGet( "moved.txt" );
}
@Test
public void oneLevelTemporaryMove()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
getServerFixture().addServlet( "/moved.txt",
new RedirectionServlet( HttpServletResponse.SC_MOVED_TEMPORARILY,
"/base.txt" ) );
testSuccessfulGet( "moved.txt" );
}
@Test
public void sixLevelPermanentMove()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
String myPath = "moved.txt";
String targetPath = "/base.txt";
getServerFixture().addServlet( "/" + myPath + "/*",
new RedirectionServlet( HttpServletResponse.SC_MOVED_PERMANENTLY, myPath,
targetPath, 6 ) );
testSuccessfulGet( myPath );
}
@Test
public void sixLevelTemporaryMove()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
String myPath = "moved.txt";
String targetPath = "/base.txt";
getServerFixture().addServlet( "/" + myPath + "/*",
new RedirectionServlet( HttpServletResponse.SC_MOVED_TEMPORARILY, myPath,
targetPath, 6 ) );
testSuccessfulGet( myPath );
}
@Test
public void infinitePermanentMove()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
String myPath = "moved.txt";
String targetPath = "/base.txt";
getServerFixture().addServlet(
"/" + myPath,
new RedirectionServlet( HttpServletResponse.SC_MOVED_PERMANENTLY, myPath,
targetPath, -1 ) );
try
{
testSuccessfulGet( myPath );
fail( "Expected failure as a result of too many redirects." );
}
catch ( TransferFailedException e )
{
// expected
}
}
@Test
public void infiniteTemporaryMove()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
ResourceDoesNotExistException, AuthorizationException
{
String myPath = "moved.txt";
String targetPath = "/base.txt";
getServerFixture().addServlet(
"/" + myPath,
new RedirectionServlet( HttpServletResponse.SC_MOVED_TEMPORARILY, myPath,
targetPath, -1 ) );
try
{
testSuccessfulGet( myPath );
fail( "Expected failure as a result of too many redirects." );
}
catch ( TransferFailedException e )
{
// expected
}
}
/**
* NOTE: This test depends on a {@link WagonTestCaseConfigurator} configuration to limit redirects to 20. In the
* case of the Sun HTTP implementation, this is the default limit.
*/
@Test
@SuppressWarnings( "checkstyle:methodname" )
public void permanentMove_TooManyRedirects_limit20()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
String myPath = "moved.txt";
String targetPath = "/base.txt";
getServerFixture().addServlet(
"/" + myPath,
new RedirectionServlet( HttpServletResponse.SC_MOVED_PERMANENTLY, myPath,
targetPath, -1 ) );
try
{
testSuccessfulGet( myPath );
fail( "Expected failure as a result of too many redirects." );
}
catch ( TransferFailedException e )
{
// expected
}
}
/**
* NOTE: This test depends on a {@link WagonTestCaseConfigurator} configuration to limit redirects to 20. In the
* case of the Sun HTTP implementation, this is the default limit.
*/
@Test
@SuppressWarnings( "checkstyle:methodname" )
public void temporaryMove_TooManyRedirects_limit20()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
ResourceDoesNotExistException, AuthorizationException
{
String myPath = "moved.txt";
String targetPath = "/base.txt";
getServerFixture().addServlet(
"/" + myPath,
new RedirectionServlet( HttpServletResponse.SC_MOVED_TEMPORARILY, myPath,
targetPath, -1 ) );
try
{
testSuccessfulGet( myPath );
fail( "Expected failure as a result of too many redirects." );
}
catch ( TransferFailedException e )
{
// expected
}
}
@Test
public void missing()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, AuthorizationException
{
if ( !initTest( null, null ) )
{
return;
}
File target = newTempFile();
try
{
getWagon().get( "404.txt", target );
fail( "should have received a 404, meaning the resource doesn't exist." );
}
catch ( ResourceDoesNotExistException e )
{
// expected
}
}
@Test
public void error()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
AuthorizationException, ResourceDoesNotExistException
{
testErrorHandling( HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
}
@Test
public void proxyTimeout()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
AuthorizationException, ResourceDoesNotExistException
{
testErrorHandling( HttpServletResponse.SC_GATEWAY_TIMEOUT );
}
@Test
public void forbidden()
throws ConnectionException, ComponentConfigurationException, IOException, ResourceDoesNotExistException,
TransferFailedException
{
AuthenticationInfo info = new AuthenticationInfo();
info.setUserName( "user" );
info.setPassword( "password" );
getServerFixture().addUser( info.getUserName(), "password" );
getServerFixture().addServlet( "/403.txt",
new ErrorCodeServlet( HttpServletResponse.SC_FORBIDDEN, "Expected 403" ) );
testAuthFailure( "403.txt", info );
}
@Test
public void successfulAuthentication()
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
AuthenticationInfo info = new AuthenticationInfo();
info.setUserName( "user" );
info.setPassword( "password" );
getServerFixture().addUser( info.getUserName(), info.getPassword() );
if ( !initTest( info, null ) )
{
return;
}
File target = newTempFile();
getWagon().get( "protected/base.txt", target );
assertFileContentsFromResource( ServerFixture.SERVER_ROOT_RESOURCE_PATH, "base.txt", target,
"Downloaded file doesn't match original." );
}
@Test
public void unsuccessfulAuthentication()
throws ConnectionException, ComponentConfigurationException, IOException, TransferFailedException,
ResourceDoesNotExistException
{
AuthenticationInfo info = new AuthenticationInfo();
info.setUserName( "user" );
info.setPassword( "password" );
getServerFixture().addUser( info.getUserName(), "anotherPassword" );
testAuthFailure( "protected/base.txt", info );
}
protected void testAuthFailure( final String path, final AuthenticationInfo info )
throws ConnectionException, ComponentConfigurationException, IOException, TransferFailedException,
ResourceDoesNotExistException
{
boolean authFailure = false;
try
{
if ( !initTest( info, null ) )
{
return;
}
}
catch ( AuthenticationException e )
{
// expected
authFailure = true;
}
File target = newTempFile();
try
{
getWagon().get( path, target );
}
catch ( AuthorizationException e )
{
// expected
authFailure = true;
}
assertTrue( "Authentication/Authorization should have failed.", authFailure );
}
protected void testSuccessfulGet( final String path )
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
testSuccessfulGet( path, "base.txt" );
}
protected void testSuccessfulGet( final String path, final String checkPath )
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
if ( !initTest( null, null ) )
{
return;
}
if ( getWagon() instanceof StreamWagon )
{
logger.info( "Connection timeout is: " + getWagon().getTimeout() );
}
File target = newTempFile();
getWagon().get( path, target );
assertFileContentsFromResource( ServerFixture.SERVER_ROOT_RESOURCE_PATH, checkPath, target,
"Downloaded file doesn't match original." );
}
protected void testErrorHandling( final int code )
throws ConnectionException, AuthenticationException, ComponentConfigurationException, IOException,
AuthorizationException, ResourceDoesNotExistException
{
if ( code == HttpServletResponse.SC_INTERNAL_SERVER_ERROR )
{
getServerFixture().addServlet( "/" + code + ".txt", new ServletExceptionServlet( "Expected " + code ) );
}
else
{
getServerFixture().addServlet( "/" + code + ".txt", new ErrorCodeServlet( code, "Expected " + code ) );
}
if ( !initTest( null, null ) )
{
return;
}
File target = newTempFile();
try
{
getWagon().get( code + ".txt", target );
fail( "should have received a " + code + " error code, meaning the resource doesn't exist." );
}
catch ( TransferFailedException e )
{
// expected
}
}
}