30
30
const int kTimeoutMs = 5000 ;
31
31
const int kSleepMs = 100 ;
32
32
33
- // Wait for a Future to be completed. If the Future returns an error, it will
34
- // be logged.
35
- void Await (const firebase::FutureBase& future, const char * name) {
33
+ // Waits for a Future to be completed and returns whether the future has
34
+ // completed successfully. If the Future returns an error, it will be logged.
35
+ bool Await (const firebase::FutureBase& future, const char * name) {
36
36
int remaining_timeout = kTimeoutMs ;
37
37
while (future.status () == firebase::kFutureStatusPending &&
38
38
remaining_timeout > 0 ) {
@@ -42,10 +42,13 @@ void Await(const firebase::FutureBase& future, const char* name) {
42
42
43
43
if (future.status () != firebase::kFutureStatusComplete ) {
44
44
LogMessage (" ERROR: %s returned an invalid result." , name);
45
+ return false ;
45
46
} else if (future.error () != 0 ) {
46
47
LogMessage (" ERROR: %s returned error %d: %s" , name, future.error (),
47
48
future.error_message ());
49
+ return false ;
48
50
}
51
+ return true ;
49
52
}
50
53
51
54
class Countable {
@@ -124,11 +127,11 @@ extern "C" int common_main(int argc, const char* argv[]) {
124
127
// Auth caches the previously signed-in user, which can be annoying when
125
128
// trying to test for sign-in failures.
126
129
auth->SignOut ();
127
- auto future_login = auth->SignInAnonymously ();
128
- Await (future_login , " Auth sign-in" );
129
- auto * future_login_result = future_login .result ();
130
- if (future_login_result && *future_login_result ) {
131
- const firebase::auth::User* user = *future_login_result ;
130
+ auto login_future = auth->SignInAnonymously ();
131
+ Await (login_future , " Auth sign-in" );
132
+ auto * login_result = login_future .result ();
133
+ if (login_result && *login_result ) {
134
+ const firebase::auth::User* user = *login_result ;
132
135
LogMessage (" Signed in as %s user, uid: %s, email: %s.\n " ,
133
136
user->is_anonymous () ? " an anonymous" : " a non-anonymous" ,
134
137
user->uid ().c_str (), user->email ().c_str ());
@@ -138,7 +141,7 @@ extern "C" int common_main(int argc, const char* argv[]) {
138
141
139
142
// Note: Auth cannot be deleted while any of the futures issued by it are
140
143
// still valid.
141
- future_login .Release ();
144
+ login_future .Release ();
142
145
143
146
LogMessage (" Initialize Firebase Firestore." );
144
147
@@ -170,7 +173,7 @@ extern "C" int common_main(int argc, const char* argv[]) {
170
173
}
171
174
LogMessage (" Successfully initialized Firebase Firestore." );
172
175
173
- firestore->set_log_level (firebase::LogLevel:: kLogLevelWarning );
176
+ firestore->set_log_level (firebase::kLogLevelDebug );
174
177
175
178
if (firestore->app () != app) {
176
179
LogMessage (" ERROR: failed to get App the Firestore was created with." );
@@ -219,28 +222,20 @@ extern "C" int common_main(int argc, const char* argv[]) {
219
222
}
220
223
221
224
LogMessage (" Testing Set()." );
222
- auto setResult = document.Set (firebase::firestore::MapFieldValue{
223
- {" str" , firebase::firestore::FieldValue::String (" foo" )},
224
- {" int" , firebase::firestore::FieldValue::Integer (123LL )}});
225
- Await (setResult, " document.Set" );
226
- if (setResult.status () != firebase::kFutureStatusComplete ) {
227
- LogMessage (" ERROR: failed to write document." );
228
- }
225
+ Await (document.Set (firebase::firestore::MapFieldValue{
226
+ {" str" , firebase::firestore::FieldValue::String (" foo" )},
227
+ {" int" , firebase::firestore::FieldValue::Integer (123 )}}),
228
+ " document.Set" );
229
229
230
230
LogMessage (" Testing Update()." );
231
- auto updateResult = document.Update (firebase::firestore::MapFieldValue{
232
- {" int" , firebase::firestore::FieldValue::Integer (321LL )}});
233
- Await (updateResult, " document.Update" );
234
- if (updateResult.status () != firebase::kFutureStatusComplete ) {
235
- LogMessage (" ERROR: failed to write document." );
236
- }
231
+ Await (document.Update (firebase::firestore::MapFieldValue{
232
+ {" int" , firebase::firestore::FieldValue::Integer (321 )}}),
233
+ " document.Update" );
237
234
238
235
LogMessage (" Testing Get()." );
239
- auto getDocumentResult = document.Get ();
240
- Await (getDocumentResult, " document.Get" );
241
- if (getDocumentResult.status () == firebase::kFutureStatusComplete ) {
242
- const firebase::firestore::DocumentSnapshot* snapshot =
243
- getDocumentResult.result ();
236
+ auto doc_future = document.Get ();
237
+ if (Await (doc_future, " document.Get" )) {
238
+ const firebase::firestore::DocumentSnapshot* snapshot = doc_future.result ();
244
239
if (snapshot == nullptr ) {
245
240
LogMessage (" ERROR: failed to read document." );
246
241
} else {
@@ -263,11 +258,7 @@ extern "C" int common_main(int argc, const char* argv[]) {
263
258
}
264
259
265
260
LogMessage (" Testing Delete()." );
266
- auto deleteResult = document.Delete ();
267
- Await (deleteResult, " document.Delete" );
268
- if (deleteResult.status () != firebase::kFutureStatusComplete ) {
269
- LogMessage (" ERROR: failed to delete document." );
270
- }
261
+ Await (document.Delete (), " document.Delete" );
271
262
LogMessage (" Tested document operations." );
272
263
273
264
TestEventListener<firebase::firestore::DocumentSnapshot>
@@ -285,34 +276,27 @@ extern "C" int common_main(int argc, const char* argv[]) {
285
276
{" str" , firebase::firestore::FieldValue::String (" foo" )}});
286
277
batch.Set (collection.Document (" two" ),
287
278
firebase::firestore::MapFieldValue{
288
- {" int" , firebase::firestore::FieldValue::Integer (123LL )}});
289
- auto commitResult = batch.Commit ();
290
- Await (commitResult, " batch.Commit" );
291
- if (commitResult.status () != firebase::kFutureStatusComplete ) {
292
- LogMessage (" ERROR: failed to write batch." );
293
- }
279
+ {" int" , firebase::firestore::FieldValue::Integer (123 )}});
280
+ Await (batch.Commit (), " batch.Commit" );
294
281
LogMessage (" Tested batch write." );
295
282
296
283
LogMessage (" Testing transaction." );
297
- auto runTransactionResult = firestore->RunTransaction (
298
- [collection](firebase::firestore::Transaction& transaction,
299
- std::string& error_message) -> firebase::firestore::Error {
300
- transaction.Update (
301
- collection.Document (" one" ),
302
- firebase::firestore::MapFieldValue{
303
- {" int" , firebase::firestore::FieldValue::Integer (123LL )}});
304
- transaction.Delete (collection.Document (" two" ));
305
- transaction.Set (
306
- collection.Document (" three" ),
307
- firebase::firestore::MapFieldValue{
308
- {" int" , firebase::firestore::FieldValue::Integer (321LL )}});
309
- return firebase::firestore::kOk ;
310
- });
311
- Await (runTransactionResult, " firestore.RunTransaction" );
312
- if (runTransactionResult.status () !=
313
- firebase::kFutureStatusComplete ) {
314
- LogMessage (" ERROR: failed to run transaction." );
315
- }
284
+ Await (
285
+ firestore->RunTransaction (
286
+ [collection](firebase::firestore::Transaction& transaction,
287
+ std::string&) -> firebase::firestore::Error {
288
+ transaction.Update (
289
+ collection.Document (" one" ),
290
+ firebase::firestore::MapFieldValue{
291
+ {" int" , firebase::firestore::FieldValue::Integer (123 )}});
292
+ transaction.Delete (collection.Document (" two" ));
293
+ transaction.Set (
294
+ collection.Document (" three" ),
295
+ firebase::firestore::MapFieldValue{
296
+ {" int" , firebase::firestore::FieldValue::Integer (321 )}});
297
+ return firebase::firestore::kOk ;
298
+ }),
299
+ " firestore.RunTransaction" );
316
300
LogMessage (" Tested transaction." );
317
301
318
302
LogMessage (" Testing query." );
@@ -321,11 +305,9 @@ extern "C" int common_main(int argc, const char* argv[]) {
321
305
.WhereGreaterThan (" int" ,
322
306
firebase::firestore::FieldValue::Boolean (true ))
323
307
.Limit (3 );
324
- auto getQueryResult = query.Get ();
325
- Await (getQueryResult, " query.Get" );
326
- if (getQueryResult.status () == firebase::kFutureStatusComplete ) {
327
- const firebase::firestore::QuerySnapshot* snapshot =
328
- getQueryResult.result ();
308
+ auto query_future = query.Get ();
309
+ if (Await (query_future, " query.Get" )) {
310
+ const firebase::firestore::QuerySnapshot* snapshot = query_future.result ();
329
311
if (snapshot == nullptr ) {
330
312
LogMessage (" ERROR: failed to fetch query result." );
331
313
} else {
0 commit comments