More tests

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/96d03085
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/96d03085
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/96d03085

Branch: refs/heads/ThreadPerGraphDataset
Commit: 96d03085302dcf84b02cc1c8186aa831b4d9f632
Parents: ade1e94
Author: ajs6f <[email protected]>
Authored: Sun Jan 8 13:09:30 2017 -0500
Committer: ajs6f <[email protected]>
Committed: Tue Feb 14 09:39:04 2017 -0500

----------------------------------------------------------------------
 .../core/pergraph/MultithreadingTest.java       | 80 +++++++++++++++++++-
 1 file changed, 78 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/96d03085/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java
 
b/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java
index a5b7679..27922db 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java
@@ -24,8 +24,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.jena.atlas.junit.BaseTest;
 import org.apache.jena.graph.Node;
-import org.apache.jena.query.ReadWrite;
 import org.apache.jena.sparql.core.DatasetGraphGraphPerTxn;
+import org.apache.jena.sparql.core.JenaTransactionRegionException;
 import org.apache.jena.sparql.core.Quad;
 import org.junit.Test;
 
@@ -48,7 +48,7 @@ public class MultithreadingTest extends BaseTest {
             Quad.create(graph3, dummy, dummy, dummy) };
 
     @Test
-    public void loadTwoGraphsAtOnce() {
+    public void writeTwoGraphsAtOnce() {
         DatasetGraphGraphPerTxn dataset = new DatasetGraphGraphPerTxn();
 
         // We start a thread loading a graph, then wait for the main thread to 
start loading a different graph. The
@@ -117,4 +117,80 @@ public class MultithreadingTest extends BaseTest {
             dataset.end();
         }
     }
+
+    @Test(expected = JenaTransactionRegionException.class)
+    public void onlyOneGraphWritableInATxn() {
+        DatasetGraphGraphPerTxn dataset = new DatasetGraphGraphPerTxn();
+        dataset.begin(WRITE);
+        try {
+            dataset.add(graph2, dummy, dummy, before);
+            dataset.add(graph1, dummy, dummy, after);
+            fail("Should not have been able to write to two different 
graphs!");
+            dataset.commit();
+        } finally {
+            dataset.end();
+        }
+    }
+
+    @Test
+    public void readFromOneGraphWhileWritingToAnother() {
+        DatasetGraphGraphPerTxn dataset = new DatasetGraphGraphPerTxn();
+        // set up some data to read
+        dataset.begin(WRITE);
+        try {
+            dataset.add(graph1, dummy, dummy, dummy);
+            dataset.commit();
+        } finally {
+            dataset.end();
+        }
+        // try and read the data while writing some more elsewhere
+        dataset.begin(WRITE);
+        try {
+            dataset.add(graph2, dummy, dummy, dummy);
+            assertTrue("Couldn't find triple in non-written graph!", 
dataset.contains(graph1, dummy, dummy, dummy));
+            dataset.commit();
+        } finally {
+            dataset.end();
+        }
+    }
+
+    @Test
+    public void snapshotIsolation() {
+        DatasetGraphGraphPerTxn dataset = new DatasetGraphGraphPerTxn();
+
+        // We start a thread loading a graph, then wait for the main thread to 
start loading a different graph. The
+        // first thread must wait to see that the main thread has successfully 
started loading its graph to finish its
+        // load. So when the first thread does finish, this proves that two 
graphs were being loaded simultaneously.
+
+        AtomicBoolean startMain = new AtomicBoolean(), baton = new 
AtomicBoolean(), finishLine = new AtomicBoolean();
+
+        new Thread(() -> {
+            dataset.begin(WRITE);
+            try {
+                dataset.add(graph1, dummy, dummy, dummy);
+                // wait for the baton
+                startMain.set(true);
+                await().untilTrue(baton);
+                // confirm that the mutation in the other thread is invisible
+                assertFalse("Mutation from another thread was visible!", 
dataset.contains(graph2, dummy, dummy, dummy));
+                dataset.commit();
+                finishLine.set(true);
+            } finally {
+                dataset.end();
+            }
+        }).start();
+
+        await().untilTrue(startMain);
+        dataset.begin(WRITE);
+        try {
+            dataset.add(graph2, dummy, dummy, dummy);
+            // pass the baton
+            baton.set(true);
+            await().untilTrue(finishLine);
+            dataset.commit();
+        } finally {
+            dataset.end();
+        }
+
+    }
 }

Reply via email to