19
19
from u1db import tests, vectorclock
22
from u1db.tests import c_backend_wrapper
24
c_backend_wrapper = None
27
c_vectorclock_scenarios = []
28
if c_backend_wrapper is not None:
29
c_vectorclock_scenarios.append(
30
('c', {'create_vcr': c_backend_wrapper.VectorClockRev}))
22
33
class TestVectorClockRev(tests.TestCase):
35
scenarios = [('py', {'create_vcr': vectorclock.VectorClockRev})
36
] + c_vectorclock_scenarios
24
38
def assertIsNewer(self, newer_rev, older_rev):
25
new_vcr = vectorclock.VectorClockRev(newer_rev)
26
old_vcr = vectorclock.VectorClockRev(older_rev)
39
new_vcr = self.create_vcr(newer_rev)
40
old_vcr = self.create_vcr(older_rev)
27
41
self.assertTrue(new_vcr.is_newer(old_vcr))
28
42
self.assertFalse(old_vcr.is_newer(new_vcr))
30
44
def assertIsConflicted(self, rev_a, rev_b):
31
vcr_a = vectorclock.VectorClockRev(rev_a)
32
vcr_b = vectorclock.VectorClockRev(rev_b)
45
vcr_a = self.create_vcr(rev_a)
46
vcr_b = self.create_vcr(rev_b)
33
47
self.assertFalse(vcr_a.is_newer(vcr_b))
34
48
self.assertFalse(vcr_b.is_newer(vcr_a))
36
50
def test__is_newer_doc_rev(self):
37
51
self.assertIsNewer('test:1', None)
38
52
self.assertIsNewer('test:2', 'test:1')
39
self.assertIsNewer('test:1|other:2', 'test:1|other:1')
40
self.assertIsNewer('test:1|other:1', 'other:1')
41
self.assertIsConflicted('test:1|other:2', 'test:2|other:1')
42
self.assertIsConflicted('test:1|other:1', 'other:2')
53
self.assertIsNewer('other:2|test:1', 'other:1|test:1')
54
self.assertIsNewer('other:1|test:1', 'other:1')
55
self.assertIsConflicted('other:2|test:1', 'other:1|test:2')
56
self.assertIsConflicted('other:1|test:1', 'other:2')
43
57
self.assertIsConflicted('test:1', 'test:1')
45
59
def test_None(self):
46
vcr = vectorclock.VectorClockRev(None)
60
vcr = self.create_vcr(None)
47
61
self.assertEqual('', vcr.as_str())
49
63
def assertIncrement(self, original, replica_uid, after_increment):
50
vcr = vectorclock.VectorClockRev(original)
64
vcr = self.create_vcr(original)
51
65
vcr.increment(replica_uid)
52
66
self.assertEqual(after_increment, vcr.as_str())
54
68
def test_increment(self):
55
69
self.assertIncrement(None, 'test', 'test:1')
56
70
self.assertIncrement('test:1', 'test', 'test:2')
72
def test_increment_adds_uid(self):
57
73
self.assertIncrement('other:1', 'test', 'other:1|test:1')
74
self.assertIncrement('a:1|ab:2', 'aa', 'a:1|aa:1|ab:2')
76
def test_increment_update_partial(self):
77
self.assertIncrement('a:1|ab:2', 'a', 'a:2|ab:2')
78
self.assertIncrement('a:2|ab:2', 'ab', 'a:2|ab:3')
80
def test_increment_appends_uid(self):
81
self.assertIncrement('b:2', 'c', 'b:2|c:1')
59
83
def assertMaximize(self, rev1, rev2, maximized):
60
vcr1 = vectorclock.VectorClockRev(rev1)
61
vcr2 = vectorclock.VectorClockRev(rev2)
84
vcr1 = self.create_vcr(rev1)
85
vcr2 = self.create_vcr(rev2)
62
86
vcr1.maximize(vcr2)
63
87
self.assertEqual(maximized, vcr1.as_str())
64
88
# reset vcr1 to maximize the other way
65
vcr1 = vectorclock.VectorClockRev(rev1)
89
vcr1 = self.create_vcr(rev1)
66
90
vcr2.maximize(vcr1)
67
91
self.assertEqual(maximized, vcr2.as_str())