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
@@ -190,4 +190,57 @@ describe 'Auth' do
190
190
  end
191
191
  end
192
192
  end
193
+
194
+ describe 'scram-sha-1 client key caching' do
195
+ clean_slate
196
+ min_server_version '3.0'
197
+ require_no_x509_auth
198
+
199
+ let(:client) { authorized_client.with(max_pool_size: 2) }
200
+
201
+ it 'caches' do
202
+ client.close
203
+ Mongo::Auth::CredentialCache.clear
204
+
205
+ RSpec::Mocks.with_temporary_scope do
206
+ expect_any_instance_of(Mongo::Auth::SCRAM::Conversation).to receive(:hi).exactly(:once).and_call_original
207
+
208
+ client.reconnect
209
+ server = client.cluster.next_primary
210
+ server.with_connection do
211
+ server.with_connection do
212
+ # nothing
213
+ end
214
+ end
215
+ end
216
+ end
217
+ end
218
+
219
+ context 'when only auth source is specified' do
220
+ require_no_auth
221
+
222
+ let(:client) do
223
+ new_local_client(SpecConfig.instance.addresses, SpecConfig.instance.ssl_options.merge(
224
+ auth_source: 'foo'))
225
+ end
226
+
227
+ it 'does not authenticate' do
228
+ expect(Mongo::Auth::User).not_to receive(:new)
229
+ client.database.command(ping: 1)
230
+ end
231
+ end
232
+
233
+ context 'when only auth mechanism is specified' do
234
+ require_x509_auth
235
+
236
+ let(:client) do
237
+ new_local_client(SpecConfig.instance.addresses, SpecConfig.instance.ssl_options.merge(
238
+ auth_mech: :mongodb_x509))
239
+ end
240
+
241
+ it 'authenticates' do
242
+ expect(Mongo::Auth::User).to receive(:new).and_call_original
243
+ client.database.command(ping: 1)
244
+ end
245
+ end
193
246
  end
@@ -1,6 +1,6 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
2
 
3
- describe 'Client options' do
3
+ describe 'Client authentication options' do
4
4
  let(:uri) { "mongodb://#{credentials}127.0.0.1:27017/#{options}" }
5
5
 
6
6
  let(:credentials) { nil }
@@ -299,9 +299,9 @@ describe 'Client options' do
299
299
  let(:credentials) { "#{user}:password@" }
300
300
 
301
301
  it 'raises an exception on client creation' do
302
- expect {
302
+ expect do
303
303
  client
304
- }.to raise_error(Mongo::Auth::InvalidConfiguration, /password is not supported/)
304
+ end.to raise_error(Mongo::Auth::InvalidConfiguration, /Password is not supported/)
305
305
  end
306
306
  end
307
307
  end
@@ -325,9 +325,9 @@ describe 'Client options' do
325
325
  let(:client_opts) { { auth_mech: :mongodb_x509, user: user, password: 'password' } }
326
326
 
327
327
  it 'raises an exception on client creation' do
328
- expect {
328
+ expect do
329
329
  client
330
- }.to raise_error(Mongo::Auth::InvalidConfiguration, /password is not supported/)
330
+ end.to raise_error(Mongo::Auth::InvalidConfiguration, /Password is not supported/)
331
331
  end
332
332
  end
333
333
  end
@@ -346,9 +346,9 @@ describe 'Client options' do
346
346
  let(:credentials) { '@' }
347
347
 
348
348
  it 'raises an exception' do
349
- expect {
349
+ expect do
350
350
  client
351
- }.to raise_error(Mongo::Auth::InvalidConfiguration, /empty username is not supported/)
351
+ end.to raise_error(Mongo::Auth::InvalidConfiguration, /Empty username is not supported/)
352
352
  end
353
353
  end
354
354
  end
@@ -365,9 +365,9 @@ describe 'Client options' do
365
365
  let(:client_opts) { { user: '', password: '' } }
366
366
 
367
367
  it 'raises an exception' do
