You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commonsrdf.apache.org by st...@apache.org on 2016/09/28 13:52:03 UTC

[11/36] incubator-commonsrdf git commit: Some AbstractRDFParserBuilder tests

Some AbstractRDFParserBuilder tests


Project: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/commit/528af997
Tree: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/tree/528af997
Diff: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/diff/528af997

Branch: refs/heads/master
Commit: 528af9976ce03280578f82531a95a49a3546b238
Parents: 478b20e
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Sun Apr 3 01:47:16 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Sun Apr 3 02:32:47 2016 +0100

----------------------------------------------------------------------
 .../simple/AbstractRDFParserBuilderTest.java    | 220 +++++++++++++++++--
 .../rdf/simple/DummyRDFParserBuilder.java       |  70 ++++--
 2 files changed, 250 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/528af997/simple/src/test/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilderTest.java
----------------------------------------------------------------------
diff --git a/simple/src/test/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilderTest.java b/simple/src/test/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilderTest.java
index 1b751fa..d23e1c8 100644
--- a/simple/src/test/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilderTest.java
+++ b/simple/src/test/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilderTest.java
@@ -19,9 +19,11 @@ package org.apache.commons.rdf.simple;
 
 import static org.junit.Assert.*;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.rdf.api.Graph;
@@ -29,39 +31,211 @@ import org.apache.commons.rdf.api.IRI;
 import org.apache.commons.rdf.api.Literal;
 import org.apache.commons.rdf.api.RDFParserBuilder;
 import org.apache.commons.rdf.api.RDFSyntax;
