Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 | |
| 13 namespace blimp { | |
| 14 namespace { | |
| 15 | |
| 16 class LwwRegisterTest : public testing::Test { | |
|
Kevin M
2016/10/13 22:03:36
This has too many helper functions :\
steimel
2016/10/17 21:46:00
Done.
| |
| 17 public: | |
| 18 void SetUp() override { | |
| 19 local_gen_ = base::MakeUnique<VersionVectorGenerator>(); | |
| 20 remote_gen_ = base::MakeUnique<VersionVectorGenerator>(); | |
| 21 local_client_wins_lww_register_ = | |
| 22 base::MakeUnique<LwwRegister<int, Bias::ClientWins>>(local_gen_.get(), | |
| 23 RunningAs::Client); | |
| 24 remote_client_wins_lww_register_ = | |
| 25 base::MakeUnique<LwwRegister<int, Bias::ClientWins>>(remote_gen_.get(), | |
| 26 RunningAs::Engine); | |
| 27 local_engine_wins_lww_register_ = | |
| 28 base::MakeUnique<LwwRegister<int, Bias::EngineWins>>(local_gen_.get(), | |
| 29 RunningAs::Client); | |
| 30 remote_engine_wins_lww_register_ = | |
| 31 base::MakeUnique<LwwRegister<int, Bias::EngineWins>>(remote_gen_.get(), | |
| 32 RunningAs::Engine); | |
| 33 } | |
| 34 | |
| 35 protected: | |
| 36 std::unique_ptr<VersionVectorGenerator> local_gen_; | |
|
Kevin M
2016/10/13 22:03:36
Why are these unique ptrs instead of just declared
Kevin M
2016/10/13 22:03:36
"Local" and "remote"? Can we be consistent with "c
steimel
2016/10/17 21:46:00
Done.
| |
| 37 std::unique_ptr<VersionVectorGenerator> remote_gen_; | |
| 38 | |
| 39 std::unique_ptr<LwwRegister<int, Bias::ClientWins>> | |
| 40 local_client_wins_lww_register_; | |
| 41 std::unique_ptr<LwwRegister<int, Bias::ClientWins>> | |
| 42 remote_client_wins_lww_register_; | |
| 43 std::unique_ptr<LwwRegister<int, Bias::EngineWins>> | |
| 44 local_engine_wins_lww_register_; | |
| 45 std::unique_ptr<LwwRegister<int, Bias::EngineWins>> | |
| 46 remote_engine_wins_lww_register_; | |
| 47 | |
| 48 template <Bias bias> | |
| 49 LwwRegister<int, bias>* getLwwRegister(RunningAs running_as); | |
|
Kevin M
2016/10/13 22:03:36
Why don't we just declare protected LwwRegister fi
steimel
2016/10/17 21:45:59
Done.
| |
| 50 | |
| 51 template <Bias bias> | |
| 52 LwwRegister<int, bias>* getClient() { | |
| 53 return getLwwRegister<bias>(RunningAs::Client); | |
| 54 } | |
| 55 | |
| 56 template <Bias bias> | |
| 57 LwwRegister<int, bias>* getEngine() { | |
| 58 return getLwwRegister<bias>(RunningAs::Engine); | |
| 59 } | |
| 60 | |
| 61 VersionVectorGenerator* getVersionGenerator(RunningAs running_as) { | |
|
Kevin M
2016/10/13 22:03:36
Helper fn isn't necessary; just have test code cal
steimel
2016/10/17 21:46:00
Done.
| |
| 62 switch (running_as) { | |
| 63 case RunningAs::Client: | |
| 64 return local_gen_.get(); | |
| 65 case RunningAs::Engine: | |
| 66 return remote_gen_.get(); | |
| 67 } | |
| 68 } | |
| 69 | |
| 70 template <Bias bias> | |
|
Kevin M
2016/10/13 22:03:36
This can be simplified as
template <typename From
| |
| 71 void SyncFromClient(); | |
| 72 | |
| 73 template <Bias bias> | |
| 74 void SyncFromEngine(); | |
| 75 | |
| 76 template <Bias bias> | |
| 77 void Sync(LwwRegister<int, bias>* from_lww_register, | |
| 78 LwwRegister<int, bias>* to_lww_register, | |
| 79 VersionVector from, | |
| 80 VersionVector to); | |
| 81 }; | |
| 82 | |
| 83 template <> | |
| 84 LwwRegister<int, Bias::ClientWins>* LwwRegisterTest::getLwwRegister( | |
| 85 RunningAs running_as) { | |
| 86 switch (running_as) { | |
| 87 case RunningAs::Client: | |
| 88 return local_client_wins_lww_register_.get(); | |
| 89 case RunningAs::Engine: | |
| 90 return remote_client_wins_lww_register_.get(); | |
| 91 } | |
| 92 } | |
| 93 | |
| 94 template <> | |
| 95 LwwRegister<int, Bias::EngineWins>* LwwRegisterTest::getLwwRegister( | |
| 96 RunningAs running_as) { | |
| 97 switch (running_as) { | |
| 98 case RunningAs::Client: | |
| 99 return local_engine_wins_lww_register_.get(); | |
| 100 case RunningAs::Engine: | |
| 101 return remote_engine_wins_lww_register_.get(); | |
| 102 } | |
| 103 } | |
| 104 | |
| 105 template <Bias bias> | |
| 106 void LwwRegisterTest::SyncFromClient() { | |
| 107 Sync<bias>(getClient<bias>(), getEngine<bias>(), | |
| 108 getVersionGenerator(RunningAs::Engine)->current(), | |
| 109 getVersionGenerator(RunningAs::Client)->current()); | |
| 110 } | |
| 111 | |
| 112 template <Bias bias> | |
| 113 void LwwRegisterTest::SyncFromEngine() { | |
| 114 Sync<bias>(getEngine<bias>(), getClient<bias>(), | |
| 115 getVersionGenerator(RunningAs::Client)->current(), | |
| 116 getVersionGenerator(RunningAs::Engine)->current()); | |
| 117 } | |
| 118 | |
| 119 template <Bias bias> | |
| 120 void LwwRegisterTest::Sync(LwwRegister<int, bias>* from_lww_register, | |
| 121 LwwRegister<int, bias>* to_lww_register, | |
| 122 VersionVector from, | |
| 123 VersionVector to) { | |
| 124 std::string changeset; | |
| 125 google::protobuf::io::StringOutputStream output_stream(&changeset); | |
| 126 from_lww_register->CreateChangesetToCurrent(from.Invert(), &output_stream); | |
| 127 | |
| 128 google::protobuf::io::ArrayInputStream input_stream(changeset.data(), | |
| 129 changeset.size()); | |
| 130 to_lww_register->ApplyChangeset(from, to.Invert(), &input_stream); | |
| 131 } | |
| 132 | |
| 133 TEST_F(LwwRegisterTest, SetSetsStateAndIncrementsLocalVersion) { | |
| 134 auto lww_register = getLwwRegister<Bias::ClientWins>(RunningAs::Client); | |
| 135 auto version_gen = getVersionGenerator(RunningAs::Client); | |
| 136 | |
| 137 VersionVector earlier_version = version_gen->current(); | |
| 138 lww_register->Set(42); | |
| 139 VersionVector current_version = version_gen->current(); | |
| 140 | |
| 141 EXPECT_EQ(42, lww_register->get()); | |
| 142 EXPECT_LT(earlier_version.local_revision(), current_version.local_revision()); | |
| 143 EXPECT_TRUE(lww_register->ModifiedSince(earlier_version)); | |
| 144 EXPECT_FALSE(lww_register->ModifiedSince(current_version)); | |
| 145 } | |
| 146 | |
| 147 TEST_F(LwwRegisterTest, CreateChangesetToCurrentReturnsMessageWithState) { | |
| 148 auto lww_register = getLwwRegister<Bias::ClientWins>(RunningAs::Client); | |
| 149 auto other_version_gen = getVersionGenerator(RunningAs::Engine); | |
| 150 | |
| 151 lww_register->Set(1992); | |
| 152 | |
| 153 std::string changeset; | |
| 154 google::protobuf::io::StringOutputStream output_stream(&changeset); | |
| 155 lww_register->CreateChangesetToCurrent(other_version_gen->current().Invert(), | |
| 156 &output_stream); | |
| 157 | |
| 158 EXPECT_EQ("1992", changeset); | |
| 159 } | |
| 160 | |
| 161 TEST_F(LwwRegisterTest, ApplyChangesetLaterChangesetChangesState) { | |
| 162 auto client = getClient<Bias::ClientWins>(); | |
| 163 auto engine = getEngine<Bias::ClientWins>(); | |
| 164 | |
| 165 client->Set(123); | |
| 166 | |
| 167 SyncFromClient<Bias::ClientWins>(); | |
| 168 | |
| 169 EXPECT_EQ(123, engine->get()); | |
| 170 } | |
| 171 | |
| 172 TEST_F(LwwRegisterTest, ApplyChangesetEarlierChangesetDoesNotChangeState) { | |
| 173 auto client = getClient<Bias::ClientWins>(); | |
| 174 auto engine = getEngine<Bias::ClientWins>(); | |
| 175 | |
| 176 client->Set(123); | |
| 177 SyncFromClient<Bias::ClientWins>(); | |
| 178 | |
| 179 engine->Set(456); | |
| 180 SyncFromClient<Bias::ClientWins>(); | |
| 181 | |
| 182 EXPECT_EQ(456, engine->get()); | |
| 183 } | |
| 184 | |
| 185 TEST_F(LwwRegisterTest, | |
| 186 ApplyChangesetConflictClientWinsClientDoesNotChangeState) { | |
| 187 auto client = getClient<Bias::ClientWins>(); | |
| 188 auto engine = getEngine<Bias::ClientWins>(); | |
| 189 | |
| 190 client->Set(123); | |
| 191 engine->Set(456); | |
| 192 SyncFromEngine<Bias::ClientWins>(); | |
| 193 | |
| 194 EXPECT_EQ(123, client->get()); | |
| 195 } | |
| 196 | |
| 197 TEST_F(LwwRegisterTest, ApplyChangesetConflictClientWinsRemoteChangesState) { | |
| 198 auto client = getClient<Bias::ClientWins>(); | |
| 199 auto engine = getEngine<Bias::ClientWins>(); | |
| 200 | |
| 201 client->Set(123); | |
| 202 engine->Set(456); | |
| 203 SyncFromClient<Bias::ClientWins>(); | |
| 204 | |
| 205 EXPECT_EQ(123, engine->get()); | |
| 206 } | |
| 207 | |
| 208 TEST_F(LwwRegisterTest, ApplyChangesetConflictEngineWinsClientChangesState) { | |
| 209 auto client = getClient<Bias::EngineWins>(); | |
| 210 auto engine = getEngine<Bias::EngineWins>(); | |
| 211 | |
| 212 client->Set(123); | |
| 213 engine->Set(456); | |
| 214 SyncFromEngine<Bias::EngineWins>(); | |
| 215 | |
| 216 EXPECT_EQ(456, client->get()); | |
| 217 } | |
| 218 | |
| 219 TEST_F(LwwRegisterTest, | |
| 220 ApplyChangesetConflictEngineWinsRemoteDoesNotChangeState) { | |
| 221 auto client = getClient<Bias::EngineWins>(); | |
| 222 auto engine = getEngine<Bias::EngineWins>(); | |
| 223 | |
| 224 client->Set(123); | |
| 225 engine->Set(456); | |
| 226 SyncFromClient<Bias::EngineWins>(); | |
| 227 | |
| 228 EXPECT_EQ(456, engine->get()); | |
| 229 } | |
| 230 | |
| 231 } // namespace | |
| 232 } // namespace blimp | |
| OLD | NEW |