blob: cefd47982657be2bb0d11ffc2fd4fd8bf42e9467 [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.server.handler;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.URI;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import org.eclipse.jetty.server.Connector;
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.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.toolchain.test.SimpleRequest;
import org.eclipse.jetty.toolchain.test.annotation.Slow;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.IO;
import org.hamcrest.Matchers;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Resource Handler test
*
* TODO: increase the testing going on here
*/
public class ResourceHandlerTest
{
private static String LN = System.getProperty("line.separator");
private static Server _server;
private static HttpConfiguration _config;
private static ServerConnector _connector;
private static ContextHandler _contextHandler;
private static ResourceHandler _resourceHandler;
@BeforeClass
public static void setUp() throws Exception
{
File dir = MavenTestingUtils.getTargetFile("test-classes/simple");
File bigger = new File(dir,"bigger.txt");
File big = new File(dir,"big.txt");
try (OutputStream out = new FileOutputStream(bigger))
{
for (int i = 0; i < 100; i++)
{
try (InputStream in = new FileInputStream(big))
{
IO.copy(in,out);
}
}
}
bigger.deleteOnExit();
// determine how the SCM of choice checked out the big.txt EOL
// we can't just use whatever is the OS default.
// because, for example, a windows system using git can be configured for EOL handling using
// local, remote, file lists, patterns, etc, rendering assumptions about the OS EOL choice
// wrong for unit tests.
LN = System.getProperty("line.separator");
try (BufferedReader reader = Files.newBufferedReader(big.toPath(),StandardCharsets.UTF_8))
{
// a buffer large enough to capture at least 1 EOL
char cbuf[] = new char[128];
reader.read(cbuf);
String sample = new String(cbuf);
if (sample.contains("\r\n"))
{
LN = "\r\n";
}
else if (sample.contains("\n\r"))
{
LN = "\n\r";
}
else
{
LN = "\n";
}
}
_server = new Server();
_config = new HttpConfiguration();
_config.setOutputBufferSize(2048);
_connector = new ServerConnector(_server,new HttpConnectionFactory(_config));
_server.setConnectors(new Connector[] { _connector });
_resourceHandler = new ResourceHandler();
_resourceHandler.setMinAsyncContentLength(4096);
_resourceHandler.setMinMemoryMappedContentLength(8192);
_resourceHandler.setResourceBase(MavenTestingUtils.getTargetFile("test-classes/simple").getAbsolutePath());
_contextHandler = new ContextHandler("/resource");
_contextHandler.setHandler(_resourceHandler);
_server.setHandler(_contextHandler);
_server.start();
}
@AfterClass
public static void tearDown() throws Exception
{
_server.stop();
}
@Before
public void before()
{
_config.setOutputBufferSize(4096);
}
@Test
public void testMissing() throws Exception
{
SimpleRequest sr = new SimpleRequest(new URI("http://localhost:" + _connector.getLocalPort()));
Assert.assertNotNull("missing jetty.css",sr.getString("/resource/jetty-dir.css"));
}
@Test
public void testSimple() throws Exception
{
SimpleRequest sr = new SimpleRequest(new URI("http://localhost:" + _connector.getLocalPort()));
Assert.assertEquals("simple text",sr.getString("/resource/simple.txt"));
}
@Test
public void testBigFile() throws Exception
{
_config.setOutputBufferSize(2048);
SimpleRequest sr = new SimpleRequest(new URI("http://localhost:" + _connector.getLocalPort()));
String response = sr.getString("/resource/big.txt");
Assert.assertThat(response,Matchers.startsWith(" 1\tThis is a big file"));
Assert.assertThat(response,Matchers.endsWith(" 400\tThis is a big file" + LN));
}
@Test
public void testBigFileBigBuffer() throws Exception
{
_config.setOutputBufferSize(16 * 1024);
SimpleRequest sr = new SimpleRequest(new URI("http://localhost:" + _connector.getLocalPort()));
String response = sr.getString("/resource/big.txt");
Assert.assertThat(response,Matchers.startsWith(" 1\tThis is a big file"));
Assert.assertThat(response,Matchers.endsWith(" 400\tThis is a big file" + LN));
}
@Test
public void testBigFileLittleBuffer() throws Exception
{
_config.setOutputBufferSize(8);
SimpleRequest sr = new SimpleRequest(new URI("http://localhost:" + _connector.getLocalPort()));
String response = sr.getString("/resource/big.txt");
Assert.assertThat(response,Matchers.startsWith(" 1\tThis is a big file"));
Assert.assertThat(response,Matchers.endsWith(" 400\tThis is a big file" + LN));
}
@Test
public void testBigger() throws Exception
{
try (Socket socket = new Socket("localhost",_connector.getLocalPort());)
{
socket.getOutputStream().write("GET /resource/bigger.txt HTTP/1.0\n\n".getBytes());
Thread.sleep(1000);
String response = IO.toString(socket.getInputStream());
Assert.assertThat(response,Matchers.startsWith("HTTP/1.1 200 OK"));
Assert.assertThat(response,Matchers.containsString(" 400\tThis is a big file" + LN + " 1\tThis is a big file"));
Assert.assertThat(response,Matchers.endsWith(" 400\tThis is a big file" + LN));
}
}
@Test
@Slow
public void testSlowBiggest() throws Exception
{
_connector.setIdleTimeout(10000);
File dir = MavenTestingUtils.getTargetFile("test-classes/simple");
File biggest = new File(dir,"biggest.txt");
try (OutputStream out = new FileOutputStream(biggest))
{
for (int i = 0; i < 10; i++)
{
try (InputStream in = new FileInputStream(new File(dir,"bigger.txt")))
{
IO.copy(in,out);
}
}
out.write("\nTHE END\n".getBytes(StandardCharsets.ISO_8859_1));
}
biggest.deleteOnExit();
try (Socket socket = new Socket("localhost",_connector.getLocalPort());OutputStream out=socket.getOutputStream();InputStream in=socket.getInputStream())
{
socket.getOutputStream().write("GET /resource/biggest.txt HTTP/1.0\n\n".getBytes());
byte[] array = new byte[102400];
ByteBuffer buffer=null;
int i=0;
while(true)
{
Thread.sleep(100);
int len=in.read(array);
if (len<0)
break;
buffer=BufferUtil.toBuffer(array,0,len);
// System.err.println(++i+": "+BufferUtil.toDetailString(buffer));
}
Assert.assertEquals('E',buffer.get(buffer.limit()-4));
Assert.assertEquals('N',buffer.get(buffer.limit()-3));
Assert.assertEquals('D',buffer.get(buffer.limit()-2));
}
}
}