/*
* Copyright (c) 2010 Google Inc.
*
* 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.google.api.client.http;
import com.google.api.client.http.HttpRequestTest.E;
import com.google.api.client.testing.http.MockLowLevelHttpRequest;
import com.google.api.client.testing.http.MockLowLevelHttpResponse;
import com.google.api.client.util.Key;
import com.google.common.collect.ImmutableList;
import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.List;
/**
* Tests {@link HttpHeaders}.
*
* @author Yaniv Inbar
*/
public class HttpHeadersTest extends TestCase {
public HttpHeadersTest() {
}
public HttpHeadersTest(String name) {
super(name);
}
public void testBasicAuthentication() {
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuthentication(
BasicAuthenticationTest.USERNAME, BasicAuthenticationTest.PASSWORD);
assertEquals(BasicAuthenticationTest.AUTH_HEADER, headers.getAuthorization());
}
public static class MyHeaders extends HttpHeaders {
@Key
public String foo;
@Key
Object objNum;
@Key
Object objList;
@Key
long someLong;
@Key
List<String> list;
@Key
String[] r;
@Key
E value;
@Key
E otherValue;
}
public void testSerializeHeaders() throws Exception {
// custom headers
MyHeaders myHeaders = new MyHeaders();
myHeaders.foo = "bar";
myHeaders.objNum = 5;
myHeaders.list = ImmutableList.of("a", "b", "c");
myHeaders.objList = ImmutableList.of("a2", "b2", "c2");
myHeaders.r = new String[] {"a1", "a2"};
myHeaders.setAcceptEncoding(null);
myHeaders.setContentLength(Long.MAX_VALUE);
myHeaders.setUserAgent("foo");
myHeaders.set("a", "b");
myHeaders.value = E.VALUE;
myHeaders.otherValue = E.OTHER_VALUE;
final MockLowLevelHttpRequest lowLevelRequest = new MockLowLevelHttpRequest();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(outputStream);
HttpHeaders.serializeHeaders(myHeaders, null, null, null, lowLevelRequest, null);
// check headers in the lowLevelRequest
assertEquals(ImmutableList.of("bar"), lowLevelRequest.getHeaderValues("foo"));
assertEquals(ImmutableList.of("a", "b", "c"), lowLevelRequest.getHeaderValues("list"));
assertEquals(ImmutableList.of("a2", "b2", "c2"), lowLevelRequest.getHeaderValues("objlist"));
assertEquals(ImmutableList.of("a1", "a2"), lowLevelRequest.getHeaderValues("r"));
assertTrue(lowLevelRequest.getHeaderValues("accept-encoding").isEmpty());
assertEquals(ImmutableList.of("foo"), lowLevelRequest.getHeaderValues("user-agent"));
assertEquals(ImmutableList.of("b"), lowLevelRequest.getHeaderValues("a"));
assertEquals(ImmutableList.of("VALUE"), lowLevelRequest.getHeaderValues("value"));
assertEquals(ImmutableList.of("other"), lowLevelRequest.getHeaderValues("othervalue"));
assertEquals(ImmutableList.of(String.valueOf(Long.MAX_VALUE)),
lowLevelRequest.getHeaderValues("content-length"));
HttpHeaders.serializeHeadersForMultipartRequests(myHeaders, null, null, writer);
// check headers in the output stream
StringBuilder expectedOutput = new StringBuilder();
expectedOutput.append("Content-Length: " + String.valueOf(Long.MAX_VALUE) + "\r\n");
expectedOutput.append("foo: bar\r\n");
expectedOutput.append("list: a\r\n");
expectedOutput.append("list: b\r\n");
expectedOutput.append("list: c\r\n");
expectedOutput.append("objList: a2\r\n");
expectedOutput.append("objList: b2\r\n");
expectedOutput.append("objList: c2\r\n");
expectedOutput.append("objNum: 5\r\n");
expectedOutput.append("otherValue: other\r\n");
expectedOutput.append("r: a1\r\n");
expectedOutput.append("r: a2\r\n");
expectedOutput.append("someLong: 0\r\n");
expectedOutput.append("User-Agent: foo\r\n");
expectedOutput.append("value: VALUE\r\n");
expectedOutput.append("a: b\r\n");
assertEquals(expectedOutput.toString(), outputStream.toString());
}
@SuppressWarnings("unchecked")
public void testFromHttpHeaders() {
HttpHeaders rawHeaders = new HttpHeaders();
rawHeaders.setContentLength(Long.MAX_VALUE);
rawHeaders.setContentType("foo/bar");
rawHeaders.setUserAgent("FooBar");
rawHeaders.set("foo", "bar");
rawHeaders.set("someLong", "5");
rawHeaders.set("list", ImmutableList.of("a", "b", "c"));
rawHeaders.set("objNum", "5");
rawHeaders.set("objList", ImmutableList.of("a2", "b2", "c2"));
rawHeaders.set("r", new String[] {"a1", "a2"});
rawHeaders.set("a", "b");
rawHeaders.set("value", E.VALUE);
rawHeaders.set("otherValue", E.OTHER_VALUE);
MyHeaders myHeaders = new MyHeaders();
myHeaders.fromHttpHeaders(rawHeaders);
assertEquals(Long.MAX_VALUE, myHeaders.getContentLength().longValue());
assertEquals("foo/bar", myHeaders.getContentType());
assertEquals("FooBar", myHeaders.getUserAgent());
assertEquals("bar", myHeaders.foo);
assertEquals(5, myHeaders.someLong);
assertEquals(ImmutableList.of("5"), myHeaders.objNum);
assertEquals(ImmutableList.of("a", "b", "c"), myHeaders.list);
assertEquals(ImmutableList.of("a2", "b2", "c2"), myHeaders.objList);
assertEquals(ImmutableList.of("a1", "a2"), ImmutableList.copyOf(myHeaders.r));
assertEquals(ImmutableList.of("b"), myHeaders.get("a"));
assertEquals(E.VALUE, myHeaders.value);
assertEquals(E.OTHER_VALUE, myHeaders.otherValue);
}
private static final String AUTHORIZATION_HEADERS =
"Accept-Encoding: gzip\r\nAuthorization: Foo\r\nAuthorization: Bar\r\n";
public void testAuthorizationHeader() throws IOException {
// serialization
HttpHeaders headers = new HttpHeaders();
headers.setAuthorization(Arrays.asList("Foo", "Bar"));
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(outputStream);
HttpHeaders.serializeHeadersForMultipartRequests(headers, null, null, writer);
assertEquals(AUTHORIZATION_HEADERS, outputStream.toString());
// parsing
MockLowLevelHttpResponse response = new MockLowLevelHttpResponse();
response.addHeader("Authorization", "Foo");
response.addHeader("Authorization", "Bar");
headers = new HttpHeaders();
headers.fromHttpResponse(response, null);
Object authHeader = headers.get("Authorization");
assertTrue(authHeader.toString(), ImmutableList.of("Foo", "Bar").equals(authHeader));
}
public void testHeaderStringValues() {
// custom headers
MyHeaders myHeaders = new MyHeaders();
myHeaders.foo = "bar";
myHeaders.objNum = 5;
myHeaders.list = ImmutableList.of("a", "b", "c");
myHeaders.objList = ImmutableList.of("a2", "b2", "c2");
myHeaders.r = new String[] {"a1", "a2"};
myHeaders.setAcceptEncoding(null);
myHeaders.setContentLength(Long.MAX_VALUE);
myHeaders.setUserAgent("foo");
myHeaders.set("a", "b");
myHeaders.value = E.VALUE;
myHeaders.otherValue = E.OTHER_VALUE;
// check first header string values
assertEquals("bar", myHeaders.getFirstHeaderStringValue("foo"));
assertEquals("a", myHeaders.getFirstHeaderStringValue("list"));
assertEquals("a2", myHeaders.getFirstHeaderStringValue("objlist"));
assertEquals("a1", myHeaders.getFirstHeaderStringValue("r"));
assertNull(myHeaders.getFirstHeaderStringValue("accept-encoding"));
assertEquals("foo", myHeaders.getFirstHeaderStringValue("user-agent"));
assertEquals("b", myHeaders.getFirstHeaderStringValue("a"));
assertEquals("VALUE", myHeaders.getFirstHeaderStringValue("value"));
assertEquals("other", myHeaders.getFirstHeaderStringValue("othervalue"));
assertEquals(
String.valueOf(Long.MAX_VALUE), myHeaders.getFirstHeaderStringValue("content-length"));
// check header string values
assertEquals(ImmutableList.of("bar"), myHeaders.getHeaderStringValues("foo"));
assertEquals(ImmutableList.of("a", "b", "c"), myHeaders.getHeaderStringValues("list"));
assertEquals(ImmutableList.of("a2", "b2", "c2"), myHeaders.getHeaderStringValues("objlist"));
assertEquals(ImmutableList.of("a1", "a2"), myHeaders.getHeaderStringValues("r"));
assertTrue(myHeaders.getHeaderStringValues("accept-encoding").isEmpty());
assertEquals(ImmutableList.of("foo"), myHeaders.getHeaderStringValues("user-agent"));
assertEquals(ImmutableList.of("b"), myHeaders.getHeaderStringValues("a"));
assertEquals(ImmutableList.of("VALUE"), myHeaders.getHeaderStringValues("value"));
assertEquals(ImmutableList.of("other"), myHeaders.getHeaderStringValues("othervalue"));
assertEquals(ImmutableList.of(String.valueOf(Long.MAX_VALUE)),
myHeaders.getHeaderStringValues("content-length"));
}
public static class SlugHeaders extends HttpHeaders {
@Key("Slug")
String slug;
}
public void testParseAge() throws Exception {
MockLowLevelHttpResponse httpResponse = new MockLowLevelHttpResponse().setHeaderNames(
Arrays.asList("Age")).setHeaderValues(Arrays.asList("3456"));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.fromHttpResponse(httpResponse, null);
assertEquals(3456L, httpHeaders.getAge().longValue());
}
public void testFromHttpResponse_normalFlow() throws Exception {
MockLowLevelHttpResponse httpResponse = new MockLowLevelHttpResponse().setHeaderNames(
Arrays.asList("Content-Type", "Slug"))
.setHeaderValues(Arrays.asList("foo/bar", "123456789"));
// Test the normal HttpHeaders class
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.fromHttpResponse(httpResponse, null);
assertEquals("foo/bar", httpHeaders.getContentType());
assertEquals(ImmutableList.of("123456789"), httpHeaders.get("Slug"));
// Test creating a SlugHeaders obj using the HttpHeaders' data
SlugHeaders slugHeaders = new SlugHeaders();
slugHeaders.fromHttpHeaders(httpHeaders);
assertEquals("foo/bar", slugHeaders.getContentType());
assertEquals("123456789", slugHeaders.slug);
}
public void testFromHttpResponse_doubleConvert() throws Exception {
MockLowLevelHttpResponse httpResponse = new MockLowLevelHttpResponse().setHeaderNames(
Arrays.asList("Content-Type", "Slug"))
.setHeaderValues(Arrays.asList("foo/bar", "123456789"));
// Test the normal HttpHeaders class
SlugHeaders slugHeaders = new SlugHeaders();
slugHeaders.fromHttpResponse(httpResponse, null);
assertEquals("foo/bar", slugHeaders.getContentType());
assertEquals("123456789", slugHeaders.slug);
// Test creating a HttpHeaders obj using the HttpHeaders' data
SlugHeaders slugHeaders2 = new SlugHeaders();
slugHeaders2.fromHttpHeaders(slugHeaders);
assertEquals("foo/bar", slugHeaders2.getContentType());
assertEquals("123456789", slugHeaders2.slug);
}
public void testFromHttpResponse_clearOldValue() throws Exception {
HttpHeaders headers = new HttpHeaders();
headers.put("Foo", "oldValue");
headers.fromHttpResponse(new MockLowLevelHttpResponse().setHeaderNames(Arrays.asList("Foo"))
.setHeaderValues(Arrays.asList("newvalue")), null);
assertEquals(Arrays.asList("newvalue"), headers.get("Foo"));
}
public static class V extends HttpHeaders {
@Key
Void v;
@Key
String s;
}
public void testFromHttpResponse_void(String value) throws Exception {
MockLowLevelHttpResponse httpResponse = new MockLowLevelHttpResponse().setHeaderNames(
Arrays.asList("v", "v", "s")).setHeaderValues(Arrays.asList("ignore", "ignore2", "svalue"));
V v = new V();
v.fromHttpResponse(httpResponse, null);
assertNull(v.v);
assertEquals("svalue", v.s);
}
}