Skip to content

Commit ede9beb

Browse files
committed
Fixed several technically failing tests.
Also fixed a bug that caused mistaken use of RevTrees for EncryptedVersionVectorOption.
1 parent 7bcf85c commit ede9beb

File tree

5 files changed

+51
-16
lines changed

5 files changed

+51
-16
lines changed

C/tests/c4ObserverTest.cc

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,6 @@ class C4ObserverTest : public C4Test {
4040
}
4141
}
4242

43-
#if SkipVersionVectorTest
44-
static constexpr int numberOfOptions = 1;
45-
#else
46-
static constexpr int numberOfOptions = 2; // rev-tree, vector; no need to test encryption
47-
#endif
48-
4943
~C4ObserverTest() {
5044
c4docobs_free(docObserver);
5145
c4dbobs_free(dbObserver);

C/tests/c4Test.cc

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,7 @@ string C4Test::sReplicatorFixturesDir = "Replicator/tests/data/";
132132

133133

134134
C4Test::C4Test(int num) : _storage(kC4SQLiteStorageEngine) { // NOLINT(cppcoreguidelines-pro-type-member-init)
135-
constexpr static TestOptions numToTestOption[] = {
136-
VersionVectorOption,
137-
EncryptedVersionVectorOption
138-
};
135+
constexpr static TestOptions numToTestOption[] = {VersionVectorOption, EncryptedVersionVectorOption};
139136
static_assert(sizeof(numToTestOption) / sizeof(TestOptions) >= numberOfOptions);
140137
TestOptions testOption = numToTestOption[num];
141138

@@ -183,13 +180,14 @@ C4Test::C4Test(int num) : _storage(kC4SQLiteStorageEngine) { // NOLINT(cppcoreg
183180
objectCount = c4_getObjectCount();
184181

185182
_dbConfig = {slice(TempDir()), kC4DB_Create};
186-
if ( testOption == VersionVectorOption ) {
183+
if ( testOption == VersionVectorOption || testOption == EncryptedVersionVectorOption ) {
187184
_dbConfig.flags |= kC4DB_VersionVectors | kC4DB_FakeVectorClock;
188185
kRev1ID = kRevID = kRev1ID_Alt = C4STR("1@*");
189186
kRev2ID = C4STR("2@*");
190187
kRev3ID = C4STR("3@*");
191188
kRev4ID = C4STR("4@*");
192189
} else {
190+
Assert(false, "Unsupported option");
193191
kRev1ID = kRevID = C4STR("1-abcd");
194192
kRev1ID_Alt = C4STR("1-dcba");
195193
kRev2ID = C4STR("2-c001d00d");
@@ -327,6 +325,24 @@ void C4Test::upgradeToVersionVectors(bool fakeClock) {
327325
syncDBConfig();
328326
}
329327

328+
void C4Test::resetDBToRevTrees(C4Database*& database) {
329+
C4DatabaseConfig2 config = dbConfig();
330+
Assert((config.flags & kC4DB_VersionVectors), "db already uses Rev Trees");
331+
332+
alloc_slice name(c4db_getName(database));
333+
REQUIRE(c4db_close(database, WITH_ERROR()));
334+
c4db_release(database);
335+
database = nullptr;
336+
C4Error error{};
337+
if ( !c4db_deleteNamed(name, config.parentDirectory, ERROR_INFO(&error)) ) Require(error.code == 0);
338+
339+
C4Log("---- Reopening '%.*s' with version vectors ---", FMTSLICE(name));
340+
config.flags &= ~kC4DB_VersionVectors;
341+
config.flags &= ~kC4DB_FakeVectorClock;
342+
database = c4db_openNamed(name, &config, ERROR_INFO());
343+
REQUIRE(database);
344+
}
345+
330346
/*static*/ C4Collection* C4Test::createCollection(C4Database* db, C4CollectionSpec spec) {
331347
auto coll = c4db_createCollection(db, spec, ERROR_INFO());
332348
Require(coll);

C/tests/c4Test.hh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class C4Test {
176176
static constexpr int numberOfOptions = 2; // See nameOfOption
177177
static constexpr const char* nameOfOption[numberOfOptions] = {"VersionVector", "EncryptedVersionVector"};
178178
#else
179-
static constexpr int numberOfOptions = 1; // rev-tree
179+
static constexpr int numberOfOptions = 1; // rev-tree
180180
static constexpr const char* nameOfOption[numberOfOptions] = {"VersionVector"};
181181
#endif
182182

@@ -231,6 +231,7 @@ class C4Test {
231231
/// Closes `db`, adds `kC4DB_VersionVectors` to config, and reopens.
232232
void upgradeToVersionVectors(bool fakeClock = false);
233233
void upgradeToVersionVectors(C4Database*&, bool fakeClock = false);
234+
void resetDBToRevTrees(C4Database*&);
234235

235236
static C4Collection* createCollection(C4Database* db, C4CollectionSpec spec);
236237
static C4Collection* getCollection(C4Database* db, C4CollectionSpec spec, bool mustExist = true);

Replicator/tests/ReplicatorAPITest.cc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include "c4Internal.hh"
2323
#include "fleece/Fleece.hh"
2424
#include "SequenceSet.hh"
25+
#include "SourceID.hh"
26+
#include "VersionVector.hh"
2527

2628
using namespace fleece;
2729
using namespace std;
@@ -263,11 +265,14 @@ TEST_CASE_METHOD(ReplicatorAPITest, "API Loopback Push & Pull Deletion", "[C][Pu
263265
c4::ref<C4Document> doc = c4coll_getDoc(defaultColl, "doc"_sl, true, kDocGetAll, nullptr);
264266
REQUIRE(doc);
265267

266-
CHECK(doc->revID == kRev2ID);
268+
alloc_slice dbSourceID = c4db_getSourceID(db);
269+
auto pair = split2(string_view(slice(kRev2ID)), string_view("@"));
270+
REQUIRE(!pair.second.empty());
271+
string rev2ID = string(pair.first) + "@" + dbSourceID.asString();
272+
273+
CHECK(slice(doc->revID) == slice(rev2ID));
267274
CHECK((doc->flags & kDocDeleted) != 0);
268275
CHECK((doc->selectedRev.flags & kRevDeleted) != 0);
269-
REQUIRE(c4doc_selectParentRevision(doc));
270-
CHECK(doc->selectedRev.revID == kRevID);
271276
}
272277

273278
TEST_CASE_METHOD(ReplicatorAPITest, "Per Collection Context Documents Ended", "[Pull][Sync]") {

Replicator/tests/ReplicatorVVUpgradeTest.cc

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ class ReplicatorVVUpgradeTest : public ReplicatorLoopbackTest {
5959
upgradeToVersionVectors(db2, fakeClock);
6060
_collDB2 = createCollection(db2, _collSpec);
6161
}
62+
63+
/// Reopens both databases, enabling version vectors in both.
64+
void resetDBsToRevTrees() {
65+
resetDBToRevTrees(db);
66+
_collDB1 = createCollection(db, _collSpec);
67+
resetDBToRevTrees(db2);
68+
_collDB2 = createCollection(db2, _collSpec);
69+
syncDBConfig();
70+
}
6271
};
6372

6473
TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Push After VV Upgrade", "[Push][Upgrade]") {
@@ -69,6 +78,7 @@ TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Push After VV Upgrade", "[Push][Upgra
6978

7079
auto serverOpts = Replicator::Options::passive(_collSpec);
7180

81+
resetDBsToRevTrees();
7282
importJSONLines(sFixturesDir + "names_100.json", _collDB1);
7383
_expectedDocumentCount = 100;
7484
Log("-------- First Replication --------");
@@ -94,6 +104,7 @@ TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Pull After VV Upgrade", "[Pull][Upgra
94104
//- db updates two of the docs it pushed, and creates a new one.
95105
//- db pushes to db2 again.
96106

107+
resetDBsToRevTrees();
97108
importJSONLines(sFixturesDir + "names_100.json", _collDB1);
98109
_expectedDocumentCount = 100;
99110
Log("-------- First Replication --------");
@@ -112,6 +123,7 @@ TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Pull After VV Upgrade", "[Pull][Upgra
112123
}
113124

114125
TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Push and Pull New Docs After VV Upgrade", "[Push][Pull][Upgrade]") {
126+
resetDBsToRevTrees();
115127
populateAndSync();
116128

117129
Log("-------- Create a doc in each db --------");
@@ -127,6 +139,7 @@ TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Push and Pull New Docs After VV Upgra
127139
}
128140

129141
TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Push and Pull Existing Docs After VV Upgrade", "[Push][Pull][Upgrade]") {
142+
resetDBsToRevTrees();
130143
populateAndSync();
131144

132145
Log("-------- Update existing doc in each db --------");
@@ -188,6 +201,7 @@ TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Resolve Rev-Tree Conflicts After VV U
188201
default:
189202
throw logic_error("unreachable");
190203
}
204+
resetDBsToRevTrees();
191205

192206
DYNAMIC_SECTION("" << sectionName) {
193207
createFleeceRev(_collDB1, docName, "1-1111"_sl, "{}"_sl);
@@ -235,6 +249,8 @@ TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Resolve Mixed Conflicts After VV Upgr
235249
const alloc_slice kDoc1Rev2B = makeRealishVector("@BobBobBobBobBobBobBobA");
236250
const alloc_slice kDoc1RevRTE = makeRealishVector("@Revision+Tree+Encoding");
237251

252+
resetDBsToRevTrees();
253+
238254
createFleeceRev(_collDB1, docName, "1-1111"_sl, "{}"_sl);
239255

240256
slice winner, loser, body, resultingRevID;
@@ -364,6 +380,9 @@ TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Resolve Mixed Conflicts After VV Upgr
364380

365381
TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Resolve Conflicts After VV Upgrade", "[Conflicts][Upgrade][Pull]") {
366382
const auto docName = "test"_sl;
383+
384+
resetDBsToRevTrees();
385+
367386
upgrade();
368387
syncDBConfig();
369388

@@ -420,4 +439,4 @@ TEST_CASE_METHOD(ReplicatorVVUpgradeTest, "Resolve Conflicts After VV Upgrade",
420439
} else {
421440
CHECK(slice(finalDoc->selectedRev.revID).findByte('*'));
422441
}
423-
}
442+
}

0 commit comments

Comments
 (0)