+import org.apache.commons.rdf.api.RDFTerm;
+import org.apache.commons.rdf.api.RDFTermFactory;
 import org.apache.commons.rdf.api.Triple;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 
 public class AbstractRDFParserBuilderTest {
 
-	/**
-	 * Test a basic parsing of an N-Triples-file
-	 * 
-	 * @throws Exception
-	 */
-	@Test
-	public void parseFile() throws Exception {		
-		Path file = Files.createTempFile("test", ".nt");
-		// No need to populate the file as the dummy parser
+	private RDFTermFactory factory = new SimpleRDFTermFactory();
+	
+	private DummyRDFParserBuilder dummyParser = new DummyRDFParserBuilder();
+	private Path testNt;
+	private Path testTtl;
+	private Path testXml;
+
+	@Before
+	public void createTempFile() throws IOException {
+		testNt = Files.createTempFile("test", ".nt");
+		testTtl = Files.createTempFile("test", ".ttl");
+		testXml = Files.createTempFile("test", ".xml");
+
+		// No need to populate the files as the dummy parser
 		// doesn't actually read anything
-		
-		RDFParserBuilder parser = new DummyRDFParserBuilder()
-				.source(file).contentType(RDFSyntax.NTRIPLES);
-		Future<Graph> f = parser.parse();
-		Graph g = f.get(5, TimeUnit.SECONDS);
-		
-		assertEquals(1, g.size());
-		Triple triple = g.getTriples().findAny().get();
+	}
+
+	@After
+	public void deleteTempFiles() throws IOException {
+		Files.deleteIfExists(testNt);
+		Files.deleteIfExists(testTtl);
+		Files.deleteIfExists(testXml);
+	}
+
+	@Test
+	public void guessRDFSyntax() throws Exception {
+		assertEquals(RDFSyntax.NTRIPLES, AbstractRDFParserBuilder.guessRDFSyntax(testNt).get());
+		assertEquals(RDFSyntax.TURTLE, AbstractRDFParserBuilder.guessRDFSyntax(testTtl).get());
+		assertFalse(AbstractRDFParserBuilder.guessRDFSyntax(testXml).isPresent());
+	}
+
+	private void checkGraph(Graph g) throws Exception {				
+		assertTrue(g.size() > 0);		
+		IRI greeting = factory.createIRI("http://example.com/greeting");	
+		// Should only have parsed once!
+		assertEquals(1, g.getTriples(null, greeting, null).count());
+		Triple triple = g.getTriples(null, greeting, null).findAny().get();
 		assertTrue(triple.getSubject() instanceof IRI);
-		IRI iri = (IRI)triple.getSubject();
-		assertEquals("http://example.com/test1", iri.getIRIString());
-		
+		IRI parsing = (IRI) triple.getSubject();
+		assertTrue(parsing.getIRIString().startsWith("urn:uuid:"));
+
 		assertEquals("http://example.com/greeting", triple.getPredicate().getIRIString());
-		
+
 		assertTrue(triple.getObject() instanceof Literal);
-		Literal literal = (Literal)triple.getObject();
+		Literal literal = (Literal) triple.getObject();
 		assertEquals("Hello world", literal.getLexicalForm());
 		assertFalse(literal.getLanguageTag().isPresent());
 		assertEquals(Types.XSD_STRING, literal.getDatatype());
+		
+		// Check uniqueness of properties that are always present
+		assertEquals(1, 
+				g.getTriples(null, factory.createIRI("http://example.com/source"), null).count());
+		
+		// Check optional properties that are unique
+		assertTrue(2 > g.getTriples(null, factory.createIRI("http://example.com/base"), null).count());
+		assertTrue(2 > g.getTriples(null, factory.createIRI("http://example.com/contentType"), null).count());
+		assertTrue(2 > g.getTriples(null, factory.createIRI("http://example.com/contentTypeSyntax"), null).count());
+	}
+	
+	@Test
+	public void parseFile() throws Exception {
+		RDFParserBuilder parser = dummyParser.source(testNt);
+		Graph g = parser.parse().get(5, TimeUnit.SECONDS);
+		checkGraph(g);
+		// FIXME: this could potentially break if the equivalent of /tmp includes
+		// international characters
+		assertEquals("<" + testNt.toUri().toString() + ">", firstPredicate(g, "source"));
+		// Should be set to the file path
+		assertEquals("<" + testNt.toUri().toString() + ">", firstPredicate(g, "base"));		
+
+		// Should NOT have guessed the content type
+		assertNull(firstPredicate(g, "contentType"));
+		assertNull(firstPredicate(g, "contentTypeSyntax"));
+	}
+
+
+	@Test
+	public void parseNoSource() throws Exception {
+		thrown.expect(IllegalStateException.class);
+		dummyParser.parse();		
 	}
+	
+	@Test
+	public void parseBaseAndContentTypeNoSource() throws Exception {
+		// Can set the other options, even without source()
+		IRI base = dummyParser.createRDFTermFactory().createIRI("http://www.example.org/test.rdf");
+		RDFParserBuilder parser = dummyParser.base(base).contentType(RDFSyntax.RDFXML);
+		thrown.expect(IllegalStateException.class);
+		thrown.expectMessage("No source has been set");
+		// but .parse() should fail
+		parser.parse();		
+	}
+	
+	@Test
+	public void parseFileMissing() throws Exception {
+		Files.delete(testNt);
+		// This should not fail yet
+		RDFParserBuilder parser = dummyParser.source(testNt);
+		// but here:
+		thrown.expect(IOException.class);
+		parser.parse();		
+	}
+
+	
+	@Test
+	public void parseFileContentType() throws Exception {
+		RDFParserBuilder parser = dummyParser.source(testNt).contentType(RDFSyntax.NTRIPLES);
+		Graph g = parser.parse().get(5, TimeUnit.SECONDS);
+		checkGraph(g);
+		// FIXME: this could potentially break if the equivalent of /tmp includes
+		// international characters
+		assertEquals("<" + testNt.toUri().toString() + ">", firstPredicate(g, "source"));
+		assertEquals("<" + testNt.toUri().toString() + ">", firstPredicate(g, "base"));		
+		assertEquals("\"NTRIPLES\"", firstPredicate(g, "contentTypeSyntax"));
+		assertEquals("\"application/n-triples\"", firstPredicate(g, "contentType"));
+	}
+
+	private String firstPredicate(Graph g, String pred) {
+		return g.getTriples(null, factory.createIRI("http://example.com/" + pred), null)
+				.map(Triple::getObject).map(RDFTerm::ntriplesString).findAny().orElse(null);
+	}
+
+
+	@Rule
+	public ExpectedException thrown = ExpectedException.none();
+	
+	@Test
+	public void parseInputStreamFailsIfBaseMissing() throws Exception {
+		InputStream inputStream = new ByteArrayInputStream(new byte[0]);
+		// Should not fail at this point
+		RDFParserBuilder parser = dummyParser.source(inputStream);
+		// but here:
+		thrown.expect(IllegalStateException.class);
+		thrown.expectMessage("base iri required for inputstream source");
+		parser.parse();
+	}
+
+	@Test
+	public void parseInputStreamWithBase() throws Exception {
+		InputStream inputStream = new ByteArrayInputStream(new byte[0]);
+		IRI base = dummyParser.createRDFTermFactory().createIRI("http://www.example.org/test.rdf");
+		RDFParserBuilder parser = dummyParser.source(inputStream).base(base);		
+		Graph g = parser.parse().get(5, TimeUnit.SECONDS);
+		checkGraph(g);
+		assertEquals("<http://www.example.org/test.rdf>", firstPredicate(g, "base"));
+		// in our particular debug output, 
+		// bnode source indicates InputStream 
+		assertTrue(firstPredicate(g, "source").startsWith("_:"));
+		assertNull(firstPredicate(g, "contentType"));
+		assertNull(firstPredicate(g, "contentTypeSyntax"));
+	}
+	
+	@Test
+	public void parseInputStreamWithNQuads() throws Exception {
+		InputStream inputStream = new ByteArrayInputStream(new byte[0]);
+		RDFParserBuilder parser = dummyParser.source(inputStream).contentType(RDFSyntax.NQUADS);		
+		Graph g = parser.parse().get(5, TimeUnit.SECONDS);
+		checkGraph(g);
+		assertNull(firstPredicate(g, "base"));
+		// in our particular debug output, 
+		// bnode source indicates InputStream 
+		assertTrue(firstPredicate(g, "source").startsWith("_:"));
+		assertEquals("\"application/n-quads\"", firstPredicate(g, "contentType"));
+		assertEquals("\"NQUADS\"", firstPredicate(g, "contentTypeSyntax"));
+	}	
+
+	@Test
+	public void parseIRI() throws Exception {
+		IRI iri = dummyParser.createRDFTermFactory().createIRI("http://www.example.net/test.ttl");
+		RDFParserBuilder parser = dummyParser.source(iri);		
+		Graph g = parser.parse().get(5, TimeUnit.SECONDS);
+		checkGraph(g);
+		assertEquals("<http://www.example.net/test.ttl>", firstPredicate(g, "source"));
+		// No base - assuming the above IRI is always 
+		// the base would break server-supplied base from 
+		// any HTTP Location redirects and  Content-Location header
+		assertNull(firstPredicate(g, "base"));
+		// ".ttl" in IRI string does not imply any content type
+		assertNull(firstPredicate(g, "contentType"));
+		assertNull(firstPredicate(g, "contentTypeSyntax"));
+		
+	}
+	
+	@Test
+	public void parseIRIBaseContentType() throws Exception {
+		IRI iri = dummyParser.createRDFTermFactory().createIRI("http://www.example.net/test.ttl");
+		RDFParserBuilder parser = dummyParser.source(iri).base(iri).contentType(RDFSyntax.TURTLE);
+		Graph g = parser.parse().get(5, TimeUnit.SECONDS);
+		checkGraph(g);
+		assertEquals("<http://www.example.net/test.ttl>", firstPredicate(g, "source"));
+		assertEquals("<http://www.example.net/test.ttl>", firstPredicate(g, "base"));
+		assertEquals("\"TURTLE\"", firstPredicate(g, "contentTypeSyntax"));
+		assertEquals("\"text/turtle\"", firstPredicate(g, "contentType"));
+	}
+
+	
 }

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/528af997/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java
----------------------------------------------------------------------
diff --git a/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java b/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java
index 38e6ed2..ddaf4ed 100644
--- a/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java
+++ b/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java
@@ -19,42 +19,78 @@ package org.apache.commons.rdf.simple;
 
 import java.io.IOException;
 import java.text.ParseException;
+import java.util.UUID;
 
 import org.apache.commons.rdf.api.Graph;
 import org.apache.commons.rdf.api.IRI;
-import org.apache.commons.rdf.api.Literal;
 import org.apache.commons.rdf.api.RDFParserBuilder;
 import org.apache.commons.rdf.api.RDFTermFactory;
 
 /** 
- * For test purposes - a {@link RDFParserBuilder} that always insert a single triple.
+ * For test purposes - a {@link RDFParserBuilder} that inserts information
+ * about what it has been asked to parse instead of actually parsing anything.
  * <p>
- * This dummy RDF parser always sleeps for at least 1000 ms
- * before inserting the triple:
+ * This always insert at least the triple equivalent to:
  * <pre>
- *    <http://example.com/test1> <http://example.com/greeting> "Hello world" .
+ *    <urn:uuid:b7ac3fcc-4d86-4d28-8358-a1cd094974a6> <http://example.com/greeting> "Hello world" .
  * </pre>
+ * Additional triples match the corresponding getter in AbstractRDFParserBuilder,
+ * e.g.:
+ * <pre>
+ *   <urn:uuid:b7ac3fcc-4d86-4d28-8358-a1cd094974a6> <http://example.com/base> <http://www.example.org/> .
+ *   <urn:uuid:b7ac3fcc-4d86-4d28-8358-a1cd094974a6> <http://example.com/sourceFile> "/tmp/file.ttl" .   
+ * </pre> 
+ * 
  *
  */
 public class DummyRDFParserBuilder extends AbstractRDFParserBuilder {
-
+	
 	@Override
 	protected void parseSynchronusly() throws IOException, IllegalStateException, ParseException {		
 		// From parseSynchronusly both of these are always present
 		RDFTermFactory factory = getRdfTermFactory().get();
 		Graph graph = getIntoGraph().get();
+				
+		// well - each parsing is unique. This should hopefully
+		// catch any accidental double parsing
+		IRI parsing = factory.createIRI("urn:uuid:" + UUID.randomUUID());
+		graph.add(parsing, factory.createIRI("http://example.com/greeting"), 
+				factory.createLiteral("Hello world"));
 		
-		// Let's always insert the same triple
-		IRI test1 = factory.createIRI("http://example.com/test1");
-		IRI greeting = factory.createIRI("http://example.com/greeting");
-		Literal hello = factory.createLiteral("Hello world");
-		try {
-			// Pretend we take a while to parse
-			Thread.sleep(1000);			
-		} catch (InterruptedException e) {
-			return;
-		} 
-		graph.add(test1, greeting, hello); 		
+		// Now we'll expose the finalized AbstractRDFParserBuilder settings
+		// so they can be inspected by the junit test
+
+		if (getSourceIri().isPresent()) {
+			graph.add(parsing, 
+					factory.createIRI("http://example.com/source"),
+					getSourceIri().get());			
+		}		
+		if (getSourceFile().isPresent()) {
+			graph.add(parsing, 
+					factory.createIRI("http://example.com/source"),
+					factory.createIRI(getSourceFile().get().toUri().toString()));
+		}
+		if (getSourceInputStream().isPresent()) { 
+			graph.add(parsing, 
+					factory.createIRI("http://example.com/source"),
+					factory.createBlankNode());
+		}
+
+		if (getBase().isPresent()) { 
+			graph.add(parsing, 
+					factory.createIRI("http://example.com/base"),
+					getBase().get());
+		}
+		if (getContentType().isPresent()) {
+			graph.add(parsing, 
+					factory.createIRI("http://example.com/contentType"),
+					factory.createLiteral(getContentType().get()));
+		}
+		if (getContentTypeSyntax().isPresent()) {
+			graph.add(parsing, 
+					factory.createIRI("http://example.com/contentTypeSyntax"),
+					factory.createLiteral(getContentTypeSyntax().get().name()));
+		}		
 	}
 
 }