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,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Client-Side Encryption' do
4
+ describe 'Prose tests: Data key and double encryption' do
5
+ require_libmongocrypt
6
+ require_enterprise
7
+ min_server_fcv '4.2'
8
+
9
+ include_context 'define shared FLE helpers'
10
+
11
+ let(:client) do
12
+ new_local_client(
13
+ SpecConfig.instance.addresses,
14
+ SpecConfig.instance.test_options
15
+ )
16
+ end
17
+
18
+ let(:client_encrypted) do
19
+ new_local_client(
20
+ SpecConfig.instance.addresses,
21
+ SpecConfig.instance.test_options.merge(
22
+ auto_encryption_options: {
23
+ kms_providers: local_kms_providers,
24
+ key_vault_namespace: 'admin.datakeys',
25
+ },
26
+ database: :db,
27
+ )
28
+ )
29
+ end
30
+
31
+ before do
32
+ client.use(:db)[:view].drop
33
+ client.use(:db).database.command(create: "view", viewOn: "coll")
34
+ end
35
+
36
+ it 'does not perform encryption on views' do
37
+ expect do
38
+ client_encrypted[:view].insert_one({})
39
+ end.to raise_error(Mongo::Error::CryptError, /cannot auto encrypt a view/)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,120 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Client do
4
+ clean_slate
5
+
6
+ context 'auto encryption options' do
7
+ require_libmongocrypt
8
+ min_server_fcv '4.2'
9
+ require_enterprise
10
+
11
+ include_context 'define shared FLE helpers'
12
+ include_context 'with local kms_providers'
13
+
14
+ before do
15
+ authorized_client.use(:admin)[:datakeys].drop
16
+ authorized_client.use(:admin)[:datakeys].insert_one(data_key)
17
+ authorized_client.use(:auto_encryption)[:users].drop
18
+ authorized_client.use(:auto_encryption)[:users,
19
+ {
20
+ 'validator' => { '$jsonSchema' => schema_map }
21
+ }
22
+ ].create
23
+ end
24
+
25
+ describe '#with' do
26
+ let(:old_client) do
27
+ new_local_client(
28
+ SpecConfig.instance.addresses,
29
+ SpecConfig.instance.test_options.merge(
30
+ auto_encryption_options: {
31
+ kms_providers: kms_providers,
32
+ key_vault_namespace: key_vault_namespace,
33
+ },
34
+ database: :auto_encryption
35
+ ),
36
+ )
37
+ end
38
+
39
+ let!(:new_client) do
40
+ old_client.with(auto_encryption_options: new_auto_encryption_options)
41
+ end
42
+
43
+ context 'with new auto_encryption_options' do
44
+ let(:new_auto_encryption_options) do
45
+ {
46
+ kms_providers: kms_providers,
47
+ key_vault_namespace: key_vault_namespace,
48
+ schema_map: { 'auto_encryption.users' => schema_map },
49
+ }
50
+ end
51
+
52
+ it 'creates a new client' do
53
+ expect(new_client).not_to eq(old_client)
54
+ end
55
+
56
+ it 'maintains the old client\'s auto encryption options' do
57
+ expect(old_client.encrypter.options[:schema_map]).to be_nil
58
+ end
59
+
60
+ it 'updates the client\'s auto encryption options' do
61
+ expect(new_client.encrypter.options[:schema_map]).to eq('auto_encryption.users' => schema_map)
62
+ end
63
+
64
+ it 'shares a cluster with the old client' do
65
+ expect(old_client.cluster).to eq(new_client.cluster)
66
+ end
67
+
68
+ it 'allows the original client to keep encrypting' do
69
+ old_client[:users].insert_one(ssn: ssn)
70
+ document = authorized_client.use(:auto_encryption)[:users].find.first
71
+ expect(document['ssn']).to be_ciphertext
72
+ end
73
+
74
+ it 'allows the new client to keep encrypting' do
75
+ old_client[:users].insert_one(ssn: ssn)
76
+ document = authorized_client.use(:auto_encryption)[:users].find.first
77
+ expect(document['ssn']).to be_ciphertext
78
+ end
79
+ end
80
+
81
+ context 'with nil auto_encryption_options' do
82
+ let(:new_auto_encryption_options) { nil }
83
+
84
+ it 'removes auto encryption options' do
85
+ expect(new_client.encrypter).to be_nil
86
+ end
87
+
88
+ it 'allows original client to keep encrypting' do
89
+ old_client[:users].insert_one(ssn: ssn)
90
+ document = authorized_client.use(:auto_encryption)[:users].find.first
91
+ expect(document['ssn']).to be_ciphertext
92
+ end
93
+ end
94
+ end
95
+
96
+ describe '#use' do
97
+ let(:old_client) do
98
+ new_local_client(
99
+ SpecConfig.instance.addresses,
100
+ SpecConfig.instance.test_options.merge(
101
+ auto_encryption_options: {
102
+ kms_providers: kms_providers,
103
+ key_vault_namespace: key_vault_namespace,
104
+ }
105
+ )
106
+ )
107
+ end
108
+
109
+ let(:new_client) do
110
+ old_client.use(:auto_encryption)
111
+ end
112
+
113
+ it 'creates a new client with encryption enabled' do
114
+ new_client[:users].insert_one(ssn: ssn)
115
+ document = authorized_client.use(:auto_encryption)[:users].find.first
116
+ expect(document['ssn']).to be_ciphertext
117
+ end
118
+ end
119
+ end
120
+ end
@@ -21,6 +21,7 @@ describe 'Command monitoring' do
21
21
  started_event = started_events.first
