mongo 2.11.6 → 2.12.0.rc0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -2
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/lib/mongo.rb +3 -0
  6. data/lib/mongo/address.rb +13 -2
  7. data/lib/mongo/auth.rb +1 -0
  8. data/lib/mongo/auth/credential_cache.rb +51 -0
  9. data/lib/mongo/auth/scram/conversation.rb +20 -16
  10. data/lib/mongo/auth/user.rb +0 -8
  11. data/lib/mongo/auth/user/view.rb +4 -4
  12. data/lib/mongo/background_thread.rb +1 -1
  13. data/lib/mongo/bulk_write.rb +5 -5
  14. data/lib/mongo/client.rb +126 -11
  15. data/lib/mongo/client_encryption.rb +103 -0
  16. data/lib/mongo/cluster.rb +2 -2
  17. data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
  18. data/lib/mongo/cluster/sdam_flow.rb +54 -58
  19. data/lib/mongo/cluster/srv_monitor.rb +1 -1
  20. data/lib/mongo/collection.rb +3 -3
  21. data/lib/mongo/collection/view.rb +1 -1
  22. data/lib/mongo/collection/view/aggregation.rb +1 -1
  23. data/lib/mongo/collection/view/change_stream.rb +12 -3
  24. data/lib/mongo/collection/view/iterable.rb +14 -5
  25. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  26. data/lib/mongo/collection/view/readable.rb +7 -9
  27. data/lib/mongo/collection/view/writable.rb +7 -7
  28. data/lib/mongo/crypt.rb +33 -0
  29. data/lib/mongo/crypt/auto_decryption_context.rb +42 -0
  30. data/lib/mongo/crypt/auto_encrypter.rb +169 -0
  31. data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
  32. data/lib/mongo/crypt/binary.rb +155 -0
  33. data/lib/mongo/crypt/binding.rb +1162 -0
  34. data/lib/mongo/crypt/context.rb +135 -0
  35. data/lib/mongo/crypt/data_key_context.rb +162 -0
  36. data/lib/mongo/crypt/encryption_io.rb +283 -0
  37. data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
  38. data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
  39. data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
  40. data/lib/mongo/crypt/handle.rb +293 -0
  41. data/lib/mongo/crypt/hooks.rb +90 -0
  42. data/lib/mongo/crypt/kms_context.rb +67 -0
  43. data/lib/mongo/crypt/status.rb +131 -0
  44. data/lib/mongo/cursor.rb +64 -32
  45. data/lib/mongo/database.rb +13 -6
  46. data/lib/mongo/database/view.rb +13 -4
  47. data/lib/mongo/dbref.rb +9 -2
  48. data/lib/mongo/error.rb +5 -1
  49. data/lib/mongo/error/crypt_error.rb +31 -0
  50. data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
  51. data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
  52. data/lib/mongo/error/kms_error.rb +22 -0
  53. data/lib/mongo/error/max_bson_size.rb +14 -3
  54. data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
  55. data/lib/mongo/error/no_server_available.rb +8 -3
  56. data/lib/mongo/error/operation_failure.rb +1 -0
  57. data/lib/mongo/grid/file.rb +0 -5
  58. data/lib/mongo/grid/file/chunk.rb +0 -2
  59. data/lib/mongo/grid/file/info.rb +2 -1
  60. data/lib/mongo/grid/fs_bucket.rb +13 -15
  61. data/lib/mongo/grid/stream/write.rb +3 -9
  62. data/lib/mongo/index/view.rb +3 -3
  63. data/lib/mongo/monitoring/event/command_started.rb +6 -1
  64. data/lib/mongo/operation/collections_info.rb +6 -3
  65. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  66. data/lib/mongo/operation/find/op_msg.rb +4 -1
  67. data/lib/mongo/operation/get_more/op_msg.rb +4 -1
  68. data/lib/mongo/operation/insert/command.rb +2 -2
  69. data/lib/mongo/operation/insert/legacy.rb +2 -2
  70. data/lib/mongo/operation/insert/op_msg.rb +3 -3
  71. data/lib/mongo/operation/result.rb +36 -27
  72. data/lib/mongo/operation/shared/executable.rb +10 -8
  73. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  74. data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
  75. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
  76. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
  77. data/lib/mongo/operation/shared/write.rb +17 -10
  78. data/lib/mongo/operation/update/op_msg.rb +1 -1
  79. data/lib/mongo/protocol/compressed.rb +6 -5
  80. data/lib/mongo/protocol/insert.rb +3 -1
  81. data/lib/mongo/protocol/message.rb +72 -8
  82. data/lib/mongo/protocol/msg.rb +191 -37
  83. data/lib/mongo/protocol/query.rb +7 -9
  84. data/lib/mongo/protocol/serializers.rb +6 -2
  85. data/lib/mongo/server.rb +10 -4
  86. data/lib/mongo/server/connection.rb +20 -9
  87. data/lib/mongo/server/connection_base.rb +81 -12
  88. data/lib/mongo/server/connection_common.rb +61 -0
  89. data/lib/mongo/server/connection_pool.rb +37 -1
  90. data/lib/mongo/server/description.rb +9 -11
  91. data/lib/mongo/server/monitor.rb +2 -0
  92. data/lib/mongo/server/monitor/connection.rb +3 -18
  93. data/lib/mongo/server/pending_connection.rb +2 -1
  94. data/lib/mongo/session.rb +2 -2
  95. data/lib/mongo/session/session_pool.rb +8 -3
  96. data/lib/mongo/socket.rb +29 -16
  97. data/lib/mongo/socket/ssl.rb +23 -8
  98. data/lib/mongo/socket/tcp.rb +12 -3
  99. data/lib/mongo/timeout.rb +49 -0
  100. data/lib/mongo/uri.rb +30 -1
  101. data/lib/mongo/version.rb +1 -1
  102. data/mongo.gemspec +1 -1
  103. data/spec/README.md +134 -7
  104. data/spec/integration/auth_spec.rb +53 -0
  105. data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
  106. data/spec/integration/client_construction_spec.rb +76 -1
  107. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +351 -0
  108. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +301 -0
  109. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +71 -0
  110. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +76 -0
  111. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +216 -0
  112. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +600 -0
  113. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +183 -0
  114. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +74 -0
  115. data/spec/integration/client_side_encryption/client_close_spec.rb +59 -0
  116. data/spec/integration/client_side_encryption/corpus_spec.rb +228 -0
  117. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
  118. data/spec/integration/client_side_encryption/data_key_spec.rb +163 -0
  119. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
  120. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +137 -0
  121. data/spec/integration/client_side_encryption/views_spec.rb +42 -0
  122. data/spec/integration/client_update_spec.rb +120 -0
  123. data/spec/integration/command_monitoring_spec.rb +3 -1
  124. data/spec/integration/command_spec.rb +44 -10
  125. data/spec/integration/connection_spec.rb +57 -0
  126. data/spec/integration/reconnect_spec.rb +7 -6
  127. data/spec/integration/size_limit_spec.rb +94 -0
  128. data/spec/integration/srv_monitoring_spec.rb +14 -6
  129. data/spec/lite_spec_helper.rb +31 -22
  130. data/spec/mongo/auth/cr_spec.rb +8 -0
  131. data/spec/mongo/auth/ldap_spec.rb +5 -1
  132. data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
  133. data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
  134. data/spec/mongo/auth/scram_spec.rb +45 -35
  135. data/spec/mongo/auth/x509_spec.rb +5 -1
  136. data/spec/mongo/client_construction_spec.rb +206 -3
  137. data/spec/mongo/client_encryption_spec.rb +408 -0
  138. data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
  139. data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
  140. data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
  141. data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
  142. data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
  143. data/spec/mongo/collection/view_spec.rb +1 -1
  144. data/spec/mongo/collection_spec.rb +4 -33
  145. data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
  146. data/spec/mongo/crypt/auto_encrypter_spec.rb +182 -0
  147. data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
  148. data/spec/mongo/crypt/binary_spec.rb +115 -0
  149. data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
  150. data/spec/mongo/crypt/binding/context_spec.rb +257 -0
  151. data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
  152. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
  153. data/spec/mongo/crypt/binding/status_spec.rb +99 -0
  154. data/spec/mongo/crypt/binding/version_spec.rb +22 -0
  155. data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
  156. data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
  157. data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
  158. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
  159. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
  160. data/spec/mongo/crypt/handle_spec.rb +198 -0
  161. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
  162. data/spec/mongo/crypt/status_spec.rb +152 -0
  163. data/spec/mongo/cursor_spec.rb +24 -4
  164. data/spec/mongo/database_spec.rb +20 -0
  165. data/spec/mongo/error/crypt_error_spec.rb +26 -0
  166. data/spec/mongo/error/max_bson_size_spec.rb +35 -0
  167. data/spec/mongo/error/no_server_available_spec.rb +11 -1
  168. data/spec/mongo/error/operation_failure_spec.rb +6 -6
  169. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  170. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  171. data/spec/mongo/operation/command_spec.rb +3 -3
  172. data/spec/mongo/operation/create_index_spec.rb +3 -3
  173. data/spec/mongo/operation/create_user_spec.rb +3 -3
  174. data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
  175. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
  176. data/spec/mongo/operation/delete_spec.rb +7 -7
  177. data/spec/mongo/operation/drop_index_spec.rb +2 -2
  178. data/spec/mongo/operation/find/legacy_spec.rb +1 -1
  179. data/spec/mongo/operation/get_more_spec.rb +1 -1
  180. data/spec/mongo/operation/indexes_spec.rb +1 -1
  181. data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
  182. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
  183. data/spec/mongo/operation/insert_spec.rb +12 -12
  184. data/spec/mongo/operation/map_reduce_spec.rb +2 -2
  185. data/spec/mongo/operation/remove_user_spec.rb +3 -3
  186. data/spec/mongo/operation/update/bulk_spec.rb +6 -6
  187. data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
  188. data/spec/mongo/operation/update_spec.rb +7 -7
  189. data/spec/mongo/operation/update_user_spec.rb +1 -1
  190. data/spec/mongo/protocol/compressed_spec.rb +2 -3
  191. data/spec/mongo/protocol/delete_spec.rb +9 -8
  192. data/spec/mongo/protocol/get_more_spec.rb +9 -8
  193. data/spec/mongo/protocol/insert_spec.rb +9 -8
  194. data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
  195. data/spec/mongo/protocol/msg_spec.rb +57 -53
  196. data/spec/mongo/protocol/query_spec.rb +12 -12
  197. data/spec/mongo/protocol/registry_spec.rb +1 -1
  198. data/spec/mongo/protocol/reply_spec.rb +1 -1
  199. data/spec/mongo/protocol/update_spec.rb +10 -9
  200. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  201. data/spec/mongo/server/connection_spec.rb +28 -7
  202. data/spec/mongo/socket_spec.rb +1 -1
  203. data/spec/mongo/timeout_spec.rb +85 -0
  204. data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
  205. data/spec/mongo/uri_spec.rb +52 -5
  206. data/spec/mongo/write_concern_spec.rb +13 -1
  207. data/spec/{support → runners}/auth.rb +14 -1
  208. data/spec/{support → runners}/change_streams.rb +1 -1
  209. data/spec/{support → runners}/change_streams/operation.rb +0 -0
  210. data/spec/{support → runners}/cmap.rb +1 -1
  211. data/spec/{support → runners}/cmap/verifier.rb +0 -0
  212. data/spec/{support → runners}/command_monitoring.rb +0 -0
  213. data/spec/runners/connection_string.rb +358 -4
  214. data/spec/{support → runners}/crud.rb +9 -9
  215. data/spec/{support → runners}/crud/context.rb +0 -0
  216. data/spec/{support → runners}/crud/operation.rb +7 -3
  217. data/spec/{support → runners}/crud/outcome.rb +0 -0
  218. data/spec/{support → runners}/crud/requirement.rb +1 -1
  219. data/spec/{support → runners}/crud/spec.rb +12 -1
  220. data/spec/{support → runners}/crud/test.rb +0 -0
  221. data/spec/{support → runners}/crud/test_base.rb +0 -0
  222. data/spec/{support → runners}/crud/verifier.rb +10 -12
  223. data/spec/{support → runners}/gridfs.rb +0 -0
  224. data/spec/{support → runners}/sdam_monitoring.rb +0 -0
  225. data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
  226. data/spec/{support → runners}/server_selection.rb +0 -0
  227. data/spec/{support → runners}/server_selection_rtt.rb +0 -0
  228. data/spec/{support → runners}/transactions.rb +4 -4
  229. data/spec/{support → runners}/transactions/context.rb +0 -0
  230. data/spec/{support → runners}/transactions/operation.rb +0 -0
  231. data/spec/{support → runners}/transactions/spec.rb +0 -0
  232. data/spec/{support → runners}/transactions/test.rb +37 -5
  233. data/spec/spec_helper.rb +0 -5
  234. data/spec/spec_tests/auth_spec.rb +3 -3
  235. data/spec/spec_tests/client_side_encryption_spec.rb +13 -0
  236. data/spec/spec_tests/connection_string_spec.rb +1 -1
  237. data/spec/spec_tests/data/auth/connection-string.yml +13 -0
  238. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  239. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  240. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  241. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  242. data/spec/spec_tests/data/client_side_encryption/bulk.yml +85 -0
  243. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  244. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  245. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  246. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  247. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  248. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  249. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  250. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  251. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  252. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  253. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  254. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  255. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  256. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  257. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  258. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  259. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  260. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  261. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  262. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +61 -0
  263. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  264. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  265. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  266. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +168 -0
  267. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
  268. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
  269. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
  270. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
  271. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
  272. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
  273. data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
  274. data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
  275. data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
  276. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
  277. data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  278. data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  279. data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  280. data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  281. data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
  282. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
  283. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
  284. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  285. data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
  286. data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
  287. data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
  288. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  289. data/spec/spec_tests/uri_options_spec.rb +6 -8
  290. data/spec/stress/connection_pool_timing_spec.rb +6 -3
  291. data/spec/support/certificates/README.md +4 -0
  292. data/spec/support/certificates/server-second-level-bundle.pem +77 -77
  293. data/spec/support/certificates/server-second-level.crt +52 -52
  294. data/spec/support/certificates/server-second-level.key +25 -25
  295. data/spec/support/certificates/server-second-level.pem +77 -77
  296. data/spec/support/client_registry.rb +19 -3
  297. data/spec/support/cluster_config.rb +9 -1
  298. data/spec/support/common_shortcuts.rb +12 -0
  299. data/spec/support/constraints.rb +16 -0
  300. data/spec/support/crypt.rb +140 -0
  301. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  302. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  303. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  304. data/spec/support/crypt/corpus/corpus.json +3657 -0
  305. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  306. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  307. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  308. data/spec/support/crypt/external/external-key.json +31 -0
  309. data/spec/support/crypt/external/external-schema.json +19 -0
  310. data/spec/support/crypt/limits/limits-doc.json +102 -0
  311. data/spec/support/crypt/limits/limits-key.json +31 -0
  312. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  313. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  314. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  315. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  316. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  317. data/spec/support/lite_constraints.rb +17 -1
  318. data/spec/support/matchers.rb +19 -0
  319. data/spec/support/shared/protocol.rb +2 -0
  320. data/spec/support/spec_config.rb +43 -13
  321. data/spec/support/utils.rb +132 -10
  322. metadata +277 -81
  323. metadata.gz.sig +0 -0
  324. data/spec/integration/grid_fs_bucket_spec.rb +0 -48
  325. data/spec/integration/zlib_compression_spec.rb +0 -25
  326. data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
  327. data/spec/support/connection_string.rb +0 -354
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
2
 
