bson 4.9.0 → 4.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +15 -6
  4. data/ext/bson/bson-native.h +4 -0
  5. data/ext/bson/init.c +75 -23
  6. data/ext/bson/read.c +63 -11
  7. data/ext/bson/write.c +42 -3
  8. data/lib/bson/active_support.rb +1 -0
  9. data/lib/bson/array.rb +5 -1
  10. data/lib/bson/big_decimal.rb +67 -0
  11. data/lib/bson/binary.rb +8 -5
  12. data/lib/bson/boolean.rb +2 -1
  13. data/lib/bson/code.rb +2 -1
  14. data/lib/bson/code_with_scope.rb +2 -1
  15. data/lib/bson/config.rb +1 -0
  16. data/lib/bson/date.rb +1 -0
  17. data/lib/bson/date_time.rb +2 -1
  18. data/lib/bson/db_pointer.rb +2 -1
  19. data/lib/bson/dbref.rb +152 -0
  20. data/lib/bson/decimal128/builder.rb +27 -20
  21. data/lib/bson/decimal128.rb +39 -14
  22. data/lib/bson/document.rb +61 -18
  23. data/lib/bson/environment.rb +1 -0
  24. data/lib/bson/error.rb +13 -0
  25. data/lib/bson/ext_json.rb +24 -11
  26. data/lib/bson/false_class.rb +2 -1
  27. data/lib/bson/float.rb +21 -32
  28. data/lib/bson/hash.rb +18 -6
  29. data/lib/bson/int32.rb +3 -2
  30. data/lib/bson/int64.rb +3 -2
  31. data/lib/bson/integer.rb +3 -2
  32. data/lib/bson/json.rb +1 -0
  33. data/lib/bson/max_key.rb +3 -2
  34. data/lib/bson/min_key.rb +3 -2
  35. data/lib/bson/nil_class.rb +2 -1
  36. data/lib/bson/object.rb +1 -0
  37. data/lib/bson/object_id.rb +4 -3
  38. data/lib/bson/open_struct.rb +1 -0
  39. data/lib/bson/regexp.rb +24 -7
  40. data/lib/bson/registry.rb +1 -0
  41. data/lib/bson/specialized.rb +1 -0
  42. data/lib/bson/string.rb +3 -2
  43. data/lib/bson/symbol.rb +2 -1
  44. data/lib/bson/time.rb +4 -3
  45. data/lib/bson/time_with_zone.rb +1 -0
  46. data/lib/bson/timestamp.rb +7 -6
  47. data/lib/bson/true_class.rb +2 -1
  48. data/lib/bson/undefined.rb +2 -1
  49. data/lib/bson/version.rb +2 -1
  50. data/lib/bson.rb +8 -5
  51. data/spec/README.md +14 -0
  52. data/spec/bson/array_spec.rb +17 -0
  53. data/spec/bson/big_decimal_spec.rb +316 -0
  54. data/spec/bson/binary_spec.rb +1 -1
  55. data/spec/bson/binary_uuid_spec.rb +12 -0
  56. data/spec/bson/byte_buffer_read_spec.rb +59 -3
  57. data/spec/bson/byte_buffer_spec.rb +129 -6
  58. data/spec/bson/byte_buffer_write_spec.rb +96 -0
  59. data/spec/bson/date_time_spec.rb +53 -0
  60. data/spec/bson/dbref_legacy_spec.rb +169 -0
  61. data/spec/bson/dbref_spec.rb +487 -0
  62. data/spec/bson/decimal128_spec.rb +231 -0
  63. data/spec/bson/document_as_spec.rb +46 -0
  64. data/spec/bson/document_spec.rb +43 -1
  65. data/spec/bson/ext_json_parse_spec.rb +37 -0
  66. data/spec/bson/hash_as_spec.rb +57 -0
  67. data/spec/bson/hash_spec.rb +105 -0
  68. data/spec/bson/int64_spec.rb +4 -24
  69. data/spec/bson/raw_spec.rb +18 -1
  70. data/spec/bson/regexp_spec.rb +52 -0
  71. data/spec/runners/common_driver.rb +1 -1
  72. data/spec/shared/LICENSE +20 -0
  73. data/spec/shared/bin/get-mongodb-download-url +17 -0
  74. data/spec/shared/bin/s3-copy +45 -0
  75. data/spec/shared/bin/s3-upload +69 -0
  76. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  77. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  78. data/spec/shared/lib/mrss/constraints.rb +386 -0
  79. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  80. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  81. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  82. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  83. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  84. data/spec/shared/lib/mrss/utils.rb +15 -0
  85. data/spec/shared/share/Dockerfile.erb +338 -0
  86. data/spec/shared/share/haproxy-1.conf +16 -0
  87. data/spec/shared/share/haproxy-2.conf +17 -0
  88. data/spec/shared/shlib/distro.sh +74 -0
  89. data/spec/shared/shlib/server.sh +367 -0
  90. data/spec/shared/shlib/set_env.sh +131 -0
  91. data/spec/spec_helper.rb +31 -0
  92. data/spec/spec_tests/common_driver_spec.rb +2 -1
  93. data/spec/spec_tests/data/corpus/binary.json +33 -0
  94. data/spec/spec_tests/data/corpus/dbref.json +21 -1
  95. data/spec/spec_tests/data/corpus/document.json +4 -0
  96. data/spec/spec_tests/data/corpus/regex.json +2 -2
  97. data/spec/spec_tests/data/corpus/timestamp.json +10 -0
  98. data/spec/spec_tests/data/corpus/top.json +23 -12
  99. data/spec/support/spec_config.rb +8 -1
  100. data.tar.gz.sig +0 -0
  101. metadata +168 -93
  102. metadata.gz.sig +1 -0