368
- expect {
368
+ expect do
369
369
  client
370
- }.to raise_error(Mongo::Auth::InvalidConfiguration, /empty username is not supported/)
370
+ end.to raise_error(Mongo::Auth::InvalidConfiguration, /Empty username is not supported/)
371
371
  end
372
372
  end
373
373
  end
@@ -36,7 +36,7 @@ describe 'Client construction' do
36
36
 
37
37
  it 'creates connection pool and keeps it populated' do
38
38
  client = ClientRegistry.instance.new_local_client([SpecConfig.instance.addresses.first],
39
- base_options.merge(min_pool_size: 1))
39
+ base_options.merge(min_pool_size: 1, max_pool_size: 1))
40
40
  # allow connection pool to populate
41
41
  sleep 0.1
42
42
 
@@ -133,4 +133,79 @@ describe 'Client construction' do
133
133
  expect(client.cluster.topology).not_to be_a(Mongo::Cluster::Topology::Unknown)
134
134
  end
135
135
  end
136
+
137
+ context 'with auto encryption options'do
138
+ require_libmongocrypt
139
+ require_enterprise
140
+ min_server_fcv '4.2'
141
+
142
+ # Diagnostics of leaked background threads only, these tests do not
143
+ # actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
144
+ clean_slate
145
+
146
+ include_context 'define shared FLE helpers'
147
+ include_context 'with local kms_providers'
148
+
149
+ let(:options) { { auto_encryption_options: auto_encryption_options } }
150
+
151
+ let(:auto_encryption_options) do
152
+ {
153
+ key_vault_client: key_vault_client,
154
+ key_vault_namespace: key_vault_namespace,
155
+ kms_providers: kms_providers
156
+ }
157
+ end
158
+
159
+ context 'with default key vault client' do
160
+ let(:key_vault_client) { nil }
161
+
162
+ let(:client) do
163
+ ClientRegistry.instance.new_local_client([SpecConfig.instance.addresses.first], options)
164
+ end
165
+
166
+ it 'creates a working key vault client' do
167
+ key_vault_client = client.encrypter.key_vault_client
168
+
169
+ result = key_vault_client[:test].insert_one(test: 1)
170
+ expect(result).to be_ok
171
+ end
172
+
173
+ it 'creates a key vault client with the same cluster as the existing client' do
174
+ key_vault_client = client.encrypter.key_vault_client
175
+ expect(key_vault_client.cluster).to eq(client.cluster)
176
+ end
177
+ end
178
+ end
179
+
180
+ context 'when seed addresses are repeated in host list' do
181
+ require_topology :single
182
+
183
+ let(:primary_address) do
184
+ ClusterConfig.instance.primary_address_host
185
+ end
186
+
187
+ let(:client) do
188
+ new_local_client([primary_address, primary_address], SpecConfig.instance.test_options)
189
+ end
190
+
191
+ it 'deduplicates the addresses' do
192
+ expect(client.cluster.addresses).to eq([Mongo::Address.new(primary_address)])
193
+ end
194
+ end
195
+
196
+ context 'when seed addresses are repeated in URI' do
197
+ require_topology :single
198
+
199
+ let(:primary_address) do
200
+ ClusterConfig.instance.primary_address_host
201
+ end
202
+
203
+ let(:client) do
204
+ new_local_client("mongodb://#{primary_address},#{primary_address}", SpecConfig.instance.test_options)
205
+ end
206
+
207
+ it 'deduplicates the addresses' do
208
+ expect(client.cluster.addresses).to eq([Mongo::Address.new(primary_address)])
209
+ end
210
+ end
136
211
  end
