mongo 2.11.6 → 2.12.0.rc0

Sign up to get free protection for your applications and to get access to all the features.
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