22
22
  expect(started_event.command_name).to eql('ismaster')
23
23
  expect(started_event.address).to be_a(Mongo::Address)
24
+ expect(started_event.command).to have_key('$db')
24
25
 
25
26
  succeeded_events = subscriber.succeeded_events.select do |event|
26
27
  event.command_name == 'ismaster'
@@ -30,6 +31,7 @@ describe 'Command monitoring' do
30
31
  expect(succeeded_event.command_name).to eql('ismaster')
31
32
  expect(succeeded_event.reply).to be_a(BSON::Document)
32
33
  expect(succeeded_event.reply['ismaster']).to eql(true)
34
+ expect(succeeded_event.reply['ok']).to eq(1)
33
35
  expect(succeeded_event.address).to be_a(Mongo::Address)
34
36
  expect(succeeded_event.duration).to be_a(Float)
35
37
 
@@ -109,7 +111,7 @@ describe 'Command monitoring' do
109
111
 
110
112
  subscriber.clear_events!
111
113
  expect do
112
- command.execute(server)
114
+ command.execute(server, client: nil)
113
115
  end.to raise_error(Mongo::Error::OperationFailure, /Not enough data-bearing nodes \(100\)/)
114
116
 
115
117
  expect(subscriber.started_events.length).to eq(1)
@@ -47,7 +47,10 @@ describe 'Command' do
47
47
 
48
48
  let(:expected_payload) do
49
49
  {
50
- 'command' => {'commitTransaction' => 1},
50
+ 'command' => {
51
+ 'commitTransaction' => 1,
52
+ '$db' => 'admin',
53
+ },
51
54
  'command_name' => 'commitTransaction',
52
55
  'database_name' => 'admin',
53
56
  'request_id' => 42,
@@ -75,6 +78,7 @@ describe 'Command' do
75
78
  'commitTransaction' => 1,
76
79
  'lsid' => session.session_id,
77
80
  'txnNumber' => BSON::Int64.new(123),
81
+ '$db' => 'admin',
78
82
  },
79
83
  'command_name' => 'commitTransaction',
80
84
  'database_name' => 'admin',
@@ -93,6 +97,7 @@ describe 'Command' do
93
97
  let(:expected_payload) do
94
98
  {
95
99
  'command' => {
100
+ '$db' => 'admin',
96
101
  'commitTransaction' => 1,
97
102
  'writeConcern' => {'w' => 'majority'},
98
103
  },
@@ -121,17 +126,46 @@ describe 'Command' do
121
126
  )
122
127
  end
123
128
 
124
- let(:expected_payload) do
125
- {
126
- 'command' => {'find' => 'collection_name'},
127
- 'command_name' => 'find',
128
- 'database_name' => 'foo',
129
- 'request_id' => 42,
130
- }
129
+ context 'OP_MSG-capable servers' do
130
+ min_server_fcv '3.6'
131
+
132
+ let(:expected_payload) do
133
+ {
134
+ 'command' => {
135
+ '$db' => 'foo',
136
+ 'find' => 'collection_name',
137
+ },
138
+ 'command_name' => 'find',
139
+ 'database_name' => 'foo',
140
+ 'request_id' => 42,
141
+ }
142
+ end
143
+
144
+ it 'returns expected payload' do
145
+ expect(payload).to eq(expected_payload)
146
+ end
131
147
  end
