blob: b3551c90284976389981b6edbff948a406a5b731 [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.stanbol.enhancer.test;
import static org.apache.stanbol.enhancer.servicesapi.impl.StringSource.UTF8;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import org.apache.commons.io.IOUtils;
import org.apache.stanbol.enhancer.servicesapi.Blob;
import org.apache.stanbol.enhancer.servicesapi.ContentSource;
import org.apache.stanbol.enhancer.servicesapi.helper.ContentItemHelper;
import org.apache.stanbol.enhancer.servicesapi.impl.ByteArraySource;
import org.apache.stanbol.enhancer.servicesapi.impl.StreamSource;
import org.apache.stanbol.enhancer.servicesapi.impl.StringSource;
import org.junit.Assert;
import org.junit.Test;
/**
* Test class intended to be extended by UnitTest classes for specific {@link Blob}
* implementations. This class tests if parsed mime-types are handled correctly.
* It does not test the actual handling of the data, because this is considered
* specific for each Blob implementation.<p>
* The {@link #createBlob(String)} MUST BE implemented to use
* the generic unit tests defined by this class.<p>
* <b>NOTE:</b>: {@link Blob} implementation can use the
* {@link ContentItemHelper#parseMimeType(String)} method for parsing
* mime-type string.
*/
public abstract class BlobTest {
private static byte[] content = "This is a test".getBytes(Charset.forName("UTF-8"));
/**
* Getter used to get the Blob to test mime-type handling. The content is
* not used for such tests and may be set to anything.
* @param mimeType the mimetype
* @return
*/
protected abstract Blob createBlob(ContentSource cs) throws IOException;
/**
* Internally used to create {@link ContentSource} instanced for the
* MimeType parsing tests
*/
private static ContentSource createContentSource(String mimeType){
return new ByteArraySource(content, mimeType);
}
@Test(expected=IllegalArgumentException.class)
public void testEmptyMimeType() throws IOException {
createBlob(createContentSource(""));
}
@Test(expected=IllegalArgumentException.class)
public void testWildcardType() throws IOException {
createBlob(createContentSource("*/*;charset=UTF-8"));
}
@Test(expected=IllegalArgumentException.class)
public void testWildcardSubType() throws IOException {
createBlob(createContentSource("text/*;charset=UTF-8"));
}
@Test(expected=IllegalArgumentException.class)
public void testEmptyMimetype() throws IOException {
createBlob(createContentSource(";charset=UTF-8"));
}
@Test(expected=IllegalArgumentException.class)
public void testMissingSubType() throws IOException {
createBlob(createContentSource("text;charset=UTF-8"));
}
@Test(expected=IllegalArgumentException.class)
public void testEmptyType() throws IOException {
createBlob(createContentSource("/plain;charset=UTF-8"));
}
@Test(expected=IllegalArgumentException.class)
public void testEmptySubType() throws IOException {
createBlob(createContentSource("text/;charset=UTF-8"));
}
@Test
public void testMimeType() throws IOException {
Blob blob = createBlob(createContentSource("text/plain;charset=UTF-8"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals("UTF-8", blob.getParameter().get("charset"));
blob = createBlob(createContentSource("text/plain;charset=UTF-8;other=test"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals("UTF-8", blob.getParameter().get("charset"));
Assert.assertTrue(blob.getParameter().containsKey("other"));
Assert.assertEquals("test", blob.getParameter().get("other"));
}
@Test
public void testMultipleSeparators() throws IOException {
Blob blob = createBlob(createContentSource("text/plain;;charset=UTF-8"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals("UTF-8", blob.getParameter().get("charset"));
blob = createBlob(createContentSource("text/plain;charset=UTF-8;;other=test"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals("UTF-8", blob.getParameter().get("charset"));
Assert.assertTrue(blob.getParameter().containsKey("other"));
Assert.assertEquals("test", blob.getParameter().get("other"));
}
@Test
public void testIllegalFormatedParameter() throws IOException {
Blob blob = createBlob(createContentSource("text/plain;=UTF-8"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().isEmpty());
blob = createBlob(createContentSource("text/plain;charset=UTF-8;=illegal"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertEquals(blob.getParameter().size(),1);
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals("UTF-8", blob.getParameter().get("charset"));
blob = createBlob(createContentSource("text/plain;=illegal;charset=UTF-8"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertEquals(blob.getParameter().size(),1);
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals("UTF-8", blob.getParameter().get("charset"));
blob = createBlob(createContentSource("text/plain;charset="));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().isEmpty());
blob = createBlob(createContentSource("text/plain;charset"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().isEmpty());
blob = createBlob(createContentSource("text/plain;charset=UTF-8;test="));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertEquals(blob.getParameter().size(),1);
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals("UTF-8", blob.getParameter().get("charset"));
blob = createBlob(createContentSource("text/plain;charset=UTF-8;test"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertEquals(blob.getParameter().size(),1);
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals("UTF-8", blob.getParameter().get("charset"));
blob = createBlob(createContentSource("text/plain;test;charset=UTF-8;"));
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertEquals(blob.getParameter().size(),1);
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals("UTF-8", blob.getParameter().get("charset"));
}
@Test(expected=UnsupportedOperationException.class)
public void testReadOnlyParameter() throws IOException {
Blob blob = createBlob(createContentSource("text/plain;test;charset=UTF-8"));
blob.getParameter().put("test", "dummy");
}
/**
* Tests correct handling of UTF-8 as default charset
* @throws IOException
*/
@Test
public void testString() throws IOException{
String test = "Exámplê";
//first via a StringSource
ContentSource cs = new StringSource(test);
Blob blob = createBlob(cs);
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals(UTF8.name(), blob.getParameter().get("charset"));
String value = new String(IOUtils.toByteArray(blob.getStream()),UTF8);
Assert.assertEquals(test, value);
}
/**
* This tests that texts with custom charsets are converted to UTF-8.
* @throws IOException
*/
@Test
public void testStringWithCustomCharset() throws IOException{
String test = "Exámplê";
Charset ISO8859_4 = Charset.forName("ISO-8859-4");
//first via a StringSource
ContentSource cs = new StringSource(test,ISO8859_4,"text/plain");
Blob blob = createBlob(cs);
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals(ISO8859_4.name(), blob.getParameter().get("charset"));
//2nd via a ByteArray
byte[] data = test.getBytes(ISO8859_4);
cs = new ByteArraySource(data,"text/plain; charset="+ISO8859_4.name());
blob = createBlob(cs);
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals(ISO8859_4.name(), blob.getParameter().get("charset"));
//3rd as Stream
cs = new StreamSource(new ByteArrayInputStream(data), "text/plain; charset="+ISO8859_4.name());
blob = createBlob(cs);
Assert.assertEquals("text/plain", blob.getMimeType());
Assert.assertTrue(blob.getParameter().containsKey("charset"));
Assert.assertEquals(ISO8859_4.name(), blob.getParameter().get("charset"));
cs = new StreamSource(new ByteArrayInputStream(data), "text/plain; "+ISO8859_4.name());
}
/**
* Tests the default mimeType "application/octet-stream" for binary data.
* @throws IOException
*/
@Test
public void testDefaultBinaryMimeType() throws IOException {
Blob blob = createBlob(new ByteArraySource("dummy".getBytes(UTF8)));
Assert.assertEquals("application/octet-stream", blob.getMimeType());
Assert.assertTrue(blob.getParameter().isEmpty());
blob = createBlob(new StreamSource(new ByteArrayInputStream("dummy".getBytes(UTF8))));
Assert.assertEquals("application/octet-stream", blob.getMimeType());
Assert.assertTrue(blob.getParameter().isEmpty());
}
}