blob: cec3cdd28ccea47af515fa3ba072dd46b69224cf [file] [log] [blame]
/*
* Copyright (C) 2011 The Guava Authors
*
* 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.common.net;
import static com.google.common.base.Charsets.UTF_16;
import static com.google.common.base.Charsets.UTF_8;
import static com.google.common.net.MediaType.ANY_APPLICATION_TYPE;
import static com.google.common.net.MediaType.ANY_AUDIO_TYPE;
import static com.google.common.net.MediaType.ANY_IMAGE_TYPE;
import static com.google.common.net.MediaType.ANY_TEXT_TYPE;
import static com.google.common.net.MediaType.ANY_TYPE;
import static com.google.common.net.MediaType.ANY_VIDEO_TYPE;
import static com.google.common.net.MediaType.HTML_UTF_8;
import static com.google.common.net.MediaType.JPEG;
import static com.google.common.net.MediaType.PLAIN_TEXT_UTF_8;
import static com.google.common.truth.Truth.assertThat;
import static java.lang.reflect.Modifier.isFinal;
import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isStatic;
import static java.util.Arrays.asList;
import com.google.common.annotations.GwtCompatible;
import com.google.common.annotations.GwtIncompatible;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.testing.EqualsTester;
import com.google.common.testing.NullPointerTester;
import java.lang.reflect.Field;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
import java.util.Arrays;
import junit.framework.TestCase;
/**
* Tests for {@link MediaType}.
*
* @author Gregory Kick
*/
@GwtCompatible(emulated = true)
public class MediaTypeTest extends TestCase {
@GwtIncompatible // reflection
public void testParse_useConstants() throws Exception {
for (MediaType constant : getConstants()) {
assertSame(constant, MediaType.parse(constant.toString()));
}
}
@GwtIncompatible // reflection
public void testCreate_useConstants() throws Exception {
for (MediaType constant : getConstants()) {
assertSame(
constant,
MediaType.create(constant.type(), constant.subtype())
.withParameters(constant.parameters()));
}
}
@GwtIncompatible // reflection
public void testConstants_charset() throws Exception {
for (Field field : getConstantFields()) {
Optional<Charset> charset = ((MediaType) field.get(null)).charset();
if (field.getName().endsWith("_UTF_8")) {
assertThat(charset).hasValue(UTF_8);
} else {
assertThat(charset).isAbsent();
}
}
}
@GwtIncompatible // reflection
public void testConstants_areUnique() {
assertThat(getConstants()).containsNoDuplicates();
}
@GwtIncompatible // reflection
private static FluentIterable<Field> getConstantFields() {
return FluentIterable.from(asList(MediaType.class.getDeclaredFields()))
.filter(
new Predicate<Field>() {
@Override
public boolean apply(Field input) {
int modifiers = input.getModifiers();
return isPublic(modifiers)
&& isStatic(modifiers)
&& isFinal(modifiers)
&& MediaType.class.equals(input.getType());
}
});
}
@GwtIncompatible // reflection
private static FluentIterable<MediaType> getConstants() {
return getConstantFields()
.transform(
new Function<Field, MediaType>() {
@Override
public MediaType apply(Field input) {
try {
return (MediaType) input.get(null);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
public void testCreate_invalidType() {
try {
MediaType.create("te><t", "plaintext");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testCreate_invalidSubtype() {
try {
MediaType.create("text", "pl@intext");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testCreate_wildcardTypeDeclaredSubtype() {
try {
MediaType.create("*", "text");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testCreate_nonAsciiType() {
try {
MediaType.create("…", "a");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testCreate_nonAsciiSubtype() {
try {
MediaType.create("a", "…");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testCreate_emptyType() {
try {
MediaType.create("", "a");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testCreate_emptySubtype() {
try {
MediaType.create("a", "");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testCreateApplicationType() {
MediaType newType = MediaType.createApplicationType("yams");
assertEquals("application", newType.type());
assertEquals("yams", newType.subtype());
}
public void testCreateAudioType() {
MediaType newType = MediaType.createAudioType("yams");
assertEquals("audio", newType.type());
assertEquals("yams", newType.subtype());
}
public void testCreateFontType() {
MediaType newType = MediaType.createFontType("yams");
assertEquals("font", newType.type());
assertEquals("yams", newType.subtype());
}
public void testCreateImageType() {
MediaType newType = MediaType.createImageType("yams");
assertEquals("image", newType.type());
assertEquals("yams", newType.subtype());
}
public void testCreateTextType() {
MediaType newType = MediaType.createTextType("yams");
assertEquals("text", newType.type());
assertEquals("yams", newType.subtype());
}
public void testCreateVideoType() {
MediaType newType = MediaType.createVideoType("yams");
assertEquals("video", newType.type());
assertEquals("yams", newType.subtype());
}
public void testGetType() {
assertEquals("text", MediaType.parse("text/plain").type());
assertEquals("application", MediaType.parse("application/atom+xml; charset=utf-8").type());
}
public void testGetSubtype() {
assertEquals("plain", MediaType.parse("text/plain").subtype());
assertEquals("atom+xml", MediaType.parse("application/atom+xml; charset=utf-8").subtype());
}
private static final ImmutableListMultimap<String, String> PARAMETERS =
ImmutableListMultimap.of("a", "1", "a", "2", "b", "3");
public void testGetParameters() {
assertEquals(ImmutableListMultimap.of(), MediaType.parse("text/plain").parameters());
assertEquals(
ImmutableListMultimap.of("charset", "utf-8"),
MediaType.parse("application/atom+xml; charset=utf-8").parameters());
assertEquals(PARAMETERS, MediaType.parse("application/atom+xml; a=1; a=2; b=3").parameters());
}
public void testWithoutParameters() {
assertSame(MediaType.parse("image/gif"), MediaType.parse("image/gif").withoutParameters());
assertEquals(
MediaType.parse("image/gif"), MediaType.parse("image/gif; foo=bar").withoutParameters());
}
public void testWithParameters() {
assertEquals(
MediaType.parse("text/plain; a=1; a=2; b=3"),
MediaType.parse("text/plain").withParameters(PARAMETERS));
assertEquals(
MediaType.parse("text/plain; a=1; a=2; b=3"),
MediaType.parse("text/plain; a=1; a=2; b=3").withParameters(PARAMETERS));
}
public void testWithParameters_invalidAttribute() {
MediaType mediaType = MediaType.parse("text/plain");
ImmutableListMultimap<String, String> parameters =
ImmutableListMultimap.of("a", "1", "@", "2", "b", "3");
try {
mediaType.withParameters(parameters);
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParameters_nonAsciiParameter() {
MediaType mediaType = MediaType.parse("text/plain");
ImmutableListMultimap<String, String> parameters = ImmutableListMultimap.of("…", "a");
try {
mediaType.withParameters(parameters);
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParameters_nonAsciiParameterValue() {
MediaType mediaType = MediaType.parse("text/plain");
ImmutableListMultimap<String, String> parameters = ImmutableListMultimap.of("a", "…");
try {
mediaType.withParameters(parameters);
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParameter() {
assertEquals(
MediaType.parse("text/plain; a=1"), MediaType.parse("text/plain").withParameter("a", "1"));
assertEquals(
MediaType.parse("text/plain; a=1"),
MediaType.parse("text/plain; a=1; a=2").withParameter("a", "1"));
assertEquals(
MediaType.parse("text/plain; a=3"),
MediaType.parse("text/plain; a=1; a=2").withParameter("a", "3"));
assertEquals(
MediaType.parse("text/plain; a=1; a=2; b=3"),
MediaType.parse("text/plain; a=1; a=2").withParameter("b", "3"));
}
public void testWithParameter_invalidAttribute() {
MediaType mediaType = MediaType.parse("text/plain");
try {
mediaType.withParameter("@", "2");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParameter_nonAsciiParameter() {
MediaType mediaType = MediaType.parse("text/plain");
try {
mediaType.withParameter("…", "a");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParameter_nonAsciiParameterValue() {
MediaType mediaType = MediaType.parse("text/plain");
try {
mediaType.withParameter("a", "…");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParameter_emptyParameter() {
MediaType mediaType = MediaType.parse("text/plain");
try {
mediaType.withParameter("", "a");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParametersIterable() {
assertEquals(
MediaType.parse("text/plain"),
MediaType.parse("text/plain; a=1; a=2").withParameters("a", ImmutableSet.<String>of()));
assertEquals(
MediaType.parse("text/plain; a=1"),
MediaType.parse("text/plain").withParameters("a", ImmutableSet.of("1")));
assertEquals(
MediaType.parse("text/plain; a=1"),
MediaType.parse("text/plain; a=1; a=2").withParameters("a", ImmutableSet.of("1")));
assertEquals(
MediaType.parse("text/plain; a=1; a=3"),
MediaType.parse("text/plain; a=1; a=2").withParameters("a", ImmutableSet.of("1", "3")));
assertEquals(
MediaType.parse("text/plain; a=1; a=2; b=3; b=4"),
MediaType.parse("text/plain; a=1; a=2").withParameters("b", ImmutableSet.of("3", "4")));
}
public void testWithParametersIterable_invalidAttribute() {
MediaType mediaType = MediaType.parse("text/plain");
try {
mediaType.withParameters("@", ImmutableSet.of("2"));
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParametersIterable_nonAsciiParameter() {
MediaType mediaType = MediaType.parse("text/plain");
try {
mediaType.withParameters("…", ImmutableSet.of("a"));
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParametersIterable_nonAsciiParameterValue() {
MediaType mediaType = MediaType.parse("text/plain");
try {
mediaType.withParameters("a", ImmutableSet.of("…"));
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testWithParametersIterable_nullValue() {
MediaType mediaType = MediaType.parse("text/plain");
try {
mediaType.withParameters("a", Arrays.asList((String) null));
fail();
} catch (NullPointerException expected) {
}
}
public void testWithCharset() {
assertEquals(
MediaType.parse("text/plain; charset=utf-8"),
MediaType.parse("text/plain").withCharset(UTF_8));
assertEquals(
MediaType.parse("text/plain; charset=utf-8"),
MediaType.parse("text/plain; charset=utf-16").withCharset(UTF_8));
}
public void testHasWildcard() {
assertFalse(PLAIN_TEXT_UTF_8.hasWildcard());
assertFalse(JPEG.hasWildcard());
assertTrue(ANY_TYPE.hasWildcard());
assertTrue(ANY_APPLICATION_TYPE.hasWildcard());
assertTrue(ANY_AUDIO_TYPE.hasWildcard());
assertTrue(ANY_IMAGE_TYPE.hasWildcard());
assertTrue(ANY_TEXT_TYPE.hasWildcard());
assertTrue(ANY_VIDEO_TYPE.hasWildcard());
}
public void testIs() {
assertTrue(PLAIN_TEXT_UTF_8.is(ANY_TYPE));
assertTrue(JPEG.is(ANY_TYPE));
assertTrue(ANY_TEXT_TYPE.is(ANY_TYPE));
assertTrue(PLAIN_TEXT_UTF_8.is(ANY_TEXT_TYPE));
assertTrue(PLAIN_TEXT_UTF_8.withoutParameters().is(ANY_TEXT_TYPE));
assertFalse(JPEG.is(ANY_TEXT_TYPE));
assertTrue(PLAIN_TEXT_UTF_8.is(PLAIN_TEXT_UTF_8));
assertTrue(PLAIN_TEXT_UTF_8.is(PLAIN_TEXT_UTF_8.withoutParameters()));
assertFalse(PLAIN_TEXT_UTF_8.withoutParameters().is(PLAIN_TEXT_UTF_8));
assertFalse(PLAIN_TEXT_UTF_8.is(HTML_UTF_8));
assertFalse(PLAIN_TEXT_UTF_8.withParameter("charset", "UTF-16").is(PLAIN_TEXT_UTF_8));
assertFalse(PLAIN_TEXT_UTF_8.is(PLAIN_TEXT_UTF_8.withParameter("charset", "UTF-16")));
}
public void testParse_empty() {
try {
MediaType.parse("");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testParse_badInput() {
try {
MediaType.parse("/");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("te<t/plain");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/pl@in");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain;");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; ");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; a");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; a=");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; a=@");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; a=\"@");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; a=1;");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; a=1; ");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; a=1; b");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; a=1; b=");
fail();
} catch (IllegalArgumentException expected) {
}
try {
MediaType.parse("text/plain; a=\u2025");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testGetCharset() {
assertThat(MediaType.parse("text/plain").charset()).isAbsent();
assertThat(MediaType.parse("text/plain; charset=utf-8").charset()).hasValue(UTF_8);
}
@GwtIncompatible // Non-UTF-8 Charset
public void testGetCharset_utf16() {
assertThat(MediaType.parse("text/plain; charset=utf-16").charset()).hasValue(UTF_16);
}
public void testGetCharset_tooMany() {
MediaType mediaType = MediaType.parse("text/plain; charset=utf-8; charset=utf-16");
try {
mediaType.charset();
fail();
} catch (IllegalStateException expected) {
}
}
public void testGetCharset_illegalCharset() {
MediaType mediaType = MediaType.parse("text/plain; charset=\"!@#$%^&*()\"");
try {
mediaType.charset();
fail();
} catch (IllegalCharsetNameException expected) {
}
}
public void testGetCharset_unsupportedCharset() {
MediaType mediaType = MediaType.parse("text/plain; charset=utf-wtf");
try {
mediaType.charset();
fail();
} catch (UnsupportedCharsetException expected) {
}
}
public void testEquals() {
new EqualsTester()
.addEqualityGroup(
MediaType.create("text", "plain"),
MediaType.create("TEXT", "PLAIN"),
MediaType.parse("text/plain"),
MediaType.parse("TEXT/PLAIN"),
MediaType.create("text", "plain").withParameter("a", "1").withoutParameters())
.addEqualityGroup(
MediaType.create("text", "plain").withCharset(UTF_8),
MediaType.create("text", "plain").withParameter("CHARSET", "UTF-8"),
MediaType.create("text", "plain")
.withParameters(ImmutableMultimap.of("charset", "utf-8")),
MediaType.parse("text/plain;charset=utf-8"),
MediaType.parse("text/plain; charset=utf-8"),
MediaType.parse("text/plain; charset=utf-8"),
MediaType.parse("text/plain; \tcharset=utf-8"),
MediaType.parse("text/plain; \r\n\tcharset=utf-8"),
MediaType.parse("text/plain; CHARSET=utf-8"),
MediaType.parse("text/plain; charset=\"utf-8\""),
MediaType.parse("text/plain; charset=\"\\u\\tf-\\8\""),
MediaType.parse("text/plain; charset=UTF-8"),
MediaType.parse("text/plain ; charset=utf-8"))
.addEqualityGroup(MediaType.parse("text/plain; charset=utf-8; charset=utf-8"))
.addEqualityGroup(
MediaType.create("text", "plain").withParameter("a", "value"),
MediaType.create("text", "plain").withParameter("A", "value"))
.addEqualityGroup(
MediaType.create("text", "plain").withParameter("a", "VALUE"),
MediaType.create("text", "plain").withParameter("A", "VALUE"))
.addEqualityGroup(
MediaType.create("text", "plain")
.withParameters(ImmutableListMultimap.of("a", "1", "a", "2")),
MediaType.create("text", "plain")
.withParameters(ImmutableListMultimap.of("a", "2", "a", "1")))
.addEqualityGroup(MediaType.create("text", "csv"))
.addEqualityGroup(MediaType.create("application", "atom+xml"))
.testEquals();
}
@GwtIncompatible // Non-UTF-8 Charset
public void testEquals_nonUtf8Charsets() {
new EqualsTester()
.addEqualityGroup(MediaType.create("text", "plain"))
.addEqualityGroup(MediaType.create("text", "plain").withCharset(UTF_8))
.addEqualityGroup(MediaType.create("text", "plain").withCharset(UTF_16))
.testEquals();
}
@GwtIncompatible // com.google.common.testing.NullPointerTester
public void testNullPointer() {
NullPointerTester tester = new NullPointerTester();
tester.testAllPublicConstructors(MediaType.class);
tester.testAllPublicStaticMethods(MediaType.class);
tester.testAllPublicInstanceMethods(MediaType.parse("text/plain"));
}
public void testToString() {
assertEquals("text/plain", MediaType.create("text", "plain").toString());
assertEquals(
"text/plain; something=\"cr@zy\"; something-else=\"crazy with spaces\";"
+ " and-another-thing=\"\"; normal-thing=foo",
MediaType.create("text", "plain")
.withParameter("something", "cr@zy")
.withParameter("something-else", "crazy with spaces")
.withParameter("and-another-thing", "")
.withParameter("normal-thing", "foo")
.toString());
}
}