@@ -0,0 +1,351 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Bulk writes with auto-encryption enabled' do
4
+ require_libmongocrypt
5
+ require_enterprise
6
+ min_server_fcv '4.2'
7
+
8
+ include_context 'define shared FLE helpers'
9
+ include_context 'with local kms_providers'
10
+
11
+ let(:subscriber) { EventSubscriber.new }
12
+
13
+ let(:client) do
14
+ new_local_client(
15
+ SpecConfig.instance.addresses,
16
+ SpecConfig.instance.test_options.merge(
17
+ auto_encryption_options: {
18
+ kms_providers: kms_providers,
19
+ key_vault_namespace: key_vault_namespace,
20
+ schema_map: { "auto_encryption.users" => schema_map },
21
+ },
22
+ database: 'auto_encryption'
23
+ ),
24
+ ).tap do |client|
25
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
26
+ end
27
+ end
28
+
29
+ let(:size_limit) { Mongo::Server::ConnectionBase::REDUCED_MAX_BSON_SIZE }
30
+
31
+ before do
32
+ authorized_client.use('auto_encryption')['users'].drop
33
+
34
+ authorized_client.use('admin')['datakeys'].drop
35
+ authorized_client.use('admin')['datakeys'].insert_one(data_key)
36
+ end
37
+
38
+ let(:command_succeeded_events) do
39
+ subscriber.succeeded_events.select do |event|
40
+ event.command_name == command_name
41
+ end
42
+ end
43
+
44
+ shared_examples 'a functioning encrypted bulk write' do |options={}|
45
+ num_writes = options[:num_writes]
46
+
47
+ before do
48
+ perform_bulk_write
49
+ end
50
+
51
+ it 'executes an encrypted bulk write' do
52
+ documents = authorized_client.use(:auto_encryption)[:users].find
53
+ ssns = documents.map { |doc| doc['ssn'] }
54
+ expect(ssns).to all(be_ciphertext)
55
+ end
56
+
57
+ it 'executes the correct number of writes' do
58
+ expect(command_succeeded_events.length).to eq(num_writes)
59
+ end
60
+ end
61
+
62
+ context 'using BulkWrite' do
63
+ let(:collection) { client['users'] }
64
+ let(:bulk_write) { Mongo::BulkWrite.new(collection, requests, {}) }
65
+ let(:perform_bulk_write) { bulk_write.execute }
66
+
67
+ context 'with insert operations' do
68
+ let(:command_name) { 'insert' }
69
+
70
+ context 'when total request size does not exceed 2MiB' do
71
+ let(:requests) do
72
+ [
73
+ { insert_one: { ssn: 'a' * (size_limit/2) } },
74
+ { insert_one: { ssn: 'a' * (size_limit/2) } }
75
+ ]
76
+ end
77
+
78
+ it_behaves_like 'a functioning encrypted bulk write', num_writes: 1
79
+ end
80
+
81
+ context 'when each operation is smaller than 2MiB, but the total request size is greater than 2MiB' do
82
+ let(:requests) do
83
+ [
84
+ { insert_one: { ssn: 'a' * (size_limit - 2000) } },
85
+ { insert_one: { ssn: 'a' * (size_limit - 2000) } }
86
+ ]
87
+ end
88
+
89
+ it_behaves_like 'a functioning encrypted bulk write', num_writes: 2
90
+ end
91
+
92
+ context 'when each operation is larger than 2MiB' do
93
+ let(:requests) do
94
+ [
95
+ { insert_one: { ssn: 'a' * (size_limit * 2) } },
96
+ { insert_one: { ssn: 'a' * (size_limit * 2) } }
97
+ ]
98
+ end
99
+
100
+ it_behaves_like 'a functioning encrypted bulk write', num_writes: 2
101
+ end
102
+
103
+ context 'when one operation is larger than 16MiB' do
104
+ let(:requests) do
105
+ [
106
+ { insert_one: { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE + 1000) } },
107
+ { insert_one: { ssn: 'a' * size_limit } }
108
+ ]
109
+ end
110
+
111
+ it 'raises an exception' do
112
+ expect do
113
+ bulk_write.execute
114
+ end.to raise_error(Mongo::Error::MaxBSONSize, /maximum allowed size: 16777216 bytes/)
115
+ end
116
+ end
117
+ end
118
+
119
+ context 'with update operations' do
120
+ let(:command_name) { 'update' }
121
+
122
+ before do
123
+ client['users'].insert_one(_id: 1)
124
+ client['users'].insert_one(_id: 2)
125
+ end
126
+
127
+ context 'when total request size does not exceed 2MiB' do
128
+ let(:requests) do
129
+ [
130
+ { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (size_limit/2) } } },
131
+ { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * (size_limit/2) } } },
132
+ ]
133
+ end
134
+
135
+ it_behaves_like 'a functioning encrypted bulk write', num_writes: 1
136
+ end
137
+
138
+ context 'when each operation is smaller than 2MiB, but the total request size is greater than 2MiB' do
139
+ let(:requests) do
140
+ [
141
+ { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (size_limit - 2000) } } },
142
+ { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * (size_limit - 2000) } } },
143
+ ]
144
+ end
145
+
146
+ it_behaves_like 'a functioning encrypted bulk write', num_writes: 2
147
+ end
148
+
149
+ context 'when each operation is larger than 2MiB' do
150
+ let(:requests) do
151
+ [
152
+ { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (size_limit * 2) } } },
153
+ { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * (size_limit * 2) } } },
154
+ ]
155
+ end
156
+
157
+ it_behaves_like 'a functioning encrypted bulk write', num_writes: 2
158
+ end
159
+
160
+ context 'when one operation is larger than 16MiB' do
161
+ let(:requests) do
162
+ [
163
+ { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE - 100) } } },
164
+ { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * size_limit } } },
165
+ ]
166
+ end
167
+
168
+ it 'raises an exception' do
169
+ expect do
170
+ bulk_write.execute
171
+ end.to raise_error(Mongo::Error::MaxBSONSize, /maximum allowed size: 16777216 bytes/)
172
+ end
173
+ end
174
+ end
175
+
176
+ context 'with delete operations' do
177
+ let(:command_name) { 'delete' }
178
+
179
+ context 'when total request size does not exceed 2MiB' do
180
+ before do
181
+ client['users'].insert_one(ssn: 'a' * (size_limit/2))
182
+ client['users'].insert_one(ssn: 'b' * (size_limit/2))
183
+ end
184
+
185
+ let(:requests) do
186
+ [
187
+ { delete_one: { filter: { ssn: 'a' * (size_limit/2) } } },
188
+ { delete_one: { filter: { ssn: 'b' * (size_limit/2) } } }
189
+ ]
190
+ end
191
+
192
+ it 'performs one delete' do
193
+ bulk_write.execute
194
+
195
+ documents = authorized_client.use('auto_encryption')['users'].find.to_a
196
+ expect(documents.length).to eq(0)
197
+ expect(command_succeeded_events.length).to eq(1)
198
+ end
199
+ end
200
+
201
+ context 'when each operation is smaller than 2MiB, but the total request size is greater than 2MiB' do
202
+ before do
203
+ client['users'].insert_one(ssn: 'a' * (size_limit - 2000))
204
+ client['users'].insert_one(ssn: 'b' * (size_limit - 2000))
205
+ end
206
+
207
+ let(:requests) do
208
+ [
209
+ { delete_one: { filter: { ssn: 'a' * (size_limit - 2000) } } },
210
+ { delete_one: { filter: { ssn: 'b' * (size_limit - 2000) } } }
211
+ ]
212
+ end
213
+
214
+ it 'performs two deletes' do
215
+ bulk_write.execute
216
+
217
+ documents = authorized_client.use('auto_encryption')['users'].find.to_a
218
+ expect(documents.length).to eq(0)
219
+ expect(command_succeeded_events.length).to eq(2)
220
+ end
221
+ end
222
+
223
+ context 'when each operation is larger than 2MiB' do
224
+ before do
225
+ client['users'].insert_one(ssn: 'a' * (size_limit * 2))
226
+ client['users'].insert_one(ssn: 'b' * (size_limit * 2))
227
+ end
228
+
229
+ let(:requests) do
230
+ [
231
+ { delete_one: { filter: { ssn: 'a' * (size_limit * 2) } } },
232
+ { delete_one: { filter: { ssn: 'b' * (size_limit * 2) } } }
233
+ ]
234
+ end
235
+
236
+ it 'performs two deletes' do
237
+ bulk_write.execute
238
+
239
+ documents = authorized_client.use('auto_encryption')['users'].find.to_a
240
+ expect(documents.length).to eq(0)
241
+ expect(command_succeeded_events.length).to eq(2)
242
+ end
243
+ end
244
+
245
+ context 'when one operation is larger than 16MiB' do
246
+ let(:requests) do
247
+ [
248
+ { delete_one: { filter: { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE + 1000) } } },
249
+ { delete_one: { filter: { ssn: 'b' * (size_limit * 2) } } }
250
+ ]
251
+ end
252
+
253
+ it 'raises an exception' do
254
+ expect do
255
+ bulk_write.execute
256
+ end.to raise_error(Mongo::Error::MaxBSONSize, /maximum allowed size: 16777216 bytes/)
257
+ end
258
+ end
259
+ end
260
+
261
+ context 'with insert, update, and delete operations' do
262
+ context 'when total request size does not exceed 2MiB' do
263
+ let(:requests) do
264
+ [
265
+ { insert_one: { _id: 1, ssn: 'a' * (size_limit/3) } },
266
+ { update_one: { filter: { _id: 1 }, update: { ssn: 'b' * (size_limit/3) } } },
267
+ { delete_one: { filter: { ssn: 'b' * (size_limit/3) } } }
268
+ ]
269
+ end
270
+
271
+ it 'successfully performs the bulk write' do
272
+ bulk_write.execute
273
+
274
+ documents = authorized_client.use('auto_encryption')['users'].find.to_a
275
+ expect(documents.length).to eq(0)
276
+ end
277
+
278
+ # Bulk writes with different types of operations should
279
+ it 'performs 1 insert, 1 update, and 1 delete' do
280
+ bulk_write.execute
281
+
282
+ command_succeeded_events = subscriber.succeeded_events
283
+
284
+ inserts = command_succeeded_events.select { |event| event.command_name == 'insert' }
285
+ updates = command_succeeded_events.select { |event| event.command_name == 'update' }
286
+ deletes = command_succeeded_events.select { |event| event.command_name == 'delete' }
287
+
288
+ expect(inserts.length).to eq(1)
289
+ expect(updates.length).to eq(1)
290
+ expect(deletes.length).to eq(1)
291
+ end
292
+ end
293
+ end
294
+ end
295
+
296
+ context '#insert_many' do
297
+ let(:perform_bulk_write) do
298
+ client[:users].insert_many(documents)
299
+ end
300
+
301
+ let(:command_name) { 'insert' }
302
+
303
+ context 'when total request size does not exceed 2MiB' do
304
+ let(:documents) do
305
+ [
306
+ { ssn: 'a' * (size_limit/2) },
307
+ { ssn: 'a' * (size_limit/2) },
308
+ ]
309
+ end
310
+
311
+ it_behaves_like 'a functioning encrypted bulk write', num_writes: 1
312
+ end
313
+
314
+ context 'when each operation is smaller than 2MiB, but the total request size is greater than 2MiB' do
315
+ let(:documents) do
316
+ [
317
+ { ssn: 'a' * (size_limit - 2000) },
318
+ { ssn: 'a' * (size_limit - 2000) },
319
+ ]
320
+ end
321
+
322
+ it_behaves_like 'a functioning encrypted bulk write', num_writes: 2
323
+ end
324
+
325
+ context 'when each operation is larger than 2MiB' do
326
+ let(:documents) do
327
+ [
328
+ { ssn: 'a' * (size_limit * 2) },
329
+ { ssn: 'a' * (size_limit * 2) },
330
+ ]
331
+ end
332
+
333
+ it_behaves_like 'a functioning encrypted bulk write', num_writes: 2
334
+ end
335
+
336
+ context 'when one operation is larger than 16MiB' do
337
+ let(:documents) do
338
+ [
339
+ { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE + 1000) },
340
+ { ssn: 'a' * size_limit },
341
+ ]
342
+ end
343
+
344
+ it 'raises an exception' do
345
+ expect do
346
+ perform_bulk_write
347
+ end.to raise_error(Mongo::Error::MaxBSONSize, /maximum allowed size: 16777216 bytes/)
348
+ end
349
+ end
350
+ end
351
+ end