@@ -0,0 +1,367 @@
1
+ # This file contains functions pertaining to downloading, starting and
2
+ # configuring a MongoDB server.
3
+
4
+ set_fcv() {
5
+ if test -n "$FCV"; then
6
+ mongo --eval 'assert.commandWorked(db.adminCommand( { setFeatureCompatibilityVersion: "'"$FCV"'" } ));' "$MONGODB_URI"
7
+ mongo --quiet --eval 'db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )' |grep "version.*$FCV"
8
+ fi
9
+ }
10
+
11
+ add_uri_option() {
12
+ opt=$1
13
+
14
+ if ! echo $MONGODB_URI |sed -e s,//,, |grep -q /; then
15
+ MONGODB_URI="$MONGODB_URI/"
16
+ fi
17
+
18
+ if ! echo $MONGODB_URI |grep -q '?'; then
19
+ MONGODB_URI="$MONGODB_URI?"
20
+ fi
21
+
22
+ MONGODB_URI="$MONGODB_URI&$opt"
23
+ }
24
+
25
+ prepare_server() {
26
+ arch=$1
27
+
28
+ if test -n "$USE_OPT_MONGODB"; then
29
+ export BINDIR=/opt/mongodb/bin
30
+ export PATH=$BINDIR:$PATH
31
+ return
32
+ fi
33
+
34
+ if test "$MONGODB_VERSION" = latest; then
35
+ # Test on the most recent published 4.3 release.
36
+ # https://jira.mongodb.org/browse/RUBY-1724
37
+ echo 'Using "latest" server is not currently implemented' 1>&2
38
+ exit 1
39
+ else
40
+ download_version="$MONGODB_VERSION"
41
+ fi
42
+
43
+ url=`$(dirname $0)/get-mongodb-download-url $download_version $arch`
44
+
45
+ prepare_server_from_url $url
46
+ }
47
+
48
+ prepare_server_from_url() {
49
+ url=$1
50
+
51
+ mongodb_dir="$MONGO_ORCHESTRATION_HOME"/mdb
52
+ mkdir -p "$mongodb_dir"
53
+ curl --retry 3 $url |tar xz -C "$mongodb_dir" -f -
54
+ BINDIR="$mongodb_dir"/`basename $url |sed -e s/.tgz//`/bin
55
+ export PATH="$BINDIR":$PATH
56
+ }
57
+
58
+ install_mlaunch_virtualenv() {
59
+ python2 -V || true
60
+ if ! python2 -m virtualenv -h >/dev/null; then
61
+ # Current virtualenv fails with
62
+ # https://github.com/pypa/virtualenv/issues/1630
63
+ python2 -m pip install 'virtualenv<20' --user
64
+ fi
65
+ if test "$USE_SYSTEM_PYTHON_PACKAGES" = 1 &&
66
+ python2 -m pip list |grep mtools-legacy
67
+ then
68
+ # Use the existing mtools-legacy
69
+ :
70
+ else
71
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
72
+ python2 -m virtualenv -p python2 $venvpath
73
+ . $venvpath/bin/activate
74
+ pip install 'mtools-legacy[mlaunch]'
75
+ fi
76
+ }
77
+
78
+ install_mlaunch_pip() {
79
+ if test -n "$USE_OPT_MONGODB" && which mlaunch >/dev/null 2>&1; then
80
+ # mlaunch is preinstalled in the docker image, do not install it here
81
+ return
82
+ fi
83
+
84
+ python -V || true
85
+ python3 -V || true
86
+ pythonpath="$MONGO_ORCHESTRATION_HOME"/python
87
+ pip install -t "$pythonpath" 'mtools-legacy[mlaunch]'
88
+ export PATH="$pythonpath/bin":$PATH
89
+ export PYTHONPATH="$pythonpath"
90
+ }
91
+
92
+ install_mlaunch_git() {
93
+ repo=$1
94
+ branch=$2
95
+ python -V || true
96
+ python3 -V || true
97
+ which pip || true
98
+ which pip3 || true
99
+
100
+ if false; then
101
+ if ! virtualenv --version; then
102
+ python3 `which pip3` install --user virtualenv
103
+ export PATH=$HOME/.local/bin:$PATH
104
+ virtualenv --version
105
+ fi
106
+
107
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
108
+ virtualenv -p python3 $venvpath
109
+ . $venvpath/bin/activate
110
+
111
+ pip3 install psutil pymongo
112
+
113
+ git clone $repo mlaunch
114
+ cd mlaunch
115
+ git checkout origin/$branch
116
+ python3 setup.py install
117
+ cd ..
118
+ else
119
+ pip install --user 'virtualenv==13'
120
+ export PATH=$HOME/.local/bin:$PATH
121
+
122
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
123
+ virtualenv $venvpath
124
+ . $venvpath/bin/activate
125
+
126
+ pip install psutil pymongo
127
+
128
+ git clone $repo mlaunch
129
+ (cd mlaunch &&
130
+ git checkout origin/$branch &&
131
+ python setup.py install
132
+ )
133
+ fi
134
+ }
135
+
136
+ # This function sets followong global variables:
137
+ # server_cert_path
138
+ # server_ca_path
139
+ # server_client_cert_path
140
+ #
141
+ # These variables are used later to connect to processes via mongo client.
142
+ calculate_server_args() {
143
+ local mongo_version=`echo $MONGODB_VERSION |tr -d .`
144
+
145
+ if test -z "$mongo_version"; then
146
+ echo "$MONGODB_VERSION must be set and not contain only dots" 1>&2
147
+ exit 3
148
+ fi
149
+
150
+ if test $mongo_version = latest; then
151
+ mongo_version=49
152
+ fi
153
+
154
+ local args="--setParameter enableTestCommands=1"
155
+
156
+ if test $mongo_version -ge 50; then
157
+ args="$args --setParameter acceptApiVersion2=1"
158
+ elif test $mongo_version -ge 47; then
159
+ args="$args --setParameter acceptAPIVersion2=1"
160
+ fi
161
+
162
+ # diagnosticDataCollectionEnabled is a mongod-only parameter on server 3.2,
163
+ # and mlaunch does not support specifying mongod-only parameters:
164
+ # https://github.com/rueckstiess/mtools/issues/696
165
+ # Pass it to 3.4 and newer servers where it is accepted by all daemons.
166
+ if test $mongo_version -ge 34; then
167
+ args="$args --setParameter diagnosticDataCollectionEnabled=false"
168
+ fi
169
+ local uri_options=
170
+ if test "$TOPOLOGY" = replica-set; then
171
+ args="$args --replicaset --name test-rs --nodes 2 --arbiter"
172
+ export HAVE_ARBITER=1
173
+ elif test "$TOPOLOGY" = sharded-cluster; then
174
+ args="$args --replicaset --nodes 2 --sharded 1 --name test-rs"
175
+ if test -z "$SINGLE_MONGOS"; then
176
+ args="$args --mongos 2"
177
+ fi
178
+ elif test "$TOPOLOGY" = standalone; then
179
+ args="$args --single"
180
+ elif test "$TOPOLOGY" = load-balanced; then
181
+ args="$args --replicaset --nodes 2 --sharded 1 --name test-rs --port 27117"
182
+ if test -z "$MRSS_ROOT"; then
183
+ echo "Please set MRSS_ROOT" 1>&2
184
+ exit 2
185
+ fi
186
+ if test -n "$SINGLE_MONGOS"; then
187
+ haproxy_config=$MRSS_ROOT/share/haproxy-1.conf
188
+ else
189
+ args="$args --mongos 2"
190
+ haproxy_config=$MRSS_ROOT/share/haproxy-2.conf
191
+ fi
192
+ uri_options="$uri_options&loadBalanced=true"
193
+ else
194
+ echo "Unknown topology: $TOPOLOGY" 1>&2
195
+ exit 1
196
+ fi
197
+ if test -n "$MMAPV1"; then
198
+ args="$args --storageEngine mmapv1 --smallfiles --noprealloc"
199
+ uri_options="$uri_options&retryReads=false&retryWrites=false"
200
+ fi
201
+ if test "$AUTH" = auth; then
202
+ args="$args --auth --username bob --password pwd123"
203
+ elif test "$AUTH" = x509; then
204
+ args="$args --auth --username bootstrap --password bootstrap"
205
+ elif echo "$AUTH" |grep -q ^aws; then
206
+ args="$args --auth --username bootstrap --password bootstrap"
207
+ args="$args --setParameter authenticationMechanisms=MONGODB-AWS,SCRAM-SHA-1,SCRAM-SHA-256"
208
+ uri_options="$uri_options&authMechanism=MONGODB-AWS&authSource=\$external"
209
+ fi
210
+
211
+ if test -n "$OCSP"; then
212
+ if test -z "$OCSP_ALGORITHM"; then
213
+ echo "OCSP_ALGORITHM must be set if OCSP is set" 1>&2
214
+ exit 1
215
+ fi
216
+ fi
217
+
218
+ if test "$SSL" = ssl || test -n "$OCSP_ALGORITHM"; then
219
+ if test -n "$OCSP_ALGORITHM"; then
220
+ if test "$OCSP_MUST_STAPLE" = 1; then
221
+ server_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server-mustStaple.pem
222
+ else
223
+ server_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server.pem
224
+ fi
225
+ server_ca_path=spec/support/ocsp/$OCSP_ALGORITHM/ca.crt
226
+ server_client_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server.pem
227
+ else
228
+ server_cert_path=spec/support/certificates/server-second-level-bundle.pem
229
+ server_ca_path=spec/support/certificates/ca.crt
230
+ server_client_cert_path=spec/support/certificates/client.pem
231
+ fi
232
+
233
+ if test -n "$OCSP_ALGORITHM"; then
234
+ client_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server.pem
235
+ elif test "$AUTH" = x509; then
236
+ client_cert_path=spec/support/certificates/client-x509.pem
237
+
238
+ uri_options="$uri_options&authMechanism=MONGODB-X509"
239
+ elif echo $RVM_RUBY |grep -q jruby; then
240
+ # JRuby does not grok chained certificate bundles -
241
+ # https://github.com/jruby/jruby-openssl/issues/181
242
+ client_cert_path=spec/support/certificates/client.pem
243
+ else
244
+ client_cert_path=spec/support/certificates/client-second-level-bundle.pem
245
+ fi
246
+
247
+ uri_options="$uri_options&tls=true&"\
248
+ "tlsCAFile=$server_ca_path&"\
249
+ "tlsCertificateKeyFile=$client_cert_path"
250
+
251
+ args="$args --sslMode requireSSL"\
252
+ " --sslPEMKeyFile $server_cert_path"\
253
+ " --sslCAFile $server_ca_path"\
254
+ " --sslClientCertificate $server_client_cert_path"
255
+ fi
256
+
257
+ # Docker forwards ports to the external interface, not to the loopback.
258
+ # Hence we must bind to all interfaces here.
259
+ if test -n "$BIND_ALL"; then
260
+ args="$args --bind_ip_all"
261
+ fi
262
+
263
+ # MongoDB servers pre-4.2 do not enable zlib compression by default
264
+ if test "$COMPRESSOR" = snappy; then
265
+ args="$args --networkMessageCompressors snappy"
266
+ elif test "$COMPRESSOR" = zlib; then
267
+ args="$args --networkMessageCompressors zlib"
268
+ fi
269
+
270
+ if test -n "$OCSP_ALGORITHM" || test -n "$OCSP_VERIFIER"; then
271
+ python3 -m pip install asn1crypto oscrypto flask
272
+ fi
273
+
274
+ local ocsp_args=
275
+ if test -n "$OCSP_ALGORITHM"; then
276
+ if test -z "$server_ca_path"; then
277
+ echo "server_ca_path must have been set" 1>&2
278
+ exit 1
279
+ fi
280
+ ocsp_args="--ca_file $server_ca_path"
281
+ if test "$OCSP_DELEGATE" = 1; then
282
+ ocsp_args="$ocsp_args \
283
+ --ocsp_responder_cert spec/support/ocsp/$OCSP_ALGORITHM/ocsp-responder.crt \
284
+ --ocsp_responder_key spec/support/ocsp/$OCSP_ALGORITHM/ocsp-responder.key \
285
+ "
286
+ else
287
+ ocsp_args="$ocsp_args \
288
+ --ocsp_responder_cert spec/support/ocsp/$OCSP_ALGORITHM/ca.crt \
289
+ --ocsp_responder_key spec/support/ocsp/$OCSP_ALGORITHM/ca.key \
290
+ "
291
+ fi
292
+ if test -n "$OCSP_STATUS"; then
293
+ ocsp_args="$ocsp_args --fault $OCSP_STATUS"
294
+ fi
295
+ fi
296
+
297
+ OCSP_ARGS="$ocsp_args"
298
+ SERVER_ARGS="$args"
299
+ URI_OPTIONS="$uri_options"
300
+ }
301
+
302
+ launch_ocsp_mock() {
303
+ if test -n "$OCSP_ARGS"; then
304
+ # Bind to 0.0.0.0 for Docker
305
+ python3 spec/support/ocsp/ocsp_mock.py $OCSP_ARGS -b 0.0.0.0 -p 8100 &
306
+ OCSP_MOCK_PID=$!
307
+ fi
308
+ }
309
+
310
+ launch_server() {
311
+ local dbdir="$1"
312
+ python -m mtools.mlaunch.mlaunch --dir "$dbdir" --binarypath "$BINDIR" $SERVER_ARGS
313
+
314
+ if test "$TOPOLOGY" = sharded-cluster && test $MONGODB_VERSION = 3.6; then
315
+ # On 3.6 server the sessions collection is not immediately available,
316
+ # so we run the refreshLogicalSessionCacheNow command on the config server
317
+ # and again on each mongos in order for the mongoses
318
+ # to correctly report logicalSessionTimeoutMinutes.
319
+ mongos_regex="\s*mongos\s+([0-9]+)\s+running\s+[0-9]+"
320
+ config_server_regex="\s*config\sserver\s+([0-9]+)\s+running\s+[0-9]+"
321
+ config_server=""
322
+ mongoses=()
323
+ if test "$AUTH" = auth
324
+ then
325
+ base_url="mongodb://bob:pwd123@localhost"
326
+ else
327
+ base_url="mongodb://localhost"
328
+ fi
329
+ if test "$SSL" = "ssl"
330
+ then
331
+ mongo_command="${BINDIR}/mongo --ssl --sslPEMKeyFile $server_cert_path --sslCAFile $server_ca_path"
332
+ else
333
+ mongo_command="${BINDIR}/mongo"
334
+ fi
335
+
336
+ while read -r line
337
+ do
338
+ if [[ $line =~ $config_server_regex ]]
339
+ then
340
+ port="${BASH_REMATCH[1]}"
341
+ config_server="${base_url}:${port}"
342
+ fi
343
+ if [[ $line =~ $mongos_regex ]]
344
+ then
345
+ port="${BASH_REMATCH[1]}"
346
+ mongoses+=("${base_url}:${port}")
347
+ fi
348
+ done < <(python -m mtools.mlaunch.mlaunch list --dir "$dbdir" --binarypath "$BINDIR")
349
+
350
+ if [ -n "$config_server" ]; then
351
+ ${mongo_command} "$config_server" --eval 'db.adminCommand("refreshLogicalSessionCacheNow")'
352
+ for mongos in ${mongoses[*]}
353
+ do
354
+ ${mongo_command} "$mongos" --eval 'db.adminCommand("refreshLogicalSessionCacheNow")'
355
+ done
356
+ fi
357
+ fi
358
+
359
+ if test "$TOPOLOGY" = load-balanced; then
360
+ if test -z "$haproxy_config"; then
361
+ echo haproxy_config should have been set 1>&2
362
+ exit 3
363
+ fi
364
+
365
+ haproxy -D -f $haproxy_config -p $mongodb_dir/haproxy.pid
366
+ fi
367
+ }
@@ -0,0 +1,131 @@
1
+ TOOLCHAIN_VERSION=43b0b8a644363c4052b9bf8221320a1828fe01a5
2
+
3
+ set_env_java() {
4
+ ls -l /opt || true
5
+ ls -l /usr/lib/jvm || true
6
+
7
+ # Use toolchain java if it exists
8
+ if [ -f /opt/java/jdk8/bin/java ]; then
9
+ export JAVACMD=/opt/java/jdk8/bin/java
10
+ #export PATH=$PATH:/opt/java/jdk8/bin
11
+ fi
12
+
13
+ # ppc64le has it in a different place
14
+ if test -z "$JAVACMD" && [ -f /usr/lib/jvm/java-1.8.0/bin/java ]; then
15
+ export JAVACMD=/usr/lib/jvm/java-1.8.0/bin/java
16
+ #export PATH=$PATH:/usr/lib/jvm/java-1.8.0/bin
17
+ fi
18
+
19
+ if true; then
20
+ # newer
21
+ # rhel71-ppc, https://jira.mongodb.org/browse/BUILD-9231
22
+ if test -z "$JAVACMD" &&
23
+ (ls /opt/java || true) |grep -q java-1.8.0-openjdk-1.8.0 &&
24
+ test -f /opt/java/java-1.8.0-openjdk-1.8.0*/bin/java;
25
+ then
26
+ path=$(cd /opt/java && ls -d java-1.8.0-openjdk-1.8.0* |head -n 1)
27
+ export JAVACMD=/opt/java/"$path"/bin/java
28
+ fi
29
+ else
30
+ # older
31
+ # rhel71-ppc seems to have an /opt/java/jdk8/bin/java but it doesn't work
32
+ if test -n "$JAVACMD" && ! exec $JAVACMD -version; then
33
+ JAVACMD=
34
+ # we will try the /usr/lib/jvm then
35
+ fi
36
+ fi
37
+
38
+ if test -n "$JAVACMD"; then
39
+ eval $JAVACMD -version
40
+ elif which java 2>/dev/null; then
41
+ java -version
42
+ else
43
+ echo No java runtime found
44
+ fi
45
+ }
46
+
47
+ set_env_ruby() {
48
+ if test -z "$RVM_RUBY"; then
49
+ echo "Empty RVM_RUBY, aborting"
50
+ exit 2
51
+ fi
52
+
53
+ #ls -l /opt
54
+
55
+ # Necessary for jruby
56
+ set_env_java
57
+
58
+ if [ "$RVM_RUBY" == "ruby-head" ]; then
59
+ # When we use ruby-head, we do not install the Ruby toolchain.
60
+ # But we still need Python 3.6+ to run mlaunch.
61
+ # Since the ruby-head tests are run on ubuntu1604, we can use the
62
+ # globally installed Python toolchain.
63
+ #export PATH=/opt/python/3.7/bin:$PATH
64
+
65
+ # 12.04, 14.04 and 16.04 are good
66
+ curl --retry 3 -fL http://rubies.travis-ci.org/ubuntu/`lsb_release -rs`/x86_64/ruby-head.tar.bz2 |tar xfj -
67
+ # TODO adjust gem path?
68
+ export PATH=`pwd`/ruby-head/bin:`pwd`/ruby-head/lib/ruby/gems/2.6.0/bin:$PATH
69
+ ruby --version
70
+ ruby --version |grep dev
71
+ elif test "$SYSTEM_RUBY" = 1; then
72
+ # Nothing
73
+ :
74
+ else
75
+ if test "$USE_OPT_TOOLCHAIN" = 1; then
76
+ # Nothing, also PATH is already set
77
+ :
78
+ elif true; then
79
+
80
+ # For testing toolchains:
81
+ #toolchain_url=https://s3.amazonaws.com//mciuploads/mongo-ruby-toolchain/`host_distro`/f11598d091441ffc8d746aacfdc6c26741a3e629/mongo_ruby_driver_toolchain_`host_distro |tr - _`_patch_f11598d091441ffc8d746aacfdc6c26741a3e629_5e46f2793e8e866f36eda2c5_20_02_14_19_18_18.tar.gz
82
+ toolchain_url=http://boxes.10gen.com/build/toolchain-drivers/mongo-ruby-driver/$TOOLCHAIN_VERSION/`host_distro`/$RVM_RUBY.tar.xz
83
+ curl --retry 3 -fL $toolchain_url |tar Jxf -
84
+ export PATH=`pwd`/rubies/$RVM_RUBY/bin:$PATH
85
+ #export PATH=`pwd`/rubies/python/3/bin:$PATH
86
+
87
+ # Attempt to get bundler to report all errors - so far unsuccessful
88
+ #curl --retry 3 -o bundler-openssl.diff https://github.com/bundler/bundler/compare/v2.0.1...p-mongo:report-errors.diff
89
+ #find . -path \*/lib/bundler/fetcher.rb -exec patch {} bundler-openssl.diff \;
90
+
91
+ else
92
+
93
+ # Normal operation
94
+ if ! test -d $HOME/.rubies/$RVM_RUBY/bin; then
95
+ echo "Ruby directory does not exist: $HOME/.rubies/$RVM_RUBY/bin" 1>&2
96
+ echo "Contents of /opt:" 1>&2
97
+ ls -l /opt 1>&2 || true
98
+ echo ".rubies symlink:" 1>&2
99
+ ls -ld $HOME/.rubies 1>&2 || true
100
+ echo "Our rubies:" 1>&2
101
+ ls -l $HOME/.rubies 1>&2 || true
102
+ exit 2
103
+ fi
104
+ export PATH=$HOME/.rubies/$RVM_RUBY/bin:$PATH
105
+
106
+ fi
107
+
108
+ ruby --version
109
+
110
+ # Ensure we're using the right ruby
111
+ ruby_name=`echo $RVM_RUBY |awk -F- '{print $1}'`
112
+ ruby_version=`echo $RVM_RUBY |awk -F- '{print $2}' |cut -c 1-3`
113
+
114
+ ruby -v |fgrep $ruby_name
115
+ ruby -v |fgrep $ruby_version
116
+
117
+ # We shouldn't need to update rubygems, and there is value in
118
+ # testing on whatever rubygems came with each supported ruby version
119
+ #echo 'updating rubygems'
120
+ #gem update --system
121
+
122
+ # Only install bundler when not using ruby-head.
123
+ # ruby-head comes with bundler and gem complains
124
+ # because installing bundler would overwrite the bundler binary.
125
+ # We now install bundler in the toolchain, hence nothing needs to be done
126
+ # in the tests.
127
+ if false && echo "$RVM_RUBY" |grep -q jruby; then
128
+ gem install bundler -v '<2'
129
+ fi
130
+ fi
131
+ }
data/spec/spec_helper.rb CHANGED
@@ -17,6 +17,7 @@ DRIVER_COMMON_BSON_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/decimal128/
17
17
  BSON_CORPUS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/corpus/*.json").sort
18
18
  BSON_CORPUS_LEGACY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/corpus_legacy/*.json").sort
19
19
 
20
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "shared", "lib"))
20
21
  $LOAD_PATH.unshift(File.dirname(__FILE__))
21
22
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
22
23
 
@@ -29,6 +30,13 @@ require "yaml"
29
30
  require 'support/spec_config'
30
31
 
31
32
  if SpecConfig.instance.active_support?
33
+ require "active_support/version"
34
+ if ActiveSupport.version >= Gem::Version.new(7)
35
+ # ActiveSupport wants us to require ALL of it all of the time.
36
+ # See: https://github.com/rails/rails/issues/43851,
37
+ # https://github.com/rails/rails/issues/43889, etc.
38
+ require 'active_support'
39
+ end
32
40
  require "active_support/time"
33
41
  require 'bson/active_support'
34
42
  end
@@ -40,6 +48,16 @@ unless ENV['CI'] || BSON::Environment.jruby?
40
48
  end
41
49
  end
42
50
 
51
+ begin
52
+ require 'mrss/lite_constraints'
53
+ rescue LoadError => exc
54
+ raise LoadError.new <<~MSG.strip
55
+ The test suite requires shared tooling to be installed.
56
+ Please refer to spec/README.md for instructions.
57
+ #{exc.class}: #{exc}
58
+ MSG
59
+ end
60
+
43
61
  Dir["./spec/support/**/*.rb"].each { |file| require file }
