Skip to content

Commit d113429

Browse files
authored
CDRIVER-4537 Ensure all aborts in test suite are preceeded by flushes (#1164)
1 parent 5915ff9 commit d113429

33 files changed

+266
-449
lines changed

build/future_function_templates/future-value.h.template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ typedef struct _future_value_t
2828
} value;
2929
} future_value_t;
3030

31-
future_value_t *future_value_new ();
31+
future_value_t *future_value_new (void);
3232

3333
#ifdef __clang__
3434
#pragma clang diagnostic push

build/future_function_templates/future.c.template

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,23 @@
77

88
{{ header_comment }}
99

10+
#define FUTURE_TIMEOUT_ABORT \
11+
if (1) { \
12+
fflush (stdout); \
13+
fprintf (stderr, "%s timed out\n", BSON_FUNC); \
14+
fflush (stderr); \
15+
abort (); \
16+
} else \
17+
((void) 0)
18+
1019
void
1120
future_get_void (future_t *future)
1221
{
13-
if (!future_wait (future)) {
14-
fprintf (stderr, "%s timed out\n", BSON_FUNC);
15-
fflush (stderr);
16-
abort ();
22+
if (future_wait (future)) {
23+
return;
1724
}
25+
26+
FUTURE_TIMEOUT_ABORT;
1827
}
1928

2029
{% for T in type_list %}
@@ -25,9 +34,7 @@ future_get_{{ T }} (future_t *future)
2534
return future_value_get_{{ T }} (&future->return_value);
2635
}
2736

28-
fprintf (stderr, "%s timed out\n", BSON_FUNC);
29-
fflush (stderr);
30-
abort ();
37+
FUTURE_TIMEOUT_ABORT;
3138
}
3239
{% endfor %}
3340

@@ -120,4 +127,3 @@ future_destroy (future_t *future)
120127
bson_mutex_destroy (&future->mutex);
121128
bson_free (future);
122129
}
123-

src/libmongoc/tests/TestSuite.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,13 @@ bson_open (const char *filename, int flags, ...)
129129
void
130130
_test_error (const char *format, ...) BSON_GNUC_PRINTF (1, 2);
131131

132-
#define test_error(...) \
133-
if (1) { \
134-
MONGOC_STDERR_PRINTF ( \
135-
"test error in: %s %d:%s()\n", __FILE__, __LINE__, BSON_FUNC); \
136-
_test_error (__VA_ARGS__); \
137-
} else \
132+
#define test_error(...) \
133+
if (1) { \
134+
MONGOC_STDERR_PRINTF ( \
135+
"test error in: %s %d:%s()\n", __FILE__, __LINE__, BSON_FUNC); \
136+
_test_error (__VA_ARGS__); \
137+
abort (); /* suppress missing return errors in non-void functions */ \
138+
} else \
138139
((void) 0)
139140

140141
#define bson_eq_bson(bson, expected) \

src/libmongoc/tests/json-test-monitoring.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,9 @@ assert_host_in_uri (const mongoc_host_list_t *host, const mongoc_uri_t *uri)
7272
hosts = hosts->next;
7373
}
7474

75-
fprintf (stderr,
76-
"Host \"%s\" not in \"%s\"",
77-
host->host_and_port,
78-
mongoc_uri_get_string (uri));
79-
fflush (stderr);
80-
abort ();
75+
test_error ("Host \"%s\" not in \"%s\"",
76+
host->host_and_port,
77+
mongoc_uri_get_string (uri));
8178
}
8279

8380

src/libmongoc/tests/json-test-operations.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ session_from_name (json_test_ctx_t *ctx, const char *session_name)
4545
} else if (!strcmp (session_name, "session1")) {
4646
return ctx->sessions[1];
4747
} else {
48-
MONGOC_ERROR ("Unrecognized session name: %s", session_name);
49-
abort ();
48+
test_error ("Unrecognized session name: %s", session_name);
5049
}
5150
}
5251

