Example #1
0
 def setUp(self):
     store = mock_store()
     lm    = LocalLocks()
     self.tm = TransactionManager(lm,store)
     root    = RootNode(self.tm,store)
     self.node = Node(root)
Example #2
0
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")