Skip to content

Commit eb66965

Browse files
wilhuffa-maurice
authored andcommitted
Miscellaneous test-only fixes
* Avoid dereferencing awaited pointers after Await has failed, preventing crashes after test timeouts. * Await `CollectionReference::Add`, preventing nondeterminism in tests. PiperOrigin-RevId: 320449430
1 parent 7e62c36 commit eb66965

File tree

4 files changed

+45
-20
lines changed

4 files changed

+45
-20
lines changed

firestore/src/tests/firestore_integration_test.cc

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,7 @@ void FirestoreIntegrationTest::WriteDocument(DocumentReference reference,
141141
const MapFieldValue& data) const {
142142
Future<void> future = reference.Set(data);
143143
Await(future);
144-
EXPECT_EQ(FutureStatus::kFutureStatusComplete, future.status());
145-
EXPECT_EQ(0, future.error()) << DescribeFailedFuture(future) << std::endl;
144+
FailIfUnsuccessful("WriteDocument", future);
146145
}
147146

148147
void FirestoreIntegrationTest::WriteDocuments(
@@ -157,28 +156,29 @@ DocumentSnapshot FirestoreIntegrationTest::ReadDocument(
157156
const DocumentReference& reference) const {
158157
Future<DocumentSnapshot> future = reference.Get();
159158
const DocumentSnapshot* result = Await(future);
160-
EXPECT_EQ(FutureStatus::kFutureStatusComplete, future.status());
161-
EXPECT_EQ(0, future.error()) << DescribeFailedFuture(future) << std::endl;
162-
EXPECT_NE(nullptr, result) << DescribeFailedFuture(future) << std::endl;
163-
return *result;
159+
if (FailIfUnsuccessful("ReadDocument", future)) {
160+
return {};
161+
} else {
162+
return *result;
163+
}
164164
}
165165

166166
QuerySnapshot FirestoreIntegrationTest::ReadDocuments(
167167
const Query& reference) const {
168168
Future<QuerySnapshot> future = reference.Get();
169169
const QuerySnapshot* result = Await(future);
170-
EXPECT_EQ(FutureStatus::kFutureStatusComplete, future.status());
171-
EXPECT_EQ(0, future.error()) << DescribeFailedFuture(future) << std::endl;
172-
EXPECT_NE(nullptr, result) << DescribeFailedFuture(future) << std::endl;
173-
return *result;
170+
if (FailIfUnsuccessful("ReadDocuments", future)) {
171+
return {};
172+
} else {
173+
return *result;
174+
}
174175
}
175176

176177
void FirestoreIntegrationTest::DeleteDocument(
177178
DocumentReference reference) const {
178179
Future<void> future = reference.Delete();
179180
Await(future);
180-
EXPECT_EQ(FutureStatus::kFutureStatusComplete, future.status());
181-
EXPECT_EQ(0, future.error()) << DescribeFailedFuture(future) << std::endl;
181+
FailIfUnsuccessful("DeleteDocument", future);
182182
}
183183

184184
std::vector<std::string> FirestoreIntegrationTest::QuerySnapshotToIds(
@@ -210,6 +210,29 @@ void FirestoreIntegrationTest::Await(const Future<void>& future) {
210210
}
211211
}
212212

213+
/* static */
214+
bool FirestoreIntegrationTest::FailIfUnsuccessful(const char* operation,
215+
const FutureBase& future) {
216+
if (future.status() != FutureStatus::kFutureStatusComplete) {
217+
ADD_FAILURE() << operation << " timed out: " << DescribeFailedFuture(future)
218+
<< std::endl;
219+
return true;
220+
} else if (future.error() != Error::kErrorOk) {
221+
ADD_FAILURE() << operation << "failed: " << DescribeFailedFuture(future)
222+
<< std::endl;
223+
return true;
224+
} else {
225+
return false;
226+
}
227+
}
228+
229+
/* static */
230+
std::string FirestoreIntegrationTest::DescribeFailedFuture(
231+
const FutureBase& future) {
232+
return "WARNING: Future failed. Error code " +
233+
std::to_string(future.error()) + ", message " + future.error_message();
234+
}
235+
213236
void FirestoreIntegrationTest::TerminateAndRelease(Firestore* firestore) {
214237
Await(firestore->Terminate());
215238
Release(firestore);

firestore/src/tests/firestore_integration_test.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,12 @@ class FirestoreIntegrationTest : public testing::Test {
252252
EXPECT_GT(cycles, 0) << "Waiting listener timed out.";
253253
}
254254

255-
template <typename T>
256-
static std::string DescribeFailedFuture(const Future<T>& future) {
257-
return "WARNING: Future failed. Error code " +
258-
std::to_string(future.error()) + ", message " +
259-
future.error_message();
260-
}
255+
// Fails the current test if the given future did not complete or contained an
256+
// error. Returns true if the future has failed.
257+
static bool FailIfUnsuccessful(const char* operation,
258+
const FutureBase& future);
259+
260+
static std::string DescribeFailedFuture(const FutureBase& future);
261261

262262
// Creates a new Firestore instance, without any caching, using a uniquely-
263263
// generated app_name.

firestore/src/tests/query_network_test.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ class QueryNetworkTest : public FirestoreIntegrationTest {
5757
EXPECT_TRUE(accumulator.AwaitRemoteEvent().empty());
5858

5959
Await(firestore()->DisableNetwork());
60-
collection.Add(MapFieldValue{{"foo", FieldValue::ServerTimestamp()}});
60+
auto added =
61+
collection.Add(MapFieldValue{{"foo", FieldValue::ServerTimestamp()}});
6162
Await(firestore()->EnableNetwork());
63+
Await(added);
6264

6365
QuerySnapshot snapshot = accumulator.AwaitServerEvent();
6466
EXPECT_FALSE(snapshot.empty());

firestore/src/tests/query_test.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ TEST_F(FirestoreIntegrationTest, TestCanQueryByDocumentIdUsingRefs) {
438438

439439
TEST_F(FirestoreIntegrationTest, TestCanQueryWithAndWithoutDocumentKey) {
440440
CollectionReference collection = Collection();
441-
collection.Add({});
441+
Await(collection.Add({}));
442442
QuerySnapshot snapshot1 = ReadDocuments(collection.OrderBy(
443443
FieldPath::DocumentId(), Query::Direction::kAscending));
444444
QuerySnapshot snapshot2 = ReadDocuments(collection);

0 commit comments

Comments
 (0)