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
*
* - Cancel the transaction correctly without getting stuck
* - Write no data into the database
*
*
* @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() );
}
}));
}
}