blob: 0482e9cf614737272a8cabecd1783c0978006f08 [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.jena.rdfconnection;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.atlas.junit.BaseTest;
import org.apache.jena.atlas.lib.StrUtils;
import org.apache.jena.query.Dataset;
import org.apache.jena.query.DatasetFactory;
import org.apache.jena.query.ReadWrite;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdfconnection.RDFConnection;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.sse.SSE;
import org.apache.jena.sparql.util.IsoMatcher;
import org.apache.jena.system.Txn;
import org.apache.jena.update.UpdateRequest;
import org.junit.Assume;
import org.junit.Test;
public abstract class AbstractTestRDFConnection extends BaseTest {
// Testing data.
static String DIR = "testing/RDFConnection/";
protected abstract RDFConnection connection();
// Not all connection types support abort.
protected abstract boolean supportsAbort();
// ---- Data
static String dsgdata = StrUtils.strjoinNL
("(dataset"
," (graph (:s :p :o) (:s0 :p0 _:a))"
," (graph :g1 (:s :p :o) (:s1 :p1 :o1))"
," (graph :g2 (:s :p :o) (:s2 :p2 :o))"
,")"
);
static String dsgdata2 = StrUtils.strjoinNL
("(dataset"
," (graph (:x :y :z))"
," (graph :g9 (:s :p :o))"
,")"
);
static String graph1 = StrUtils.strjoinNL
("(graph (:s :p :o) (:s1 :p1 :o))"
);
static String graph2 = StrUtils.strjoinNL
("(graph (:s :p :o) (:s2 :p2 :o))"
);
static DatasetGraph dsg = SSE.parseDatasetGraph(dsgdata);
static Dataset dataset = DatasetFactory.wrap(dsg);
static DatasetGraph dsg2 = SSE.parseDatasetGraph(dsgdata2);
static Dataset dataset2 = DatasetFactory.wrap(dsg2);
static String graphName = "http://test/graph";
static String graphName2 = "http://test/graph2";
static Model model1 = ModelFactory.createModelForGraph(SSE.parseGraph(graph1));
static Model model2 = ModelFactory.createModelForGraph(SSE.parseGraph(graph2));
// ---- Data
@Test public void connect_01() {
@SuppressWarnings("resource")
RDFConnection conn = connection();
assertFalse(conn.isClosed());
conn.close();
assertTrue(conn.isClosed());
// Allow multiple close()
conn.close();
}
@Test public void dataset_load_1() {
String testDataFile = DIR+"data.trig";
try ( RDFConnection conn = connection() ) {
conn.loadDataset(testDataFile);
Dataset ds0 = RDFDataMgr.loadDataset(testDataFile);
Dataset ds = conn.fetchDataset();
assertTrue("Datasets not isomorphic", isomorphic(ds0, ds));
}
}
@Test public void dataset_put_1() {
try ( RDFConnection conn = connection() ) {
conn.putDataset(dataset);
Dataset ds1 = conn.fetchDataset();
assertTrue("Datasets not isomorphic", isomorphic(dataset, ds1));
}
}
@Test public void dataset_put_2() {
try ( RDFConnection conn = connection() ) {
conn.putDataset(dataset);
conn.putDataset(dataset2);
Dataset ds1 = conn.fetchDataset();
assertTrue("Datasets not isomorphic", isomorphic(dataset2, ds1));
}
}
@Test public void dataset_post_1() {
try ( RDFConnection conn = connection() ) {
conn.loadDataset(dataset);
Dataset ds1 = conn.fetchDataset();
assertTrue("Datasets not isomorphic", isomorphic(dataset, ds1));
}
}
@Test public void dataset_post_2() {
try ( RDFConnection conn = connection() ) {
conn.loadDataset(dataset);
conn.loadDataset(dataset2);
Dataset ds1 = conn.fetchDataset();
long x = Iter.count(ds1.listNames());
assertEquals("NG count", 3, x);
assertFalse("Datasets are isomorphic", isomorphic(dataset, ds1));
assertFalse("Datasets are isomorphic", isomorphic(dataset2, ds1));
}
}
// Default graph
@Test public void graph_load_1() {
String testDataFile = DIR+"data.ttl";
Model m0 = RDFDataMgr.loadModel(testDataFile);
try ( RDFConnection conn = connection() ) {
conn.load(testDataFile);
Model m = conn.fetch();
assertTrue("Models not isomorphic", isomorphic(m0, m));
}
}
@Test public void graph_put_1() {
try ( RDFConnection conn = connection() ) {
conn.put(model1);
Dataset ds1 = conn.fetchDataset();
Model m0 = conn.fetch();
assertTrue("Models not isomorphic", isomorphic(model1, ds1.getDefaultModel()));
Model m = conn.fetch();
assertTrue("Models not isomorphic", isomorphic(model1, m));
}
}
@Test public void graph_put_2() {
try ( RDFConnection conn = connection() ) {
conn.put(model1);
conn.put(model2);
Model m = conn.fetch();
assertTrue("Models not isomorphic", isomorphic(m, model2));
assertFalse("Models not isomorphic", isomorphic(m, model1));
}
}
@Test public void graph_post_1() {
try ( RDFConnection conn = connection() ) {
conn.load(model1);
Model m = conn.fetch();
assertTrue("Models not isomorphic", isomorphic(m, model1));
}
}
@Test public void graph_post_2() {
try ( RDFConnection conn = connection() ) {
conn.load(model1);
conn.load(model2);
Model m = conn.fetch();
Model m0 = ModelFactory.createUnion(model2, model1);
assertTrue("Models are not isomorphic", isomorphic(m0, m));
}
}
// DELETE
// Named graphs
@Test public void named_graph_load_1() {
String testDataFile = DIR+"data.ttl";
Model m0 = RDFDataMgr.loadModel(testDataFile);
try ( RDFConnection conn = connection() ) {
conn.load(graphName, testDataFile);
Model m = conn.fetch(graphName);
assertTrue("Models not isomorphic", isomorphic(m0, m));
Model mDft = conn.fetch();
assertTrue(mDft.isEmpty());
}
}
@Test public void named_graph_put_1() {
try ( RDFConnection conn = connection() ) {
conn.put(graphName, model1);
Dataset ds1 = conn.fetchDataset();
Model m0 = conn.fetch(graphName);
assertTrue("Models not isomorphic", isomorphic(model1, ds1.getNamedModel(graphName)));
Model m = conn.fetch(graphName);
assertTrue("Models not isomorphic", isomorphic(model1, m));
}
}
@Test public void named_graph_put_2() {
try ( RDFConnection conn = connection() ) {
conn.put(graphName, model1);
conn.put(graphName, model2);
Model m = conn.fetch(graphName);
assertTrue("Models not isomorphic", isomorphic(m, model2));
assertFalse("Models not isomorphic", isomorphic(m, model1));
}
}
@Test public void named_graph_put_2_different() {
try ( RDFConnection conn = connection() ) {
conn.put(graphName, model1);
conn.put(graphName2, model2);
Model m1 = conn.fetch(graphName);
Model m2 = conn.fetch(graphName2);
assertTrue("Models not isomorphic", isomorphic(m1, model1));
assertTrue("Models not isomorphic", isomorphic(m2, model2));
}
}
@Test public void named_graph_post_1() {
try ( RDFConnection conn = connection() ) {
conn.load(graphName, model1);
Model m = conn.fetch(graphName);
assertTrue("Models not isomorphic", isomorphic(m, model1));
}
}
@Test public void named_graph_post_2() {
try ( RDFConnection conn = connection() ) {
conn.load(graphName, model1);
conn.load(graphName, model2);
Model m = conn.fetch(graphName);
Model m0 = ModelFactory.createUnion(model2, model1);
assertTrue("Models are not isomorphic", isomorphic(m0, m));
}
}
// DELETE
// Remote connections don't support transactions fully.
//@Test public void transaction_01()
private static boolean isomorphic(Dataset ds1, Dataset ds2) {
return IsoMatcher.isomorphic(ds1.asDatasetGraph(), ds2.asDatasetGraph());
}
private static boolean isomorphic(Model model1, Model model2) {
return model1.isIsomorphicWith(model2);
}
@Test public void query_ask_01() {
try ( RDFConnection conn = connection() ) {
Txn.executeRead(conn, ()->{
boolean b = conn.queryAsk("ASK{}");
assertTrue(b);
});
}
}
@Test public void query_ask_02() {
try ( RDFConnection conn = connection() ) {
boolean b = conn.queryAsk("ASK{}");
assertTrue(b);
}
}
@Test public void query_select_01() {
AtomicInteger counter = new AtomicInteger(0);
try ( RDFConnection conn = connection() ) {
Txn.executeWrite(conn, ()->conn.loadDataset(DIR+"data.trig"));
Txn.executeRead(conn, ()->
conn.querySelect("SELECT * { ?s ?p ?o }" , (r)->counter.incrementAndGet()));
assertEquals(2, counter.get());
}
}
@Test public void query_select_02() {
AtomicInteger counter = new AtomicInteger(0);
try ( RDFConnection conn = connection() ) {
conn.loadDataset(DIR+"data.trig");
conn.querySelect("SELECT * { ?s ?p ?o}" , (r)->counter.incrementAndGet());
assertEquals(2, counter.get());
}
}
@Test public void query_construct_01() {
try ( RDFConnection conn = connection() ) {
Txn.executeWrite(conn, ()->conn.loadDataset(DIR+"data.trig"));
Txn.executeRead(conn, ()-> {
Model m = conn.queryConstruct("CONSTRUCT WHERE { ?s ?p ?o }");
assertEquals(2, m.size());
});
}
}
@Test public void query_construct_02() {
try ( RDFConnection conn = connection() ) {
conn.loadDataset(DIR+"data.trig");
Model m = conn.queryConstruct("CONSTRUCT WHERE { ?s ?p ?o }");
assertEquals(2, m.size());
}
}
@Test public void update_01() {
try ( RDFConnection conn = connection() ) {
conn.update("INSERT DATA { <urn:x:s> <urn:x:p> <urn:x:o>}");
}
}
@Test public void update_02() {
try ( RDFConnection conn = connection() ) {
Txn.executeWrite(conn, ()->conn.update("INSERT DATA { <urn:x:s> <urn:x:p> <urn:x:o>}"));
}
}
@Test public void update_03() {
UpdateRequest update = new UpdateRequest();
update.add("INSERT DATA { <urn:x:s> <urn:x:p> <urn:x:o>}");
try ( RDFConnection conn = connection() ) {
conn.update(update);
}
}
@Test public void update_04() {
UpdateRequest update = new UpdateRequest();
update.add("INSERT DATA { <urn:x:s> <urn:x:p> <urn:x:o>}");
try ( RDFConnection conn = connection() ) {
Txn.executeWrite(conn, ()->conn.update(update));
}
}
// Not all Transactional support abort.
@Test public void transaction_commit_read_01() {
String testDataFile = DIR+"data.trig";
try ( RDFConnection conn = connection() ) {
conn.begin(ReadWrite.WRITE);
conn.loadDataset(dataset);
conn.commit();
conn.end();
conn.begin(ReadWrite.READ);
Model m = conn.fetch();
assertTrue(isomorphic(m, dataset.getDefaultModel()));
conn.end();
}
}
// Not all RDFConnections support abort.
@Test public void transaction_abort_read02() {
Assume.assumeTrue(supportsAbort());
String testDataFile = DIR+"data.trig";
try ( RDFConnection conn = connection() ) {
conn.begin(ReadWrite.WRITE);
conn.loadDataset(testDataFile);
conn.abort();
conn.end();
conn.begin(ReadWrite.READ);
Model m = conn.fetch();
assertTrue(m.isEmpty());
conn.end();
}
}
//@Test(expected=JenaTransactionException.class)
public void transaction_bad_01() {
try ( RDFConnection conn = connection() ) {
conn.begin(ReadWrite.WRITE);
// Should have conn.commit();
conn.end();
}
}
}