3
3
  describe Mongo::WriteConcern do
4
4
 
@@ -194,6 +194,18 @@ describe Mongo::WriteConcern do
194
194
  expect(wc).to be_a(Mongo::WriteConcern::Unacknowledged)
195
195
  expect(wc.options[:w]).to eq(0)
196
196
  end
197
+
198
+ context 'and j is true' do
199
+ let(:options) do
200
+ { 'w' => 0, j: true }
201
+ end
202
+
203
+ it 'raises an exception' do
204
+ expect do
205
+ wc
206
+ end.to raise_error(Mongo::Error::InvalidWriteConcern, /:j cannot be true when :w is 0/)
207
+ end
208
+ end
197
209
  end
198
210
  end
199
211
 
@@ -13,7 +13,20 @@
13
13
  # limitations under the License.
14
14
  RSpec::Matchers.define :have_blank_credentials do
15
15
  match do |client|
16
- %i(auth_mech auth_mech_properties auth_source password user).all? do |key|
16
+ # The "null credential" definition in auth spec tests readme at
17
+ # https://github.com/mongodb/specifications/blob/master/source/auth/tests/README.rst
18
+ # is as follows:
19
+ #
20
+ # credential: If null, the credential must not be considered configured
21
+ # for the the purpose of deciding if the driver should authenticate to the
22
+ # topology.
23
+ #
24
+ # Ruby driver authenticates if :user or :auth_mech client options are set.
25
+ #
26
+ # Note that this is a different test from "no auth-related options are
27
+ # set on the client". Options like password or auth source are preserved
28
+ # by the client if set, but do not trigger authentication.
29
+ %i(auth_mech user).all? do |key|
17
30
  client.options[key].nil?
