/*
* HttpRequestTest.java
*
* Created on Jul 23, 2007, 11:03:10 PM
*
* Test the HTTP request processor class
*
*/
package com.pugh.sockso.web;
import com.pugh.sockso.tests.TestUtils;
import com.pugh.sockso.tests.SocksoTestCase;
import java.io.InputStream;
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.DataInputStream;
import static org.easymock.EasyMock.*;
public class HttpRequestTest extends SocksoTestCase {
public void testConstructor() throws Exception {
InputStream in = TestUtils.getInputStream( "GET / HTTP/1.1\r\nasdasd\r\n\r\n" );
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
}
public void testGetHost() throws Exception {
String host = "jaksdhk";
InputStream in = TestUtils.getInputStream( "GET / HTTP/1.1\r\nHost: " + host + "\r\n" );
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
assertEquals( host, r.getHost() );
}
public void testGetUrlParam() throws Exception {
InputStream in = TestUtils.getInputStream( "GET /foo/bar/FOOBAR HTTP/1.1\r\n" );
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
assertEquals( r.getUrlParam(0), "foo" );
assertEquals( r.getUrlParam(1), "bar" );
assertEquals( r.getUrlParam(2), "FOOBAR" );
}
public void testGetParamCount() throws Exception {
InputStream in = TestUtils.getInputStream( "GET /foo/bar/FOOBAR HTTP/1.1\r\n" );
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
assertEquals( r.getParamCount(), 3 );
}
public void testGetPlayParamsNoSkip() throws Exception {
InputStream in = TestUtils.getInputStream( "GET /play/ar123/al456 HTTP/1.1\r\n" );
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
String[] params = r.getPlayParams( false );
assertEquals( params.length, 2 );
assertEquals( params[0], "ar123" );
assertEquals( params[1], "al456" );
}
public void testGetPlayParamsWithSkip() throws Exception {
InputStream in = TestUtils.getInputStream( "GET /play/music/ar123/al456 HTTP/1.1\r\n" );
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
String[] params = r.getPlayParams( true );
assertEquals( params.length, 2 );
assertEquals( params[0], "ar123" );
assertEquals( params[1], "al456" );
}
public void testGetPlayParamsNumSkips() throws Exception {
InputStream in = TestUtils.getInputStream( "GET /play/ar123/al456/pl253 HTTP/1.1\r\n" );
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
String[] params = r.getPlayParams( 2 );
assertEquals( params.length, 1 );
assertEquals( params[0], "pl253" );
}
public void testAddCookies() throws Exception {
InputStream in = TestUtils.getInputStream( "GET / HTTP/1.1\r\n" );
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
int origCount = r.cookies.size();
r.addCookies( " foo=bar; " );
assertEquals( (origCount+1), r.cookies.size() );
}
public void testReadPostData() throws Exception {
InputStream in = TestUtils.getInputStream(
"GET / HTTP/1.1\r\n" +
"Host: local\r\n\r\n" +
"foo=bar&baz=foo+bar"
);
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
assertEquals( "bar", r.getArgument("foo") );
assertEquals( "foo bar", r.getArgument("baz") );
assertEquals( "", r.getArgument("foobar") );
}
public void testGetCookie() throws Exception {
InputStream in = TestUtils.getInputStream(
"GET / HTTP/1.1\r\n" +
"Cookie: foo=bar; baz=foobar;\r\n\r\n"
);
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
assertEquals( "bar", r.getCookie("foo") );
assertEquals( "foobar", r.getCookie("baz") );
}
public void testReadGetData() throws Exception {
InputStream in = TestUtils.getInputStream(
"GET /action?foo=rab&bar=oof HTTP/1.1\r\n" +
"\r\n"
);
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
assertEquals( "rab", r.getArgument("foo") );
assertEquals( "oof", r.getArgument("bar") );
assertEquals( "", r.getArgument("foooof") );
}
public void testHasArgument() throws Exception {
InputStream in = TestUtils.getInputStream(
"GET /action?foo=rab&bar=oof HTTP/1.1\r\n" +
"\r\n"
);
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
assertEquals( true, r.hasArgument("foo") );
assertEquals( false, r.hasArgument("barbar") );
}
/**
* all lines in a HTTP request *should* end with \r\n, but we'll try and
* handle just \n aswell incase.
*
* @throws java.io.IOException
* @throws com.pugh.sockso.web.BadRequestException
*
*/
public void testHandlesDodgyLineEndings() throws Exception {
// mix of good and bad line endings
InputStream in = TestUtils.getInputStream(
"GET / HTTP/1.1\n" +
"Host: local\n\r\n" +
"foo=bar&baz=foo+bar"
);
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
assertEquals( "bar", r.getArgument("foo") );
assertEquals( "foo bar", r.getArgument("baz") );
assertEquals( "", r.getArgument("foobar") );
}
public void testGetMultipartData() throws Exception {
InputStream in = TestUtils.getInputStream(
"GET /action?foo=rab&bar=oof HTTP/1.1\r\n" +
"Content-Type: multipart/form-data; boundary=AaB03x\r\n" +
"\r\n" +
"--AaB03x\r\n" +
"Content-Disposition: form-data; name=\"name\"\r\n" +
"\r\n" +
"Larry\r\n" +
"--AaB03x\r\n" +
"Content-Disposition: form-data; name=\"myFile\"; filename=\"file1.txt\"\r\n" +
"Content-Type: text/plain\r\n" +
"\r\n" +
"contents of file\r\n" +
"--AaB03x--\r\n"
);
Server server = createMock( Server.class );
HttpRequest r = new HttpRequest( server );
r.process( in );
assertEquals( true, r.hasArgument("foo") );
assertEquals( true, r.hasArgument("name") );
assertEquals( "Larry", r.getArgument("name") );
UploadFile file = r.getFile( "myFile" );
assertNotNull( file );
assertEquals( "file1.txt", file.getFilename() );
assertNotNull( file.getTemporaryFile() );
assertEquals( "text/plain", file.getContentType() );
}
/**
* uses the test request data for a particular browser and platform
*
* @param platform
* @param name
*
*/
private void testRequest( final String platform, final String browser ) throws Exception {
final String folder = "test/data/requests/" +platform+ "/" +browser+ "/";
final File getFile = new File( folder + "get.txt" );
final File postFile = new File( folder + "post.txt" );
final File multipartFile = new File( folder + "multipart.txt" );
// request objects
final Request getReq = new HttpRequest( null );
final Request postReq = new HttpRequest( null );
final Request multipartReq = new HttpRequest( null );
// get request
getReq.process( new DataInputStream( new FileInputStream(getFile) ) );
assertEquals( "bar", getReq.getArgument("foo") );
// post request
postReq.process( new DataInputStream( new FileInputStream(postFile) ) );
assertEquals( "bar", postReq.getArgument("foo") );
// multipart request
multipartReq.process( new DataInputStream( new FileInputStream(multipartFile) ) );
assertEquals( "bar", multipartReq.getArgument("foo") );
final UploadFile uploadedFile = multipartReq.getFile( "myFile" );
if ( !TestUtils.compareFiles( uploadedFile.getTemporaryFile(), new File("test/data/binary.bin") ) ) {
fail( "Uploaded file not correct" );
}
}
// OSX
public void testOsxSafari() throws Exception {
testRequest("osx","safari-3.2");
}
public void testOsxFirefox() throws Exception {
testRequest("osx","firefox-3.0");
}
public void testOsxOpera() throws Exception {
testRequest("osx","opera-9.6");
}
// WINDOWS
public void testWindowsIE() throws Exception {
testRequest( "windows", "ie-6.0" );
}
public void testWindowsFirefox() throws Exception {
testRequest( "windows", "firefox-2.0" );
testRequest( "windows", "firefox-3.0" );
}
// LINUX
public void testLinuxKonqueror() throws Exception {
testRequest( "linux", "konqueror-3.5" );
}
public void testLinuxFirefox() throws Exception {
testRequest( "linux", "firefox-2.0" );
testRequest( "linux", "firefox-3.0" );
}
}