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,108 @@
1
+ module MongoCryptSpecHelper
2
+ def bind_crypto_hooks(mongocrypt)
3
+ Mongo::Crypt::Binding.mongocrypt_setopt_crypto_hooks(
4
+ mongocrypt,
5
+ method(:aes_encrypt),
6
+ method(:aes_decrypt),
7
+ method(:random),
8
+ method(:hmac_sha_512),
9
+ method(:hmac_sha_256),
10
+ method(:hmac_hash),
11
+ nil
12
+ )
13
+ end
14
+ module_function :bind_crypto_hooks
15
+
16
+ def mongocrypt_binary_t_from(string)
17
+ bytes = string.unpack('C*')
18
+
19
+ p = FFI::MemoryPointer
20
+ .new(bytes.size)
21
+ .write_array_of_type(FFI::TYPE_UINT8, :put_uint8, bytes)
22
+
23
+ Mongo::Crypt::Binding.mongocrypt_binary_new_from_data(p, bytes.length)
24
+ end
25
+ module_function :mongocrypt_binary_t_from
26
+
27
+ private
28
+
29
+ def string_from_binary(binary_p)
30
+ str_p = Mongo::Crypt::Binding.mongocrypt_binary_data(binary_p)
31
+ len = Mongo::Crypt::Binding.mongocrypt_binary_len(binary_p)
32
+ str_p.read_string(len)
33
+ end
34
+ module_function :string_from_binary
35
+
36
+ def write_to_binary(binary_p, data)
37
+ str_p = Mongo::Crypt::Binding.mongocrypt_binary_data(binary_p)
38
+ str_p.put_bytes(0, data)
39
+ end
40
+ module_function :write_to_binary
41
+
42
+ def aes_encrypt(_, key_binary_p, iv_binary_p, input_binary_p, output_binary_p,
43
+ response_length_p, status_p)
44
+ key = string_from_binary(key_binary_p)
45
+ iv = string_from_binary(iv_binary_p)
46
+ input = string_from_binary(input_binary_p)
47
+
48
+ output = Mongo::Crypt::Hooks.aes(key, iv, input)
49
+ write_to_binary(output_binary_p, output)
50
+ response_length_p.write_int(output.length)
51
+
52
+ true
53
+ end
54
+ module_function :aes_encrypt
55
+
56
+ def aes_decrypt(_, key_binary_p, iv_binary_p, input_binary_p, output_binary_p,
57
+ response_length_p, status_p)
58
+ key = string_from_binary(key_binary_p)
59
+ iv = string_from_binary(iv_binary_p)
60
+ input = string_from_binary(input_binary_p)
61
+
62
+ output = Mongo::Crypt::Hooks.aes(key, iv, input, decrypt: true)
63
+ write_to_binary(output_binary_p, output)
64
+ response_length_p.write_int(output.length)
65
+
66
+ true
67
+ end
68
+ module_function :aes_decrypt
69
+
70
+ def random(_, output_binary_p, num_bytes, status_p)
71
+ output = Mongo::Crypt::Hooks.random(num_bytes)
72
+ write_to_binary(output_binary_p, output)
73
+
74
+ true
75
+ end
76
+ module_function :random
77
+
78
+ def hmac_sha_512(_, key_binary_p, input_binary_p, output_binary_p, status_p)
79
+ key = string_from_binary(key_binary_p)
80
+ input = string_from_binary(input_binary_p)
81
+
82
+ output = Mongo::Crypt::Hooks.hmac_sha('SHA512', key, input)
83
+ write_to_binary(output_binary_p, output)
84
+
85
+ true
86
+ end
87
+ module_function :hmac_sha_512
88
+
89
+ def hmac_sha_256(_, key_binary_p, input_binary_p, output_binary_p, status_p)
90
+ key = string_from_binary(key_binary_p)
91
+ input = string_from_binary(input_binary_p)
92
+
93
+ output = Mongo::Crypt::Hooks.hmac_sha('SHA256', key, input)
94
+ write_to_binary(output_binary_p, output)
95
+
96
+ true
97
+ end
98
+ module_function :hmac_sha_256
99
+
100
+ def hmac_hash(_, input_binary_p, output_binary_p, status_p)
101
+ input = string_from_binary(input_binary_p)
102
+ output = Mongo::Crypt::Hooks.hash_sha256(input)
103
+ write_to_binary(output_binary_p, output)
104
+
105
+ true
106
+ end
107
+ module_function :hmac_hash
108
+ end
@@ -0,0 +1,152 @@
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::Status do
9
+ require_libmongocrypt
10
+
11
+ let(:status) { described_class.new }
12
+
13
+ let(:label) { :error_client }
14
+ let(:code) { 401 }
15
+ let(:message) { 'Unauthorized' }
16
+
17
+ let(:status_with_info) do
18
+ status.update(label, code, message)
19
+ end
20
+
21
+ describe '#initialize' do
22
+ it 'doesn\'t throw an error' do
23
+ expect { status }.not_to raise_error
24
+ end
25
+ end
26
+
27
+ describe '#self.from_pointer' do
28
+ let(:pointer) { Mongo::Crypt::Binding.mongocrypt_status_new }
29
+ let(:status) { described_class.from_pointer(pointer) }
30
+
31
+ after do
32
+ Mongo::Crypt::Binding.mongocrypt_status_destroy(pointer)
33
+ end
34
+
35
+ it 'creates a status from the pointer passed in' do
36
+ expect do
37
+ status
38
+ end.not_to raise_error
39
+
40
+ expect(status.ref).to eq(pointer)
41
+ end
42
+ end
43
+
44
+ describe '#update' do
45
+ context 'with invalid label' do
46
+ it 'raises an exception' do
47
+ expect do
48
+ status.update(:random_label, 0, '')
49
+ end.to raise_error(ArgumentError, /random_label is an invalid value for a Mongo::Crypt::Status label/)
50
+ end
51
+
52
+ it 'works with an empty message' do
53
+ status.update(:ok, 0, '')
54
+ expect(status.message).to eq('')
55
+ end
56
+ end
57
+ end
58
+
59
+ describe '#label' do
60
+ context 'new status' do
61
+ it 'returns :ok' do
62
+ expect(status.label).to eq(:ok)
63
+ end
64
+ end
65
+
66
+ context 'status with info' do
67
+ it 'returns label' do
68
+ expect(status_with_info.label).to eq(label)
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '#code' do
74
+ context 'new status' do
75
+ it 'returns 0' do
76
+ expect(status.code).to eq(0)
77
+ end
78
+ end
79
+
80
+ context 'status with info' do
81
+ it 'returns code' do
82
+ expect(status_with_info.code).to eq(code)
83
+ end
84
+ end
85
+ end
86
+
87
+ describe '#message' do
88
+ context 'new status' do
89
+ it 'returns an empty string' do
90
+ expect(status.message).to eq('')
91
+ end
92
+ end
93
+
94
+ context 'status with info' do
95
+ it 'returns a message' do
96
+ expect(status_with_info.message).to eq(message)
97
+ end
98
+ end
99
+ end
100
+
101
+ describe '#ok?' do
102
+ context 'new status' do
103
+ it 'returns true' do
104
+ expect(status.ok?).to be true
105
+ end
106
+ end
107
+
108
+ context 'status with info' do
109
+ it 'returns false' do
110
+ expect(status_with_info.ok?).to be false
111
+ end
112
+ end
113
+ end
114
+
115
+ describe '#crypt_error' do
116
+ context 'when status is ok' do
117
+ before do
118
+ status.update(:ok, 0, '')
119
+ end
120
+
121
+ it 'does not raise exception' do
122
+ expect do
123
+ status.raise_crypt_error
124
+ end.not_to raise_error
125
+ end
126
+ end
127
+
128
+ context 'when status is :error_kms' do
129
+ before do
130
+ status.update(:error_kms, 100, 'KMS error message')
131
+ end
132
+
133
+ it 'raises exception' do
134
+ expect do
135
+ status.raise_crypt_error
136
+ end.to raise_error(Mongo::Error::KmsError, 'KMS error message (libmongocrypt error code 100)')
137
+ end
138
+ end
139
+
140
+ context 'when status is error client' do
141
+ before do
142
+ status.update(:error_client, 2, 'Client Error')
143
+ end
144
+
145
+ it 'raises exception' do
146
+ expect do
147
+ status.raise_crypt_error
148
+ end.to raise_error(Mongo::Error::CryptError, 'Client Error (libmongocrypt error code 2)')
149
+ end
150
+ end
151
+ end
152
+ end
@@ -75,6 +75,23 @@ describe Mongo::Cursor do
75
75
  end
