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,136 @@
1
+ require 'mongo'
2
+ require 'spec_helper'
3
+
4
+ describe Mongo::Crypt::EncryptionIO do
5
+ let(:subject) do
6
+ described_class.new(
7
+ key_vault_namespace: 'foo.bar',
8
+ key_vault_client: authorized_client,
9
+ mongocryptd_options: mongocryptd_options,
10
+ )
11
+ end
12
+
13
+ describe '#spawn_mongocryptd' do
14
+ context 'no spawn path' do
15
+ let(:mongocryptd_options) do
16
+ {
17
+ mongocryptd_spawn_args: ['test'],
18
+ }
19
+ end
20
+
21
+ it 'fails with an exception' do
22
+ lambda do
23
+ subject.send(:spawn_mongocryptd)
24
+ end.should raise_error(ArgumentError, /Cannot spawn mongocryptd process when no.*mongocryptd_spawn_path/)
25
+ end
26
+ end
27
+
28
+ context 'no spawn args' do
29
+ let(:mongocryptd_options) do
30
+ {
31
+ mongocryptd_spawn_path: 'echo',
32
+ }
33
+ end
34
+
35
+ it 'fails with an exception' do
36
+ lambda do
37
+ subject.send(:spawn_mongocryptd)
38
+ end.should raise_error(ArgumentError, /Cannot spawn mongocryptd process when no.*mongocryptd_spawn_args/)
39
+ end
40
+ end
41
+
42
+ context 'empty array for spawn args' do
43
+ let(:mongocryptd_options) do
44
+ {
45
+ mongocryptd_spawn_path: 'echo',
46
+ mongocryptd_spawn_args: [],
47
+ }
48
+ end
49
+
50
+ it 'fails with an exception' do
51
+ lambda do
52
+ subject.send(:spawn_mongocryptd)
53
+ end.should raise_error(ArgumentError, /Cannot spawn mongocryptd process when no.*mongocryptd_spawn_args/)
54
+ end
55
+ end
56
+
57
+ context 'good spawn path and args' do
58
+ let(:mongocryptd_options) do
59
+ {
60
+ mongocryptd_spawn_path: 'echo',
61
+ mongocryptd_spawn_args: ['hi'],
62
+ }
63
+ end
64
+
65
+ it 'spawns' do
66
+ subject.send(:spawn_mongocryptd)
67
+ end
68
+ end
69
+
70
+ context '-- for args to emulate no args' do
71
+ let(:mongocryptd_options) do
72
+ {
73
+ mongocryptd_spawn_path: 'echo',
74
+ mongocryptd_spawn_args: ['--'],
75
+ }
76
+ end
77
+
78
+ it 'spawns' do
79
+ subject.send(:spawn_mongocryptd)
80
+ end
81
+ end
82
+ end
83
+
84
+ describe '#mark_command' do
85
+ let(:mock_client) do
86
+ double('mongocryptd client').tap do |client|
87
+ database = double('mock database')
88
+ expect(database).to receive(:command).and_raise(Mongo::Error::NoServerAvailable.new(Mongo::ServerSelector::Primary.new, nil, 'test message'))
89
+ allow(database).to receive(:command).and_return([])
90
+ expect(client).to receive(:database).at_least(:once).and_return(database)
91
+ end
92
+ end
93
+
94
+ let(:base_options) do
95
+ {
96
+ mongocryptd_spawn_path: 'echo',
97
+ mongocryptd_spawn_args: ['--'],
98
+ }
99
+ end
100
+
101
+ let(:subject) do
102
+ described_class.new(
103
+ mongocryptd_client: mock_client,
104
+ key_vault_namespace: 'foo.bar',
105
+ key_vault_client: authorized_client,
106
+ mongocryptd_options: mongocryptd_options,
107
+ )
108
+ end
109
+
110
+ context ':mongocryptd_bypass_spawn not given' do
111
+ let(:mongocryptd_options) do
112
+ base_options
113
+ end
114
+
115
+ it 'spawns' do
116
+ expect(subject).to receive(:spawn_mongocryptd)
117
+ subject.mark_command({})
118
+ end
119
+ end
120
+
121
+ context ':mongocryptd_bypass_spawn given' do
122
+ let(:mongocryptd_options) do
123
+ base_options.merge(
124
+ mongocryptd_bypass_spawn: true,
125
+ )
126
+ end
127
+
128
+ it 'does not spawn' do
129
+ expect(subject).not_to receive(:spawn_mongocryptd)
130
+ lambda do
131
+ subject.mark_command({})
132
+ end.should raise_error(Mongo::Error::NoServerAvailable, /test message/)
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,72 @@
1
+ require 'mongo'
2
+ require 'lite_spec_helper'
3
+
4
+ describe Mongo::Crypt::ExplicitDecryptionContext do
5
+ require_libmongocrypt
6
+ include_context 'define shared FLE helpers'
7
+
8
+ let(:mongocrypt) { Mongo::Crypt::Handle.new(kms_providers, logger: logger) }
9
+ let(:context) { described_class.new(mongocrypt, io, value) }
10
+ let(:logger) { nil }
11
+ let(:io) { double("Mongo::ClientEncryption::IO") }
12
+
13
+ # A binary string representing a value previously encrypted by libmongocrypt
14
+ let(:encrypted_data) do
15
+ "\x01\xDF2~\x89\xD2+N}\x84;i(\xE5\xF4\xBF \x024\xE5\xD2\n\x9E\x97\x9F\xAF\x9D\xC7\xC9\x1A\a\x87z\xAE_;r\xAC\xA9\xF6n\x1D\x0F\xB5\xB1#O\xB7\xCA\xEE$/\xF1\xFA\b\xA7\xEC\xDB\xB6\xD4\xED\xEAMw3+\xBBv\x18\x97\xF9\x99\xD5\x13@\x80y\n{\x19R\xD3\xF0\xA1C\x05\xF7)\x93\x9Bh\x8AA.\xBB\xD3&\xEA"
16
+ end
17
+
18
+ let(:value) do
19
+ { 'v': BSON::Binary.new(encrypted_data, :ciphertext) }
20
+ end
21
+
22
+ describe '#initialize' do
23
+ context 'when mongocrypt is initialized with local KMS provider options' do
24
+ include_context 'with local kms_providers'
25
+
26
+ it 'initializes context' do
27
+ expect do
28
+ context
29
+ end.not_to raise_error
30
+ end
31
+ end
32
+
33
+ context 'when mongocrypt is initialized with AWS KMS provider options' do
34
+ include_context 'with AWS kms_providers'
35
+
36
+ it 'initializes context' do
37
+ expect do
38
+ context
39
+ end.not_to raise_error
40
+ end
41
+ end
42
+
43
+ context 'with verbose logging' do
44
+ include_context 'with local kms_providers'
45
+
46
+ before(:all) do
47
+ # Logging from libmongocrypt requires the C library to be built with the -DENABLE_TRACE=ON
48
+ # option; none of the pre-built packages on Evergreen have been built with logging enabled.
49
+ #
50
+ # It is still useful to be able to run these tests locally to confirm that logging is working
51
+ # while debugging any problems.
52
+ #
53
+ # For now, skip this test by default and revisit once we have determined how we want to
54
+ # package libmongocrypt with the Ruby driver (see: https://jira.mongodb.org/browse/RUBY-1966)
55
+ skip "These tests require libmongocrypt to be built with the '-DENABLE_TRACE=ON' cmake option." +
56
+ " They also require the MONGOCRYPT_TRACE environment variable to be set to 'ON'."
57
+ end
58
+
59
+ let(:logger) do
60
+ ::Logger.new($stdout).tap do |logger|
61
+ logger.level = ::Logger::DEBUG
62
+ end
63
+ end
64
+
65
+ it 'receives log messages from libmongocrypt' do
66
+ expect(logger).to receive(:debug).with(/mongocrypt_ctx_explicit_decrypt_init/)
67
+
68
+ context
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,170 @@
1
+ require 'mongo'
2
+ require 'lite_spec_helper'
3
+
4
+ describe Mongo::Crypt::ExplicitEncryptionContext do
5
+ require_libmongocrypt
6
+ include_context 'define shared FLE helpers'
7
+
8
+ let(:mongocrypt) { Mongo::Crypt::Handle.new(kms_providers, logger: logger) }
9
+ let(:context) { described_class.new(mongocrypt, io, value, options) }
10
+
11
+ let(:logger) { nil }
12
+
13
+ let(:io) { double("Mongo::ClientEncryption::IO") }
14
+ let(:value) { { 'v': 'Hello, world!' } }
15
+
16
+ let(:options) do
17
+ {
18
+ key_id: key_id,
19
+ key_alt_name: key_alt_name,
20
+ algorithm: algorithm
21
+ }
22
+ end
23
+
24
+ describe '#initialize' do
25
+ shared_examples 'a functioning ExplicitEncryptionContext' do
26
+ context 'with nil key_id and key_alt_name options' do
27
+ let(:key_id) { nil }
28
+ let(:key_alt_name) { nil }
29
+
30
+ it 'raises an exception' do
31
+ expect do
32
+ context
33
+ end.to raise_error(ArgumentError, /:key_id and :key_alt_name options cannot both be nil/)
34
+ end
35
+ end
36
+
37
+ context 'with both key_id and key_alt_name options' do
38
+ it 'raises an exception' do
39
+ expect do
40
+ context
41
+ end.to raise_error(ArgumentError, /:key_id and :key_alt_name options cannot both be present/)
42
+ end
43
+ end
44
+
45
+ context 'with invalid key_id' do
46
+ let(:key_id) { 'random string' }
47
+ let(:key_alt_name) { nil }
48
+
49
+ it 'raises an exception' do
50
+ expect do
51
+ context
52
+ end.to raise_error(ArgumentError, /Expected the :key_id option to be a BSON::Binary object/)
53
+ end
54
+ end
55
+
56
+ context 'with invalid key_alt_name' do
57
+ let(:key_id) { nil }
58
+ let(:key_alt_name) { 5 }
59
+
60
+ it 'raises an exception' do
61
+ expect do
62
+ context
63
+ end.to raise_error(ArgumentError, /key_alt_name option must be a String/)
64
+ end
65
+ end
66
+
67
+ context 'with valid key_alt_name' do
68
+ let(:key_id) { nil }
69
+
70
+ context 'with nil algorithm' do
71
+ let(:algorithm) { nil }
72
+
73
+ it 'raises exception' do
74
+ expect do
75
+ context
76
+ end.to raise_error(Mongo::Error::CryptError, /passed null algorithm/)
77
+ end
78
+ end
79
+
80
+ context 'with invalid algorithm' do
81
+ let(:algorithm) { 'unsupported-algorithm' }
82
+
83
+ it 'raises an exception' do
84
+ expect do
85
+ context
86
+ end.to raise_error(Mongo::Error::CryptError, /unsupported algorithm/)
87
+ end
88
+ end
89
+
90
+ it 'initializes context' do
91
+ expect do
92
+ context
93
+ end.not_to raise_error
94
+ end
95
+ end
96
+
97
+ context 'with valid key_id' do
98
+ let(:key_alt_name) { nil }
99
+
100
+ context 'with nil algorithm' do
101
+ let(:algorithm) { nil }
102
+
103
+ it 'raises exception' do
104
+ expect do
105
+ context
106
+ end.to raise_error(Mongo::Error::CryptError, /passed null algorithm/)
107
+ end
108
+ end
109
+
110
+ context 'with invalid algorithm' do
111
+ let(:algorithm) { 'unsupported-algorithm' }
112
+
113
+ it 'raises an exception' do
114
+ expect do
115
+ context
116
+ end.to raise_error(Mongo::Error::CryptError, /unsupported algorithm/)
117
+ end
118
+ end
119
+
120
+ it 'initializes context' do
121
+ expect do
122
+ context
123
+ end.not_to raise_error
124
+ end
125
+ end
126
+ end
127
+
128
+ context 'when mongocrypt is initialized with AWS KMS provider options' do
129
+ include_context 'with AWS kms_providers'
130
+ it_behaves_like 'a functioning ExplicitEncryptionContext'
131
+ end
132
+
133
+ context 'when mongocrypt is initialized with local KMS provider options' do
134
+ include_context 'with local kms_providers'
135
+ it_behaves_like 'a functioning ExplicitEncryptionContext'
136
+ end
137
+
138
+ context 'with verbose logging' do
139
+ include_context 'with local kms_providers'
140
+
141
+ before(:all) do
142
+ # Logging from libmongocrypt requires the C library to be built with the -DENABLE_TRACE=ON
143
+ # option; none of the pre-built packages on Evergreen have been built with logging enabled.
144
+ #
145
+ # It is still useful to be able to run these tests locally to confirm that logging is working
146
+ # while debugging any problems.
147
+ #
148
+ # For now, skip this test by default and revisit once we have determined how we want to
149
+ # package libmongocrypt with the Ruby driver (see: https://jira.mongodb.org/browse/RUBY-1966)
150
+ skip "These tests require libmongocrypt to be built with the '-DENABLE_TRACE=ON' cmake option." +
151
+ " They also require the MONGOCRYPT_TRACE environment variable to be set to 'ON'."
152
+ end
153
+
154
+ let(:key_alt_name) { nil }
155
+ let(:logger) do
156
+ ::Logger.new($stdout).tap do |logger|
157
+ logger.level = ::Logger::DEBUG
158
+ end
159
+ end
160
+
161
+ it 'receives log messages from libmongocrypt' do
162
+ expect(logger).to receive(:debug).with(/mongocrypt_ctx_setopt_key_id/)
163
+ expect(logger).to receive(:debug).with(/mongocrypt_ctx_setopt_algorithm/)
164
+ expect(logger).to receive(:debug).with(/mongocrypt_ctx_explicit_encrypt_init/)
165
+
166
+ context
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,198 @@
1
+ require 'mongo'
2
+ require 'base64'
3
+ require 'lite_spec_helper'
4
+
5
+ describe Mongo::Crypt::Handle do
6
+ require_libmongocrypt
7
+ include_context 'define shared FLE helpers'
8
+
9
+ describe '#initialize' do
10
+ let(:handle) { described_class.new(kms_providers, schema_map: schema_map) }
11
+ let(:schema_map) { nil }
12
+
13
+ shared_examples 'a functioning Mongo::Crypt::Handle' do
14
+ context 'with valid schema map' do
15
+ it 'does not raise an exception' do
16
+ expect { handle }.not_to raise_error
17
+ end
18
+ end
19
+
20
+ context 'with invalid schema map' do
21
+ let(:schema_map) { '' }
22
+
23
+ it 'raises an exception' do
24
+ expect { handle }.to raise_error(ArgumentError, /schema_map must be a Hash or nil/)
25
+ end
26
+ end
27
+
28
+ context 'with nil schema map' do
29
+ let(:schema_map) { nil }
30
+
31
+ it 'does not raise an exception' do
32
+ expect { handle }.not_to raise_error
33
+ end
34
+ end
35
+ end
36
+
37
+ context 'with empty kms_providers' do
38
+ let(:kms_providers) { {} }
39
+
40
+ it 'raises an exception' do
41
+ expect { handle }.to raise_error(ArgumentError, /must have one of the following keys: :aws, :local/)
42
+ end
43
+ end
44
+
45
+ context 'with invalid aws kms_providers' do
46
+ let(:kms_providers) { { aws: {} } }
47
+
48
+ it 'raises an exception' do
49
+ expect { handle }.to raise_error(ArgumentError, /kms_providers with :aws key must be in the format: { aws: { access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' } }/)
50
+ end
51
+ end
52
+
53
+ context 'with invalid kms_providers key' do
54
+ let(:kms_providers) { { random_kms_provider: {} } }
55
+
56
+ it 'raises an exception' do
57
+ expect { handle }.to raise_error(ArgumentError, /must have one of the following keys: :aws, :local/)
58
+ end
59
+ end
60
+
61
+ context 'with empty local kms_providers' do
62
+ let(:kms_providers) { { local: {} } }
63
+
64
+ it 'raises an exception' do
65
+ expect { handle }.to raise_error(ArgumentError, /kms_providers with :local key must be in the format: { local: { key: 'MASTER-KEY' } }/)
66
+ end
67
+ end
68
+
69
+ context 'with invalid local kms_providers' do
70
+ let(:kms_providers) { { local: { invalid_key: 'Some stuff' } } }
71
+
72
+ it 'raises an exception' do
73
+ expect { handle }.to raise_error(ArgumentError, /kms_providers with :local key must be in the format: { local: { key: 'MASTER-KEY' } }/)
74
+ end
75
+ end
76
+
77
+ context 'with invalid local kms master key' do
78
+ let(:kms_providers) do
79
+ {
80
+ local: {
81
+ key: 'ruby' * 23 # NOT 96 bytes
82
+ }
83
+ }
84
+ end
85
+
86
+ it 'raises an exception' do
87
+ expect { handle }.to raise_error(Mongo::Error::CryptError, 'local key must be 96 bytes (libmongocrypt error code 1)')
88
+ end
89
+ end
90
+
91
+ context 'with valid local kms_providers' do
92
+ include_context 'with local kms_providers'
93
+ it_behaves_like 'a functioning Mongo::Crypt::Handle'
94
+ end
95
+
96
+ context 'with nil AWS kms_provider' do
97
+ let(:kms_providers) {
98
+ {
99
+ aws: nil
100
+ }
101
+ }
102
+
103
+ it 'raises an exception' do
104
+ expect do
105
+ handle
106
+ end.to raise_error(ArgumentError, /The :aws KMS provider must not be nil/)
107
+ end
108
+ end
109
+
110
+ context 'with empty AWS kms_provider' do
111
+ let(:kms_providers) {
112
+ {
113
+ aws: {}
114
+ }
115
+ }
116
+
117
+ it 'raises an exception' do
118
+ expect do
119
+ handle
120
+ end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
121
+ end
122
+ end
123
+
124
+ context 'with nil AWS access_key_id' do
125
+ let(:kms_providers) {
126
+ {
127
+ aws: {
128
+ access_key_id: nil,
129
+ secret_access_key: SpecConfig.instance.fle_aws_secret
130
+ }
131
+ }
132
+ }
133
+
134
+ it 'raises an exception' do
135
+ expect do
136
+ handle
137
+ end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
138
+ end
139
+ end
140
+
141
+ context 'with non-string AWS access_key_id' do
142
+ let(:kms_providers) {
143
+ {
144
+ aws: {
145
+ access_key_id: 5,
146
+ secret_access_key: SpecConfig.instance.fle_aws_secret
147
+ }
148
+ }
149
+ }
150
+
151
+ it 'raises an exception' do
152
+ expect do
153
+ handle
154
+ end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
155
+ end
156
+ end
157
+
158
+
159
+ context 'with nil AWS secret_access_key' do
160
+ let(:kms_providers) {
161
+ {
162
+ aws: {
163
+ access_key_id: SpecConfig.instance.fle_aws_key,
164
+ secret_access_key: nil
165
+ }
166
+ }
167
+ }
168
+
169
+ it 'raises an exception' do
170
+ expect do
171
+ handle
172
+ end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
173
+ end
174
+ end
175
+
176
+ context 'with non-string AWS secret_access_key' do
177
+ let(:kms_providers) {
178
+ {
179
+ aws: {
180
+ access_key_id: SpecConfig.instance.fle_aws_key,
181
+ secret_access_key: 5
182
+ }
183
+ }
184
+ }
185
+
186
+ it 'raises an exception' do
187
+ expect do
188
+ handle
189
+ end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
190
+ end
191
+ end
192
+
193
+ context 'with valid AWS kms_providers' do
194
+ include_context 'with AWS kms_providers'
195
+ it_behaves_like 'a functioning Mongo::Crypt::Handle'
196
+ end
197
+ end
198
+ end