blob: 6520a9a9de9a1ba2492f1f0a35638710b1d849a2 [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.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import org.apache.clerezza.commons.rdf.Graph;
import org.apache.clerezza.commons.rdf.IRI;
import org.apache.clerezza.commons.rdf.impl.utils.PlainLiteralImpl;
import org.apache.clerezza.commons.rdf.impl.utils.simple.SimpleGraph;
import org.apache.clerezza.commons.rdf.impl.utils.TripleImpl;
import org.apache.commons.io.IOUtils;
import org.apache.stanbol.enhancer.servicesapi.Blob;
import org.apache.stanbol.enhancer.servicesapi.ContentItem;
import org.apache.stanbol.enhancer.servicesapi.ContentItemFactory;
import org.apache.stanbol.enhancer.servicesapi.ContentReference;
import org.apache.stanbol.enhancer.servicesapi.ContentSink;
import org.apache.stanbol.enhancer.servicesapi.ContentSource;
import org.apache.stanbol.enhancer.servicesapi.impl.StringSource;
import org.apache.stanbol.enhancer.servicesapi.rdf.Enhancer;
import org.apache.stanbol.enhancer.servicesapi.rdf.Properties;
import org.junit.Before;
import org.junit.Test;
/**
* This UnitTest MUST BE passed by all {@link ContentItemFactory} implementations.
* It only checks the creation of {@link ContentItem}s and {@link Blob}s. It
* does not actually test the ContentItem and Blob implementations as those
* need to pass {@link ContentItemTest} and {@link BlobTest} respectively.
*
* @author Rupert Westenthaler
*/
public abstract class ContentItemFactoryTest {
/**
* Internally used to test {@link ContentReference} constructors
*/
private static ContentReference TEST_CR = new ContentReference() {
ContentSource source = new StringSource("Dummy Reference Content");
@Override
public String getReference() {
return "urn:dummy.reference";
}
@Override
public ContentSource dereference() throws IOException {
return source;
}
};
/**
* Internally used to test {@link ContentSource} constructors
*/
private static ContentSource TEST_CS = new StringSource("Dummy Content");
/**
* The prefix used for testing
*/
private static String PREFIX = "http://www.example.com/prefix#";
/**
* The {@link ContentItem#getUri() ID} used for testing
*/
private static IRI ID = new IRI("http://www.example.com/content-items#12345");
/**
* ImmutableGraph used to test of parsed metadata are preserved
*/
private static Graph METADATA = new SimpleGraph();
static {
METADATA.add(new TripleImpl(ID, Properties.RDF_TYPE, Enhancer.CONTENT_ITEM));
METADATA.add(new TripleImpl(ID, Properties.RDFS_LABEL, new PlainLiteralImpl("Test ContentItem")));
}
/**
* Member variable for the {@link ContentItemFactory} instance used for
* testing. This is initialise {@link Before} the first unit test is
* esecuted.
*/
protected ContentItemFactory contentItemFactory;
/**
* This method is assumed to return an new ContentItemFactory instance on
* every call. Currently it is called only once in the {@link Before} state
* of the first test.<p>
* Subclasses can use the {@link #contentItemFactory} member
* variable in additional tests.
* @return the {@link ContentItemFactory} instance used for the tests.
*/
protected abstract ContentItemFactory createContentItemFactory() throws IOException ;
/**
* Initialises the {@link #contentItemFactory} {@link Before} the first
* unit test is executed. Needs not to be manually called by test methods.
*/
@Before
public void initFactory() throws IOException {
if(contentItemFactory == null){
contentItemFactory = createContentItemFactory();
assertNotNull("Unable to create ContentItemFactory instance",
contentItemFactory);
}
}
/*
* Set of tests to test that IllegalArgumentExceptions are
* thrown if null is parsed as ContentSource to the various
* createContentItem methods
*/
@Test(expected=IllegalArgumentException.class)
public void missingCiContentSource() throws IOException{
contentItemFactory.createContentItem((ContentSource)null);
}
@Test(expected=IllegalArgumentException.class)
public void missingCiContentSource2() throws IOException{
contentItemFactory.createContentItem(PREFIX,null);
}
@Test(expected=IllegalArgumentException.class)
public void missingCiContentSource3() throws IOException{
contentItemFactory.createContentItem(ID,null);
}
@Test(expected=IllegalArgumentException.class)
public void missingCiContentSource4() throws IOException{
contentItemFactory.createContentItem(ID,null,new SimpleGraph());
}
@Test(expected=IllegalArgumentException.class)
public void missingCiContentSource5() throws IOException{
contentItemFactory.createContentItem(PREFIX,null,new SimpleGraph());
}
/*
* Set of tests to test that IllegalArgumentExceptions are
* thrown if null is parsed as ContentReference to the various
* createContentItem methods
*/
@Test(expected=IllegalArgumentException.class)
public void missingCiContentReference() throws IOException{
contentItemFactory.createContentItem((ContentReference)null);
}
@Test(expected=IllegalArgumentException.class)
public void missingCiContentReference2() throws IOException{
contentItemFactory.createContentItem(null,new SimpleGraph());
}
/*
* Set of tests to test that IllegalArgumentExceptions are
* thrown if null is parsed to the createBlob methods.
*/
@Test(expected=IllegalArgumentException.class)
public void missingBlobContentReference() throws IOException{
contentItemFactory.createBlob((ContentReference)null);
}
@Test(expected=IllegalArgumentException.class)
public void missingBlobContentSource() throws IOException{
contentItemFactory.createBlob((ContentSource)null);
}
/*
* Set of tests to test that IllegalArgumentExceptions if
* null is parsed as prefix
*/
@Test(expected=IllegalArgumentException.class)
public void missingCiPrefix() throws IOException{
contentItemFactory.createContentItem((String)null,TEST_CS);
}
@Test(expected=IllegalArgumentException.class)
public void missingCiPrefix2() throws IOException{
contentItemFactory.createContentItem((String)null,TEST_CS,new SimpleGraph());
}
/**
* Test that the generated ID starts with the parsed prefix
*/
@Test
public void testPrefix() throws IOException{
ContentItem ci = contentItemFactory.createContentItem(PREFIX, TEST_CS);
assertNotNull(ci);
assertNotNull(ci.getUri());
assertTrue("The ID of the created ContentItem MUST start with the parsed prefix",
ci.getUri().getUnicodeString().startsWith(PREFIX));
ci = contentItemFactory.createContentItem(PREFIX, TEST_CS,new SimpleGraph());
assertNotNull(ci);
assertNotNull(ci.getUri());
assertTrue("The ID of the created ContentItem MUST start with the parsed prefix",
ci.getUri().getUnicodeString().startsWith(PREFIX));
}
/**
* Test that the parsed URI is used as ID of the ContentItem
*/
@Test
public void testURI() throws IOException {
ContentItem ci = contentItemFactory.createContentItem(ID, TEST_CS);
assertNotNull(ci);
assertNotNull(ci.getUri());
assertTrue("The ID of the created ContentItem MUST be equals to the parsed ID",
ci.getUri().equals(ID));
ci = contentItemFactory.createContentItem(ID, TEST_CS,new SimpleGraph());
assertNotNull(ci);
assertNotNull(ci.getUri());
assertTrue("The ID of the created ContentItem MUST be equals to the parsed ID",
ci.getUri().equals(ID));
}
/**
* Test the generation of valid IDs if no or <code>null</code> is parsed
* as id
*/
@Test
public void testDefaultId() throws IOException {
ContentItem ci = contentItemFactory.createContentItem(TEST_CS);
assertNotNull(ci);
assertNotNull(ci.getUri());
ci = contentItemFactory.createContentItem((IRI)null,TEST_CS);
assertNotNull(ci);
assertNotNull(ci.getUri());
ci = contentItemFactory.createContentItem((IRI)null,TEST_CS, new SimpleGraph());
assertNotNull(ci);
assertNotNull(ci.getUri());
}
/**
* Tests if the {@link ContentReference#getReference()} is used as ID for
* the contentItem
*/
@Test
public void testContentReferenceId() throws IOException {
ContentItem ci = contentItemFactory.createContentItem(TEST_CR);
assertNotNull(ci);
assertNotNull(ci.getUri());
assertEquals(TEST_CR.getReference(),ci.getUri().getUnicodeString());
contentItemFactory.createContentItem(TEST_CR, new SimpleGraph());
assertNotNull(ci);
assertNotNull(ci.getUri());
assertEquals(TEST_CR.getReference(),ci.getUri().getUnicodeString());
}
/**
* Tests if triples contained in parsed Metadata are also present within
* the {@link ContentItem#getMetadata()} graph
*/
@Test
public void testParsedMetadata() throws IOException {
ContentItem ci = contentItemFactory.createContentItem(TEST_CR, METADATA);
assertNotNull(ci);
assertEquals("The created ContentItem MUST contain parsed metadata",
METADATA.size(), ci.getMetadata().size());
ci = contentItemFactory.createContentItem(ID,TEST_CS, METADATA);
assertNotNull(ci);
assertEquals("The created ContentItem MUST contain parsed metadata",
METADATA.size(), ci.getMetadata().size());
ci = contentItemFactory.createContentItem(PREFIX,TEST_CS, METADATA);
assertNotNull(ci);
assertEquals("The created ContentItem MUST contain parsed metadata",
METADATA.size(), ci.getMetadata().size());
}
@Test
public void testContentSink() throws IOException {
String mt = "text/plain";
Charset ISO8859_4 = Charset.forName("ISO-8859-4");
ContentSink cs = contentItemFactory.createContentSink(mt+"; charset="+ISO8859_4.name());
assertNotNull(cs);
assertNotNull(cs.getBlob());
OutputStream out = cs.getOutputStream();
assertNotNull(cs);
// multiple calls MUST return the same OutputStream!
assertSame(out, cs.getOutputStream());
//test mime type
assertNotNull(cs.getBlob().getMimeType());
//get MimeType MUST return the simple mime type
assertEquals(mt, cs.getBlob().getMimeType());
String charsetParam = cs.getBlob().getParameter().get("charset");
assertNotNull("expected charset parameter is missing!",charsetParam);
assertEquals(ISO8859_4.name(), charsetParam);
//now write some data to the sink
String TEST_CONTENT = "Thîs tésts wrîtîng to â ConténtSînk!";
//note this uses the same charset as parsed as charset in the
//constructor!
IOUtils.write(TEST_CONTENT, cs.getOutputStream(),ISO8859_4.name());
IOUtils.closeQuietly(cs.getOutputStream());
//now read the data from the blob
String content = IOUtils.toString(
cs.getBlob().getStream(),
charsetParam);
assertEquals(TEST_CONTENT, content);
}
@Test
public void testContentSinkDefaultMimeType() throws IOException {
String DEFAULT = "application/octet-stream";
ContentSink cs = contentItemFactory.createContentSink(null);
assertNotNull(cs);
assertNotNull(cs.getBlob());
assertNotNull(cs.getBlob().getMimeType());
//get MimeType MUST return the simple mime type
assertEquals(DEFAULT, cs.getBlob().getMimeType());
assertNull(cs.getBlob().getParameter().get("charset"));
}
}