44
62
 
45
63
  # Alternate IO class that returns a String from #readbyte.
@@ -60,4 +78,17 @@ RSpec.configure do |config|
60
78
  config.expect_with :rspec do |c|
61
79
  c.syntax = [:should, :expect]
62
80
  end
81
+
82
+ # To ensure that calling GC.compact does not produce unexpected behavior,
83
+ # randomly call GC.compact after a small percentage of tests in the suite.
84
+ # This behavior is only enabled when the COMPACT environment variable is true.
85
+ if SpecConfig.instance.compact?
86
+ config.after do
87
+ if rand < SpecConfig::COMPACTION_CHANCE
88
+ GC.compact
89
+ end
90
+ end
91
+ end
92
+
93
+ config.extend Mrss::LiteConstraints
63
94
  end
@@ -64,7 +64,8 @@ describe 'Driver common bson tests' do
64
64
  let(:valid_errors) do
65
65
  [
66
66
  BSON::Decimal128::InvalidString,
67
- BSON::Decimal128::InvalidRange
67
+ BSON::Decimal128::InvalidRange,
68
+ BSON::Decimal128::UnrepresentablePrecision,
68
69
  ]
69
70
  end
70
71
 
@@ -39,11 +39,22 @@
39
39
  "canonical_bson": "1D000000057800100000000473FFD26444B34C6990E8E7D1DFC035D400",
