def test_suspend_multi(self): (doc, rev1, rev_s1) = self.createSuspendDoc() with Connector().update(self.store1, doc, rev1) as w: w.writeAll('FILE', 'forward') w.commit() rev2 = w.getRev() with Connector().update(self.store1, doc, rev2) as w: w.writeAll('FILE', 'Hail to the king, baby!') w.suspend() rev_s2 = w.getRev() l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev2]) self.assertEqual(len(l.preRevs()), 2) self.assertTrue(rev_s1 in l.preRevs()) self.assertTrue(rev_s2 in l.preRevs()) s = Connector().stat(rev_s1) self.assertEqual(s.parents(), [rev1]) s = Connector().stat(rev_s2) self.assertEqual(s.parents(), [rev2]) self.assertRevContent(self.store1, rev1, {'FILE' : 'ok'}) self.assertRevContent(self.store1, rev_s1, {'FILE' : 'update'}) self.assertRevContent(self.store1, rev2, {'FILE' : 'forward'}) self.assertRevContent(self.store1, rev_s2, {'FILE' : 'Hail to the king, baby!'})
def test_transitive_keep(self): with Connector().create(self.store1, "public.data", "test.ignore") as w1: with Connector().create(self.store1, "public.data", "test.ignore") as w2: w2.write('FILE', 'test') w2.commit() doc2 = w2.getDoc() rev2 = w2.getRev() # create a reference from w1 to w2 w1.write('PDSD', struct.dumps([struct.DocLink(self.store2, doc2)])) w1.commit() doc1 = w1.getDoc() rev1 = w1.getRev() # w2 is closed now, w1 still open, should prevent gc self.gc(self.store1) l = Connector().lookupDoc(doc1) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), []) self.assertEqual(Connector().lookupRev(rev1), [self.store1]) l = Connector().lookupDoc(doc2) self.assertEqual(l.revs(), [rev2]) self.assertEqual(l.preRevs(), []) self.assertEqual(Connector().lookupRev(rev2), [self.store1])
def test_suspend(self): (doc, rev1, rev2) = self.createSuspendDoc() l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) self.assertRevContent(self.store1, rev1, {'FILE' : 'ok'}) self.assertRevContent(self.store1, rev2, {'FILE' : 'update'})
def test_resume_abort(self): (doc, rev1, rev2) = self.createSuspendDoc() with Connector().resume(self.store1, doc, rev2) as w: w.writeAll('FILE', 'Hail to the king, baby!') l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) w.close() l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) self.assertRevContent(self.store1, rev1, {'FILE' : 'ok'}) self.assertRevContent(self.store1, rev2, {'FILE' : 'update'})
def test_resume_wrong(self): (doc, rev1, rev2) = self.createSuspendDoc() self.assertRaises(IOError, Connector().resume, self.store1, doc, rev1) l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev2]) self.assertRevContent(self.store1, rev1, {'FILE' : 'ok'}) self.assertRevContent(self.store1, rev2, {'FILE' : 'update'})
def test_create_keep_handle(self): with Connector().create(self.store1, "public.data", "test.ignore") as w: w.commit() doc = w.getDoc() rev = w.getRev() # perform a GC cycle self.gc(self.store1) l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev]) self.assertEqual(l.preRevs(), []) Connector().stat(rev)
def test_collect(self): # deliberately close handle after creating! with Connector().create(self.store1, "public.data", "test.ignore") as w: w.commit() doc = w.getDoc() rev = w.getRev() # perform a GC cycle self.gc(self.store1) l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), []) self.assertEqual(l.preRevs(), []) self.assertRaises(IOError, Connector().stat, rev)
def test_resume_suspend_orig(self): (doc, rev1, rev2) = self.createSuspendDoc() with Connector().resume(self.store1, doc, rev2) as w: w.suspend() rev3 = w.getRev() l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev3]) s = Connector().stat(rev3) self.assertEqual(s.parents(), [rev1]) self.assertRevContent(self.store1, rev1, {'FILE' : 'ok'}) self.assertRevContent(self.store1, rev3, {'FILE' : 'update'})
def test_resume_commit(self): (doc, rev1, rev2) = self.createSuspendDoc() with Connector().resume(self.store1, doc, rev2) as w: w.writeAll('FILE', 'What are you waiting for, christmas?') w.commit() rev3 = w.getRev() l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev3]) self.assertEqual(len(l.preRevs()), 0) s = Connector().stat(rev3) self.assertEqual(s.parents(), [rev1]) self.assertRevContent(self.store1, rev1, {'FILE' : 'ok'}) self.assertRevContent(self.store1, rev3, {'FILE' : 'What are you waiting for, christmas?'})
def test_resume_suspend_mod(self): (doc, rev1, rev2) = self.createSuspendDoc() with Connector().resume(self.store1, doc, rev2) as w: w.writeAll("FILE", "What are you waiting for, christmas?") w.suspend() rev3 = w.getRev() l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev1]) self.assertEqual(l.preRevs(), [rev3]) s = Connector().stat(rev3) self.assertEqual(s.parents(), [rev1]) self.assertRevContent(self.store1, rev1, {"FILE": "ok"}) self.assertRevContent(self.store1, rev3, {"FILE": "What are you waiting for, christmas?"})
def test_forget(self): (doc, rev1, rev_s1) = self.createSuspendDoc() with Connector().update(self.store1, doc, rev1) as w: w.writeAll('FILE', 'forward') w.commit() rev2 = w.getRev() with Connector().update(self.store1, doc, rev2) as w: w.writeAll('FILE', 'Hail to the king, baby!') w.suspend() rev_s2 = w.getRev() self.assertRaises(IOError, Connector().forget, self.store1, doc, rev1) Connector().forget(self.store1, doc, rev_s1) l = Connector().lookupDoc(doc) self.assertEqual(l.revs(), [rev2]) self.assertEqual(l.preRevs(), [rev_s2])
def test_fork_keep_handle(self): w = self.create(self.store1, "test.format.foo") self.assertEqual(w.getType(), "test.format.foo") w.commit() doc1 = w.getDoc() rev1 = w.getRev() with Connector().fork(self.store1, rev1, "test.ignore") as w: w.write('FILE', 'update') w.commit() doc2 = w.getDoc() rev2 = w.getRev() # perform a GC cycle self.gc(self.store1) l = Connector().lookupDoc(doc2) self.assertEqual(l.revs(), [rev2]) self.assertEqual(l.preRevs(), []) Connector().stat(rev2)