/*
* 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.easymock.EasyMock.expect;
import org.apache.shindig.common.ContainerConfig;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.gadgets.GadgetException;
import org.apache.shindig.gadgets.http.HttpResponse;
import org.apache.shindig.gadgets.http.HttpResponseBuilder;
import com.google.common.collect.Maps;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Tests for ProxyBase.
*/
public class ProxyBaseTest extends ServletTestFixture {
private final ProxyBase proxy = new ProxyBase() {
@Override
public void fetch(HttpServletRequest request, HttpServletResponse response) {
// Nothing.
}
};
public void testValidateUrlNoPath() throws Exception {
Uri url = proxy.validateUrl("http://www.example.com");
assertEquals("http", url.getScheme());
assertEquals("www.example.com", url.getAuthority());
assertEquals("/", url.getPath());
assertNull(url.getQuery());
assertNull(url.getFragment());
}
public void testValidateUrlHttps() throws Exception {
Uri url = proxy.validateUrl("https://www.example.com");
assertEquals("https", url.getScheme());
assertEquals("www.example.com", url.getAuthority());
assertEquals("/", url.getPath());
assertNull(url.getQuery());
assertNull(url.getFragment());
}
public void testValidateUrlWithPath() throws Exception {
Uri url = proxy.validateUrl("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());
}
public void testValidateUrlWithPort() throws Exception {
Uri url = proxy.validateUrl("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());
}
public void testValidateUrlWithEncodedPath() throws Exception {
Uri url = proxy.validateUrl("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());
}
public void testValidateUrlWithEncodedQuery() throws Exception {
Uri url = proxy.validateUrl("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());
}
public void testValidateUrlWithNoPathAndEncodedQuery() throws Exception {
Uri url = proxy.validateUrl("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());
}
public void testValidateUrlNullInput() {
try {
proxy.validateUrl(null);
fail("Should have thrown");
} catch (GadgetException e) {
// good
}
}
public void testValidateUrlBadInput() {
try {
proxy.validateUrl("%$#%#$%#$%");
} catch (GadgetException e) {
// good
}
}
public void testValidateUrlBadProtocol() {
try {
proxy.validateUrl("gopher://foo");
} catch (GadgetException e) {
// good
}
}
public void testSetResponseHeaders() {
HttpResponse results = new HttpResponseBuilder().create();
replay();
proxy.setResponseHeaders(request, recorder, results);
// Just verify that they were set. Specific values are configurable.
assertNotNull("Expires header not set", recorder.getHeader("Expires"));
assertNotNull("Cache-Control header not set", recorder.getHeader("Cache-Control"));
assertEquals("attachment;filename=p.txt", recorder.getHeader("Content-Disposition"));
}
public void testSetResponseHeadersForFlash() {
HttpResponse results = new HttpResponseBuilder()
.setHeader("Content-Type", "application/x-shockwave-flash")
.create();
replay();
proxy.setResponseHeaders(request, recorder, results);
// Just verify that they were set. Specific values are configurable.
assertNotNull("Expires header not set", recorder.getHeader("Expires"));
assertNotNull("Cache-Control header not set", recorder.getHeader("Cache-Control"));
assertNull("Content-Disposition header set for flash",
recorder.getHeader("Content-Disposition"));
}
public void testSetResponseHeadersNoCache() {
Map<String, List<String>> headers = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
headers.put("Pragma", Arrays.asList("no-cache"));
HttpResponse results = new HttpResponseBuilder()
.addHeader("Pragma", "no-cache")
.create();
replay();
proxy.setResponseHeaders(request, recorder, results);
// Just verify that they were set. Specific values are configurable.
assertNotNull("Expires header not set", recorder.getHeader("Expires"));
assertEquals("no-cache", recorder.getHeader("Pragma"));
assertEquals("no-cache", recorder.getHeader("Cache-Control"));
assertEquals("attachment;filename=p.txt", recorder.getHeader("Content-Disposition"));
}
public void testSetResponseHeadersForceParam() {
HttpResponse results = new HttpResponseBuilder().create();
expect(request.getParameter(ProxyBase.REFRESH_PARAM)).andReturn("30").anyTimes();
replay();
proxy.setResponseHeaders(request, recorder, results);
checkCacheControlHeaders(30, false);
assertEquals("attachment;filename=p.txt", recorder.getHeader("Content-Disposition"));
}
public void testGetParameter() {
expect(request.getParameter("foo")).andReturn("bar");
replay();
assertEquals("bar", proxy.getParameter(request, "foo", "not foo"));
}
public void testGetParameterWithNullValue() {
expect(request.getParameter("foo")).andReturn(null);
replay();
assertEquals("not foo", proxy.getParameter(request, "foo", "not foo"));
}
public void testGetContainerWithContainer() {
expect(request.getParameter(ProxyBase.CONTAINER_PARAM)).andReturn("bar");
replay();
assertEquals("bar", proxy.getContainer(request));
}
public void testGetContainerWithSynd() {
expect(request.getParameter(ProxyBase.CONTAINER_PARAM)).andReturn(null);
expect(request.getParameter(ProxyBase.SYND_PARAM)).andReturn("syndtainer");
replay();
assertEquals("syndtainer", proxy.getContainer(request));
}
public void testGetContainerNoParam() {
expect(request.getParameter(ProxyBase.CONTAINER_PARAM)).andReturn(null);
expect(request.getParameter(ProxyBase.SYND_PARAM)).andReturn(null);
replay();
assertEquals(ContainerConfig.DEFAULT_CONTAINER, proxy.getContainer(request));
}
}