76
76
  end
77
77
  end
78
+
79
+ context 'server is unknown' do
80
+ let(:server) do
81
+ view.send(:server_selector).select_server(authorized_client.cluster).tap do |server|
82
+ authorized_client.cluster.disconnect!
83
+ server.unknown!
84
+ end
85
+ end
86
+
87
+ let(:view) do
88
+ Mongo::Collection::View.new(authorized_collection)
89
+ end
90
+
91
+ it 'works' do
92
+ cursor
93
+ end
94
+ end
78
95
  end
79
96
 
80
97
  describe '#each' do
@@ -499,11 +516,14 @@ describe Mongo::Cursor do
499
516
  end
500
517
 
501
518
  let(:query_spec) do
502
- { :selector => {}, :options => {}, :db_name => SpecConfig.instance.test_db, :coll_name => TEST_COLL }
519
+ { selector: {}, options: {},
520
+ db_name: SpecConfig.instance.test_db, coll_name: TEST_COLL }
503
521
  end
504
522
 
505
523
  let(:reply) do
506
- Mongo::Operation::Find.new(query_spec)
524
+ Mongo::Operation::Find.new(query_spec).tap do |reply|
525
+ allow(reply).to receive(:cursor_id).and_return(42)
526
+ end
507
527
  end
508
528
 
