// Copyright 2007 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.enterprise.connector.traversal;
import junit.framework.TestCase;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* Tests for the MimeTypeMap class.
*/
public class MimeTypeMapTest extends TestCase {
private String[] mimeTypes = {"foo", "bar/baz"};
Set<String> mimeTypesSet = ArrayAsSet(mimeTypes);
private MimeTypeMap testMap;
@Override
protected void setUp() throws Exception {
super.setUp();
testMap = new MimeTypeMap();
}
/** Test empty map returns the default unknown level for all. */
public void testEmptyMimeTypeMap() {
// Empty map should have all lookups return UnknownMimeType level.
assertEquals(1, testMap.mimeTypeSupportLevel("foo"));
assertEquals(1, testMap.mimeTypeSupportLevel("ibblefrix"));
assertEquals(1, testMap.mimeTypeSupportLevel(null));
}
/** Test setUnknownMimeTypeSupportLevel(). */
public void testSetUnknownMimeTypeSupportLevel() {
assertEquals(1, testMap.mimeTypeSupportLevel("foo"));
testMap.setUnknownMimeTypeSupportLevel(2);
assertEquals(2, testMap.mimeTypeSupportLevel("foo"));
}
/** Test initMap with null mime types set. */
public void testNullMimeTypesSet() {
// Adding a null set of mime types to empty map results in empty map.
// Empty map should have all lookups return UnknownMimeType level.
testMap.initMimeTypes(null, 5);
assertEquals(1, testMap.mimeTypeSupportLevel("foo"));
}
/** Test initMap with empty mime types set. */
public void testEmptyMimeTypesSet() {
// Adding an empty set of mime types to empty map results in empty map.
// Empty map should have all lookups return UnknownMimeType level.
testMap.initMimeTypes(new HashSet<String>(), 5);
assertEquals(1, testMap.mimeTypeSupportLevel("foo"));
}
/** Test setting a support level < 3 gets bumpted to 3. */
public void testSmallLevel() {
// Make sure lowest value does not drop to <= 0, as
// these are reserved for unsupported and excluded types.
// Attempts to generate a set of values anchored at 1 or 2
// should bump the anchor up to 3.
testMap.initMimeTypes(mimeTypesSet, 2);
assertEquals(3, testMap.mimeTypeSupportLevel("bar/baz"));
}
/** Test that all unsupported mimetypes return a rank of 0. */
public void testUnsupportedMimeTypes() {
testMap.setUnsupportedMimeTypes(mimeTypesSet);
assertEquals(0, testMap.mimeTypeSupportLevel("foo"));
assertEquals(0, testMap.mimeTypeSupportLevel("bar/baz"));
assertEquals(1, testMap.mimeTypeSupportLevel("ibblefrix"));
assertEquals(1, testMap.mimeTypeSupportLevel(null));
}
/** Test that all unsupported mimetypes return a rank of -1. */
public void testExcludedMimeTypes() {
testMap.setExcludedMimeTypes(mimeTypesSet);
assertEquals(-1, testMap.mimeTypeSupportLevel("foo"));
assertEquals(-1, testMap.mimeTypeSupportLevel("bar/baz"));
assertEquals(1, testMap.mimeTypeSupportLevel("ibblefrix"));
assertEquals(1, testMap.mimeTypeSupportLevel(null));
}
/** Test different support levels of supported mime types. */
public void testSupportedMimeTypes() {
// default for unspecified mime types is supported (1)
testMap.setSupportedMimeTypes(mimeTypesSet);
assertEquals(2, testMap.mimeTypeSupportLevel("foo"));
assertEquals(4, testMap.mimeTypeSupportLevel("bar/baz"));
assertEquals(1, testMap.mimeTypeSupportLevel("ibblefrix"));
assertEquals(1, testMap.mimeTypeSupportLevel(null));
testMap.setUnknownMimeTypeSupportLevel(0);
// new the default is unsupported(0)
assertTrue(testMap.mimeTypeSupportLevel("foo") > 1);
assertTrue(testMap.mimeTypeSupportLevel("ibblefrix") <= 0);
assertTrue(testMap.mimeTypeSupportLevel(null) <= 0);
}
/** Test vnd mime types are preferred over experimental. */
public void testVndExp() {
String[] mimeTypes = { "application/foo", "application/vnd.foo",
"x-foo/bar", "application/x-foo" };
testMap.setSupportedMimeTypes(ArrayAsSet(mimeTypes));
assertTrue(testMap.mimeTypeSupportLevel("application/foo") >
testMap.mimeTypeSupportLevel("application/x-foo"));
assertTrue(testMap.mimeTypeSupportLevel("application/foo") >
testMap.mimeTypeSupportLevel("x-foo/bar"));
assertTrue(testMap.mimeTypeSupportLevel("application/vnd.foo") >
testMap.mimeTypeSupportLevel("application/foo"));
assertEquals("application/vnd.foo",
testMap.preferredMimeType(ArrayAsSet(mimeTypes)));
}
/** Test ranking for all the categories. */
public void testMixedSupportMimeTypes() {
MimeTypeMap testMap = new MimeTypeMap();
String[] preferredMimeTypes = {"foo/bar"};
String[] supportedMimeTypes = {"foo/baz", "bar/baz"};
String[] unsupportedMimeTypes = {"foo", "bar/cat"};
String[] excludedMimeTypes = {"ignore", "bar/bar"};
testMap.setPreferredMimeTypes(ArrayAsSet(preferredMimeTypes));
testMap.setSupportedMimeTypes(ArrayAsSet(supportedMimeTypes));
testMap.setUnsupportedMimeTypes(ArrayAsSet(unsupportedMimeTypes));
testMap.setExcludedMimeTypes(ArrayAsSet(excludedMimeTypes));
assertEquals(8, testMap.mimeTypeSupportLevel("foo/bar"));
assertEquals(4, testMap.mimeTypeSupportLevel("foo/baz"));
assertEquals(0, testMap.mimeTypeSupportLevel("foo/rat"));
assertEquals(4, testMap.mimeTypeSupportLevel("bar/baz"));
assertEquals(1, testMap.mimeTypeSupportLevel("bar/zoo"));
assertEquals(0, testMap.mimeTypeSupportLevel("bar/cat"));
assertEquals(-1, testMap.mimeTypeSupportLevel("bar/bar"));
assertEquals(-1, testMap.mimeTypeSupportLevel("ignore/bar"));
String[] testMimeTypes = {"foo/bar", "bar/baz", "bar/bar"};
assertEquals("foo/bar",
testMap.preferredMimeType(ArrayAsSet(testMimeTypes)));
}
/** Test null or emptySet to preferredMimeType(). */
public void testNullOrEmptyPreferredMimeTypeSet() {
assertNull(testMap.preferredMimeType(null));
assertNull(testMap.preferredMimeType(new HashSet<String>()));
}
private static Set<String> ArrayAsSet(String[] a) {
return new HashSet<String>(Arrays.asList(a));
}
}