/*
* Copyright (c) 2012 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.common.base.Charsets;
import junit.framework.TestCase;
/**
* Tests for the {@link HttpMediaType} class.
*
* @author Matthias Linder (mlinder)
* @since 1.10
*/
public class HttpMediaTypeTest extends TestCase {
public void testBuild() {
HttpMediaType m = new HttpMediaType("main", "sub");
assertEquals("main/sub", m.build());
}
public void testBuild_star() {
HttpMediaType m = new HttpMediaType("*", "*");
assertEquals("*/*", m.build());
}
public void testBuild_parameters() {
HttpMediaType m = new HttpMediaType("main", "sub");
m.setParameter("bbb", ";/ ");
m.setParameter("aaa", "1");
assertEquals("main/sub; aaa=1; bbb=\";/ \"", m.build());
}
public void testBuild_json() {
HttpMediaType m = new HttpMediaType("application/json").setCharsetParameter(Charsets.UTF_8);
assertEquals("application/json; charset=UTF-8", m.build());
}
public void testBuild_multipartSpec() {
HttpMediaType m = new HttpMediaType("main", "sub");
m.setParameter("bbb", "foo=/bar");
assertEquals("main/sub; bbb=\"foo=/bar\"", m.build());
}
public void testBuild_parametersCasing() {
HttpMediaType m = new HttpMediaType("main", "sub");
m.setParameter("foo", "FooBar");
assertEquals("main/sub; foo=FooBar", m.build());
}
public void testFromString() {
HttpMediaType m = new HttpMediaType("main/sub");
assertEquals("main", m.getType());
assertEquals("sub", m.getSubType());
}
public void testFromString_star() {
HttpMediaType m = new HttpMediaType("text/*");
assertEquals("text", m.getType());
assertEquals("*", m.getSubType());
}
public void testFromString_null() {
try {
new HttpMediaType(null);
fail("Method did not NullPointerException");
} catch (NullPointerException expected) {}
}
public void testFromString_multipartSpec() {
// Values allowed by the spec: http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
String value = "f00'()+_,-./:=?bar";
HttpMediaType m = new HttpMediaType("text/plain; boundary=" + value + "; foo=bar");
assertEquals(value, m.getParameter("boundary"));
assertEquals("bar", m.getParameter("foo"));
}
public void testFromString_full() {
HttpMediaType m = new HttpMediaType("text/plain; charset=utf-8; foo=\"foo; =bar\"");
assertEquals("text", m.getType());
assertEquals("plain", m.getSubType());
assertEquals("utf-8", m.getParameter("charset"));
assertEquals("foo; =bar", m.getParameter("foo"));
assertEquals(2, m.getParameters().size());
}
public void testFromString_case() {
HttpMediaType m = new HttpMediaType("text/plain; Foo=Bar");
assertEquals("Bar", m.getParameter("fOO"));
}
public void testSetMainType() {
assertEquals("foo", new HttpMediaType("text", "plain").setType("foo").getType());
}
public void testSetMainType_invalid() {
try {
new HttpMediaType("text", "plain").setType("foo/bar");
fail("Method did not throw IllegalArgumentException");
} catch (IllegalArgumentException expected) {}
}
public void testSetSubType() {
assertEquals("foo", new HttpMediaType("text", "plain").setSubType("foo").getSubType());
}
public void testSetSubType_invalid() {
try {
new HttpMediaType("text", "plain").setSubType("foo/bar");
fail("Method did not throw IllegalArgumentException");
} catch (IllegalArgumentException expected) {}
}
public void testSetParameter_casing() {
HttpMediaType mt = new HttpMediaType("text", "plain");
mt.setParameter("Foo", "Bar");
assertEquals("Bar", mt.getParameter("FOO"));
}
private boolean containsInvalidChar(String str) {
try {
new HttpMediaType("text", "plain").setSubType(str);
return false;
} catch (IllegalArgumentException expected) {
return true;
}
}
private void assertFullSerialization(String str) {
assertEquals(str, new HttpMediaType(str).build());
}
public void testFullSerialization() {
assertFullSerialization("text/plain");
assertFullSerialization("text/plain; foo=bar");
assertFullSerialization("text/plain; bar=bar; foo=foo");
assertFullSerialization("text/plain; bar=\"Bar Bar\"; foo=Foo");
assertFullSerialization("text/*");
assertFullSerialization("*/*");
assertFullSerialization("text/*; charset=utf-8; foo=\"bar bar bar\"");
}
public void testInvalidCharsRegex() {
assertEquals(false, containsInvalidChar("foo"));
assertEquals(false, containsInvalidChar("X-Foo-Bar"));
assertEquals(true, containsInvalidChar("foo/bar"));
assertEquals(true, containsInvalidChar(" foo"));
assertEquals(true, containsInvalidChar("foo;bar"));
}
public void testCharset() {
HttpMediaType hmt = new HttpMediaType("foo/bar");
assertEquals(null, hmt.getCharsetParameter());
hmt.setCharsetParameter(Charsets.UTF_8);
assertEquals(Charsets.UTF_8.name(), hmt.getParameter("charset"));
assertEquals(Charsets.UTF_8, hmt.getCharsetParameter());
}
public void testEqualsIgnoreParameters() {
assertEquals(true, new HttpMediaType("foo/bar").equalsIgnoreParameters(new HttpMediaType("Foo/bar")));
assertEquals(true, new HttpMediaType("foo/bar").equalsIgnoreParameters(
new HttpMediaType("foo/bar; charset=utf-8")));
assertEquals(false, new HttpMediaType("foo/bar").equalsIgnoreParameters(new HttpMediaType("bar/foo")));
assertEquals(false, new HttpMediaType("foo/bar").equalsIgnoreParameters(null));
}
public void testEqualsIgnoreParameters_static() {
assertEquals(true, HttpMediaType.equalsIgnoreParameters(null, null));
assertEquals(false, HttpMediaType.equalsIgnoreParameters(null, "foo/bar"));
assertEquals(true, HttpMediaType.equalsIgnoreParameters("foo/bar", "foo/bar"));
assertEquals(true, HttpMediaType.equalsIgnoreParameters("foo/bar; a=c", "foo/bar; b=d"));
}
public void testEquals() {
assertEquals(true, new HttpMediaType("foo/bar").equals(new HttpMediaType("foo/bar")));
assertEquals(true, new HttpMediaType("foo/bar; a=c").equals(new HttpMediaType("foo/bar; a=c")));
assertEquals(false, new HttpMediaType("foo/bar; bar=bar").equals(new HttpMediaType("foo/bar")));
assertEquals(false, new HttpMediaType("foo/bar").equals(null));
assertEquals(false, new HttpMediaType("foo/bar").equals(new Integer(5)));
}
}