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
@@ -0,0 +1,301 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Auto Encryption' do
4
+ require_libmongocrypt
5
+ require_enterprise
6
+ min_server_fcv '4.2'
7
+
8
+ # Diagnostics of leaked background threads only, these tests do not
9
+ # actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
10
+ clean_slate
11
+
12
+ include_context 'define shared FLE helpers'
13
+ include_context 'with local kms_providers'
14
+
15
+ let(:subscriber) { EventSubscriber.new }
16
+ let(:db_name) { 'auto_encryption' }
17
+
18
+ let(:encryption_client) do
19
+ new_local_client(
20
+ SpecConfig.instance.addresses,
21
+ SpecConfig.instance.test_options.merge(
22
+ auto_encryption_options: {
23
+ kms_providers: kms_providers,
24
+ key_vault_namespace: key_vault_namespace,
25
+ schema_map: { "auto_encryption.users" => schema_map },
26
+ },
27
+ database: db_name
28
+ ),
29
+ ).tap do |client|
30
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
31
+ end
32
+ end
33
+
34
+ before(:each) do
35
+ authorized_client.use(key_vault_db)[key_vault_coll].drop
36
+ authorized_client.use(key_vault_db)[key_vault_coll].insert_one(data_key)
37
+
38
+ encryption_client[:users].drop
39
+ result = encryption_client[:users].insert_one(ssn: ssn, age: 23)
40
+ end
41
+
42
+ let(:started_event) do
43
+ subscriber.started_events.find do |event|
44
+ event.command_name == command_name && event.database_name == db_name
45
+ end
46
+ end
47
+
48
+ let(:succeeded_event) do
49
+ subscriber.succeeded_events.find do |event|
50
+ event.command_name == command_name && event.database_name == db_name
51
+ end
52
+ end
53
+
54
+ let(:key_vault_list_collections_event) do
55
+ subscriber.started_events.find do |event|
56
+ event.command_name == 'listCollections' && event.database_name == key_vault_db
57
+ end
58
+ end
59
+
60
+ shared_examples 'it has an encrypted key_vault_client' do
61
+ it 'registers a listCollections event on the key vault client' do
62
+ expect(key_vault_list_collections_event).not_to be_nil
63
+ expect(key_vault_list_collections_event.command['$db']).to eq(key_vault_db)
64
+ end
65
+ end
66
+
67
+ describe '#aggregate' do
68
+ let(:command_name) { 'aggregate' }
69
+
70
+ before do
71
+ encryption_client[:users].aggregate([{ '$match' => { 'ssn' => ssn } }]).first
72
+ end
73
+
74
+ it 'has encrypted data in command monitoring' do
75
+ # Command started event occurs after ssn is encrypted
76
+ expect(
77
+ started_event.command["pipeline"].first["$match"]["ssn"]["$eq"]
78
+ ).to be_ciphertext
79
+
80
+ # Command succeeded event occurs before ssn is decrypted
81
+ expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
82
+ end
83
+
84
+ it_behaves_like 'it has an encrypted key_vault_client'
85
+ end
86
+
87
+ describe '#count' do
88
+ let(:command_name) { 'count' }
89
+
90
+ before do
91
+ encryption_client[:users].count(ssn: ssn)
92
+ end
93
+
94
+ it 'has encrypted data in command monitoring' do
95
+ # Command started event occurs after ssn is encrypted
96
+ # Command succeeded event does not contain any data to be decrypted
97
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
98
+ end
99
+
100
+ it_behaves_like 'it has an encrypted key_vault_client'
101
+ end
102
+
103
+ describe '#distinct' do
104
+ let(:command_name) { 'distinct' }
105
+
106
+ before do
107
+ encryption_client[:users].distinct(:ssn)
108
+ end
109
+
110
+ it 'has encrypted data in command monitoring' do
111
+ # Command started event does not contain any data to be encrypted
112
+ # Command succeeded event occurs before ssn is decrypted
113
+ expect(succeeded_event.reply["values"].first).to be_ciphertext
114
+ end
115
+
116
+ it_behaves_like 'it has an encrypted key_vault_client'
117
+ end
118
+
119
+ describe '#delete_one' do
120
+ let(:command_name) { 'delete' }
121
+
122
+ before do
123
+ encryption_client[:users].delete_one(ssn: ssn)
124
+ end
125
+
126
+ it 'has encrypted data in command monitoring' do
127
+ # Command started event occurs after ssn is encrypted
128
+ # Command succeeded event does not contain any data to be decrypted
129
+ expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
130
+ end
131
+
132
+ it_behaves_like 'it has an encrypted key_vault_client'
133
+ end
134
+
135
+ describe '#delete_many' do
136
+ let(:command_name) { 'delete' }
137
+
138
+ before do
139
+ encryption_client[:users].delete_many(ssn: ssn)
140
+ end
141
+
142
+ it 'has encrypted data in command monitoring' do
143
+ # Command started event occurs after ssn is encrypted
144
+ # Command succeeded event does not contain any data to be decrypted
145
+ expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
146
+ end
147
+
148
+ it_behaves_like 'it has an encrypted key_vault_client'
149
+ end
150
+
151
+ describe '#find' do
152
+ let(:command_name) { 'find' }
153
+
154
+ before do
155
+ encryption_client[:users].find(ssn: ssn).first
156
+ end
157
+
158
+ it 'has encrypted data in command monitoring' do
159
+ # Command started event occurs after ssn is encrypted
160
+ expect(started_event.command["filter"]["ssn"]["$eq"]).to be_ciphertext
161
+
162
+ # Command succeeded event occurs before ssn is decrypted
163
+ expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
164
+ end
165
+
166
+ it_behaves_like 'it has an encrypted key_vault_client'
167
+ end
168
+
169
+ describe '#find_one_and_delete' do
170
+ let(:command_name) { 'findAndModify' }
171
+
172
+ before do
173
+ encryption_client[:users].find_one_and_delete(ssn: ssn)
174
+ end
175
+
176
+ it 'has encrypted data in command monitoring' do
177
+ # Command started event occurs after ssn is encrypted
178
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
179
+
180
+ # Command succeeded event occurs before ssn is decrypted
181
+ expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
182
+ end
183
+
184
+ it_behaves_like 'it has an encrypted key_vault_client'
185
+ end
186
+
187
+ describe '#find_one_and_replace' do
188
+ let(:command_name) { 'findAndModify' }
189
+
190
+ before do
191
+ encryption_client[:users].find_one_and_replace(
192
+ { ssn: ssn },
193
+ { ssn: '555-555-5555' }
194
+ )
195
+ end
196
+
197
+ it 'has encrypted data in command monitoring' do
198
+ # Command started event occurs after ssn is encrypted
199
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
200
+ expect(started_event.command["update"]["ssn"]).to be_ciphertext
201
+
202
+ # Command succeeded event occurs before ssn is decrypted
203
+ expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
204
+ end
205
+
206
+ it_behaves_like 'it has an encrypted key_vault_client'
207
+ end
208
+
209
+ describe '#find_one_and_update' do
210
+ let(:command_name) { 'findAndModify' }
211
+
212
+ before do
213
+ encryption_client[:users].find_one_and_update(
214
+ { ssn: ssn },
215
+ { ssn: '555-555-5555' }
216
+ )
217
+ end
218
+
219
+ it 'has encrypted data in command monitoring' do
220
+
221
+ # Command started event occurs after ssn is encrypted
222
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
223
+ expect(started_event.command["update"]["ssn"]).to be_ciphertext
224
+
225
+ # Command succeeded event occurs before ssn is decrypted
226
+ expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
227
+ end
228
+
229
+ it_behaves_like 'it has an encrypted key_vault_client'
230
+ end
231
+
232
+ describe '#insert_one' do
233
+ let(:command_name) { 'insert' }
234
+
235
+ before do
236
+ encryption_client[:users].insert_one(ssn: ssn)
237
+ end
238
+
239
+ it 'has encrypted data in command monitoring' do
240
+ # Command started event occurs after ssn is encrypted
241
+ # Command succeeded event does not contain any data to be decrypted
242
+ expect(started_event.command["documents"].first["ssn"]).to be_ciphertext
243
+ end
244
+
245
+ it_behaves_like 'it has an encrypted key_vault_client'
246
+ end
247
+
248
+ describe '#replace_one' do
249
+ let(:command_name) { 'update' }
250
+
251
+ before do
252
+ encryption_client[:users].replace_one(
253
+ { ssn: ssn },
254
+ { ssn: '555-555-5555' }
255
+ )
256
+ end
257
+
258
+ it 'has encrypted data in command monitoring' do
259
+ # Command started event occurs after ssn is encrypted
260
+ # Command succeeded event does not contain any data to be decrypted
261
+ expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
262
+ expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
263
+ end
264
+
265
+ it_behaves_like 'it has an encrypted key_vault_client'
266
+ end
267
+
268
+ describe '#update_one' do
269
+ let(:command_name) { 'update' }
270
+
271
+ before do
272
+ encryption_client[:users].update_one({ ssn: ssn }, { ssn: '555-555-5555' })
273
+ end
274
+
275
+ it 'has encrypted data in command monitoring' do
276
+ # Command started event occurs after ssn is encrypted
277
+ # Command succeeded event does not contain any data to be decrypted
278
+ expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
279
+ expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
280
+ end
281
+
282
+ it_behaves_like 'it has an encrypted key_vault_client'
283
+ end
284
+
285
+ describe '#update_many' do
286
+ let(:command_name) { 'update' }
287
+
288
+ before do
289
+ # update_many does not support replacement-style updates
290
+ encryption_client[:users].update_many({ ssn: ssn }, { "$inc" => { :age => 1 } })
291
+ end
292
+
293
+ it 'has encrypted data in command monitoring' do
294
+ # Command started event occurs after ssn is encrypted
295
+ # Command succeeded event does not contain any data to be decrypted
296
+ expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
297
+ end
298
+
299
+ it_behaves_like 'it has an encrypted key_vault_client'
300
+ end
301
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Auto Encryption' do
4
+ require_libmongocrypt
5
+ min_server_fcv '4.2'
6
+ require_enterprise
7
+
8
+ include_context 'define shared FLE helpers'
9
+ include_context 'with local kms_providers'
10
+
11
+ context 'with an invalid mongocryptd spawn path' do
12
+ let(:client) do
13
+ new_local_client(
14
+ SpecConfig.instance.addresses,
15
+ SpecConfig.instance.test_options.merge(
16
+ auto_encryption_options: {
17
+ kms_providers: kms_providers,
18
+ key_vault_namespace: key_vault_namespace,
19
+ schema_map: { 'auto_encryption.users' => schema_map },
20
+ extra_options: {
21
+ mongocryptd_spawn_path: 'echo hello world',
22
+ mongocryptd_spawn_args: []
23
+ }
24
+ },
25
+ database: 'auto_encryption'
26
+ ),
27
+ )
28
+ end
29
+
30
+ let(:server_selector) { double("ServerSelector") }
31
+ let(:cluster) { double("Cluster") }
32
+
33
+ before do
34
+ authorized_client.use(:admin)[:datakeys].drop
35
+ authorized_client.use(:admin)[:datakeys].insert_one(data_key)
36
+
37
+ allow(server_selector).to receive(:name)
38
+ allow(server_selector).to receive(:server_selection_timeout)
39
+ allow(server_selector).to receive(:local_threshold)
40
+ allow(cluster).to receive(:summary)
41
+
42
+ # Raise a server selection error on intent-to-encrypt commands to mock
43
+ # what would happen if mongocryptd hadn't already been spawned. It is
44
+ # necessary to mock this behavior because it is likely that another test
45
+ # will have already spawned mongocryptd, causing this test to fail.
46
+ allow_any_instance_of(Mongo::Database)
47
+ .to receive(:command)
48
+ .with(
49
+ hash_including(
50
+ 'insert' => 'users',
51
+ '$db' => 'auto_encryption',
52
+ 'ordered' => true,
53
+ 'lsid' => kind_of(Hash),
54
+ 'documents' => kind_of(Array),
55
+ 'jsonSchema' => kind_of(Hash),
56
+ 'isRemoteSchema' => false,
57
+ )
58
+ )
59
+ .and_raise(Mongo::Error::NoServerAvailable.new(server_selector, cluster))
60
+ end
61
+
62
+ it 'raises an exception when trying to perform auto encryption' do
63
+ expect do
64
+ client[:users].insert_one(ssn: ssn)
65
+ end.to raise_error(
66
+ Mongo::Error::MongocryptdSpawnError,
67
+ /Failed to spawn mongocryptd at the path "echo hello world" with arguments/
68
+ )
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Auto Encryption' do
4
+ require_libmongocrypt
5
+ max_server_version '4.0'
6
+
7
+ # Diagnostics of leaked background threads only, these tests do not
8
+ # actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
9
+ clean_slate
10
+
11
+ include_context 'define shared FLE helpers'
12
+
13
+ let(:encryption_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
+ # Must use local schema map because server versions older than 4.2
21
+ # do not support jsonSchema collection validator.
22
+ schema_map: { 'auto_encryption.users' => schema_map },
23
+ bypass_auto_encryption: bypass_auto_encryption
24
+ },
25
+ database: 'auto_encryption'
26
+ ),
27
+ )
28
+ end
29
+
30
+ let(:bypass_auto_encryption) { false }
31
+ let(:client) { authorized_client.use(:auto_encryption) }
32
+
33
+ let(:encrypted_ssn_binary) do
34
+ BSON::Binary.new(Base64.decode64(encrypted_ssn), :ciphertext)
35
+ end
36
+
37
+ shared_examples 'it decrypts but does not encrypt on wire version < 8' do
38
+ before do
39
+ client[:users].insert_one(ssn: encrypted_ssn_binary)
40
+
41
+ authorized_client.use(:admin)[:datakeys].drop
42
+ authorized_client.use(:admin)[:datakeys].insert_one(data_key)
43
+ end
44
+
45
+ it 'raises an exception when trying to encrypt' do
46
+ expect do
47
+ encryption_client[:users].find(ssn: ssn).first
48
+ end.to raise_error(Mongo::Error::CryptError, /Auto-encryption requires a minimum MongoDB version of 4.2/)
49
+ end
50
+
51
+ context 'with bypass_auto_encryption=true' do
52
+ let(:bypass_auto_encryption) { true }
53
+
54
+ it 'does not raise an exception but doesn\'t encrypt' do
55
+ document = encryption_client[:users].find(ssn: ssn).first
56
+ expect(document).to be_nil
57
+ end
58
+
59
+ it 'still decrypts' do
60
+ document = encryption_client[:users].find(ssn: encrypted_ssn_binary).first
61
+ # ssn field is still decrypted
62
+ expect(document['ssn']).to eq(ssn)
63
+ end
64
+ end
65
+ end
66
+
67
+ context 'with AWS kms provider' do
68
+ include_context 'with AWS kms_providers'
69
+ it_behaves_like 'it decrypts but does not encrypt on wire version < 8'
70
+ end
71
+
72
+ context 'with local kms provider' do
73
+ include_context 'with local kms_providers'
74
+ it_behaves_like 'it decrypts but does not encrypt on wire version < 8'
75
+ end
76
+ end
@@ -0,0 +1,216 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Client with auto encryption #reconnect' do
4
+ require_libmongocrypt
5
+ min_server_fcv '4.2'
6
+ require_enterprise
7
+
8
+ # Diagnostics of leaked background threads only, these tests do not
9
+ # actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
10
+ clean_slate
11
+
12
+ include_context 'define shared FLE helpers'
13
+
14
+ let(:client) do
15
+ new_local_client(
16
+ SpecConfig.instance.addresses,
17
+ SpecConfig.instance.test_options.merge(
18
+ {
19
+ auto_encryption_options: {
20
+ kms_providers: kms_providers,
21
+ key_vault_namespace: key_vault_namespace,
22
+ key_vault_client: key_vault_client_option,
23
+ schema_map: { 'auto_encryption.users': schema_map }
24
+ },
25
+ database: 'auto_encryption'
26
+ }
27
+ )
28
+ )
29
+ end
30
+
31
+ let(:unencrypted_client) { authorized_client.use(:auto_encryption) }
32
+
33
+ let(:mongocryptd_client) { client.encrypter.mongocryptd_client }
34
+ let(:key_vault_client) { client.encrypter.key_vault_client }
35
+ let(:data_key_id) { data_key['_id'] }
36
+
37
+ shared_examples 'a functioning client' do
38
+ it 'can perform an encrypted find command' do
39
+ doc = client[:users].find(ssn: ssn).first
40
+ expect(doc).not_to be_nil
41
+ expect(doc['ssn']).to eq(ssn)
42
+ end
43
+ end
44
+
45
+ shared_examples 'a functioning mongocryptd client' do
46
+ it 'can perform a schemaRequiresEncryption command' do
47
+ # A schemaRequiresEncryption command; mongocryptd should respond that
48
+ # this command requires encryption.
49
+ response = mongocryptd_client.database.command(
50
+ insert: 'users',
51
+ ordered: true,
52
+ lsid: { id: BSON::Binary.new("\x00" * 16, :uuid) },
53
+ documents: [{
54
+ ssn: '123-456-7890',
55
+ _id: BSON::ObjectId.new,
56
+ }],
57
+ jsonSchema: schema_map,
58
+ isRemoteSchema: false
59
+ )
60
+
61
+ expect(response).to be_ok
62
+ expect(response.documents.first['schemaRequiresEncryption']).to be true
63
+ end
64
+ end
65
+
66
+ shared_examples 'a functioning key vault client' do
67
+ it 'can perform a find command' do
68
+ doc = key_vault_client.use(key_vault_db)[key_vault_coll].find(_id: data_key_id).first
69
+ expect(doc).not_to be_nil
70
+ expect(doc['_id']).to eq(data_key_id)
71
+ end
72
+ end
73
+
74
+ shared_examples 'an auto-encryption client that reconnects properly' do
75
+ before do
76
+ authorized_client.use(:admin)[:datakeys].drop
77
+ authorized_client.use(:admin)[:datakeys].insert_one(data_key)
78
+
79
+ unencrypted_client[:users].drop
80
+ # Use a client without auto_encryption_options to insert an
81
+ # encrypted document into the collection; this ensures that the
82
+ # client with auto_encryption_options must perform decryption
83
+ # to properly read the document.
84
+ unencrypted_client[:users].insert_one(
85
+ ssn: BSON::Binary.new(Base64.decode64(encrypted_ssn), :ciphertext)
86
+ )
87
+ end
88
+
89
+ context 'after reconnecting without closing main client' do
90
+ before do
91
+ client.reconnect
92
+ end
93
+
94
+ it_behaves_like 'a functioning client'
95
+ it_behaves_like 'a functioning mongocryptd client'
96
+ it_behaves_like 'a functioning key vault client'
97
+ end
98
+
99
+ context 'after closing and reconnecting main client' do
100
+ before do
101
+ client.close
102
+ client.reconnect
103
+ end
104
+
105
+ it_behaves_like 'a functioning client'
106
+ it_behaves_like 'a functioning mongocryptd client'
107
+ it_behaves_like 'a functioning key vault client'
108
+ end
109
+
110
+ context 'after killing client monitor thread' do
111
+ before do
112
+ thread = client.cluster.servers.first.monitor.instance_variable_get('@thread')
113
+ expect(thread).to be_alive
114
+
115
+ thread.kill
116
+
117
+ sleep 0.1
118
+ expect(thread).not_to be_alive
119
+
120
+ client.reconnect
121
+ end
122
+
123
+ it_behaves_like 'a functioning client'
124
+ it_behaves_like 'a functioning mongocryptd client'
125
+ it_behaves_like 'a functioning key vault client'
126
+ end
127
+
128
+ context 'after closing mongocryptd client and reconnecting' do
129
+ before do
130
+ mongocryptd_client.close
131
+ client.reconnect
132
+ end
133
+
134
+ it_behaves_like 'a functioning client'
135
+ it_behaves_like 'a functioning mongocryptd client'
136
+ it_behaves_like 'a functioning key vault client'
137
+ end
138
+
139
+ context 'after killing mongocryptd client monitor thread and reconnecting' do
140
+ before do
141
+ thread = mongocryptd_client.cluster.servers.first.monitor.instance_variable_get('@thread')
142
+ expect(thread).to be_alive
143
+
144
+ thread.kill
145
+
146
+ sleep 0.1
147
+ expect(thread).not_to be_alive
148
+
149
+ client.reconnect
150
+ end
151
+
152
+ it_behaves_like 'a functioning client'
153
+ it_behaves_like 'a functioning mongocryptd client'
154
+ it_behaves_like 'a functioning key vault client'
155
+ end
156
+
157
+ context 'after closing key_vault_client and reconnecting' do
158
+ before do
159
+ key_vault_client.close
160
+ client.reconnect
161
+ end
162
+
163
+ it_behaves_like 'a functioning client'
164
+ it_behaves_like 'a functioning mongocryptd client'
165
+ it_behaves_like 'a functioning key vault client'
166
+ end
167
+
168
+ context 'after killing key_vault_client monitor thread and reconnecting' do
169
+ before do
170
+ thread = key_vault_client.cluster.servers.first.monitor.instance_variable_get('@thread')
171
+ expect(thread).to be_alive
172
+
173
+ thread.kill
174
+
175
+ sleep 0.1
176
+ expect(thread).not_to be_alive
177
+
178
+ client.reconnect
179
+ end
180
+
181
+ it_behaves_like 'a functioning client'
182
+ it_behaves_like 'a functioning mongocryptd client'
183
+ it_behaves_like 'a functioning key vault client'
184
+ end
185
+ end
186
+
187
+ context 'with default key vault client option' do
188
+ let(:key_vault_client_option) { nil }
189
+
190
+ context 'with AWS KMS providers' do
191
+ include_context 'with AWS kms_providers'
192
+ it_behaves_like 'an auto-encryption client that reconnects properly'
193
+ end
194
+
195
+ context 'with local KMS providers' do
196
+ include_context 'with local kms_providers'
197
+ it_behaves_like 'an auto-encryption client that reconnects properly'
198
+ end
199
+ end
200
+
201
+ context 'with custom key vault client option' do
202
+ let(:key_vault_client_option) do
203
+ Mongo::Client.new(SpecConfig.instance.addresses).use(:test)
204
+ end
205
+
206
+ context 'with AWS KMS providers' do
207
+ include_context 'with AWS kms_providers'
208
+ it_behaves_like 'an auto-encryption client that reconnects properly'
209
+ end
210
+
211
+ context 'with local KMS providers' do
212
+ include_context 'with local kms_providers'
213
+ it_behaves_like 'an auto-encryption client that reconnects properly'
214
+ end
215
+ end
216
+ end