Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(820)

Side by Side Diff: blimp/net/helium/lww_register_unittest.cc

Issue 2400303002: Add LwwRegister CRDT (Closed)
Patch Set: Refactor Serializer to use overloaded methods and add unit tests. Refactor LwwRegister to not be te… Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "blimp/net/helium/lww_register.h"
6
7 #include <string>
8
9 #include "blimp/net/helium/version_vector.h"
10 #include "blimp/net/helium/version_vector_generator.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite .h"
13
14 namespace blimp {
15 namespace {
16
17 class LwwRegisterTest : public testing::Test {
18 protected:
19 VersionVectorGenerator client_gen_;
20 VersionVectorGenerator engine_gen_;
21
22 Bias bias_;
23
24 std::unique_ptr<LwwRegister<int>> client_lww_register_;
25 std::unique_ptr<LwwRegister<int>> engine_lww_register_;
26
27 void set_bias(Bias bias) { bias_ = bias; }
28
29 LwwRegister<int>* getClient() {
30 if (client_lww_register_) {
31 return client_lww_register_.get();
32 }
33 client_lww_register_ = base::MakeUnique<LwwRegister<int>>(
34 &client_gen_, bias_, RunningAs::Client);
35 return client_lww_register_.get();
36 }
37
38 LwwRegister<int>* getEngine() {
39 if (engine_lww_register_) {
40 return engine_lww_register_.get();
41 }
42 engine_lww_register_ = base::MakeUnique<LwwRegister<int>>(
43 &engine_gen_, bias_, RunningAs::Engine);
44 return engine_lww_register_.get();
45 }
46
47 void SyncFromClient() {
48 Sync(getClient(), getEngine(), engine_gen_.current(),
49 client_gen_.current());
50 }
51
52 void SyncFromEngine() {
53 Sync(getEngine(), getClient(), client_gen_.current(),
54 engine_gen_.current());
55 }
56
57 void Sync(LwwRegister<int>* from_lww_register,
58 LwwRegister<int>* to_lww_register,
59 VersionVector from,
60 VersionVector to);
61 };
62
63 void LwwRegisterTest::Sync(LwwRegister<int>* from_lww_register,
64 LwwRegister<int>* to_lww_register,
65 VersionVector from,
66 VersionVector to) {
67 std::string changeset;
68 google::protobuf::io::StringOutputStream raw_output_stream(&changeset);
69 google::protobuf::io::CodedOutputStream output_stream(&raw_output_stream);
70
71 from_lww_register->CreateChangesetToCurrent(from.Invert(), &output_stream);
72
73 google::protobuf::io::ArrayInputStream raw_input_stream(changeset.data(),
74 changeset.size());
75 google::protobuf::io::CodedInputStream input_stream(&raw_input_stream);
76 to_lww_register->ApplyChangeset(from, to.Invert(), &input_stream);
77 }
78
79 TEST_F(LwwRegisterTest, SetSetsStateAndIncrementsLocalVersion) {
80 set_bias(Bias::ClientWins);
81 auto lww_register = getClient();
82
83 VersionVector earlier_version = client_gen_.current();
84 lww_register->Set(42);
85 VersionVector current_version = client_gen_.current();
86
87 EXPECT_EQ(42, lww_register->value());
88 EXPECT_LT(earlier_version.local_revision(), current_version.local_revision());
89 EXPECT_TRUE(lww_register->ModifiedSince(earlier_version));
90 EXPECT_FALSE(lww_register->ModifiedSince(current_version));
91 }
92
93 TEST_F(LwwRegisterTest, ApplyChangesetLaterChangesetChangesState) {
94 set_bias(Bias::ClientWins);
95 auto client = getClient();
96 auto engine = getEngine();
97
98 client->Set(123);
99 SyncFromClient();
100
101 EXPECT_EQ(123, engine->value());
102 }
103
104 TEST_F(LwwRegisterTest, ApplyChangesetEarlierChangesetDoesNotChangeState) {
105 set_bias(Bias::ClientWins);
106 auto client = getClient();
107 auto engine = getEngine();
108
109 client->Set(123);
110 SyncFromClient();
111
112 engine->Set(456);
113 SyncFromClient();
114
115 EXPECT_EQ(456, engine->value());
116 }
117
118 TEST_F(LwwRegisterTest,
119 ApplyChangesetConflictClientWinsClientDoesNotChangeState) {
120 set_bias(Bias::ClientWins);
121 auto client = getClient();
122 auto engine = getEngine();
123
124 client->Set(123);
125 engine->Set(456);
126 SyncFromEngine();
127
128 EXPECT_EQ(123, client->value());
scf 2016/10/17 22:09:51 I would always assert the state in both sides. The
steimel 2016/10/18 23:53:20 Well, at least the way it's currently working, I o
129 }
130
131 TEST_F(LwwRegisterTest, ApplyChangesetConflictClientWinsRemoteChangesState) {
132 set_bias(Bias::ClientWins);
133 auto client = getClient();
134 auto engine = getEngine();
135
136 client->Set(123);
137 engine->Set(456);
138 SyncFromClient();
139
140 EXPECT_EQ(123, engine->value());
141 }
142
143 TEST_F(LwwRegisterTest, ApplyChangesetConflictEngineWinsClientChangesState) {
144 set_bias(Bias::EngineWins);
145 auto client = getClient();
146 auto engine = getEngine();
147
148 client->Set(123);
149 engine->Set(456);
150 SyncFromEngine();
151
152 EXPECT_EQ(456, client->value());
153 }
154
155 TEST_F(LwwRegisterTest,
156 ApplyChangesetConflictEngineWinsRemoteDoesNotChangeState) {
157 set_bias(Bias::EngineWins);
158 auto client = getClient();
159 auto engine = getEngine();
160
161 client->Set(123);
162 engine->Set(456);
163 SyncFromClient();
164
165 EXPECT_EQ(456, engine->value());
166 }
167
168 } // namespace
169 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698