blob: a32ce5b95fb76db917e82b4b01a1f8dbc31503fc [file] [log] [blame]
package org.apache.maven.wagon.providers.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 junit.framework.Assert;
import org.apache.maven.wagon.Wagon;
import org.apache.maven.wagon.observers.Debug;
import org.apache.maven.wagon.repository.Repository;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.IOUtil;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.Files;
import java.nio.file.OpenOption;
import java.nio.file.StandardOpenOption;
/**
* @author Olivier Lamy
*/
public class HugeFileDownloadTest
extends PlexusTestCase
{
private static final Logger LOGGER = LoggerFactory.getLogger( HugeFileDownloadTest.class );
private static long HUGE_FILE_SIZE =
Integer.valueOf( Integer.MAX_VALUE ).longValue() + Integer.valueOf( Integer.MAX_VALUE ).longValue();
private Server server;
private ServerConnector connector;
public void testDownloadHugeFileWithContentLength()
throws Exception
{
final File hugeFile = new File( getBasedir(), "target/hugefile.txt" );
if ( !hugeFile.exists() || hugeFile.length() < HUGE_FILE_SIZE )
{
makeHugeFile( hugeFile );
}
server = new Server( );
connector = new ServerConnector( server, new HttpConnectionFactory( new HttpConfiguration() ) );
server.addConnector( connector );
ServletContextHandler root = new ServletContextHandler( ServletContextHandler.SESSIONS );
root.setResourceBase( new File( getBasedir(), "target" ).getAbsolutePath() );
ServletHolder servletHolder = new ServletHolder( new HttpServlet()
{
@Override
protected void doGet( HttpServletRequest req, HttpServletResponse resp )
throws ServletException, IOException
{
FileInputStream fis = new FileInputStream( hugeFile );
resp.addHeader( "Content-Length", String.valueOf( hugeFile.length() ) );
IOUtil.copy( fis, resp.getOutputStream() );
fis.close();
}
} );
root.addServlet( servletHolder, "/*" );
server.setHandler( root );
server.start();
File dest = null;
try
{
Wagon wagon = getWagon();
wagon.connect( new Repository( "id", "http://localhost:" + connector.getLocalPort() ) );
dest = File.createTempFile( "huge", "txt" );
LOGGER.info( "Fetching 'hugefile.txt' with content length" );
wagon.get( "hugefile.txt", dest );
Assert.assertTrue( dest.length() >= HUGE_FILE_SIZE );
LOGGER.info( "The file was successfully fetched" );
wagon.disconnect();
}
finally
{
server.stop();
dest.delete();
hugeFile.delete();
}
}
public void testDownloadHugeFileWithChunked()
throws Exception
{
final File hugeFile = new File( getBasedir(), "target/hugefile.txt" );
if ( !hugeFile.exists() || hugeFile.length() < HUGE_FILE_SIZE )
{
makeHugeFile( hugeFile );
}
server = new Server( );
connector = new ServerConnector( server, new HttpConnectionFactory( new HttpConfiguration() ) );
server.addConnector( connector );
ServletContextHandler root = new ServletContextHandler( ServletContextHandler.SESSIONS );
root.setResourceBase( new File( getBasedir(), "target" ).getAbsolutePath() );
ServletHolder servletHolder = new ServletHolder( new HttpServlet()
{
@Override
protected void doGet( HttpServletRequest req, HttpServletResponse resp )
throws ServletException, IOException
{
FileInputStream fis = new FileInputStream( hugeFile );
IOUtil.copy( fis, resp.getOutputStream() );
fis.close();
}
} );
root.addServlet( servletHolder, "/*" );
server.setHandler( root );
server.start();
File dest = null;
try
{
Wagon wagon = getWagon();
wagon.connect( new Repository( "id", "http://localhost:" + connector.getLocalPort() ) );
dest = File.createTempFile( "huge", "txt" );
LOGGER.info( "Fetching 'hugefile.txt' in chunks" );
wagon.get( "hugefile.txt", dest );
Assert.assertTrue( dest.length() >= HUGE_FILE_SIZE );
LOGGER.info( "The file was successfully fetched" );
wagon.disconnect();
}
finally
{
server.stop();
dest.delete();
hugeFile.delete();
}
}
protected Wagon getWagon()
throws Exception
{
Wagon wagon = (Wagon) lookup( Wagon.ROLE, "http" );
Debug debug = new Debug();
wagon.addSessionListener( debug );
return wagon;
}
private void makeHugeFile( File hugeFile )
throws Exception
{
LOGGER.info( "Creating test file" );
final ByteBuffer buf = ByteBuffer.allocate( 4 ).putInt( 2 );
buf.rewind();
final OpenOption[] options = { StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW,
StandardOpenOption.SPARSE };
try ( final SeekableByteChannel channel = Files.newByteChannel( hugeFile.toPath(), options ) )
{
channel.position( HUGE_FILE_SIZE );
channel.write( buf );
}
LOGGER.info( "Test file created" );
}
}