Skip to content

Commit fe280d8

Browse files
committed
CDRIVER-952 skip a bulk test on server 3.2.0-rc0
Avoid SERVER-21079: skip /BulkOperation/large_inserts_ordered test if the server is a 3.2 release candidate. Introduce helpers to skip tests based on server version in general.
1 parent 68b747e commit fe280d8

File tree

3 files changed

+140
-3
lines changed

3 files changed

+140
-3
lines changed

tests/test-bulk.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1936,7 +1936,7 @@ test_wtimeout_plus_duplicate_key_err_write_commands (void)
19361936

19371937

19381938
static void
1939-
test_large_inserts_ordered ()
1939+
test_large_inserts_ordered (void *ctx)
19401940
{
19411941
mongoc_client_t *client;
19421942
bool has_write_cmds;
@@ -2579,6 +2579,20 @@ test_bulk_write_concern_over_1000(void)
25792579
mongoc_write_concern_destroy (write_concern);
25802580
}
25812581

2582+
static int
2583+
check_for_server_21079 (void)
2584+
{
2585+
server_version_t server_version = test_framework_get_server_version ();
2586+
2587+
/* Skip 3.2.0 release candidates, with version arrays like [3, 2, 0, -n] */
2588+
if (server_version > test_framework_str_to_version ("3.1.9") &&
2589+
server_version < test_framework_str_to_version ("3.2.0")) {
2590+
return 0;
2591+
}
2592+
2593+
return 1;
2594+
}
2595+
25822596
void
25832597
test_bulk_install (TestSuite *suite)
25842598
{
@@ -2654,8 +2668,9 @@ test_bulk_install (TestSuite *suite)
26542668
#endif
26552669
TestSuite_Add (suite, "/BulkOperation/wtimeout_duplicate_key/write_commands",
26562670
test_wtimeout_plus_duplicate_key_err_write_commands);
2657-
TestSuite_Add (suite, "/BulkOperation/large_inserts_ordered",
2658-
test_large_inserts_ordered);
2671+
TestSuite_AddFull (suite, "/BulkOperation/large_inserts_ordered",
2672+
test_large_inserts_ordered, NULL, NULL,
2673+
check_for_server_21079);
26592674
TestSuite_Add (suite, "/BulkOperation/large_inserts_unordered",
26602675
test_large_inserts_unordered);
26612676
TestSuite_Add (suite, "/BulkOperation/numerous_ordered",

tests/test-libmongoc.c

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,122 @@ test_framework_max_wire_version_at_least (int version)
10271027
return at_least;
10281028
}
10291029

1030+
#define N_SERVER_VERSION_PARTS 4
1031+
1032+
static server_version_t
1033+
_parse_server_version (const bson_t *buildinfo)
1034+
{
1035+
bson_iter_t iter;
1036+
bson_iter_t array_iter;
1037+
int i;
1038+
server_version_t ret = 0;
1039+
1040+
ASSERT (bson_iter_init_find (&iter, buildinfo, "versionArray"));
1041+
ASSERT (bson_iter_recurse (&iter, &array_iter));
1042+
1043+
/* Server returns a 4-part version like [3, 2, 0, 0], or like [3, 2, 0, -49]
1044+
* for an RC. Bail if number of parts is ever not 4. */
1045+
i = 0;
1046+
while (bson_iter_next (&array_iter)) {
1047+
ret *= 1000;
1048+
ret += 100 + bson_iter_as_int64 (&array_iter);
1049+
i++;
1050+
ASSERT_CMPINT (i, <=, N_SERVER_VERSION_PARTS);
1051+
}
1052+
1053+
ASSERT_CMPINT (i, ==, N_SERVER_VERSION_PARTS);
1054+
1055+
return ret;
1056+
}
1057+
1058+
server_version_t
1059+
test_framework_get_server_version (void)
1060+
{
1061+
mongoc_client_t *client;
1062+
bson_t reply;
1063+
bson_error_t error;
1064+
server_version_t ret = 0;
1065+
1066+
client = test_framework_client_new ();
1067+
ASSERT_OR_PRINT (mongoc_client_command_simple (
1068+
client, "admin", tmp_bson ("{'buildinfo': 1}"),
1069+
NULL, &reply, &error), error);
1070+
1071+
ret = _parse_server_version (&reply);
1072+
1073+
bson_destroy (&reply);
1074+
mongoc_client_destroy (client);
1075+
1076+
return ret;
1077+
}
1078+
1079+
server_version_t
1080+
test_framework_str_to_version (const char *version_str)
1081+
{
1082+
char *str_copy;
1083+
char *part;
1084+
char *end;
1085+
int i;
1086+
server_version_t ret = 0;
1087+
1088+
str_copy = bson_strdup (version_str);
1089+
i = 0;
1090+
part = strtok (str_copy, ".");
1091+
while (part) {
1092+
ret *= 1000;
1093+
1094+
/* add 100 since release candidates have versions like "3.2.0.-49" */
1095+
ret += 100 + bson_ascii_strtoll (part, &end, 10);
1096+
i++;
1097+
ASSERT_CMPINT (i, <=, N_SERVER_VERSION_PARTS);
1098+
part = strtok (NULL, ".");
1099+
}
1100+
1101+
/* pad out a short version like "3.0" */
1102+
for (; i < N_SERVER_VERSION_PARTS; i++) {
1103+
ret *= 1000;
1104+
ret += 100;
1105+
}
1106+
1107+
bson_free (str_copy);
1108+
1109+
return ret;
1110+
}
1111+
1112+
/* self-tests for a test framework feature */
1113+
static void
1114+
test_version_cmp (void)
1115+
{
1116+
server_version_t v2_6_12 = 102106112100;
1117+
server_version_t v3_0_0 = 103100100100;
1118+
server_version_t v3_0_1 = 103100101100;
1119+
server_version_t v3_0_10 = 103100110100;
1120+
server_version_t v3_2_0_rc1_pre = 103102100051;
1121+
1122+
ASSERT (v2_6_12 == test_framework_str_to_version ("2.6.12"));
1123+
ASSERT (v2_6_12 == _parse_server_version (
1124+
tmp_bson ("{'versionArray': [2, 6, 12, 0]}")));
1125+
1126+
ASSERT (v3_0_0 == test_framework_str_to_version ("3"));
1127+
ASSERT (v3_0_0 == _parse_server_version (
1128+
tmp_bson ("{'versionArray': [3, 0, 0, 0]}")));
1129+
1130+
ASSERT (v3_0_1 == test_framework_str_to_version ("3.0.1"));
1131+
ASSERT (v3_0_1 == _parse_server_version (
1132+
tmp_bson ("{'versionArray': [3, 0, 1, 0]}")));
1133+
1134+
ASSERT (v3_0_10 == test_framework_str_to_version ("3.0.10"));
1135+
ASSERT (v3_0_10 == _parse_server_version (
1136+
tmp_bson ("{'versionArray': [3, 0, 10, 0]}")));
1137+
1138+
ASSERT (v3_2_0_rc1_pre == test_framework_str_to_version ("3.2.0.-49"));
1139+
ASSERT (v3_2_0_rc1_pre == _parse_server_version (
1140+
tmp_bson ("{'versionArray': [3, 2, 0, -49]}")));
1141+
1142+
ASSERT (v3_2_0_rc1_pre > test_framework_str_to_version ("3.1.9"));
1143+
ASSERT (v3_2_0_rc1_pre < test_framework_str_to_version ("3.2"));
1144+
}
1145+
10301146
int
10311147
main (int argc,
10321148
char *argv[])
@@ -1048,6 +1164,7 @@ main (int argc,
10481164
#endif
10491165

10501166
TestSuite_Init (&suite, "", argc, argv);
1167+
TestSuite_Add (&suite, "/TestSuite/version_cmp", test_version_cmp);
10511168

10521169
test_array_install (&suite);
10531170
test_async_install (&suite);

tests/test-libmongoc.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,9 @@ typedef struct _debug_stream_stats_t {
5959
void test_framework_set_debug_stream (mongoc_client_t *client,
6060
debug_stream_stats_t *stats);
6161

62+
typedef int64_t server_version_t;
63+
64+
server_version_t test_framework_get_server_version (void);
65+
server_version_t test_framework_str_to_version (const char *version_str);
66+
6267
#endif

0 commit comments

Comments
 (0)