132
148
 
133
- it 'returns expected payload' do
134
- expect(payload).to eq(expected_payload)
149
+ # Servers using legacy wire protocol message do not have $db in payload.
150
+ # $db is added to the payload later when the command monitoring event is
151
+ # published.
152
+ context 'pre-OP_MSG servers' do
153
+ max_server_version '3.4'
154
+
155
+ let(:expected_payload) do
156
+ {
157
+ 'command' => {
158
+ 'find' => 'collection_name',
159
+ },
160
+ 'command_name' => 'find',
161
+ 'database_name' => 'foo',
162
+ 'request_id' => 42,
163
+ }
164
+ end
165
+
166
+ it 'returns expected payload' do
167
+ expect(payload).to eq(expected_payload)
168
+ end
135
169
  end
136
170
  end
137
171
 
@@ -168,6 +168,63 @@ describe 'Connections' do
168
168
  it_behaves_like 'is 1 per connection'
169
169
  end
170
170
  end
171
+
172
+ context 'when socket connection fails' do
173
+
174
+ before do
175
+ server
176
+ end
177
+
178
+ let(:socket_cls) { ::Socket }
179
+
180
+ let(:socket) do
181
+ double('socket').tap do |socket|
182
+ allow(socket).to receive(:setsockopt)
183
+ allow(socket).to receive(:set_encoding)
184
+ allow(socket).to receive(:getsockopt)
185
+ expect(socket).to receive(:connect).and_raise(IOError, 'test error')
186
+
187
+ # This test is testing for the close call:
188
+ expect(socket).to receive(:close)
189
+ end
190
+ end
191
+
192
+ it 'closes the socket' do
193
+ RSpec::Mocks.with_temporary_scope do
194
+ expect(::Socket).to receive(:new).with(
195
+ Socket::AF_INET, Socket::SOCK_STREAM, 0).and_return(socket)
196
+
197
+ lambda do
198
+ connection.connect!
199
+ end.should raise_error(Mongo::Error::SocketError, /test error/)
200
+ end
201
+ end
202
+
203
+ context 'with tls' do
204
+ require_tls
205
+
206
+ let(:socket) do
207
+ double('socket').tap do |socket|
208
+ allow(socket).to receive(:hostname=)
209
+ allow(socket).to receive(:sync_close=)
210
+ expect(socket).to receive(:connect).and_raise(IOError, 'test error')
211
+
212
+ # This test is testing for the close call:
213
+ expect(socket).to receive(:close)
214
+ end
215
+ end
216
+
217
+ it 'closes the SSL socket' do
218
+ RSpec::Mocks.with_temporary_scope do
219
+ expect(OpenSSL::SSL::SSLSocket).to receive(:new).and_return(socket)
220
+
221
+ lambda do
222
+ connection.connect!
223
+ end.should raise_error(Mongo::Error::SocketError, /test error/)
224
+ end
225
+ end
226
+ end
227
+ end
171
228
  end
172
229
 
173
230
  describe 'wire protocol version range update' do
@@ -54,9 +54,7 @@ describe 'Client after reconnect' do
54
54
  context 'SRV monitor thread' do
55
55
 
56
56
  let(:uri) do
57
- "mongodb+srv://test1.test.build.10gen.cc/?tls=#{SpecConfig.instance.ssl?}&tlsInsecure=true".tap do |uri|
58
- puts "Constructed URI: #{uri}"
59
- end
57
+ "mongodb+srv://test1.test.build.10gen.cc/?tls=#{SpecConfig.instance.ssl?}"
60
58
  end
61
59
 
62
60
  # Debug logging to troubleshoot failures in Evergreen
@@ -68,8 +66,8 @@ describe 'Client after reconnect' do
68
66
 
69
67
  let(:client) do
70
68
  ClientRegistry.instance.register_local_client(
71
- Mongo::Client.new(uri, server_selection_timeout: 3.86,
72
- logger: logger))
69
+ Mongo::Client.new(uri, SpecConfig.instance.ssl_options.merge(
70
+ server_selection_timeout: 3.86, logger: logger)))
73
71
  end
74
72
 
75
73
  let(:wait_for_discovery) do
