Java tutorial
/* * Copyright 2007 Jesse Peterson * * Licensed 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. */ package com.jpeterson.littles3; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.GregorianCalendar; import java.util.TimeZone; import javax.servlet.http.HttpServletRequest; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jmock.Mock; import org.jmock.MockObjectTestCase; import com.jpeterson.littles3.bo.AuthenticatorException; import com.jpeterson.littles3.bo.CanonicalUser; import com.jpeterson.littles3.bo.HackAuthenticator; import com.jpeterson.littles3.bo.S3Authenticator; public class S3ObjectRequestTest extends MockObjectTestCase { private Log logger; /** * Create the test case * * @param testName * name of the test case */ public S3ObjectRequestTest(String testName) { super(testName); logger = LogFactory.getLog(this.getClass()); logger.debug("S3ObjectTest"); } /** * @return the suite of tests being tested */ public static Test suite() { return new TestSuite(S3ObjectRequestTest.class); } /** * Test getting/setting the serviceEndpoint. */ public void test_serviceEndpoint() { S3ObjectRequest o = new S3ObjectRequest(); assertEquals("Unexpected serviceEndpoint", null, o.getServiceEndpoint()); o.setServiceEndpoint("http://localhost"); assertEquals("Unexpected serviceEndpoint", "http://localhost", o.getServiceEndpoint()); } /** * Test getting/setting the bucket. */ public void test_bucket() { S3ObjectRequest o = new S3ObjectRequest(); assertEquals("Unexpected bucket", null, o.getBucket()); o.setBucket("testBucket"); assertEquals("Unexpected bucket", "testBucket", o.getBucket()); } /** * Test getting/setting the key. */ public void test_key() { S3ObjectRequest o = new S3ObjectRequest(); assertEquals("Unexpected key", null, o.getKey()); o.setKey("testKey"); assertEquals("Unexpected key", "testKey", o.getKey()); } /** * Test a basic <code>create</code>. */ public void xtest_create() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/myBucket/myKey.txt")); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")).will(returnValue("localhost")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://localhost/context/myBucket/myKey.txt"))); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "localhost", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://localhost/context", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "myBucket", o.getBucket()); assertEquals("Unexpected key", "myKey.txt", o.getKey()); assertEquals("Unexpected requestor", new CanonicalUser("unitTest"), o.getRequestor()); } /** * Test a basic <code>create</code> with an anonymous request. */ public void xtest_createAnonymousRequest() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/myBucket/myKey.txt")); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")).will(returnValue("localhost")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://localhost/context/myBucket/myKey.txt"))); mockHttpServletRequest.expects(once()).method("getUserPrincipal").will(returnValue(null)); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "localhost", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://localhost/context", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "myBucket", o.getBucket()); assertEquals("Unexpected key", "myKey.txt", o.getKey()); assertEquals("Unexpected requestor", new CanonicalUser(CanonicalUser.ID_ANONYMOUS), o.getRequestor()); } /** * Test a basic <code>create</code> but with a space in the key. */ public void xtest_createWithSpace() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/myBucket/my Key.txt")); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")).will(returnValue("localhost")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://localhost/context/myBucket/my%20Key.txt"))); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "localhost", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://localhost/context", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "myBucket", o.getBucket()); assertEquals("Unexpected key", "my Key.txt", o.getKey()); } /** * Test a <code>create</code> with no key but with a slash character after * the bucket. */ public void xtest_createNoKeyBucketEndsWithSlash() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/myBucket/")); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")).will(returnValue("localhost")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://localhost/context/myBucket/"))); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "localhost", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://localhost/context", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "myBucket", o.getBucket()); assertNull("Unexpected key", o.getKey()); } /** * Test a <code>create</code> using virtual hosting of buckets. Ordinary * method. */ public void xtest_virtualHostingOrdinaryMethod() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/johnsmith/homepage.html")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://s3.amazonaws.com/johnsmith/homepage.html"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")) .will(returnValue("s3.amazonaws.com")); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "s3.amazonaws.com", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://s3.amazonaws.com", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "johnsmith", o.getBucket()); assertEquals("Unexpected key", "homepage.html", o.getKey()); } /** * Test a <code>create</code> using virtual hosting of buckets. HTTP 1.0, * contains no Host header. */ public void xtest_virtualHostingHTTP10() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/johnsmith/homepage.html")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://s3.amazonaws.com/johnsmith/homepage.html"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")).will(returnValue(null)); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "s3.amazonaws.com", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://s3.amazonaws.com", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "johnsmith", o.getBucket()); assertEquals("Unexpected key", "homepage.html", o.getKey()); } /** * Test a <code>create</code> using virtual hosting of buckets. Sub-domain * method. */ public void xtest_virtualHostingSubDomain() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/homepage.html")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://johnsmith.s3.amazonaws.com/homepage.html"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")) .will(returnValue("johnsmith.s3.amazonaws.com")); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "s3.amazonaws.com", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://johnsmith.s3.amazonaws.com", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "johnsmith", o.getBucket()); assertEquals("Unexpected key", "homepage.html", o.getKey()); } /** * Test a <code>create</code> using virtual hosting of buckets. Sub-domain * method with upper case Host header. */ public void xtest_virtualHostingSubDomainUpperCase() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/homepage.html")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://johnsmith.s3.amazonaws.com/homepage.html"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")) .will(returnValue("JohnSmith.s3.amazonaws.com")); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "s3.amazonaws.com", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://johnsmith.s3.amazonaws.com", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "johnsmith", o.getBucket()); assertEquals("Unexpected key", "homepage.html", o.getKey()); } /** * Test a <code>create</code> using virtual hosting of buckets. Domain is * the bucket. */ public void xtest_virtualHostingDomain() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/homepage.html")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://www.johnsmith.net/homepage.html"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")) .will(returnValue("www.johnsmith.net")); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "s3.amazonaws.com", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://www.johnsmith.net", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "www.johnsmith.net", o.getBucket()); assertEquals("Unexpected key", "homepage.html", o.getKey()); } /** * Test a <code>create</code> with no key but and no slash character after * the bucket. */ public void xtest_createNoKeyBucketNoSlash() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/myBucket")); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")).will(returnValue("localhost")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://localhost/context/myBucket"))); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "localhost", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://localhost/context", o.getServiceEndpoint()); assertEquals("Unexpected bucket", "myBucket", o.getBucket()); assertNull("Unexpected key", o.getKey()); } /** * Test a <code>create</code> with no bucket. */ public void xtest_createNoBucket() { S3ObjectRequest o; Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/")); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")).will(returnValue("localhost")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://localhost/context/"))); mockHttpServletRequest.expects(once()).method("getUserPrincipal") .will(returnValue(new CanonicalUser("unitTest"))); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("x-hack-user")).will(returnValue(null)); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); o = S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "localhost", authenticator); } catch (IllegalArgumentException e) { e.printStackTrace(); fail("Unexpected exception"); return; } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } assertEquals("Unexpected serviceEndpoint", "http://localhost/context", o.getServiceEndpoint()); assertNull("Unexpected bucket", o.getBucket()); assertNull("Unexpected key", o.getKey()); } /** * Test a <code>create</code> with an invalid request. */ public void xtest_createIllegalRequest() { Mock mockHttpServletRequest = mock(HttpServletRequest.class); mockHttpServletRequest.expects(once()).method("getPathInfo").will(returnValue("/foo")); mockHttpServletRequest.expects(once()).method("getHeader").with(eq("Host")).will(returnValue("localhost")); mockHttpServletRequest.expects(once()).method("getRequestURL") .will(returnValue(new StringBuffer("http://localhost/context/bar"))); try { HackAuthenticator authenticator = new HackAuthenticator(); authenticator.setAuthenticator(new S3Authenticator()); S3ObjectRequest.create((HttpServletRequest) mockHttpServletRequest.proxy(), "localhost", authenticator); fail("Expected exception"); } catch (IllegalArgumentException e) { // expected } catch (AuthenticatorException e) { e.printStackTrace(); fail("Unexpected exception"); return; } } /** * Basically a utility test for creating an ISO 8601 date. */ public void test_isoDate() { SimpleDateFormat iso8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); TimeZone utc = TimeZone.getTimeZone("UTC"); iso8601.setTimeZone(utc); GregorianCalendar cal = new GregorianCalendar(2007, 6, 19, 9, 50, 33); assertEquals("Unexpected formatted date", "2007-07-19T14:50:33.000Z", iso8601.format(cal.getTime())); } /** * Integration test to execute the algorithm for hostname resolution. */ public void xtest_localHost() { String configHost; String token = "$resolvedLocalHost$"; configHost = "foo:" + token + token + ":8080"; if (configHost.indexOf(token) >= 0) { InetAddress localHost; String resolvedLocalHost = "localhost"; try { localHost = InetAddress.getLocalHost(); resolvedLocalHost = localHost.getCanonicalHostName(); } catch (UnknownHostException e) { logger.fatal("Unable to resolve local host", e); } configHost = configHost.replace(token, resolvedLocalHost); } // this is machine dependent System.out.println(">>>> configHost: " + configHost); assertEquals("Unexpected hostname", "foo:PEM32Z2RC1LIC.NCSP.PEROOT.COMPEM32Z2RC1LIC.NCSP.PEROOT.COM:8080", configHost); } }