40
40
  "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"04\"}}}"
41
41
  },
42
+ {
43
+ "description": "subtype 0x04 UUID",
44
+ "canonical_bson": "1D000000057800100000000473FFD26444B34C6990E8E7D1DFC035D400",
45
+ "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"04\"}}}",
46
+ "degenerate_extjson": "{\"x\" : { \"$uuid\" : \"73ffd264-44b3-4c69-90e8-e7d1dfc035d4\"}}"
47
+ },
42
48
  {
43
49
  "description": "subtype 0x05",
44
50
  "canonical_bson": "1D000000057800100000000573FFD26444B34C6990E8E7D1DFC035D400",
45
51
  "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"05\"}}}"
46
52
  },
53
+ {
54
+ "description": "subtype 0x07",
55
+ "canonical_bson": "1D000000057800100000000773FFD26444B34C6990E8E7D1DFC035D400",
56
+ "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"07\"}}}"
57
+ },
47
58
  {
48
59
  "description": "subtype 0x80",
49
60
  "canonical_bson": "0F0000000578000200000080FFFF00",
@@ -81,5 +92,27 @@
81
92
  "description": "subtype 0x02 length negative one",
82
93
  "bson": "130000000578000600000002FFFFFFFFFFFF00"
83
94
  }
95
+ ],
96
+ "parseErrors": [
97
+ {
98
+ "description": "$uuid wrong type",
99
+ "string": "{\"x\" : { \"$uuid\" : { \"data\" : \"73ffd264-44b3-4c69-90e8-e7d1dfc035d4\"}}}"
100
+ },
101
+ {
102
+ "description": "$uuid invalid value--too short",
103
+ "string": "{\"x\" : { \"$uuid\" : \"73ffd264-44b3-90e8-e7d1dfc035d4\"}}"
104
+ },
105
+ {
106
+ "description": "$uuid invalid value--too long",
107
+ "string": "{\"x\" : { \"$uuid\" : \"73ffd264-44b3-4c69-90e8-e7d1dfc035d4-789e4\"}}"
108
+ },
109
+ {
110
+ "description": "$uuid invalid value--misplaced hyphens",
111
+ "string": "{\"x\" : { \"$uuid\" : \"73ff-d26444b-34c6-990e8e-7d1dfc035d4\"}}"
112
+ },
113
+ {
114
+ "description": "$uuid invalid value--too many hyphens",
115
+ "string": "{\"x\" : { \"$uuid\" : \"----d264-44b3-4--9-90e8-e7d1dfc0----\"}}"
116
+ }
84
117
  ]
