package org.simantics.db.tests.api.delayedWrite; import java.util.concurrent.atomic.AtomicReference; import org.junit.Assert; import org.junit.Test; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.DelayedWriteRequest; import org.simantics.db.common.request.UniqueRead; import org.simantics.db.exception.CancelTransactionException; import org.simantics.db.exception.DatabaseException; import org.simantics.db.testing.annotation.Fails; import org.simantics.db.testing.base.ExistingDatabaseTest; /** * Checks that throwing CancelTransactionException from within * {@link DelayedWriteRequest#perform(WriteGraph)} will *
    *
  1. Cancel the transaction correctly without getting stuck
  2. *
  3. Write no data into the database
  4. *
* * @author Tuukka Lehtonen */ public class DelayedWriteRequestCancelHandling extends ExistingDatabaseTest { @Test @Fails public void test() throws Exception { final AtomicReference ref = new AtomicReference(); try { DelayedWriteRequest r = new DelayedWriteRequest() { @Override public void perform(WriteGraph graph) throws DatabaseException { // Should throw an exception / error ref.set(graph.newResource()); graph.claim(ref.get(), L0.InstanceOf, null, L0.String); throw new CancelTransactionException("intentional cancel"); } }; getSession().sync(r); } catch (CancelTransactionException e) { // Should happen. } catch (DatabaseException e) { // Shouldn't happen. fail("Got DatabaseException " + e + ", should've received CancelTransactionException"); } // Just to check the database session is still alive. Resource r = getSession().sync(new org.simantics.db.common.primitiverequest.Resource("http:/")); fail("No data should've been written", getSession().sync(new UniqueRead() { @Override public Boolean perform(ReadGraph graph) throws DatabaseException { return graph.hasStatement( ref.get() ); } })); } }