Skip to content

Commit 54849d0

Browse files
authored
Fix flaky bundle tests. (#547)
* Ensure progress updates are all received. * Fix flaky bundle tests.
1 parent 8c60e5a commit 54849d0

File tree

1 file changed

+32
-6
lines changed

1 file changed

+32
-6
lines changed

firestore/integration_test_internal/src/bundle_test.cc

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ std::string CreateTestBundle(Firestore* db) {
6565
return CreateBundle(db->app()->options().project_id());
6666
}
6767

68+
void SetPromiseValueWhenUpdateIsFinal(
69+
LoadBundleTaskProgress progress,
70+
std::promise<void>& final_update_received) {
71+
if (progress.state() == LoadBundleTaskProgress::State::kError ||
72+
progress.state() == LoadBundleTaskProgress::State::kSuccess) {
73+
final_update_received.set_value();
74+
}
75+
}
76+
6877
class BundleTest : public FirestoreIntegrationTest {
6978
protected:
7079
void SetUp() override {
@@ -133,15 +142,19 @@ TEST_F(BundleTest, CanLoadBundlesWithProgressUpdates) {
133142
auto bundle = CreateTestBundle(db);
134143

135144
std::vector<LoadBundleTaskProgress> progresses;
145+
std::promise<void> final_update;
136146
Future<LoadBundleTaskProgress> result = db->LoadBundle(
137-
bundle, [&progresses](const LoadBundleTaskProgress& progress) {
147+
bundle,
148+
[&progresses, &final_update](const LoadBundleTaskProgress& progress) {
138149
progresses.push_back(progress);
150+
SetPromiseValueWhenUpdateIsFinal(progress, final_update);
139151
});
140152

141153
auto final_progress = AwaitResult(result);
142154

143155
// 4 progresses will be reported: initial, document 1, document 2, final
144156
// success.
157+
final_update.get_future().wait();
145158
ASSERT_EQ(progresses.size(), 4);
146159
EXPECT_THAT(progresses[0], InProgressWithLoadedDocuments(0));
147160
EXPECT_THAT(progresses[1], InProgressWithLoadedDocuments(1));
@@ -195,12 +208,16 @@ TEST_F(BundleTest, LoadBundlesForASecondTimeSkips) {
195208
VerifySuccessProgress(first_load);
196209

197210
std::vector<LoadBundleTaskProgress> progresses;
211+
std::promise<void> final_update;
198212
LoadBundleTaskProgress second_load = AwaitResult(db->LoadBundle(
199-
bundle, [&progresses](const LoadBundleTaskProgress& progress) {
213+
bundle,
214+
[&progresses, &final_update](const LoadBundleTaskProgress& progress) {
200215
progresses.push_back(progress);
216+
SetPromiseValueWhenUpdateIsFinal(progress, final_update);
201217
}));
202218

203219
// There will be 4 progress updates if it does not skip loading.
220+
final_update.get_future().wait();
204221
ASSERT_EQ(progresses.size(), 1);
205222
VerifySuccessProgress(progresses[0]);
206223
EXPECT_EQ(progresses[0], second_load);
@@ -220,13 +237,18 @@ TEST_F(BundleTest, LoadInvalidBundlesShouldFail) {
220237
};
221238
for (const auto& bundle : invalid_bundles) {
222239
std::vector<LoadBundleTaskProgress> progresses;
240+
std::promise<void> final_update;
223241
Future<LoadBundleTaskProgress> result = db->LoadBundle(
224-
bundle, [&progresses](const LoadBundleTaskProgress& progress) {
242+
bundle,
243+
[&progresses, &final_update](const LoadBundleTaskProgress& progress) {
225244
progresses.push_back(progress);
245+
SetPromiseValueWhenUpdateIsFinal(progress, final_update);
226246
});
227-
Await(result);
228247

248+
Await(result);
229249
EXPECT_NE(result.error(), Error::kErrorOk);
250+
251+
final_update.get_future().wait();
230252
ASSERT_EQ(progresses.size(), 1);
231253
VerifyErrorProgress(progresses[0]);
232254
}
@@ -306,13 +328,17 @@ TEST_F(BundleTest, LoadDocumentsFromOtherProjectsShouldFail) {
306328
Firestore* db = TestFirestore();
307329
auto bundle = CreateBundle("other-project");
308330
std::vector<LoadBundleTaskProgress> progresses;
331+
std::promise<void> final_update;
309332
Future<LoadBundleTaskProgress> result = db->LoadBundle(
310-
bundle, [&progresses](const LoadBundleTaskProgress& progress) {
333+
bundle,
334+
[&progresses, &final_update](const LoadBundleTaskProgress& progress) {
311335
progresses.push_back(progress);
336+
SetPromiseValueWhenUpdateIsFinal(progress, final_update);
312337
});
313338
Await(result);
314-
315339
EXPECT_NE(result.error(), Error::kErrorOk);
340+
341+
final_update.get_future().wait();
316342
ASSERT_EQ(progresses.size(), 2);
317343
EXPECT_THAT(progresses[0], InProgressWithLoadedDocuments(0));
318344
VerifyErrorProgress(progresses[1]);

0 commit comments

Comments
 (0)