@@ -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+
6877class 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