85
118
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "DBRef",
2
+ "description": "Document type (DBRef sub-documents)",
3
3
  "bson_type": "0x03",
4
4
  "valid": [
5
5
  {
@@ -26,6 +26,26 @@
26
26
  "description": "Document with key names similar to those of a DBRef",
27
27
  "canonical_bson": "3e0000000224726566000c0000006e6f742d612d646272656600072469640058921b3e6e32ab156a22b59e022462616e616e6100050000007065656c0000",
28
28
  "canonical_extjson": "{\"$ref\": \"not-a-dbref\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$banana\": \"peel\"}"
29
+ },
30
+ {
31
+ "description": "DBRef with additional dollar-prefixed and dotted fields",
32
+ "canonical_bson": "48000000036462726566003c0000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e10612e62000100000010246300010000000000",
33
+ "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"a.b\": {\"$numberInt\": \"1\"}, \"$c\": {\"$numberInt\": \"1\"}}}"
34
+ },
35
+ {
36
+ "description": "Sub-document resembles DBRef but $id is missing",
37
+ "canonical_bson": "26000000036462726566001a0000000224726566000b000000636f6c6c656374696f6e000000",
38
+ "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\"}}"
39
+ },
40
+ {
41
+ "description": "Sub-document resembles DBRef but $ref is not a string",
42
+ "canonical_bson": "2c000000036462726566002000000010247265660001000000072469640058921b3e6e32ab156a22b59e0000",
43
+ "canonical_extjson": "{\"dbref\": {\"$ref\": {\"$numberInt\": \"1\"}, \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}}}"
44
+ },
45
+ {
46
+ "description": "Sub-document resembles DBRef but $db is not a string",
47
+ "canonical_bson": "4000000003646272656600340000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e1024646200010000000000",
48
+ "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$db\": {\"$numberInt\": \"1\"}}}"
29
49
  }
30
50
  ]
31
51
  }
@@ -31,6 +31,10 @@
31
31
  {
32
32
  "description": "Invalid subdocument: bad string length in field",
33
33
  "bson": "1C00000003666F6F001200000002626172000500000062617A000000"
34
+ },
35
+ {
36
+ "description": "Null byte in sub-document key",
37
+ "bson": "150000000378000D00000010610000010000000000"
34
38
  }
35
39
  ]
36
40
  }
@@ -54,11 +54,11 @@
54
54
  ],
55
55
  "decodeErrors": [
56
56
  {
57
- "description": "embedded null in pattern",
57
+ "description": "Null byte in pattern string",
58
58
  "bson": "0F0000000B610061006300696D0000"
59
59
  },
60
60
  {
61
- "description": "embedded null in flags",
61
+ "description": "Null byte in flags string",
62
62
  "bson": "100000000B61006162630069006D0000"
63
63
  }
64
64
  ]