forked from rethinkdb/rethinkdb
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvector_clocks.cc
More file actions
72 lines (52 loc) · 2.07 KB
/
vector_clocks.cc
File metadata and controls
72 lines (52 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2010-2012 RethinkDB, all rights reserved.
#include "containers/uuid.hpp"
#include "rpc/semilattice/joins/vclock.hpp"
#include "unittest/gtest.hpp"
#include "utils.hpp"
namespace unittest {
TEST(VectorClock, Construction) {
vclock_t<int> blank; //contains an unitialized value
ASSERT_FALSE(blank.in_conflict());
uuid_u machine1 = generate_uuid();
vclock_t<int> val(0, machine1);
ASSERT_FALSE(val.in_conflict());
semilattice_join(&blank, val);
ASSERT_FALSE(blank.in_conflict());
ASSERT_EQ(blank.get(), 0);
}
TEST(VectorClock, NewVersion) {
vclock_t<int> val;
uuid_u machine1 = generate_uuid(), machine2 = generate_uuid(),
machine3 = generate_uuid(), machine4 = generate_uuid();
semilattice_join(&val, val.make_new_version(1, machine1));
ASSERT_EQ(val.get(), 1);
semilattice_join(&val, val.make_new_version(2, machine2));
ASSERT_EQ(val.get(), 2);
semilattice_join(&val, val.make_new_version(3, machine3));
ASSERT_EQ(val.get(), 3);
vclock_t<int> change = val;
change.get_mutable() = 4;
change.upgrade_version(machine4);
semilattice_join(&val, change);
ASSERT_EQ(val.get(), 4);
}
TEST(VectorClock, Conflict) {
uuid_u machine1 = generate_uuid(), machine2 = generate_uuid();
vclock_t<int> m_1s_opinion(1, machine1);
vclock_t<int> m_2s_opinion(2, machine2);
vclock_t<int> merge;
semilattice_join(&merge, m_1s_opinion);
semilattice_join(&merge, m_2s_opinion);
ASSERT_TRUE(merge.in_conflict());
//make sure conflicted things throw on gets
ASSERT_THROW(merge.get(), in_conflict_exc_t);
ASSERT_THROW(merge.get_mutable(), in_conflict_exc_t);
ASSERT_THROW(merge.make_new_version(3, machine2), in_conflict_exc_t);
ASSERT_THROW(merge.upgrade_version(machine2), in_conflict_exc_t);
uuid_u resolving_machine = generate_uuid();
vclock_t<int> resolution = merge.make_resolving_version(3, resolving_machine);
semilattice_join(&merge, resolution);
ASSERT_FALSE(merge.in_conflict());
ASSERT_EQ(merge.get(), 3);
}
} //namespace unittest