package edu.brown.catalog.conflicts; import org.junit.Test; import org.voltdb.benchmark.tpcc.TPCCProjectBuilder; import org.voltdb.benchmark.tpcc.procedures.GetTableCounts; import org.voltdb.benchmark.tpcc.procedures.neworder; import org.voltdb.benchmark.tpcc.procedures.paymentByCustomerId; import org.voltdb.benchmark.tpcc.procedures.paymentByCustomerName; import org.voltdb.benchmark.tpcc.procedures.slev; import org.voltdb.catalog.Procedure; import edu.brown.BaseTestCase; import edu.brown.benchmark.AbstractProjectBuilder; import edu.brown.catalog.conflicts.ConflictSetCalculator; public class TestConflictSetCalculator extends BaseTestCase { ConflictSetCalculator cc; private final AbstractProjectBuilder builder = new TPCCProjectBuilder() { { this.addAllDefaults(); this.addStmtProcedure( "NonConflictRead", "SELECT W_ZIP FROM WAREHOUSE WHERE W_NAME = ?" ); this.addStmtProcedure( "NonConflictUpdate", "UPDATE WAREHOUSE SET W_STREET_1 = ? WHERE W_ID = ?" ); } }; @Override protected void setUp() throws Exception { super.setUp(builder); this.cc = new ConflictSetCalculator(catalog); } /** * testReadReadNonConflict */ @Test public void testReadReadNonConflict() throws Exception { Procedure proc0 = this.getProcedure("NonConflictRead"); Procedure proc1 = this.getProcedure(slev.class); boolean conflicts = !this.cc.checkReadWriteConflict(proc0, proc1).isEmpty(); assertFalse(conflicts); } /** * testReadWriteUpdateNonConflict */ @Test public void testReadWriteUpdateNonConflict() throws Exception { Procedure proc0 = this.getProcedure("NonConflictRead"); Procedure proc1 = this.getProcedure("NonConflictUpdate"); boolean conflicts = !this.cc.checkReadWriteConflict(proc0, proc1).isEmpty(); assertFalse(conflicts); } /** * testReadWriteConflict */ @Test public void testReadWriteConflict() throws Exception { Procedure proc0 = this.getProcedure(neworder.class); Procedure proc1 = this.getProcedure(slev.class); // There is no conflict between #1 and #2 boolean conflicts = !this.cc.checkReadWriteConflict(proc0, proc1).isEmpty(); assertFalse(conflicts); // But there should be one between #2 and #1 conflicts = !this.cc.checkReadWriteConflict(proc1, proc0).isEmpty(); assertTrue(conflicts); } /** * testWriteWriteConflict */ @Test public void testWriteWriteConflict() throws Exception { Procedure proc0 = this.getProcedure(paymentByCustomerId.class); Procedure proc1 = this.getProcedure(paymentByCustomerName.class); boolean conflicts = !this.cc.checkWriteWriteConflict(proc0, proc1).isEmpty(); assertTrue(conflicts); // Should be symmetrical conflicts = !this.cc.checkWriteWriteConflict(proc1, proc0).isEmpty(); assertTrue(conflicts); } /** * testAllConflicts */ @Test public void testAllConflicts() throws Exception { Procedure proc0 = this.getProcedure(neworder.class); Procedure proc1 = this.getProcedure(GetTableCounts.class); boolean conflicts; conflicts = !this.cc.checkReadWriteConflict(proc0, proc1).isEmpty(); assertFalse(conflicts); conflicts = !this.cc.checkReadWriteConflict(proc1, proc0).isEmpty(); assertTrue(conflicts); conflicts = !this.cc.checkWriteWriteConflict(proc0, proc1).isEmpty(); assertFalse(conflicts); conflicts = !this.cc.checkWriteWriteConflict(proc1, proc0).isEmpty(); assertFalse(conflicts); } }