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,46 @@
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 'helper methods' do
10
+ require_libmongocrypt
11
+
12
+ describe '#validate_document' do
13
+ context 'with BSON::Document data' do
14
+ it 'does not raise an exception' do
15
+ expect do
16
+ Mongo::Crypt::Binding.validate_document(BSON::Document.new)
17
+ end.not_to raise_error
18
+ end
19
+ end
20
+
21
+ context 'with Hash data' do
22
+ it 'does not raise an exception' do
23
+ expect do
24
+ Mongo::Crypt::Binding.validate_document({})
25
+ end.not_to raise_error
26
+ end
27
+ end
28
+
29
+ context 'with nil data' do
30
+ it 'raises an exception' do
31
+ expect do
32
+ Mongo::Crypt::Binding.validate_document(nil)
33
+ end.to raise_error(Mongo::Error::CryptError, /Attempted to pass nil data to libmongocrypt/)
34
+ end
35
+ end
36
+
37
+ context 'with non-document data' do
38
+ it 'raises an exception' do
39
+ expect do
40
+ Mongo::Crypt::Binding.validate_document('not a bson document')
41
+ end.to raise_error(Mongo::Error::CryptError, /Attempted to pass invalid data to libmongocrypt/)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,144 @@
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
+ describe 'Mongo::Crypt::Binding' do
10
+ describe 'mongocrypt_t binding' do
11
+ require_libmongocrypt
12
+
13
+ after do
14
+ Mongo::Crypt::Binding.mongocrypt_destroy(mongocrypt)
15
+ end
16
+
17
+ describe '#mongocrypt_new' do
18
+ let(:mongocrypt) { Mongo::Crypt::Binding.mongocrypt_new }
19
+
20
+ it 'returns a pointer' do
21
+ expect(mongocrypt).to be_a_kind_of(FFI::Pointer)
22
+ end
23
+ end
24
+
25
+ describe '#mongocrypt_setopt_kms_provider_local' do
26
+ let(:mongocrypt) { Mongo::Crypt::Binding.mongocrypt_new }
27
+
28
+ let(:binary) do
29
+ p = FFI::MemoryPointer.new(key_bytes.size)
30
+ .write_array_of_type(FFI::TYPE_UINT8, :put_uint8, key_bytes)
31
+
32
+ Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(p, key_bytes.length)
33
+ end
34
+
35
+ after do
36
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(binary)
37
+ end
38
+
39
+ context 'with valid key' do
40
+ let(:key_bytes) { [114, 117, 98, 121] * 24 } # 96 bytes
41
+
42
+ it 'returns true' do
43
+ expect(Mongo::Crypt::Binding.mongocrypt_setopt_kms_provider_local(mongocrypt, binary)).to be true
44
+ end
45
+ end
46
+
47
+ context 'with invalid key' do
48
+ let(:key_bytes) { [114, 117, 98, 121] * 23 } # NOT 96 bytes
49
+
50
+ it 'returns false' do
51
+ expect(Mongo::Crypt::Binding.mongocrypt_setopt_kms_provider_local(mongocrypt, binary)).to be false
52
+ end
53
+ end
54
+ end
55
+
56
+ describe '#mongocrypt_init' do
57
+ let(:key_bytes) { [114, 117, 98, 121] * 24 } # 96 bytes
58
+
59
+ let(:binary) do
60
+ p = FFI::MemoryPointer.new(key_bytes.size)
61
+ .write_array_of_type(FFI::TYPE_UINT8, :put_uint8, key_bytes)
62
+
63
+ Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(p, key_bytes.length)
64
+ end
65
+
66
+ let(:mongocrypt) do
67
+ mongocrypt = Mongo::Crypt::Binding.mongocrypt_new
68
+ Mongo::Crypt::Binding.mongocrypt_setopt_kms_provider_local(mongocrypt, binary)
69
+
70
+ mongocrypt
71
+ end
72
+
73
+ after do
74
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(binary)
75
+ end
76
+
77
+ context 'with valid kms option' do
78
+ before do
79
+ MongoCryptSpecHelper.bind_crypto_hooks(mongocrypt)
80
+ end
81
+
82
+ it 'returns true' do
83
+ expect(Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)).to be true
84
+ end
85
+ end
86
+
87
+ context 'without binding crypto hooks' do
88
+ it 'returns false' do
89
+ expect(Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)).to be false
90
+ end
91
+ end
92
+
93
+ context 'with invalid kms option' do
94
+ before do
95
+ MongoCryptSpecHelper.bind_crypto_hooks(mongocrypt)
96
+ end
97
+
98
+ let(:key_bytes) { [114, 117, 98, 121] * 23 } # NOT 96 bytes
99
+
100
+ it 'returns false' do
101
+ expect(Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)).to be false
102
+ end
103
+ end
104
+ end
105
+
106
+ describe '#mongocrypt_status' do
107
+ let(:status) { Mongo::Crypt::Binding.mongocrypt_status_new }
108
+ let(:mongocrypt) { mongocrypt = Mongo::Crypt::Binding.mongocrypt_new }
109
+
110
+ after do
111
+ Mongo::Crypt::Binding.mongocrypt_status_destroy(status)
112
+ end
113
+
114
+ context 'for a new mongocrypt_t object' do
115
+ it 'returns an ok status' do
116
+ Mongo::Crypt::Binding.mongocrypt_status(mongocrypt, status)
117
+ expect(Mongo::Crypt::Binding.mongocrypt_status_type(status)).to eq(:ok)
118
+ end
119
+ end
120
+
121
+ context 'for a mongocrypt_t object with invalid kms options' do
122
+ let(:key_bytes) { [114, 117, 98, 121] * 23 } # NOT 96 bytes
123
+
124
+ let(:binary) do
125
+ p = FFI::MemoryPointer.new(key_bytes.size)
126
+ .write_array_of_type(FFI::TYPE_UINT8, :put_uint8, key_bytes)
127
+
128
+ Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(p, key_bytes.length)
129
+ end
130
+
131
+ after do
132
+ Mongo::Crypt::Binding.mongocrypt_binary_destroy(binary)
133
+ end
134
+
135
+ it 'returns a error_client status' do
136
+ Mongo::Crypt::Binding.mongocrypt_setopt_kms_provider_local(mongocrypt, binary)
137
+
138
+ Mongo::Crypt::Binding.mongocrypt_status(mongocrypt, status)
139
+ expect(Mongo::Crypt::Binding.mongocrypt_status_type(status)).to eq(:error_client)
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,99 @@
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 'mongocrypt_status_t binding' do
10
+ require_libmongocrypt
11
+
12
+ let(:status) { Mongo::Crypt::Binding.mongocrypt_status_new }
13
+ let(:message) { "Operation unauthorized" }
14
+
15
+ let(:status_with_info) do
16
+ Mongo::Crypt::Binding.mongocrypt_status_set(
17
+ status,
18
+ :error_client,
19
+ 401,
20
+ message,
21
+ message.length + 1
22
+ )
23
+
24
+ status
25
+ end
26
+
27
+ after do
28
+ Mongo::Crypt::Binding.mongocrypt_status_destroy(status)
29
+ end
30
+
31
+ describe '#mongocrypt_status_new' do
32
+ it 'returns a pointer' do
33
+ expect(status).to be_a_kind_of(FFI::Pointer)
34
+ end
35
+ end
36
+
37
+ describe '#mongocrypt_status_type' do
38
+ context 'when status has no type' do
39
+ it 'returns :ok/0' do
40
+ expect(Mongo::Crypt::Binding.mongocrypt_status_type(status)).to eq(:ok)
41
+ end
42
+ end
43
+
44
+ context 'when status has type' do
45
+ it 'returns type' do
46
+ expect(Mongo::Crypt::Binding.mongocrypt_status_type(status_with_info)).to eq(:error_client)
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#mongocrypt_status_code' do
52
+ context 'when status has no code' do
53
+ it 'returns 0' do
54
+ expect(Mongo::Crypt::Binding.mongocrypt_status_code(status)).to eq(0)
55
+ end
56
+ end
57
+
58
+ context 'when status has code' do
59
+ it 'returns code' do
60
+ expect(Mongo::Crypt::Binding.mongocrypt_status_code(status_with_info)).to eq(401)
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#mongocrypt_status_message' do
66
+ context 'when status has no message' do
67
+ it 'returns nil' do
68
+ expect(Mongo::Crypt::Binding.mongocrypt_status_message(status, nil)).to eq(nil)
69
+ end
70
+ end
71
+
72
+ context 'when status has message' do
73
+ it 'returns message' do
74
+ expect(Mongo::Crypt::Binding.mongocrypt_status_message(status_with_info, nil)).to eq(message)
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '#mongocrypt_status_ok' do
80
+ context 'when status_type is not ok' do
81
+ it 'returns false' do
82
+ expect(Mongo::Crypt::Binding.mongocrypt_status_ok(status_with_info)).to be false
83
+ end
84
+ end
85
+
86
+ context 'when status_type is ok' do
87
+ let(:message) { 'Operation successful' }
88
+ let(:status_with_info) do
89
+ Mongo::Crypt::Binding.mongocrypt_status_set(status, :ok, 200, message, message.length + 1)
90
+ status
91
+ end
92
+
93
+ it 'returns true' do
94
+ expect(Mongo::Crypt::Binding.mongocrypt_status_ok(status_with_info)).to be true
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,22 @@
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
+ require_libmongocrypt
10
+
11
+ describe '#mongocrypt_version' do
12
+ let(:version) { Mongo::Crypt::Binding.mongocrypt_version(nil) }
13
+
14
+ it 'is a string' do
15
+ expect(version).to be_a_kind_of(String)
16
+ end
17
+
18
+ it 'is in the x.y.z-tag format' do
19
+ expect(version).to match(/\A(\d+.){2}(\d+)?(-[A-Za-z\+\d]+)?\z/)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ require 'lite_spec_helper'
2
+
3
+ describe 'Mongo::Crypt::Binding' do
4
+ require_no_libmongocrypt
5
+
6
+ context 'when load fails' do
7
+
8
+ it 'retries loading at the next reference' do
9
+ lambda do
10
+ Mongo::Crypt::Binding
11
+ end.should raise_error(LoadError, /no path to libmongocrypt specified/)
12
+
13
+ # second load should also be attempted and should fail with the
14
+ # LoadError exception
15
+ lambda do
16
+ Mongo::Crypt::Binding
17
+ end.should raise_error(LoadError, /no path to libmongocrypt specified/)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,213 @@
1
+ require 'mongo'
2
+ require 'base64'
3
+ require 'lite_spec_helper'
4
+
5
+ describe Mongo::Crypt::DataKeyContext do
6
+ require_libmongocrypt
7
+ include_context 'define shared FLE helpers'
8
+
9
+ let(:mongocrypt) do
10
+ Mongo::Crypt::Handle.new(kms_providers)
11
+ end
12
+
13
+ let(:io) { double("Mongo::Crypt::EncryptionIO") }
14
+
15
+ let(:context) { described_class.new(mongocrypt, io, kms_provider_name, options) }
16
+ let(:base_options) { {} }
17
+ let(:options) { base_options }
18
+
19
+ describe '#initialize' do
20
+ shared_examples 'it properly sets key_alt_names' do
21
+ context 'with one key_alt_names' do
22
+ let(:options) { base_options.merge(key_alt_names: ['keyAltName1']) }
23
+
24
+ it 'does not raise an exception' do
25
+ expect do
26
+ context
27
+ end.not_to raise_error
28
+ end
29
+ end
30
+
31
+ context 'with multiple key_alt_names' do
32
+ let(:options) { base_options.merge(key_alt_names: ['keyAltName1', 'keyAltName2']) }
33
+
34
+ it 'does not raise an exception' do
35
+ expect do
36
+ context
37
+ end.not_to raise_error
38
+ end
39
+ end
40
+
41
+ context 'with empty key_alt_names' do
42
+ let(:options) { base_options.merge(key_alt_names: []) }
43
+
44
+ it 'does not raise an exception' do
45
+ expect do
46
+ context
47
+ end.not_to raise_error
48
+ end
49
+ end
50
+
51
+ context 'with invalid key_alt_names' do
52
+ let(:options) { base_options.merge(key_alt_names: ['keyAltName1', 3]) }
53
+
54
+ it 'does raises an exception' do
55
+ expect do
56
+ context
57
+ end.to raise_error(ArgumentError, /All values of the :key_alt_names option Array must be Strings/)
58
+ end
59
+ end
60
+
61
+ context 'with non-array key_alt_names' do
62
+ let(:options) { base_options.merge(key_alt_names: "keyAltName1") }
63
+
64
+ it 'does raises an exception' do
65
+ expect do
66
+ context
67
+ end.to raise_error(ArgumentError, /key_alt_names option must be an Array/)
68
+ end
69
+ end
70
+ end
71
+
72
+ context 'with invalid kms provider'do
73
+ let(:kms_providers) { local_kms_providers }
74
+ let(:kms_provider_name) { 'invalid' }
75
+
76
+ it 'raises an exception' do
77
+ expect do
78
+ context
79
+ end.to raise_exception(/invalid is an invalid kms provider/)
80
+ end
81
+ end
82
+
83
+ context 'with local kms provider and empty options' do
84
+ include_context 'with local kms_providers'
85
+
86
+ it_behaves_like 'it properly sets key_alt_names'
87
+
88
+ it 'does not raise an exception' do
89
+ expect do
90
+ context
91
+ end.not_to raise_error
92
+ end
93
+ end
94
+
95
+ context 'with aws kms provider' do
96
+ include_context 'with AWS kms_providers'
97
+
98
+ let(:base_options) { { master_key: { region: 'us-east-2', key: 'arn' } } }
99
+
100
+ it_behaves_like 'it properly sets key_alt_names'
101
+
102
+ context 'with empty options' do
103
+ let(:options) { {} }
104
+
105
+ it 'raises an exception' do
106
+ expect do
107
+ context
108
+ end.to raise_error(ArgumentError, /options Hash must contain a key named :master_key with a Hash value/)
109
+ end
110
+ end
111
+
112
+ context 'with an invalid master key option' do
113
+ let(:options) { { master_key: 'key' } }
114
+
115
+ it 'raises an exception' do
116
+ expect do
117
+ context
118
+ end.to raise_error(ArgumentError, /:master_key option must be a Hash/)
119
+ end
120
+ end
121
+
122
+ context 'where master key is an empty hash' do
123
+ let(:options) { { master_key: {} } }
124
+
125
+ it 'raises an exception' do
126
+ expect do
127
+ context
128
+ end.to raise_error(ArgumentError, /The value of :region option of the :master_key options hash cannot be nil/)
129
+ end
130
+ end
131
+
132
+ context 'with a nil region option' do
133
+ let(:options) { { master_key: { region: nil } } }
134
+
135
+ it 'raises an exception' do
136
+ expect do
137
+ context
138
+ end.to raise_error(ArgumentError, /The value of :region option of the :master_key options hash cannot be nil/)
139
+ end
140
+ end
141
+
142
+ context 'with an invalid region option' do
143
+ let(:options) { { master_key: { region: 5 } } }
144
+
145
+ it 'raises an exception' do
146
+ expect do
147
+ context
148
+ end.to raise_error(ArgumentError, /5 is an invalid AWS master_key region/)
149
+ end
150
+ end
151
+
152
+ context 'with an invalid key option' do
153
+ let(:options) { { master_key: { region: 'us-east-2', key: nil } } }
154
+
155
+ it 'raises an exception' do
156
+ expect do
157
+ context
158
+ end.to raise_error(ArgumentError, /The value of :key option of the :master_key options hash cannot be nil/)
159
+ end
160
+ end
161
+
162
+ context 'with an invalid key option' do
163
+ let(:options) { { master_key: { region: 'us-east-2', key: 5 } } }
164
+
165
+ it 'raises an exception' do
166
+ expect do
167
+ context
168
+ end.to raise_error(ArgumentError, /5 is an invalid AWS master_key key/)
169
+ end
170
+ end
171
+
172
+ context 'with an invalid endpoint option' do
173
+ let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 5 } } }
174
+
175
+ it 'raises an exception' do
176
+ expect do
177
+ context
178
+ end.to raise_error(ArgumentError, /5 is an invalid AWS master_key endpoint/)
179
+ end
180
+ end
181
+
182
+ context 'with valid options' do
183
+ it 'does not raise an exception' do
184
+ expect do
185
+ context
186
+ end.not_to raise_error
187
+ end
188
+ end
189
+
190
+ context 'with valid endpoint' do
191
+ let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 'endpoint/to/kms' } } }
192
+
193
+ it 'does not raise an exception' do
194
+ expect do
195
+ context
196
+ end.not_to raise_error
197
+ end
198
+ end
199
+ end
200
+ end
201
+
202
+ describe '#run_state_machine' do
203
+ # TODO: test with AWS KMS provider
204
+
205
+ context 'with local KMS provider' do
206
+ include_context 'with local kms_providers'
207
+
208
+ it 'creates a data key' do
209
+ expect(context.run_state_machine).to be_a_kind_of(Hash)
210
+ end
211
+ end
212
+ end
213
+ end