@@ -794,7 +793,6 @@ add_request_to_bulk (mongoc_bulk_operation_t *bulk,
794793
bulk, &filter, &update, &opts, error);
795794
} else {
796795
test_error ("unrecognized request name %s", name);
797-
abort ();
798796
}
799797

800798
bson_destroy (&opts);
@@ -957,7 +955,6 @@ single_write (mongoc_collection_t *collection,
957955
collection, &filter, &update, &opts, reply, &error);
958956
} else {
959957
test_error ("unrecognized request name %s", name);
960-
abort ();
961958
}
962959

963960
value_init_from_doc (&value, reply);

src/libmongoc/tests/json-test.c

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,6 @@ test_server_selection_logic_cb (bson_t *test)
415415
sd->round_trip_time_msec = bson_iter_int32 (&sd_iter);
416416
} else if (sd->type != MONGOC_SERVER_UNKNOWN) {
417417
test_error ("%s has no avg_rtt_ms", sd->host.host_and_port);
418-
abort ();
419418
}
420419

421420
if (bson_iter_init_find (&sd_iter, &server, "maxWireVersion")) {
@@ -529,7 +528,6 @@ test_server_selection_logic_cb (bson_t *test)
529528
if (!found) {
530529
test_error ("Should have been selected but wasn't: %s",
531530
bson_iter_utf8 (&host, NULL));
532-
abort ();
533531
}
534532

535533
matched_servers[i] = true;
@@ -543,7 +541,6 @@ test_server_selection_logic_cb (bson_t *test)
543541

544542
test_error ("Shouldn't have been selected but was: %s",
545543
sd->host.host_and_port);
546-
abort ();
547544
}
548545
}
549546

@@ -652,9 +649,9 @@ collect_tests_from_dir (char (*paths)[MAX_TEST_NAME_LENGTH] /* OUT */,
652649

653650
dir = opendir (dir_path);
654651
if (!dir) {
655-
MONGOC_ERROR ("Cannot open \"%s\"", dir_path);
656-
MONGOC_ERROR ("Run test-libmongoc in repository root directory.\n");
657-
abort ();
652+
test_error ("Cannot open \"%s\"\n"
653+
"Run test-libmongoc in repository root directory.",
654+
dir_path);
658655
}
659656

660657
while ((entry = readdir (dir))) {
@@ -720,7 +717,7 @@ get_bson_from_json_file (char *filename)
720717
/* read entire file into buffer */
721718
buffer = (const char *) bson_malloc0 (length);
722719
if (fread ((void *) buffer, 1, length, file) != length) {
723-
abort ();
720+
test_error ("Failed to read JSON file into buffer");
724721
}
725722

726723
fclose (file);
@@ -731,8 +728,7 @@ get_bson_from_json_file (char *filename)
731728
/* convert to bson */
732729
data = bson_new_from_json ((const uint8_t *) buffer, length, &error);
733730
if (!data) {
734-
fprintf (stderr, "Cannot parse %s: %s\n", filename, error.message);
735-
abort ();
731+
test_error ("Cannot parse %s: %s", filename, error.message);
736732
}
737733

738734
bson_free ((void *) buffer);
@@ -1430,10 +1426,9 @@ set_uri_opts_from_bson (mongoc_uri_t *uri, const bson_t *opts)
14301426
} else if (mongoc_uri_option_is_utf8 (key)) {
14311427
mongoc_uri_set_option_as_utf8 (uri, key, bson_iter_utf8 (&iter, NULL));
14321428
} else {
1433-
MONGOC_ERROR ("Unsupported clientOptions field \"%s\" in %s",
1434-
key,
1435-
bson_as_json (opts, NULL));
1436-
abort ();
1429+
test_error ("Unsupported clientOptions field \"%s\" in %s",
1430+
key,
1431+
bson_as_json (opts, NULL));
14371432
}
14381433
}
14391434
}
@@ -1479,11 +1474,10 @@ set_auto_encryption_opts (mongoc_client_t *client, bson_t *test)
14791474
test_framework_getenv ("MONGOC_TEST_AWS_ACCESS_KEY_ID");
14801475

