Added: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletUtilTest.java URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletUtilTest.java?rev=982090&view=auto ============================================================================== --- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletUtilTest.java (added) +++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletUtilTest.java Wed Aug 4 00:09:36 2010 @@ -0,0 +1,239 @@ +/* + * 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. + */ +package org.apache.shindig.gadgets.servlet; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Vector; + +import org.apache.commons.codec.binary.Base64; +import org.apache.shindig.common.servlet.HttpServletResponseRecorder; +import org.apache.shindig.common.servlet.HttpUtil; +import org.apache.shindig.common.uri.Uri; +import org.apache.shindig.common.util.FakeTimeSource; +import org.apache.shindig.gadgets.GadgetException; +import org.apache.shindig.gadgets.http.HttpRequest; +import org.apache.shindig.gadgets.http.HttpResponse; +import org.apache.shindig.gadgets.http.HttpResponseBuilder; +import org.easymock.EasyMock; + +import org.json.JSONObject; +import org.junit.Test; + +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ServletUtilTest { + @Test + public void testValidateUrlNoPath() throws Exception { + Uri url = ServletUtil.validateUrl(Uri.parse("http://www.example.com")); + assertEquals("http", url.getScheme()); + assertEquals("www.example.com", url.getAuthority()); + assertEquals("/", url.getPath()); + assertNull(url.getQuery()); + assertNull(url.getFragment()); + } + + @Test + public void testValidateUrlHttps() throws Exception { + Uri url = ServletUtil.validateUrl(Uri.parse("https://www.example.com")); + assertEquals("https", url.getScheme()); + assertEquals("www.example.com", url.getAuthority()); + assertEquals("/", url.getPath()); + assertNull(url.getQuery()); + assertNull(url.getFragment()); + } + + @Test + public void testValidateUrlWithPath() throws Exception { + Uri url = ServletUtil.validateUrl(Uri.parse("http://www.example.com/foo")); + assertEquals("http", url.getScheme()); + assertEquals("www.example.com", url.getAuthority()); + assertEquals("/foo", url.getPath()); + assertNull(url.getQuery()); + assertNull(url.getFragment()); + } + + @Test + public void testValidateUrlWithPort() throws Exception { + Uri url = ServletUtil.validateUrl(Uri.parse("http://www.example.com:8080/foo")); + assertEquals("http", url.getScheme()); + assertEquals("www.example.com:8080", url.getAuthority()); + assertEquals("/foo", url.getPath()); + assertNull(url.getQuery()); + assertNull(url.getFragment()); + } + + @Test + public void testValidateUrlWithEncodedPath() throws Exception { + Uri url = ServletUtil.validateUrl(Uri.parse("http://www.example.com/foo%20bar")); + assertEquals("http", url.getScheme()); + assertEquals("www.example.com", url.getAuthority()); + assertEquals("/foo%20bar", url.getPath()); + assertNull(url.getQuery()); + assertNull(url.getFragment()); + } + + @Test + public void testValidateUrlWithEncodedQuery() throws Exception { + Uri url = ServletUtil.validateUrl(Uri.parse("http://www.example.com/foo?q=with%20space")); + assertEquals("http", url.getScheme()); + assertEquals("www.example.com", url.getAuthority()); + assertEquals("/foo", url.getPath()); + assertEquals("q=with%20space", url.getQuery()); + assertEquals("with space", url.getQueryParameter("q")); + assertNull(url.getFragment()); + } + + @Test + public void testValidateUrlWithNoPathAndEncodedQuery() throws Exception { + Uri url = ServletUtil.validateUrl(Uri.parse("http://www.example.com?q=with%20space")); + assertEquals("http", url.getScheme()); + assertEquals("www.example.com", url.getAuthority()); + assertEquals("/", url.getPath()); + assertEquals("q=with%20space", url.getQuery()); + assertNull(url.getFragment()); + } + + @Test(expected = GadgetException.class) + public void testValidateUrlNullInput() throws Exception { + ServletUtil.validateUrl(null); + } + + @Test + public void testOutputDataUri() throws Exception { + checkOutputDataUri("text/foo", "text/foo", "UTF-8"); + } + + @Test + public void testOutputDataUriWithCharset() throws Exception { + checkOutputDataUri("text/bar; charset=ISO-8859-1", "text/bar", "ISO-8859-1"); + } + + private void checkOutputDataUri(String contentType, String expectedType, + String expectedEncoding) throws Exception { + String theData = "this is the data"; + String mk1 = "meta1", mv1 = "val1"; + String mk2 = "'\"}key", mv2 = "val{\"'"; + HttpResponse response = new HttpResponseBuilder() + .setResponseString(theData) + .addHeader("Content-Type", contentType) + .setMetadata(mk1, mv1) + .setMetadata(mk2, mv2) + .setMetadata(ServletUtil.DATA_URI_KEY, "foo") // Should be ignored. + .create(); + + HttpResponse jsonified = ServletUtil.convertToJsonResponse(response); + + assertEquals("application/json; charset=UTF-8", jsonified.getHeader("Content-Type")); + + String emitted = jsonified.getResponseAsString(); + JSONObject js = new JSONObject(emitted); + assertEquals(mv1, js.getString(mk1)); + assertEquals(mv2, js.getString(mk2)); + String content64 = getBase64(theData); + assertEquals("data:" + expectedType + ";base64;charset=" + expectedEncoding + "," + content64, + js.getString(ServletUtil.DATA_URI_KEY)); + } + + private String getBase64(String input) throws Exception { + return new String(Base64.encodeBase64(input.getBytes("UTF8")), "UTF8"); + } + + @Test + public void testFromHttpServletRequest() throws Exception { + HttpServletRequest original = EasyMock.createMock(HttpServletRequest.class); + EasyMock.expect(original.getScheme()).andReturn("https"); + EasyMock.expect(original.getServerName()).andReturn("www.example.org"); + EasyMock.expect(original.getServerPort()).andReturn(444); + EasyMock.expect(original.getRequestURI()).andReturn("/path/foo"); + EasyMock.expect(original.getQueryString()).andReturn("one=two&three=four"); + Vector<String> headerNames = new Vector<String>(); + headerNames.add("Header1"); + headerNames.add("Header2"); + EasyMock.expect(original.getHeaderNames()).andReturn(headerNames.elements()); + EasyMock.expect(original.getHeader("Header1")).andReturn("HVal1"); + EasyMock.expect(original.getHeader("Header2")).andReturn("HVal2"); + EasyMock.expect(original.getMethod()).andReturn("post"); + final ByteArrayInputStream bais = new ByteArrayInputStream("post body".getBytes()); + ServletInputStream sis = new ServletInputStream() { + @Override + public int read() throws IOException { + return bais.read(); + } + }; + EasyMock.expect(original.getInputStream()).andReturn(sis); + EasyMock.expect(original.getRemoteAddr()).andReturn("1.2.3.4"); + + EasyMock.replay(original); + HttpRequest request = ServletUtil.fromHttpServletRequest(original); + EasyMock.verify(original); + + assertEquals(Uri.parse("https://www.example.org:444/path/foo?one=two&three=four"), + request.getUri()); + assertEquals(3, request.getHeaders().size()); + assertEquals("HVal1", request.getHeader("Header1")); + assertEquals("HVal2", request.getHeader("Header2")); + assertEquals("post", request.getMethod()); + assertEquals("post body", request.getPostBodyAsString()); + assertEquals("1.2.3.4", request.getParam(ServletUtil.REMOTE_ADDR_KEY)); + } + + @Test + public void testCopyResponseToServlet() throws Exception { + HttpResponse response = new HttpResponseBuilder() + .setResponseString("response string").setHttpStatusCode(200).addHeader("h1", "v1") + .addHeader("h2", "v2").setCacheTtl(1000).create(); + + HttpServletResponse servletResponse = EasyMock.createMock(HttpServletResponse.class); + HttpServletResponseRecorder recorder = new HttpServletResponseRecorder(servletResponse); + + ServletUtil.copyResponseToServlet(response, recorder); + + assertEquals(200, recorder.getHttpStatusCode()); + assertEquals("response string", recorder.getResponseAsString()); + assertEquals("v1", recorder.getHeader("h1")); + assertEquals("v2", recorder.getHeader("h2")); + } + + @Test + public void testCopyResponseToServletNoCache() throws Exception { + HttpResponse response = new HttpResponseBuilder() + .setResponseString("response string").setHttpStatusCode(200).addHeader("h1", "v1") + .addHeader("h2", "v2").setStrictNoCache().create(); + + HttpServletResponse servletResponse = EasyMock.createMock(HttpServletResponse.class); + HttpServletResponseRecorder recorder = new HttpServletResponseRecorder(servletResponse); + + FakeTimeSource fakeTime = new FakeTimeSource(); + HttpUtil.setTimeSource(fakeTime); + ServletUtil.copyResponseToServlet(response, recorder); + + assertEquals(200, recorder.getHttpStatusCode()); + assertEquals("response string", recorder.getResponseAsString()); + assertEquals("v1", recorder.getHeader("h1")); + assertEquals("v2", recorder.getHeader("h2")); + assertEquals("no-cache", recorder.getHeader("Pragma")); + assertEquals("no-cache", recorder.getHeader("Cache-Control")); + } +}
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/UriUtilsTest.java URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/UriUtilsTest.java?rev=982090&r1=982089&r2=982090&view=diff ============================================================================== --- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/UriUtilsTest.java (original) +++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/UriUtilsTest.java Wed Aug 4 00:09:36 2010 @@ -18,34 +18,22 @@ */ package org.apache.shindig.gadgets.uri; +import static org.junit.Assert.assertEquals; + import com.google.inject.internal.ImmutableList; import com.google.inject.internal.ImmutableMap; -import org.apache.shindig.common.EasyMockTestCase; import org.apache.shindig.common.uri.Uri; import org.apache.shindig.gadgets.http.HttpRequest; import org.apache.shindig.gadgets.http.HttpResponse; import org.apache.shindig.gadgets.http.HttpResponseBuilder; -import org.apache.shindig.gadgets.servlet.ServletTestFixture; -import org.easymock.EasyMock; -import org.easymock.IAnswer; -import org.junit.Before; import org.junit.Test; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.util.*; -import static org.easymock.EasyMock.expect; - /** * Tests for UriUtils. */ -public class UriUtilsTest extends ServletTestFixture { - @Before - public void setUp() throws Exception { - } - +public class UriUtilsTest { Enumeration<String> makeEnumeration(String... args) { Vector<String> vector = new Vector<String>(); if (args != null) { @@ -59,10 +47,11 @@ public class UriUtilsTest extends Servle String url = "http://example.org/foo"; HttpRequest req = new HttpRequest(Uri.parse(url)) .setRewriteMimeType(requestMime); - recorder.setContentType(responseMime); + HttpResponseBuilder builder = new HttpResponseBuilder() + .setHeader("Content-Type", responseMime); - UriUtils.maybeRewriteContentType(req, recorder); - assertEquals(expectedMime, recorder.getContentType()); + UriUtils.maybeRewriteContentType(req, builder); + assertEquals(expectedMime, builder.getHeader("Content-Type")); } @Test @@ -121,26 +110,25 @@ public class UriUtilsTest extends Servle .setHttpStatusCode(5000) .addHeader("hello", "world1") .addHeader("hello", "world2") - .addHeader("hello\\u2297", "bad header") + .addHeader("hello\u2297", "bad header") .addHeader("Content-length", "10") .addHeader("vary", "1") .create(); - HttpServletResponse response = mock(HttpServletResponse.class); - - response.setStatus(5000); - EasyMock.expectLastCall().once(); - - response.addHeader("hello", "world1"); - EasyMock.expectLastCall().once(); - response.addHeader("hello", "world2"); - EasyMock.expectLastCall().once(); + HttpResponseBuilder builder = new HttpResponseBuilder(); - replay(); - UriUtils.copyResponseHeadersAndStatusCode(resp, response, false, false, + UriUtils.copyResponseHeadersAndStatusCode(resp, builder, false, false, UriUtils.DisallowedHeaders.OUTPUT_TRANSFER_DIRECTIVES, UriUtils.DisallowedHeaders.CACHING_DIRECTIVES); - verify(); + + HttpResponse response = builder.create(); + + // Date is added by HttpResponse. + assertEquals(3, response.getHeaders().size()); + Iterator<String> headers = response.getHeaders("hello").iterator(); + assertEquals("world1", headers.next()); + assertEquals("world2", headers.next()); + assertEquals(5000, response.getHttpStatusCode()); } @Test @@ -149,26 +137,21 @@ public class UriUtilsTest extends Servle .setHttpStatusCode(5000) .addHeader("hello", "world1") .addHeader("hello", "world2") - .addHeader("hello\\u2297", "bad header") + .addHeader("hello\u2297", "bad header") .addHeader("Content-length", "10") .addHeader("vary", "1") .create(); - HttpServletResponse response = mock(HttpServletResponse.class); - - response.setStatus(5000); - EasyMock.expectLastCall().once(); - - response.setHeader("hello", "world1"); - EasyMock.expectLastCall().once(); - response.setHeader("hello", "world2"); - EasyMock.expectLastCall().once(); - + + HttpResponseBuilder builder = new HttpResponseBuilder(); - replay(); - UriUtils.copyResponseHeadersAndStatusCode(resp, response, false, true, + UriUtils.copyResponseHeadersAndStatusCode(resp, builder, false, true, UriUtils.DisallowedHeaders.OUTPUT_TRANSFER_DIRECTIVES, UriUtils.DisallowedHeaders.CACHING_DIRECTIVES); - verify(); + + HttpResponse response = builder.create(); + assertEquals(2, response.getHeaders().size()); + assertEquals("world2", response.getHeader("hello")); + assertEquals(5000, response.getHttpStatusCode()); } @Test @@ -177,26 +160,21 @@ public class UriUtilsTest extends Servle .setHttpStatusCode(500) .addHeader("hello", "world1") .addHeader("hello", "world2") - .addHeader("hello\\u2297", "bad header") + .addHeader("hello\u2297", "bad header") .addHeader("Content-length", "10") .addHeader("vary", "1") .create(); - HttpServletResponse response = mock(HttpServletResponse.class); - response.setStatus(502); - EasyMock.expectLastCall().once(); + HttpResponseBuilder builder = new HttpResponseBuilder(); - response.setHeader("hello", "world1"); - EasyMock.expectLastCall().once(); - response.setHeader("hello", "world2"); - EasyMock.expectLastCall().once(); - - - replay(); - UriUtils.copyResponseHeadersAndStatusCode(resp, response, true, true, + UriUtils.copyResponseHeadersAndStatusCode(resp, builder, true, true, UriUtils.DisallowedHeaders.OUTPUT_TRANSFER_DIRECTIVES, UriUtils.DisallowedHeaders.CACHING_DIRECTIVES); - verify(); + + HttpResponse response = builder.create(); + assertEquals(2, response.getHeaders().size()); + assertEquals("world2", response.getHeader("hello")); + assertEquals(502, response.getHttpStatusCode()); } @Test @@ -205,45 +183,37 @@ public class UriUtilsTest extends Servle .setHttpStatusCode(500) .addHeader("hello", "world1") .addHeader("hello", "world2") - .addHeader("hello\\u2297", "bad header") + .addHeader("hello\u2297", "bad header") .addHeader("Content-length", "10") .addHeader("vary", "1") .create(); - HttpServletResponse response = mock(HttpServletResponse.class); - - response.setStatus(500); - EasyMock.expectLastCall().once(); - response.setHeader("hello", "world1"); - EasyMock.expectLastCall().once(); - response.setHeader("hello", "world2"); - EasyMock.expectLastCall().once(); + HttpResponseBuilder builder = new HttpResponseBuilder(); - - replay(); - UriUtils.copyResponseHeadersAndStatusCode(resp, response, false, true, + UriUtils.copyResponseHeadersAndStatusCode(resp, builder, false, true, UriUtils.DisallowedHeaders.OUTPUT_TRANSFER_DIRECTIVES, UriUtils.DisallowedHeaders.CACHING_DIRECTIVES); - verify(); + + HttpResponse response = builder.create(); + assertEquals(2, response.getHeaders().size()); + assertEquals("world2", response.getHeader("hello")); + assertEquals(500, response.getHttpStatusCode()); } @Test public void testCopyRequestHeaders() throws Exception { - HttpServletRequest request = mock(HttpServletRequest.class); + HttpRequest origRequest = new HttpRequest(Uri.parse("http://www.example.org/data.html")); - EasyMock.expect(request.getHeaderNames()) - .andReturn(makeEnumeration("h1", "h2", "hello\\u2297", - "unchanged_header", "Content-Length")); - EasyMock.expect(request.getHeaders("h1")) - .andReturn(makeEnumeration("v1", "v2")); - EasyMock.expect(request.getHeaders("h2")) - .andReturn(makeEnumeration("v3", "v4")); - EasyMock.expect(request.getHeaders("hello\\u2297")) - .andReturn(makeEnumeration("v5", "v6")); - EasyMock.expect(request.getHeaders("unchanged_header")) - .andReturn(makeEnumeration()); - EasyMock.expect(request.getHeaders("Content-Length")) - .andReturn(makeEnumeration("50", "100")); + Map<String, List<String>> addedHeaders = + ImmutableMap.<String, List<String>>builder() + .put("h1", ImmutableList.of("v1", "v2")) + .put("h2", ImmutableList.of("v3", "v4")) + .put("hello\u2297", ImmutableList.of("v5", "v6")) + .put("unchanged_header", ImmutableList.<String>of()) + .put("Content-Length", ImmutableList.of("50", "100")) + .build(); + + origRequest.addAllHeaders(addedHeaders); HttpRequest req = new HttpRequest(Uri.parse( "http://www.example.org/data.html")); @@ -252,18 +222,16 @@ public class UriUtilsTest extends Servle req.addHeader("Content-Length", "10"); req.addHeader("unchanged_header", "original_value"); - replay(); - UriUtils.copyRequestHeaders(request, req, + UriUtils.copyRequestHeaders(origRequest, req, UriUtils.DisallowedHeaders.POST_INCOMPATIBLE_DIRECTIVES); - verify(); Map<String, List<String>> headers = ImmutableMap.<String, List<String>>builder() .put("h1", ImmutableList.of("v1", "v2")) .put("h2", ImmutableList.of("v3", "v4")) - .put("hello\\u2297", ImmutableList.of("v5", "v6")) .put("unchanged_header", ImmutableList.of("original_value")) .put("Content-Length", ImmutableList.of("10")) + .put(HttpRequest.DOS_PREVENTION_HEADER, ImmutableList.of("on")) .build(); assertEquals(headers, req.getHeaders()); @@ -271,34 +239,16 @@ public class UriUtilsTest extends Servle @Test public void testCopyRequestData() throws Exception { - HttpServletRequest request = mock(HttpServletRequest.class); - - expect(request.getMethod()).andReturn("Post").anyTimes(); - - final String data = "hello world"; - ServletInputStream inputStream = mock(ServletInputStream.class); - expect(request.getInputStream()).andReturn(inputStream); - expect(inputStream.read((byte[]) EasyMock.anyObject())) - .andAnswer(new IAnswer<Integer>() { - public Integer answer() throws Throwable { - byte[] byteArray = (byte[]) EasyMock.getCurrentArguments()[0]; - System.arraycopy(data.getBytes(), 0, byteArray, 0, data.length()); - return data.length(); - } - }); - expect(inputStream.read((byte[]) EasyMock.anyObject())) - .andAnswer(new IAnswer<Integer>() { - public Integer answer() throws Throwable { - return -1; - } - }); - + HttpRequest origRequest = new HttpRequest(Uri.parse("http://www.example.com")); + origRequest.setMethod("Post"); + + String data = "hello world"; + origRequest.setPostBody(data.getBytes()); + HttpRequest req = new HttpRequest(Uri.parse( "http://www.example.org/data.html")); - replay(); - UriUtils.copyRequestData(request, req); - verify(); + UriUtils.copyRequestData(origRequest, req); assertEquals(data, req.getPostBodyAsString()); }
