def setUp(self): store = mock_store() lm = LocalLocks() self.tm = TransactionManager(lm,store) root = RootNode(self.tm,store) self.node = Node(root)
class TransactionManagerTest(unittest.TestCase): def setUp(self): store = mock_store() lm = LocalLocks() self.tm = TransactionManager(lm,store) root = RootNode(self.tm,store) self.node = Node(root) def testauto_commit(self): self.assertFalse(self.tm.commited) x = self.tm.start_write(self.node) self.assertFalse(self.tm.commited) self.tm.end_write(self.node,x) self.assertTrue(self.tm.commited) def testmanual_commit(self): self.assertFalse(self.tm.commited) x = self.tm.begin_xaction() self.assertFalse(self.tm.commited) y = self.tm.start_write(self.node) self.assertFalse(self.tm.commited) self.tm.end_write(self.node,y) self.assertFalse(self.tm.commited) self.tm.commit_xaction(x) self.assertTrue(self.tm.commited) def test_recursive_lock(self): self.assertFalse(self.tm.commited) self.assertFalse(self.tm.commited) x= self.tm.start_write(self.node) self.assertFalse(self.tm.commited) y=self.tm.start_write(self.node) self.assertFalse(self.tm.commited) self.tm.end_write(self.node,y) self.assertFalse(self.tm.commited) self.tm.end_write(self.node,x) self.assertTrue(self.tm.commited) def test_rw_conflict(self): def writer(): self.tm.start_write(self.node) self.gotlock = True x=self.tm.begin_xaction() y=self.tm.start_read(self.node) self.gotlock= False thread.start_new_thread(writer,()) time.sleep(1) self.assertFalse(self.gotlock) self.tm.end_read(self.node,y) time.sleep(1) self.assertFalse(self.gotlock) self.tm.commit_xaction(x) time.sleep(1) self.assertTrue(self.gotlock) def test_ww_conflict(self): def writer(): self.tm.start_write(self.node) self.gotlock = True x=self.tm.begin_xaction() y=self.tm.start_write(self.node) self.gotlock= False thread.start_new_thread(writer,()) time.sleep(1) self.assertFalse(self.gotlock) self.tm.end_write(self.node,y) time.sleep(1) self.assertFalse(self.gotlock) self.tm.commit_xaction(x) time.sleep(1) self.assertTrue(self.gotlock) def test_wr_conflict(self): def reader(): self.tm.start_read(self.node) self.gotlock = True x=self.tm.begin_xaction() y=self.tm.start_write(self.node) self.gotlock= False thread.start_new_thread(reader,()) time.sleep(1) self.assertFalse(self.gotlock) self.tm.end_write(self.node,y) time.sleep(1) self.assertFalse(self.gotlock) self.tm.commit_xaction(x) time.sleep(1) self.assertTrue(self.gotlock) def test_autoabort(self): def _dotest(): with WriteLock(self.node): self.node.fail_update() self.assertRaises(ValueError, _dotest) self.assertEquals(self.tm.state , "xaction_aborted") def test_noautoabort_manual_xaction(self): def _dotest(): with WriteLock(self.node): self.node.fail_update() x=self.tm.begin_xaction() self.assertRaises(ValueError, _dotest) self.assertNotEquals(self.tm.state , "xaction_aborted") self.tm.commit_xaction(x) self.assertEquals(self.tm.state , "xaction_commited") self.assertTrue(self.tm.commited) def test_manual_abort(self): self.assertFalse(self.tm.commited) x=self.tm.begin_xaction() self.assertFalse(self.tm.commited) y=self.tm.start_write(self.node) self.assertFalse(self.tm.commited) self.tm.end_write(self.node,y) self.assertFalse(self.tm.commited) self.tm.abort_xaction(x) self.assertFalse(self.tm.commited) self.assertEquals(self.tm.state , "xaction_aborted") self.assertEquals(self.tm.xaction.count,0) def test_exception_during_commit(self): self.node.fail_write = True self.assertFalse(self.tm.commited) x = self.tm.start_write(self.node) self.assertFalse(self.tm.commited) self.assertRaises(TestError,self.tm.end_write,self.node,x) self.assertEquals(self.tm.state , "xaction_aborted")