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,107 @@
1
+ require 'mongo'
2
+ require 'lite_spec_helper'
3
+
4
+ describe Mongo::Crypt::AutoEncryptionContext 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, db_name, command) }
10
+
11
+ let(:logger) { nil }
12
+
13
+ let(:io) { double("Mongo::ClientEncryption::IO") }
14
+ let(:db_name) { 'admin' }
15
+ let(:command) do
16
+ {
17
+ "find": "test",
18
+ "filter": {
19
+ "ssn": "457-55-5462"
20
+ }
21
+ }
22
+ end
23
+
24
+ describe '#initialize' do
25
+ shared_examples 'a functioning AutoEncryptionContext' do
26
+ context 'with valid command' do
27
+ it 'initializes context' do
28
+ expect do
29
+ context
30
+ end.not_to raise_error
31
+ end
32
+ end
33
+
34
+ context 'with invalid command' do
35
+ let(:command) do
36
+ {
37
+ incorrect_key: 'value'
38
+ }
39
+ end
40
+
41
+ it 'raises an exception' do
42
+ expect do
43
+ context
44
+ end.to raise_error(/command not supported for auto encryption: incorrect_key/)
45
+ end
46
+ end
47
+
48
+ context 'with nil command' do
49
+ let(:command) { nil }
50
+
51
+ it 'raises an exception' do
52
+ expect do
53
+ context
54
+ end.to raise_error(Mongo::Error::CryptError, /Attempted to pass nil data to libmongocrypt/)
55
+ end
56
+ end
57
+
58
+ context 'with non-document command' do
59
+ let(:command) { 'command-to-encrypt' }
60
+
61
+ it 'raises an exception' do
62
+ expect do
63
+ context
64
+ end.to raise_error(Mongo::Error::CryptError, /Attempted to pass invalid data to libmongocrypt/)
65
+ end
66
+ end
67
+ end
68
+
69
+ context 'with local KMS providers' do
70
+ include_context 'with local kms_providers'
71
+ it_behaves_like 'a functioning AutoEncryptionContext'
72
+ end
73
+
74
+ context 'with AWS KMS providers' do
75
+ include_context 'with AWS kms_providers'
76
+ it_behaves_like 'a functioning AutoEncryptionContext'
77
+ end
78
+
79
+ context 'with verbose logging' do
80
+ include_context 'with local kms_providers'
81
+
82
+ before(:all) do
83
+ # Logging from libmongocrypt requires the C library to be built with the -DENABLE_TRACE=ON
84
+ # option; none of the pre-built packages on Evergreen have been built with logging enabled.
85
+ #
86
+ # It is still useful to be able to run these tests locally to confirm that logging is working
87
+ # while debugging any problems.
88
+ #
89
+ # For now, skip this test by default and revisit once we have determined how we want to
90
+ # package libmongocrypt with the Ruby driver (see: https://jira.mongodb.org/browse/RUBY-1966)
91
+ skip "These tests require libmongocrypt to be built with the '-DENABLE_TRACE=ON' cmake option." +
92
+ " They also require the MONGOCRYPT_TRACE environment variable to be set to 'ON'."
93
+ end
94
+
95
+ let(:logger) do
96
+ ::Logger.new($stdout).tap do |logger|
97
+ logger.level = ::Logger::DEBUG
98
+ end
99
+ end
100
+
101
+ it 'receives log messages from libmongocrypt' do
102
+ expect(logger).to receive(:debug).with(/mongocrypt_ctx_encrypt_init/)
103
+ context
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,115 @@
1
+ require 'mongo'
2
+ require 'support/lite_constraints'
3
+
4
+ RSpec.configure do |config|
5
+ config.extend(LiteConstraints)
6
+ end
7
+
8
+ describe Mongo::Crypt::Binary do
9
+ require_libmongocrypt
10
+
11
+ let(:data) { 'I love Ruby' }
12
+ let(:binary) { described_class.from_data(data) }
13
+
14
+ describe '#initialize' do
15
+ context 'with nil data' do
16
+ let(:binary) { described_class.new }
17
+
18
+ it 'creates a new Mongo::Crypt::Binary object' do
19
+ expect do
20
+ binary
21
+ end.not_to raise_error
22
+ end
23
+ end
24
+
25
+ context 'with valid data' do
26
+ let(:binary) { described_class.new(data: data) }
27
+
28
+ it 'creates a new Mongo::Crypt::Binary object' do
29
+ expect do
30
+ binary
31
+ end.not_to raise_error
32
+ end
33
+ end
34
+
35
+ context 'with pointer' do
36
+ let(:pointer) { Mongo::Crypt::Binding.mongocrypt_binary_new }
37
+ let(:binary) { described_class.new(pointer: pointer) }
38
+
39
+ after do
40
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(pointer)
41
+ end
42
+
43
+ it 'creates a new Mongo::Crypt::Binary object from pointer' do
44
+ expect do
45
+ binary
46
+ end.not_to raise_error
47
+
48
+ expect(binary.ref).to eq(pointer)
49
+ end
50
+ end
51
+ end
52
+
53
+ describe '#self.from_data' do
54
+ let(:binary) { described_class.from_data(data) }
55
+
56
+ it 'creates a new Mongo::Crypt::Binary object' do
57
+ expect do
58
+ binary
59
+ end.not_to raise_error
60
+ end
61
+ end
62
+
63
+ describe '#self.from_pointer' do
64
+ let(:pointer) { Mongo::Crypt::Binding.mongocrypt_binary_new }
65
+ let(:binary) { described_class.from_pointer(pointer) }
66
+
67
+ after do
68
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(pointer)
69
+ end
70
+
71
+ it 'creates a new Mongo::Crypt::Binary object from pointer' do
72
+ expect do
73
+ binary
74
+ end.not_to raise_error
75
+
76
+ expect(binary.ref).to eq(pointer)
77
+ end
78
+ end
79
+
80
+ describe '#to_s' do
81
+ it 'returns the original string' do
82
+ expect(binary.to_s).to eq(data)
83
+ end
84
+ end
85
+
86
+ describe '#write' do
87
+ # Binary must have enough space pre-allocated
88
+ let(:binary) { described_class.from_data("\00" * data.length) }
89
+
90
+ it 'writes data to the binary object' do
91
+ expect(binary.write(data)).to be true
92
+ expect(binary.to_s).to eq(data)
93
+ end
94
+
95
+ context 'with no space allocated' do
96
+ let(:binary) { described_class.new }
97
+
98
+ it 'returns false' do
99
+ expect do
100
+ binary.write(data)
101
+ end.to raise_error(ArgumentError, /Cannot write #{data.length} bytes of data to a Binary object that was initialized with 0 bytes/)
102
+ end
103
+ end
104
+
105
+ context 'without enough space allocated' do
106
+ let(:binary) { described_class.from_data("\00" * (data.length - 1)) }
107
+
108
+ it 'returns false' do
109
+ expect do
110
+ binary.write(data)
111
+ end.to raise_error(ArgumentError, /Cannot write #{data.length} bytes of data to a Binary object that was initialized with #{data.length - 1} bytes/)
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,56 @@
1
+ require 'mongo'
2
+ require 'support/lite_constraints'
3
+
4
+ RSpec.configure do |config|
5
+ config.extend(LiteConstraints)
6
+ end
7
+
8
+ describe 'Mongo::Crypt::Binding' do
9
+ describe 'binary_t bindings' do
10
+ require_libmongocrypt
11
+
12
+ let(:bytes) { [104, 101, 108, 108, 111] }
13
+
14
+ let(:bytes_pointer) do
15
+ # FFI::MemoryPointer automatically frees memory when it goes out of scope
16
+ p = FFI::MemoryPointer.new(bytes.size)
17
+ p.write_array_of_type(FFI::TYPE_UINT8, :put_uint8, bytes)
18
+ end
19
+
20
+ after do
21
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(binary)
22
+ end
23
+
24
+ describe '#mongocrypt_binary_new' do
25
+ let(:binary) { Mongo::Crypt::Binding.mongocrypt_binary_new }
26
+
27
+ it 'returns a pointer' do
28
+ expect(binary).to be_a_kind_of(FFI::Pointer)
29
+ end
30
+ end
31
+
32
+ describe '#mongocrypt_binary_new_from_data' do
33
+ let(:binary) { Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(bytes_pointer, bytes.length) }
34
+
35
+ it 'returns a pointer' do
36
+ expect(binary).to be_a_kind_of(FFI::Pointer)
37
+ end
38
+ end
39
+
40
+ describe '#mongocrypt_binary_data' do
41
+ let(:binary) { Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(bytes_pointer, bytes.length) }
42
+
43
+ it 'returns the pointer to the data' do
44
+ expect(Mongo::Crypt::Binding.mongocrypt_binary_data(binary)).to eq(bytes_pointer)
45
+ end
46
+ end
47
+
48
+ describe '#mongocrypt_binary_len' do
49
+ let(:binary) { Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(bytes_pointer, bytes.length) }
50
+
51
+ it 'returns the length of the data' do
52
+ expect(Mongo::Crypt::Binding.mongocrypt_binary_len(binary)).to eq(bytes.length)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,257 @@
1
+ require 'mongo'
2
+ require 'support/lite_constraints'
3
+ require 'mongo/crypt/helpers/mongo_crypt_spec_helper'
4
+
5
+ RSpec.configure do |config|
6
+ config.extend(LiteConstraints)
7
+ end
8
+
9
+ shared_context 'initialized for data key creation' do
10
+ let(:master_key) { "ru\xfe\x00" * 24 }
11
+ let(:binary) { MongoCryptSpecHelper.mongocrypt_binary_t_from(master_key)}
12
+
13
+ before do
14
+ Mongo::Crypt::Binding.mongocrypt_setopt_kms_provider_local(mongocrypt, binary)
15
+ MongoCryptSpecHelper.bind_crypto_hooks(mongocrypt)
16
+ Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)
17
+
18
+ Mongo::Crypt::Binding.mongocrypt_ctx_setopt_masterkey_local(context)
19
+ end
20
+
21
+ after do
22
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(binary)
23
+ end
24
+ end
25
+
26
+ shared_context 'initialized for explicit encryption' do
27
+ # TODO: replace with code showing how to generate this value
28
+ let(:key_id) { "\xDEd\x00\xDC\x0E\xF8J\x99\x97\xFA\xCC\x04\xBF\xAA\x00\xF5" }
29
+ let(:key_id_binary) { MongoCryptSpecHelper.mongocrypt_binary_t_from(key_id) }
30
+
31
+ let(:value) do
32
+ { 'v': 'Hello, world!' }.to_bson.to_s
33
+ end
34
+
35
+ let(:value_binary) { MongoCryptSpecHelper.mongocrypt_binary_t_from(value) }
36
+
37
+ before do
38
+ MongoCryptSpecHelper.bind_crypto_hooks(mongocrypt)
39
+ Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)
40
+
41
+ Mongo::Crypt::Binding.mongocrypt_ctx_setopt_key_id(context, key_id_binary)
42
+ Mongo::Crypt::Binding.mongocrypt_ctx_setopt_algorithm(
43
+ context,
44
+ 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic',
45
+ -1
46
+ )
47
+ end
48
+
49
+ after do
50
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(key_id_binary)
51
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(value_binary)
52
+ end
53
+ end
54
+
55
+ describe 'Mongo::Crypt::Binding' do
56
+ describe 'mongocrypt_ctx_t bindings' do
57
+ require_libmongocrypt
58
+ fails_on_jruby
59
+
60
+ let(:mongocrypt) { Mongo::Crypt::Binding.mongocrypt_new }
61
+ let(:context) { Mongo::Crypt::Binding.mongocrypt_ctx_new(mongocrypt) }
62
+
63
+ after do
64
+ Mongo::Crypt::Binding.mongocrypt_destroy(mongocrypt)
65
+ Mongo::Crypt::Binding.mongocrypt_ctx_destroy(context)
66
+ end
67
+
68
+ describe '#mongocrypt_ctx_new' do
69
+ it 'returns a pointer' do
70
+ expect(context).to be_a_kind_of(FFI::Pointer)
71
+ end
72
+ end
73
+
74
+ describe '#mongocrypt_ctx_status' do
75
+ let(:status) { Mongo::Crypt::Binding.mongocrypt_status_new }
76
+
77
+ after do
78
+ Mongo::Crypt::Binding.mongocrypt_status_destroy(status)
79
+ end
80
+
81
+ context 'for a new mongocrypt_ctx_t object' do
82
+ it 'returns an ok status' do
83
+ Mongo::Crypt::Binding.mongocrypt_ctx_status(context, status)
84
+ expect(Mongo::Crypt::Binding.mongocrypt_status_type(status)).to eq(:ok)
85
+ end
86
+ end
87
+ end
88
+
89
+ describe '#mongocrypt_ctx_setopt_masterkey_local' do
90
+ let(:result) do
91
+ Mongo::Crypt::Binding.mongocrypt_ctx_setopt_masterkey_local(context)
92
+ end
93
+
94
+ before do
95
+ Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)
96
+ end
97
+
98
+ it 'returns true' do
99
+ expect(result).to be true
100
+ end
101
+ end
102
+
103
+ describe '#mongocrypt_ctx_datakey_init' do
104
+ let(:result) do
105
+ Mongo::Crypt::Binding.mongocrypt_ctx_datakey_init(context)
106
+ end
107
+
108
+ context 'a master key option and KMS provider have been set' do
109
+ include_context 'initialized for data key creation'
110
+
111
+ it 'returns true' do
112
+ expect(result).to be true
113
+ end
114
+ end
115
+ end
116
+
117
+ describe '#mongocrypt_ctx_setopt_key_id' do
118
+ let(:binary) { MongoCryptSpecHelper.mongocrypt_binary_t_from(uuid) }
119
+
120
+ let(:result) do
121
+ Mongo::Crypt::Binding.mongocrypt_ctx_setopt_key_id(context, binary)
122
+ end
123
+
124
+ before do
125
+ Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)
126
+ end
127
+
128
+ after do
129
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(binary)
130
+ end
131
+
132
+ context 'with valid key id' do
133
+ # 16-byte binary uuid string
134
+ # TODO: replace with code showing how to generate this value
135
+ let(:uuid) { "\xDEd\x00\xDC\x0E\xF8J\x99\x97\xFA\xCC\x04\xBF\xAA\x00\xF5" }
136
+
137
+ it 'returns true' do
138
+ expect(result).to be true
139
+ end
140
+ end
141
+
142
+ context 'with invalid key id' do
143
+ # invalid uuid string -- a truncated string of bytes
144
+ let(:uuid) { "\xDEd\x00\xDC\x0E\xF8J\x99\x97\xFA\xCC\x04\xBF" }
145
+
146
+ it 'returns false' do
147
+ expect(result).to be false
148
+ end
149
+ end
150
+ end
151
+
152
+ describe '#mongocrypt_ctx_setopt_algorithm' do
153
+ let(:result) do
154
+ Mongo::Crypt::Binding.mongocrypt_ctx_setopt_algorithm(
155
+ context,
156
+ algo,
157
+ -1
158
+ )
159
+ end
160
+
161
+ before do
162
+ Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)
163
+ end
164
+
165
+ context 'with deterministic algorithm' do
166
+ let(:algo) { 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' }
167
+
168
+ it 'returns true' do
169
+ expect(result).to be true
170
+ end
171
+ end
172
+
173
+ context 'with random algorithm' do
174
+ let(:algo) { 'AEAD_AES_256_CBC_HMAC_SHA_512-Random' }
175
+
176
+ it 'returns true' do
177
+ expect(result).to be true
178
+ end
179
+ end
180
+
181
+ context 'with invalid algorithm' do
182
+ let(:algo) { 'fake-algorithm' }
183
+
184
+ it 'returns false' do
185
+ expect(result).to be false
186
+ end
187
+ end
188
+
189
+ context 'with nil algorithm' do
190
+ let(:algo) { nil }
191
+
192
+ it 'returns false' do
193
+ expect(result).to be false
194
+ end
195
+ end
196
+ end
197
+
198
+ describe '#mongocrypt_ctx_explicit_encrypt_init' do
199
+ let(:result) do
200
+ Mongo::Crypt::Binding.mongocrypt_ctx_explicit_encrypt_init(context, value_binary)
201
+ end
202
+
203
+ context 'a key_id and algorithm have been set' do
204
+ include_context 'initialized for explicit encryption'
205
+
206
+ it 'returns true' do
207
+ expect(result).to be true
208
+ end
209
+ end
210
+ end
211
+
212
+ describe '#mongocrypt_ctx_mongo_op' do
213
+ context 'ctx is initialized for explicit encryption' do
214
+ include_context 'initialized for explicit encryption'
215
+
216
+ before do
217
+ Mongo::Crypt::Binding.mongocrypt_ctx_explicit_encrypt_init(context, value_binary)
218
+ end
219
+
220
+ let(:out_binary) { Mongo::Crypt::Binding.mongocrypt_binary_new }
221
+ let(:result) { Mongo::Crypt::Binding.mongocrypt_ctx_mongo_op(context, out_binary) }
222
+
223
+ after do
224
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(out_binary)
225
+ end
226
+
227
+ it 'returns a BSON document' do
228
+ expect(result).to be true
229
+
230
+ data = Mongo::Crypt::Binding.mongocrypt_binary_data(out_binary)
231
+ len = Mongo::Crypt::Binding.mongocrypt_binary_len(out_binary)
232
+
233
+ response = data.get_array_of_uint8(0, len).pack('C*')
234
+ expect(response).to be_a_kind_of(String)
235
+ end
236
+ end
237
+ end
238
+
239
+ describe '#mongocrypt_ctx_state' do
240
+ let(:result) do
241
+ Mongo::Crypt::Binding.mongocrypt_ctx_state(context)
242
+ end
243
+
244
+ context 'the mongocrypt_ctx has been properly initialized' do
245
+ include_context 'initialized for data key creation'
246
+
247
+ before do
248
+ Mongo::Crypt::Binding.mongocrypt_ctx_datakey_init(context)
249
+ end
250
+
251
+ it 'returns ready state' do
252
+ expect(result).to eq(:ready)
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end