18
31
  end
19
32
  end
@@ -24,7 +24,7 @@ RSpec::Matchers.define :match_commands do |test|
24
24
  end
25
25
  end
26
26
 
27
- require 'support/change_streams/operation'
27
+ require 'runners/change_streams/operation'
28
28
 
29
29
  module Mongo
30
30
  module ChangeStreams
@@ -1,4 +1,4 @@
1
- require 'support/cmap/verifier'
1
+ require 'runners/cmap/verifier'
2
2
 
3
3
  module Mongo
4
4
  module Cmap
@@ -1,7 +1,361 @@
1
+ # Copyright (C) 2014-2019 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ RSpec::Matchers.define :have_hosts do |test, hosts|
16
+
17
+ match do |cl|
18
+
19
+ def find_server(client, host)
20
+ client.cluster.servers_list.detect do |s|
21
+ if host.port
22
+ s.address.host == host.host && s.address.port == host.port
23
+ else
24
+ s.address.host == host.host
25
+ end
26
+ end
27
+ end
28
+
29
+ def match_host?(server, host)
30
+ server.address.host == host.host
31
+ end
32
+
33
+ def match_port?(server, host)
34
+ server.address.port == host.port || !host.port
35
+ end
36
+
37
+ def match_address_family?(server, host)
38
+ address_family(server) == host.address_family
39
+ end
40
+
41
+ def address_family(server)
42
+ server.address.socket(2)
43
+ server.address.instance_variable_get(:@resolver).class
44
+ end
45
+
46
+ hosts.all? do |host|
47
+ server = find_server(cl, host)
48
+ server &&
49
+ match_host?(server, host) &&
50
+ match_port?(server, host) #&&
51
+ #match_address_family?(server, host)
52
+ end
53
+ end
54
+
55
+ failure_message do |client|
56
+ "With URI: #{test.uri_string}\n" +
57
+ "Expected client hosts: #{client.cluster.instance_variable_get(:@servers)} " +
58
+ "to match #{hosts}"
59
+ end
60
+ end
61
+
62
+ RSpec::Matchers.define :match_auth do |test|
63
+
64
+ def match_database?(client, auth)
65
+ client.options[:database] == auth.database || !auth.database
66
+ end
67
+
68
+ def match_password?(client, auth)
69
+ client.options[:password] == auth.password ||
70
+ client.options[:password].nil? && auth.password == ''
71
+ end
72
+
73
+ match do |client|
74
+ auth = test.auth
75
+ return true unless auth
76
+ client.options[:user] == auth.username &&
77
+ match_password?(client, auth) &&
78
+ match_database?(client, auth)
79
+ end
80
+
81
+ failure_message do |client|
82
+ "With URI: #{test.uri_string}\n" +
83
+ "Expected that test auth: #{test.auth} would match client auth: #{client.options}"
84
+ end
85
+ end
86
+
87
+ RSpec::Matchers.define :match_options do |test|
88
+
89
+ match do |client|
90
+ options = test.options
91
+ return true unless options
92
+ options.match?(client.options)
93
+ end
94
+
95
+ failure_message do |client|
96
+ "With URI: #{test.uri_string}\n" +
97
+ "Expected that test options: #{test.options.options} would match client options: #{client.options}"
98
+ end
99
+ end
100
+
101
+ module Mongo
102
+ module ConnectionString
103
+
104
+ class Spec
105
+
106
+ attr_reader :description
107
+
108
+ # Instantiate the new spec.
109
+ #
110
+ # @param [ String ] test_path The path to the file.
111
+ #
112
+ # @since 2.0.0
113
+ def initialize(test_path)
114
+ @spec = YAML.load(File.read(test_path))
115
+ @description = File.basename(test_path)
116
+ end
117
+
118
+ def tests
119
+ @tests ||= @spec['tests'].collect do |spec|
120
+ Test.new(spec)
121
+ end
122
+ end
123
+ end
124
+
125
+ class Test
126
+ include RSpec::Core::Pending
127
+
128
+ attr_reader :description
129
+ attr_reader :uri_string
130
+
131
+ def initialize(spec)
132
+ @spec = spec
133
+ @description = @spec['description']
134
+ @uri_string = @spec['uri']
135
+ end
136
+
137
+ def valid?
138
+ @spec['valid']
139
+ end
140
+
141
+ def warn?
142
+ @spec['warning']
143
+ end
144
+
145
+ def hosts
146
+ @hosts ||= (@spec['hosts'] || []).collect do |host|
147
+ Host.new(host)
148
+ end
149
+ end
150
+
151
+ def seeds
152
+ if @spec['seeds']
153
+ @seeds ||= (@spec['seeds'] || []).collect do |host|
154
+ Host.new(host)
155
+ end
156
+ else
157
+ nil
158
+ end
159
+ end
160
+
161
+ def options
162
+ @options ||= Options.new(@spec['options']) if @spec['options']
163
+ end
164
+
165
+ def client
166
+ @client ||= ClientRegistry.instance.new_local_client(@spec['uri'], monitoring_io: false)
167
+ rescue Mongo::Error::LintError => e
168
+ if e.message =~ /arbitraryButStillValid/
169
+ skip 'Test uses a read concern that fails linter'
170
+ end
171
+ end
172
+
173
+ def uri
174
+ @uri ||= Mongo::URI.get(@spec['uri'])
175
+ end
176
+
177
+ def auth
178
+ @auth ||= Auth.new(@spec['auth']) if @spec['auth']
179
+ end
180
+
181
+ def raise_error?
182
+ @spec['error']
183
+ end
184
+
185
+ def read_concern_expectation
186
+ @spec['readConcern']
187
+ end
188
+
189
+ def write_concern_expectation
190
+ @spec['writeConcern']
191
+ end
192
+ end
193
+
194
+ class Host
195
+
196
+ MAPPING = {
197
+ 'ipv4' => Mongo::Address::IPv4,
198
+ 'ipv6' => Mongo::Address::IPv6,
199
+ 'unix' => Mongo::Address::Unix
200
+ }
201
+
202
+ attr_reader :host
203
+ attr_reader :port
204
+
205
+ def initialize(spec)
206
+ if spec.is_a?(Hash)
207
+ # Connection string spec tests
208
+ @spec = spec
209
+ @host = @spec['host']
210
+ @port = @spec['port']
211
+ else
212
+ # DNS seed list spec tests
213
+ address = Mongo::Address.new(spec)
214
+ @host = address.host
215
+ @port = address.port
216
+ end
217
+ end
218
+
219
+ def address_family
220
+ MAPPING[@spec['type']]
221
+ end
222
+ end
223
+
224
+ class Auth
225
+
226
+ attr_reader :username
227
+ attr_reader :password
228
+ attr_reader :database
229
+
230
+ def initialize(spec)
231
+ @spec = spec
232
+ @username = @spec['username']
233
+ @password = @spec['password']
234
+ @database = @spec['db']
235
+ end
236
+
237
+ def to_s
238
+ "username: #{username}, password: #{password}, database: #{database}"
239
+ end
240
+ end
241
+
242
+ class Options
243
+
244
+ MAPPINGS = {
245
+ # Replica Set Options
246
+ 'replicaset' => :replica_set,
247
+
248
+ # Timeout Options
249
+ 'connecttimeoutms' => :connect_timeout,
250
+ 'sockettimeoutms' => :socket_timeout,
251
+ 'serverselectiontimeoutms' => :server_selection_timeout,
252
+ 'localthresholdms' => :local_threshold,
253
+ 'heartbeatfrequencyms' => :heartbeat_frequency,
254
+ 'maxidletimems' => :max_idle_time,
255
+
256
+ # Write Options
257
+ 'journal' => [:write_concern, 'j'],
258
+ 'w' => [:write_concern, 'w'],
259
+ 'wtimeoutms' => [:write_concern, 'wtimeout'],
260
+
261
+ # Read Options
262
+ 'readpreference' => ['read', 'mode'],
263
+ 'readpreferencetags' => ['read', 'tag_sets'],
264
+ 'maxstalenessseconds' => ['read', 'max_staleness'],
265
+
266
+ # Pool Options
267
+ 'minpoolsize' => :min_pool_size,
268
+ 'maxpoolsize' => :max_pool_size,
269
+
270
+ # Security Options
271
+ 'tls' => :ssl,
272
+ 'tlsallowinvalidcertificates' => :ssl_verify_certificate,
273
+ 'tlsallowinvalidhostnames' => :ssl_verify_hostname,
274
+ 'tlscafile' => :ssl_ca_cert,
275
+ 'tlscertificatekeyfile' => :ssl_cert,
276
+ 'tlscertificatekeyfilepassword' => :ssl_key_pass_phrase,
277
+ 'tlsinsecure' => :ssl_verify,
278
+
279
+ # Auth Options
280
+ 'authsource' => :auth_source,
281
+ 'authmechanism' => :auth_mech,
282
+ 'authmechanismproperties' => :auth_mech_properties,
283
+
284
+ # Client Options
285
+ 'appname' => :app_name,
286
+ 'readconcernlevel' => [:read_concern, 'level'],
287
+ 'retrywrites' => :retry_writes,
288
+ 'zlibcompressionlevel' => :zlib_compression_level,
289
+ }
290
+
291
+ attr_reader :options
292
+
293
+ def initialize(options)
294
+ @options = options
295
+ end
296
+
297
+ def match?(opts)
298
+ @options.all? do |k, v|
299
+ k = k.downcase
300
+
301
+ expected =
302
+ case k
303
+ when 'authmechanism'
304
+ Mongo::URI::AUTH_MECH_MAP[v].downcase.to_s
305
+ when 'authmechanismproperties'
306
+ v.reduce({}) do |new_v, prop|
307
+ prop_key = prop.first.downcase
308
+ prop_val = prop.last == 'true' ? true : prop.last
309
+ new_v[prop_key] = prop_val
310
+
311
+ new_v
312
+ end
313
+ when 'compressors'
314
+ v.dup.tap do |compressors|
315
+ # The Ruby driver doesn't support snappy
316
+ compressors.delete('snappy')
317
+ end
318
+ when 'readpreference'
319
+ Mongo::URI::READ_MODE_MAP[v.downcase].to_s
320
+ when 'tlsallowinvalidcertificates', 'tlsallowinvalidhostnames', 'tlsinsecure'
321
+ !v
322
+ else
323
+ if k.end_with?('ms') && k != 'wtimeoutms'
324
+ v / 1000.0
325
+ elsif v.is_a?(String)
326
+ v.downcase
327
+ else
328
+ v
329
+ end
330
+ end
331
+
332
+ actual =
333
+ case MAPPINGS[k]
334
+ when nil
335
+ opts[k]
336
+ when Array
337
+ opts[MAPPINGS[k].first][MAPPINGS[k].last]
338
+ else
339
+ opts[MAPPINGS[k]]
340
+ end
341
+
342
+ if actual.is_a?(Symbol)
343
+ actual = actual.to_s
344
+ end
345
+ if actual.is_a?(String)
346
+ actual = actual.downcase
347
+ end
348
+
349
+ expected == actual
350
+ end
351
+ end
352
+ end
353
+ end
354
+ end
1
355
 
2
356
  def define_connection_string_spec_tests(test_paths, spec_cls = Mongo::ConnectionString::Spec, &block)
3
357
 
4
- clean_slate_for_all
358
+ clean_slate_for_all_if_possible
5
359
 
6
360
  test_paths.each do |path|
7
361
 
@@ -20,9 +374,9 @@ def define_connection_string_spec_tests(test_paths, spec_cls = Mongo::Connection
20
374
  context 'when the uri is invalid', unless: test.valid? do
21
375
 
22
376
  it 'raises an error' do
23
- expect{
377
+ expect do
24
378
  test.uri
25
- }.to raise_exception(Mongo::Error::InvalidURI)
379
+ end.to raise_exception(Mongo::Error::InvalidURI)
26
380
  end
27
381
  end
28
382
 
@@ -47,7 +401,7 @@ def define_connection_string_spec_tests(test_paths, spec_cls = Mongo::Connection
47
401
  expect(test.client).to have_hosts(test, test.hosts)
48
402
  end
49
403
 
50
- it 'creates a client with the correct authentication properties' do
404
+ it 'creates a client with the correct authentication options' do
51
405
  expect(test.client).to match_auth(test)
52
406
  end
53
407