509
529
  let(:cursor) do
@@ -584,10 +604,10 @@ describe Mongo::Cursor do
584
604
  expect(cursor.to_a.map { |doc| doc['a'] }).to eq((0..9).to_a + (20..99).to_a)
585
605
  end
586
606
  =end
587
- it 'raises NotImplementedError' do
607
+ it 'raises InvalidCursorOperation' do
588
608
  expect do
589
609
  cursor.to_a
590
- end.to raise_error(NotImplementedError, 'Cannot restart iteration of a cursor which issued a getMore')
610
+ end.to raise_error(Mongo::Error::InvalidCursorOperation, 'Cannot restart iteration of a cursor which issued a getMore')
591
611
  end
592
612
  end
593
613
  end
@@ -180,6 +180,26 @@ describe Mongo::Database do
180
180
  it 'returns a list of the collections info' do
181
181
  expect(result).to include('acol')
182
182
  end
183
+
184
+ context 'with more than one collection' do
185
+ before do
186
+ database[:anothercol].drop
187
+ database[:anothercol].create
188
+
189
+ expect(database.collections.length).to be > 1
190
+ end
191
+
192
+ let(:result) do
193
+ database.list_collections(filter: { name: 'anothercol' }).map do |info|
194
+ info['name']
195
+ end
196
+ end
197
+
198
+ it 'can filter by collection name' do
199
+ expect(result.length).to eq(1)
200
+ expect(result.first).to eq('anothercol')
201
+ end
202
+ end
183
203
  end
184
204
 
185
205
  context 'server 2.6' do
@@ -0,0 +1,26 @@
1
+ require 'lite_spec_helper'
2
+
3
+ describe Mongo::Error::CryptError do
4
+ let(:label) { :error_client }
5
+ let(:code) { 401 }
6
+ let(:message) { 'Operation unauthorized' }
7
+
8
+
9
+ describe '#initialize' do
10
+ context 'with code' do
11
+ let(:error) { described_class.new(message, code: code) }
12
+
13
+ it 'correctly generates the error message' do
14
+ expect(error.message).to eq("#{message} (libmongocrypt error code #{code})")
15
+ end
16
+ end
17
+
18
+ context 'with code' do
19
+ let(:error) { described_class.new(message) }
20
+
21
+ it 'correctly generates the error message' do
22
+ expect(error.message).to eq(message)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ require 'lite_spec_helper'
2
+
3
+ describe Mongo::Error::MaxBSONSize do
4
+ describe 'message' do
5
+ context 'when constructor is given no arguments' do
6
+ let(:error) do
7
+ described_class.new
8
+ end
9
+
10
+ it 'is the predefined message' do
11
+ error.message.should == 'The document exceeds maximum allowed BSON size'
12
+ end
13
+ end
14
+
15
+ context 'when constructor is given an integer argument' do
16
+ let(:error) do
17
+ described_class.new(42)
18
+ end
19
+
20
+ it 'is the predefined message with the size added' do
21
+ error.message.should == 'The document exceeds maximum allowed BSON size. The maximum allowed size is 42'
22
+ end
23
+ end
24
+
25
+ context 'when constructor is given a string argument' do
26
+ let(:error) do
27
+ described_class.new('hello world')
28
+ end
29
+
30
+ it 'is the provided message' do
31
+ error.message.should == 'hello world'
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
2
 