@@ -134,7 +132,10 @@ describe 'Client after reconnect' do
134
132
 
135
133
  let(:client) do
136
134
  ClientRegistry.instance.register_local_client(
137
- Mongo::Client.new(uri, server_selection_timeout: 3.89,
135
+ Mongo::Client.new(uri,
136
+ timeout: 5,
137
+ connect_timeout: 5,
138
+ server_selection_timeout: 3.89,
138
139
  resolv_options: {
139
140
  nameserver: 'localhost',
140
141
  nameserver_port: [['localhost', 5300], ['127.0.0.1', 5300]],
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'BSON & command size limits' do
4
+ let(:max_document_size) { 16*1024*1024 }
5
+
6
+ before do
7
+ authorized_collection.delete_many
8
+ end
9
+
10
+ # This test uses a large document that is significantly smaller than the
11
+ # size limit. It is a basic sanity check.
12
+ it 'allows user-provided documents to be 15MiB' do
13
+ document = { key: 'a' * 15*1024*1024, _id: 'foo' }
14
+
15
+ authorized_collection.insert_one(document)
16
+ end
17
+
18
+ # This test uses a large document that is significantly larger than the
19
+ # size limit. It is a basic sanity check.
20
+ it 'fails single write of oversized documents' do
21
+ document = { key: 'a' * 17*1024*1024, _id: 'foo' }
22
+
23
+ lambda do
24
+ authorized_collection.insert_one(document)
25
+ end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
26
+ end
27
+
28
+ # This test checks our bulk write splitting when documents are not close
29
+ # to the limit, but where splitting is definitely required.
30
+ it 'allows split bulk write of medium sized documents' do
31
+ # 8 documents of 4 MiB each = 32 MiB total data, should be split over
32
+ # either 2 or 3 bulk writes depending on how well the driver splits
33
+ documents = []
34
+ 1.upto(8) do |index|
35
+ documents << { key: 'a' * 4*1024*1024, _id: "in#{index}" }
36
+ end
37
+
38
+ authorized_collection.insert_many(documents)
39
+ authorized_collection.count_documents({}).should == 8
40
+ end
41
+
42
+ # This test ensures that document which are too big definitely fail insertion.
43
+ it 'fails bulk write of oversized documents' do
44
+ documents = []
45
+ 1.upto(3) do |index|
46
+ documents << { key: 'a' * 17*1024*1024, _id: "in#{index}" }
47
+ end
48
+
49
+ lambda do
50
+ authorized_collection.insert_many(documents)
51
+ end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
52
+ authorized_collection.count_documents({}).should == 0
53
+ end
54
+
55
+ it 'allows user-provided documents to be exactly 16MiB' do
56
+ # The document must contain the _id field, otherwise the server will
57
+ # add it which will increase the size of the document as persisted by
58
+ # the server.
59
+ document = { key: 'a' * (max_document_size - 28), _id: 'foo' }
60
+ expect(document.to_bson.length).to eq(max_document_size)
61
+
62
+ authorized_collection.insert_one(document)
63
+ end
64
+
65
+ it 'fails on the server when a document larger than 16MiB is inserted' do
66
+ document = { key: 'a' * (max_document_size - 27), _id: 'foo' }
67
+ expect(document.to_bson.length).to eq(max_document_size+1)
68
+
69
+ lambda do
70
+ authorized_collection.insert_one(document)
71
+ end.should raise_error(Mongo::Error::OperationFailure, /object to insert too large/)
72
+ end
73
+
74
+ it 'fails in the driver when a document larger than 16MiB+16KiB is inserted' do
75
+ document = { key: 'a' * (max_document_size - 27 + 16*1024), _id: 'foo' }
76
+ expect(document.to_bson.length).to eq(max_document_size+16*1024+1)
77
+
78
+ lambda do
79
+ authorized_collection.insert_one(document)
80
+ end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
81
+ end
82
+
83
+ it 'allows bulk writes of multiple documents of exactly 16 MiB each' do
84
+ documents = []
85
+ 1.upto(3) do |index|
86
+ document = { key: 'a' * (max_document_size - 28), _id: "in#{index}" }
87
+ expect(document.to_bson.length).to eq(max_document_size)
88
+ documents << document
89
+ end
90
+
91
+ authorized_collection.insert_many(documents)
92
+ authorized_collection.count_documents({}).should == 3
93
+ end
94
+ end