blob: 093446e31314b447d30477956e93e21d32ff02a3 [file] [log] [blame]
// ***************************************************************************************************************************
// * 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.juneau.https;
import java.util.*;
import org.apache.juneau.http.*;
import org.apache.juneau.json.*;
import org.apache.juneau.testutils.*;
import org.junit.*;
import org.junit.runner.*;
import org.junit.runners.*;
/**
* Verifies that the Content-Type class handles matching correctly.
*/
@RunWith(Parameterized.class)
public class ContentTypeTest {
@Parameterized.Parameters
public static Collection<Object[]> getParameters() {
return Arrays.asList(new Object[][] {
// label, accept-header, media-types, expected-index
// Simple matches
{ "SimpleMatch-1", "text/json", "['text/json']", 0 },
{ "SimpleMatch-2", "text/json", "['text/json','text/foo']", 0 },
{ "SimpleMatch-3", "text/json", "['text/foo','text/json']", 1 },
// Simple no-matches
{ "SimpleNoMatch-1", "text/jsonx", "['text/json']", -1 },
{ "SimpleNoMatch-2", "text/jso", "['text/json']", -1 },
{ "SimpleNoMatch-3", "text/json", "['application/json']", -1 },
{ "SimpleNoMatch-4", "text/json", "[]", -1 },
{ "XmlAndRdf-1", "text/xml+rdf", "['text/xml','text/xml+rdf']", 1 },
{ "XmlAndRdf-2", "text/xml+rdf", "['text/xml+rdf','text/xml']", 0 },
// Fuzzy matches
{ "Fuzzy-1", "text/1+2", "['text/1+2']", 0 },
// Order of subtype parts shouldn't matter.
{ "Fuzzy-2", "text/2+1", "['text/1+2']", 0 },
// Should match if Accept has 'extra' subtypes.
// For example, "Accept: text/json+activity" should match against the "text/json" serializer.
{ "Fuzzy-3", "text/1+2", "['text/1']", 0 },
// Shouldn't match because the accept media type must be at least a subset of the real media type
// For example, "Accept: text/json" should not match against the "text/json+lax" serializer.
{ "Fuzzy-4", "text/1", "['text/1+2']", -1 },
{ "Fuzzy-5", "text/1+2", "['text/1','text/1+3']", 0 },
// "text/1+2" should be a better match than just "text/1"
{ "Fuzzy-6", "text/1+2", "['text/1','text/1+2','text/1+2+3']", 1 },
// Same as last, but mix up the order a bit.
{ "Fuzzy-7", "text/1+2", "['text/1+2+3','text/1','text/1+2']", 2 },
// Same as last, but mix up the order of the subtypes as well.
{ "Fuzzy-8", "text/1+2", "['text/3+2+1','text/1','text/2+1']", 2 },
{ "Fuzzy-9", "text/1+2+3+4", "['text/1+2','text/1+2+3']", 1 },
{ "Fuzzy-10", "text/1+2+3+4", "['text/1+2+3','text/1+2']", 0 },
{ "Fuzzy-11", "text/4+2+3+1", "['text/1+2+3','text/1+2']", 0 },
{ "Fuzzy-12", "text/4+2+3+1", "['text/1+2','text/1+2+3']", 1 },
});
}
private String label, contentType, mediaTypes;
private int expected;
public ContentTypeTest(String label, String contentType, String mediaTypes, int expected) {
this.label = label;
this.contentType = contentType;
this.mediaTypes = mediaTypes;
this.expected = expected;
}
@Test
public void test() throws Exception {
ContentType ct = ContentType.forString(this.contentType);
MediaType[] mt = JsonParser.DEFAULT.parse(mediaTypes, MediaType[].class);
int r = ct.findMatch(mt);
TestUtils.assertEquals(expected, r, "{0} failed", label);
}
}