3
3
  describe Mongo::Error::NoServerAvailable do
4
4
  describe 'message' do
@@ -18,5 +18,15 @@ describe Mongo::Error::NoServerAvailable do
18
18
  it 'is correct' do
19
19
  expect(error.message).to eq('No primary server is available in cluster: #<Cluster topology=Unknown[127.0.0.1:27017] servers=[#<Server address=127.0.0.1:27017 UNKNOWN>]> with timeout=30, LT=0.015')
20
20
  end
21
+
22
+ context 'when cluster is nil' do
23
+ let(:error) do
24
+ Mongo::Error::NoServerAvailable.new(selector, nil)
25
+ end
26
+
27
+ it 'is correct' do
28
+ expect(error.message).to eq('No primary server is available with timeout=30, LT=0.015')
29
+ end
30
+ end
21
31
  end
22
32
  end
@@ -72,7 +72,7 @@ describe Mongo::Error::OperationFailure do
72
72
  context 'when there is a network error' do
73
73
  context 'getMore' do
74
74
  let(:error) { Mongo::Error::OperationFailure.new('problem: socket exception',
75
- Mongo::Operation::GetMore::Result.new([])) }
75
+ Mongo::Operation::GetMore::Result.new(nil)) }
76
76
 
77
77
  it 'returns true' do
78
78
  expect(error.change_stream_resumable?).to be true
@@ -91,7 +91,7 @@ describe Mongo::Error::OperationFailure do
91
91
  context 'when there is a resumable message' do
92
92
  context 'getMore response' do
93
93
  let(:error) { Mongo::Error::OperationFailure.new('problem: node is recovering',
94
- Mongo::Operation::GetMore::Result.new([])) }
94
+ Mongo::Operation::GetMore::Result.new(nil)) }
95
95
 
96
96
  it 'returns true' do
97
97
  expect(error.change_stream_resumable?).to eql(true)
@@ -110,7 +110,7 @@ describe Mongo::Error::OperationFailure do
110
110
  context 'when there is a resumable code' do
111
111
  context 'getMore response' do
112
112
  let(:error) { Mongo::Error::OperationFailure.new('no message',
113
- Mongo::Operation::GetMore::Result.new([]),
113
+ Mongo::Operation::GetMore::Result.new(nil),
114
114
  :code => 91, :code_name => 'ShutdownInProgress') }
115
115
 
116
116
  it 'returns true' do
@@ -131,7 +131,7 @@ describe Mongo::Error::OperationFailure do
131
131
  context 'when there is a non-resumable code' do
132
132
  context 'getMore response' do
133
133
  let(:error) { Mongo::Error::OperationFailure.new('no message',
134
- Mongo::Operation::GetMore::Result.new([]),
134
+ Mongo::Operation::GetMore::Result.new(nil),
135
135
  :code => 136, :code_name => 'CappedPositionLost') }
136
136
 
137
137
  it 'returns false' do
@@ -152,7 +152,7 @@ describe Mongo::Error::OperationFailure do
152
152
  context 'when there is a non-resumable label' do
153
153
  context 'getMore response' do
154
154
  let(:error) { Mongo::Error::OperationFailure.new('no message',
155
- Mongo::Operation::GetMore::Result.new([]),
155
+ Mongo::Operation::GetMore::Result.new(nil),
156
156
  :code => 91, :code_name => 'ShutdownInProgress',
157
157
  :labels => ['NonResumableChangeStreamError']) }
158
158
 
@@ -175,7 +175,7 @@ describe Mongo::Error::OperationFailure do
175
175
  context 'when there is another label' do
176
176
  context 'getMore response' do
177
177
  let(:error) { Mongo::Error::OperationFailure.new('no message',
178
- Mongo::Operation::GetMore::Result.new([]),
178
+ Mongo::Operation::GetMore::Result.new(nil),
179
179
  :code => 91, :code_name => 'ShutdownInProgress',
180
180
  :labels => %w(TransientTransactionError)) }
181
181