@@ -1027,6 +1027,122 @@ test_framework_max_wire_version_at_least (int version)
1027
1027
return at_least ;
1028
1028
}
1029
1029
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
+
1030
1146
int
1031
1147
main (int argc ,
1032
1148
char * argv [])
@@ -1048,6 +1164,7 @@ main (int argc,
1048
1164
#endif
1049
1165
1050
1166
TestSuite_Init (& suite , "" , argc , argv );
1167
+ TestSuite_Add (& suite , "/TestSuite/version_cmp" , test_version_cmp );
1051
1168
1052
1169
test_array_install (& suite );
1053
1170
test_async_install (& suite );
0 commit comments