14811476
if (!secret_access_key || !access_key_id) {
1482-
fprintf (stderr,
1483-
"Set MONGOC_TEST_AWS_SECRET_ACCESS_KEY and "
1484-
"MONGOC_TEST_AWS_ACCESS_KEY_ID environment variables to "
1485-
"run Client Side Encryption tests.\n");
1486-
abort ();
1477+
test_error (
1478+
"Set MONGOC_TEST_AWS_SECRET_ACCESS_KEY and "
1479+
"MONGOC_TEST_AWS_ACCESS_KEY_ID environment variables to "
1480+
"run Client Side Encryption tests.");
14871481
}
14881482

14891483
{
@@ -1517,19 +1511,16 @@ set_auto_encryption_opts (mongoc_client_t *client, bson_t *test)
15171511
test_framework_getenv ("MONGOC_TEST_AWS_TEMP_SESSION_TOKEN");
15181512

15191513
if (!secret_access_key || !access_key_id) {
1520-
fprintf (stderr,
1521-
"Set MONGOC_TEST_AWS_TEMP_SECRET_ACCESS_KEY and "
1522-
"MONGOC_TEST_AWS_TEMP_ACCESS_KEY_ID environment variables "
1523-
"to run Client Side Encryption tests.\n");
1524-
abort ();
1514+
test_error (
1515+
"Set MONGOC_TEST_AWS_TEMP_SECRET_ACCESS_KEY and "
1516+
"MONGOC_TEST_AWS_TEMP_ACCESS_KEY_ID environment variables "
1517+
"to run Client Side Encryption tests.");
15251518
}
15261519

15271520
// Only require session token when requested.
15281521
if (!session_token && need_aws_with_session_token) {
1529-
fprintf (stderr,
1530-
"Set MONGOC_TEST_AWS_TEMP_SESSION_TOKEN environment "
1531-
"variable to run Client Side Encryption tests.\n");
1532-
abort ();
1522+
test_error ("Set MONGOC_TEST_AWS_TEMP_SESSION_TOKEN environment "
1523+
"variable to run Client Side Encryption tests.");
15331524
}
15341525

15351526
{
@@ -1567,12 +1558,10 @@ set_auto_encryption_opts (mongoc_client_t *client, bson_t *test)
15671558
test_framework_getenv ("MONGOC_TEST_AZURE_CLIENT_SECRET");
15681559

15691560
if (!azure_tenant_id || !azure_client_id || !azure_client_secret) {
1570-
fprintf (stderr,
1571-
"Set MONGOC_TEST_AZURE_TENANT_ID, "
1572-
"MONGOC_TEST_AZURE_CLIENT_ID, and "
1573-
"MONGOC_TEST_AZURE_CLIENT_SECRET to enable CSFLE "
1574-
"tests.");
1575-
abort ();
1561+
test_error ("Set MONGOC_TEST_AZURE_TENANT_ID, "
1562+
"MONGOC_TEST_AZURE_CLIENT_ID, and "
1563+
"MONGOC_TEST_AZURE_CLIENT_SECRET to enable CSFLE "
1564+
"tests.");
15761565
}
15771566

15781567
bson_concat (&kms_providers,
@@ -1595,11 +1584,9 @@ set_auto_encryption_opts (mongoc_client_t *client, bson_t *test)
15951584
gcp_privatekey = test_framework_getenv ("MONGOC_TEST_GCP_PRIVATEKEY");
15961585

15971586
if (!gcp_email || !gcp_privatekey) {
1598-
fprintf (stderr,
1599-
"Set MONGOC_TEST_GCP_EMAIL and "
1600-
"MONGOC_TEST_GCP_PRIVATEKEY to enable CSFLE "
1601-
"tests.");
1602-
abort ();
1587+
test_error ("Set MONGOC_TEST_GCP_EMAIL and "
1588+
"MONGOC_TEST_GCP_PRIVATEKEY to enable CSFLE "
1589+
"tests.");
16031590
}
16041591

16051592
bson_concat (

0 commit comments

Comments
 (0)