mongo 2.11.4 → 2.12.3

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 (357) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/README.md +2 -1
  6. data/lib/mongo.rb +3 -0
  7. data/lib/mongo/address.rb +44 -19
  8. data/lib/mongo/auth.rb +1 -0
  9. data/lib/mongo/auth/credential_cache.rb +51 -0
  10. data/lib/mongo/auth/scram/conversation.rb +20 -16
  11. data/lib/mongo/auth/user.rb +0 -8
  12. data/lib/mongo/auth/user/view.rb +4 -4
  13. data/lib/mongo/background_thread.rb +1 -1
  14. data/lib/mongo/bulk_write.rb +5 -5
  15. data/lib/mongo/client.rb +143 -14
  16. data/lib/mongo/client_encryption.rb +103 -0
  17. data/lib/mongo/cluster.rb +8 -4
  18. data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
  19. data/lib/mongo/cluster/sdam_flow.rb +54 -58
  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 +9 -7
  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 +40 -0
  30. data/lib/mongo/crypt/auto_encrypter.rb +179 -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 +1229 -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 +289 -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 +315 -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 +23 -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/bulk_write_error.rb +16 -14
  50. data/lib/mongo/error/crypt_error.rb +31 -0
  51. data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
  52. data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
  53. data/lib/mongo/error/kms_error.rb +22 -0
  54. data/lib/mongo/error/max_bson_size.rb +14 -3
  55. data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
  56. data/lib/mongo/error/no_server_available.rb +8 -3
  57. data/lib/mongo/error/notable.rb +0 -15
  58. data/lib/mongo/error/operation_failure.rb +1 -0
  59. data/lib/mongo/error/parser.rb +1 -1
  60. data/lib/mongo/grid/file.rb +5 -0
  61. data/lib/mongo/grid/file/chunk.rb +2 -0
  62. data/lib/mongo/grid/file/info.rb +3 -2
  63. data/lib/mongo/grid/fs_bucket.rb +15 -13
  64. data/lib/mongo/grid/stream/write.rb +9 -3
  65. data/lib/mongo/index/view.rb +3 -3
  66. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  67. data/lib/mongo/monitoring/event/command_started.rb +6 -1
  68. data/lib/mongo/operation/collections_info.rb +6 -3
  69. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  70. data/lib/mongo/operation/find/op_msg.rb +4 -1
  71. data/lib/mongo/operation/get_more/op_msg.rb +4 -1
  72. data/lib/mongo/operation/insert/command.rb +3 -2
  73. data/lib/mongo/operation/insert/legacy.rb +3 -2
  74. data/lib/mongo/operation/insert/op_msg.rb +3 -3
  75. data/lib/mongo/operation/result.rb +36 -27
  76. data/lib/mongo/operation/shared/executable.rb +11 -9
  77. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  78. data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
  79. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
  80. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
  81. data/lib/mongo/operation/shared/read_preference_supported.rb +68 -19
  82. data/lib/mongo/operation/shared/response_handling.rb +1 -1
  83. data/lib/mongo/operation/shared/sessions_supported.rb +44 -3
  84. data/lib/mongo/operation/shared/write.rb +17 -10
  85. data/lib/mongo/operation/update/op_msg.rb +1 -1
  86. data/lib/mongo/protocol/bit_vector.rb +2 -1
  87. data/lib/mongo/protocol/compressed.rb +6 -5
  88. data/lib/mongo/protocol/insert.rb +3 -1
  89. data/lib/mongo/protocol/message.rb +94 -15
  90. data/lib/mongo/protocol/msg.rb +207 -37
  91. data/lib/mongo/protocol/query.rb +7 -9
  92. data/lib/mongo/protocol/serializers.rb +43 -15
  93. data/lib/mongo/retryable.rb +1 -1
  94. data/lib/mongo/server.rb +10 -4
  95. data/lib/mongo/server/connection.rb +20 -9
  96. data/lib/mongo/server/connection_base.rb +118 -18
  97. data/lib/mongo/server/connection_common.rb +61 -0
  98. data/lib/mongo/server/connection_pool.rb +37 -1
  99. data/lib/mongo/server/connection_pool/populator.rb +1 -1
  100. data/lib/mongo/server/description.rb +9 -11
  101. data/lib/mongo/server/monitor.rb +2 -0
  102. data/lib/mongo/server/monitor/connection.rb +3 -18
  103. data/lib/mongo/server/pending_connection.rb +2 -1
  104. data/lib/mongo/session.rb +3 -3
  105. data/lib/mongo/session/session_pool.rb +8 -3
  106. data/lib/mongo/socket.rb +29 -16
  107. data/lib/mongo/socket/ssl.rb +23 -8
  108. data/lib/mongo/socket/tcp.rb +12 -3
  109. data/lib/mongo/srv/monitor.rb +73 -42
  110. data/lib/mongo/srv/result.rb +0 -1
  111. data/lib/mongo/timeout.rb +49 -0
  112. data/lib/mongo/uri.rb +30 -1
  113. data/lib/mongo/uri/srv_protocol.rb +1 -1
  114. data/lib/mongo/version.rb +1 -1
  115. data/mongo.gemspec +1 -3
  116. data/spec/README.md +228 -7
  117. data/spec/integration/auth_spec.rb +53 -0
  118. data/spec/integration/bulk_write_spec.rb +19 -0
  119. data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
  120. data/spec/integration/client_construction_spec.rb +100 -1
  121. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +353 -0
  122. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +303 -0
  123. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +72 -0
  124. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +79 -0
  125. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +221 -0
  126. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +601 -0
  127. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +187 -0
  128. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +78 -0
  129. data/spec/integration/client_side_encryption/client_close_spec.rb +63 -0
  130. data/spec/integration/client_side_encryption/corpus_spec.rb +233 -0
  131. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
  132. data/spec/integration/client_side_encryption/data_key_spec.rb +165 -0
  133. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
  134. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +141 -0
  135. data/spec/integration/client_side_encryption/views_spec.rb +44 -0
  136. data/spec/integration/client_update_spec.rb +154 -0
  137. data/spec/integration/command_monitoring_spec.rb +3 -1
  138. data/spec/integration/command_spec.rb +44 -10
  139. data/spec/integration/connection_spec.rb +57 -0
  140. data/spec/integration/crud_spec.rb +89 -0
  141. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  142. data/spec/integration/read_preference_spec.rb +26 -0
  143. data/spec/integration/reconnect_spec.rb +7 -6
  144. data/spec/integration/size_limit_spec.rb +111 -0
  145. data/spec/integration/srv_monitoring_spec.rb +16 -8
  146. data/spec/integration/zlib_compression_spec.rb +25 -0
  147. data/spec/kerberos/kerberos_spec.rb +87 -0
  148. data/spec/lite_spec_helper.rb +34 -29
  149. data/spec/mongo/auth/cr_spec.rb +8 -0
  150. data/spec/mongo/auth/ldap_spec.rb +5 -1
  151. data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
  152. data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
  153. data/spec/mongo/auth/scram_spec.rb +45 -35
  154. data/spec/mongo/auth/user/view_spec.rb +3 -6
  155. data/spec/mongo/auth/x509_spec.rb +5 -1
  156. data/spec/mongo/bulk_write/result_spec.rb +11 -7
  157. data/spec/mongo/client_construction_spec.rb +206 -2
  158. data/spec/mongo/client_encryption_spec.rb +405 -0
  159. data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
  160. data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
  161. data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
  162. data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
  163. data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
  164. data/spec/mongo/collection/view_spec.rb +1 -1
  165. data/spec/mongo/collection_spec.rb +28 -9
  166. data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
  167. data/spec/mongo/crypt/auto_encrypter_spec.rb +187 -0
  168. data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
  169. data/spec/mongo/crypt/binary_spec.rb +115 -0
  170. data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
  171. data/spec/mongo/crypt/binding/context_spec.rb +257 -0
  172. data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
  173. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
  174. data/spec/mongo/crypt/binding/status_spec.rb +99 -0
  175. data/spec/mongo/crypt/binding/version_spec.rb +22 -0
  176. data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
  177. data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
  178. data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
  179. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
  180. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
  181. data/spec/mongo/crypt/handle_spec.rb +232 -0
  182. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
  183. data/spec/mongo/crypt/status_spec.rb +152 -0
  184. data/spec/mongo/cursor_spec.rb +24 -4
  185. data/spec/mongo/database_spec.rb +20 -0
  186. data/spec/mongo/error/bulk_write_error_spec.rb +49 -0
  187. data/spec/mongo/error/crypt_error_spec.rb +26 -0
  188. data/spec/mongo/error/max_bson_size_spec.rb +35 -0
  189. data/spec/mongo/error/no_server_available_spec.rb +11 -1
  190. data/spec/mongo/error/notable_spec.rb +59 -0
  191. data/spec/mongo/error/operation_failure_spec.rb +6 -6
  192. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  193. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  194. data/spec/mongo/operation/command_spec.rb +3 -3
  195. data/spec/mongo/operation/create_index_spec.rb +3 -3
  196. data/spec/mongo/operation/create_user_spec.rb +3 -3
  197. data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
  198. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
  199. data/spec/mongo/operation/delete_spec.rb +7 -7
  200. data/spec/mongo/operation/drop_index_spec.rb +2 -2
  201. data/spec/mongo/operation/find/legacy_spec.rb +2 -1
  202. data/spec/mongo/operation/get_more_spec.rb +1 -1
  203. data/spec/mongo/operation/indexes_spec.rb +1 -1
  204. data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
  205. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
  206. data/spec/mongo/operation/insert_spec.rb +12 -12
  207. data/spec/mongo/operation/map_reduce_spec.rb +2 -2
  208. data/spec/mongo/operation/read_preference_legacy_spec.rb +351 -0
  209. data/spec/mongo/operation/read_preference_op_msg_spec.rb +194 -0
  210. data/spec/mongo/operation/remove_user_spec.rb +3 -3
  211. data/spec/mongo/operation/update/bulk_spec.rb +6 -6
  212. data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
  213. data/spec/mongo/operation/update_spec.rb +7 -7
  214. data/spec/mongo/operation/update_user_spec.rb +1 -1
  215. data/spec/mongo/protocol/compressed_spec.rb +2 -3
  216. data/spec/mongo/protocol/delete_spec.rb +9 -8
  217. data/spec/mongo/protocol/get_more_spec.rb +9 -8
  218. data/spec/mongo/protocol/insert_spec.rb +9 -8
  219. data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
  220. data/spec/mongo/protocol/msg_spec.rb +57 -53
  221. data/spec/mongo/protocol/query_spec.rb +12 -12
  222. data/spec/mongo/protocol/registry_spec.rb +1 -1
  223. data/spec/mongo/protocol/reply_spec.rb +1 -1
  224. data/spec/mongo/protocol/update_spec.rb +10 -9
  225. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  226. data/spec/mongo/server/connection_spec.rb +28 -7
  227. data/spec/mongo/socket_spec.rb +1 -1
  228. data/spec/mongo/srv/monitor_spec.rb +88 -69
  229. data/spec/mongo/timeout_spec.rb +85 -0
  230. data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
  231. data/spec/mongo/uri_spec.rb +52 -5
  232. data/spec/mongo/write_concern_spec.rb +13 -1
  233. data/spec/{support → runners}/auth.rb +14 -1
  234. data/spec/{support → runners}/change_streams.rb +1 -1
  235. data/spec/{support → runners}/change_streams/operation.rb +0 -0
  236. data/spec/{support → runners}/cmap.rb +1 -1
  237. data/spec/{support → runners}/cmap/verifier.rb +0 -0
  238. data/spec/{support → runners}/command_monitoring.rb +0 -0
  239. data/spec/runners/connection_string.rb +358 -4
  240. data/spec/{support → runners}/crud.rb +9 -9
  241. data/spec/{support → runners}/crud/context.rb +0 -0
  242. data/spec/{support → runners}/crud/operation.rb +7 -3
  243. data/spec/{support → runners}/crud/outcome.rb +0 -0
  244. data/spec/{support → runners}/crud/requirement.rb +1 -1
  245. data/spec/{support → runners}/crud/spec.rb +12 -1
  246. data/spec/{support → runners}/crud/test.rb +0 -0
  247. data/spec/{support → runners}/crud/test_base.rb +0 -0
  248. data/spec/{support → runners}/crud/verifier.rb +10 -12
  249. data/spec/{support → runners}/gridfs.rb +0 -0
  250. data/spec/{support → runners}/sdam_monitoring.rb +0 -0
  251. data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
  252. data/spec/{support → runners}/server_selection.rb +0 -0
  253. data/spec/{support → runners}/server_selection_rtt.rb +0 -0
  254. data/spec/{support → runners}/transactions.rb +9 -11
  255. data/spec/{support → runners}/transactions/context.rb +0 -0
  256. data/spec/{support → runners}/transactions/operation.rb +0 -0
  257. data/spec/{support → runners}/transactions/spec.rb +0 -0
  258. data/spec/{support → runners}/transactions/test.rb +37 -5
  259. data/spec/spec_helper.rb +0 -5
  260. data/spec/spec_tests/auth_spec.rb +3 -3
  261. data/spec/spec_tests/client_side_encryption_spec.rb +8 -0
  262. data/spec/spec_tests/connection_string_spec.rb +1 -1
  263. data/spec/spec_tests/data/auth/connection-string.yml +13 -0
  264. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  265. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  266. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  267. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  268. data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
  269. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  270. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  271. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  272. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  273. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  274. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  275. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  276. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  277. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  278. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  279. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  280. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  281. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  282. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  283. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  284. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  285. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  286. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  287. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  288. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
  289. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  290. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  291. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  292. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
  293. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
  294. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
  295. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
  296. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
  297. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
  298. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
  299. data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
  300. data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
  301. 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
  302. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
  303. data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  304. data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  305. data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  306. data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  307. data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
  308. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
  309. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
  310. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  311. data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
  312. data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
  313. data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
  314. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  315. data/spec/spec_tests/uri_options_spec.rb +6 -8
  316. data/spec/stress/connection_pool_timing_spec.rb +6 -3
  317. data/spec/support/certificates/README.md +4 -0
  318. data/spec/support/certificates/server-second-level-bundle.pem +77 -77
  319. data/spec/support/certificates/server-second-level.crt +52 -52
  320. data/spec/support/certificates/server-second-level.key +25 -25
  321. data/spec/support/certificates/server-second-level.pem +77 -77
  322. data/spec/support/client_registry.rb +19 -3
  323. data/spec/support/cluster_config.rb +9 -1
  324. data/spec/support/cluster_tools.rb +6 -1
  325. data/spec/support/common_shortcuts.rb +12 -0
  326. data/spec/support/constraints.rb +16 -0
  327. data/spec/support/crypt.rb +154 -0
  328. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  329. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  330. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  331. data/spec/support/crypt/corpus/corpus.json +3657 -0
  332. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  333. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  334. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  335. data/spec/support/crypt/external/external-key.json +31 -0
  336. data/spec/support/crypt/external/external-schema.json +19 -0
  337. data/spec/support/crypt/limits/limits-doc.json +102 -0
  338. data/spec/support/crypt/limits/limits-key.json +31 -0
  339. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  340. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  341. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  342. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  343. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  344. data/spec/support/lite_constraints.rb +19 -1
  345. data/spec/support/matchers.rb +19 -0
  346. data/spec/support/shared/protocol.rb +2 -0
  347. data/spec/support/spec_config.rb +53 -13
  348. data/spec/support/utils.rb +140 -10
  349. metadata +894 -687
  350. metadata.gz.sig +0 -0
  351. data/lib/mongo/cluster/srv_monitor.rb +0 -127
  352. data/lib/mongo/srv/warning_result.rb +0 -35
  353. data/spec/enterprise_auth/kerberos_spec.rb +0 -58
  354. data/spec/mongo/cluster/srv_monitor_spec.rb +0 -214
  355. data/spec/mongo/operation/read_preference_spec.rb +0 -245
  356. data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
  357. data/spec/support/connection_string.rb +0 -354
@@ -1,4 +1,4 @@
1
- require "spec_helper"
1
+ require 'lite_spec_helper'
2
2
 
3
3
  describe Mongo::Protocol::Registry do
4
4
 
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
2
 
3
3
  describe Mongo::Protocol::Reply do
4
4
 
@@ -1,17 +1,18 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
+ require 'support/shared/protocol'
2
3
 
3
4
  describe Mongo::Protocol::Update do
4
5
 
5
6
  let(:opcode) { 2001 }
6
7
  let(:db) { SpecConfig.instance.test_db }
7
- let(:coll) { TEST_COLL }
8
- let(:ns) { "#{db}.#{coll}" }
8
+ let(:collection_name) { 'protocol-test' }
9
+ let(:ns) { "#{db}.#{collection_name}" }
9
10
  let(:selector) { { :name => 'Tyler' } }
10
11
  let(:update_doc) { { :name => 'Bob' } }
11
12
  let(:options) { Hash.new }
12
13
 
13
14
  let(:message) do
14
- described_class.new(db, coll, selector, update_doc, options)
15
+ described_class.new(db, collection_name, selector, update_doc, options)
15
16
  end
16
17
 
17
18
  describe '#initialize' do
@@ -35,7 +36,7 @@ describe Mongo::Protocol::Update do
35
36
 
36
37
  context 'when the fields are equal' do
37
38
  let(:other) do
38
- described_class.new(db, coll, selector, update_doc, options)
39
+ described_class.new(db, collection_name, selector, update_doc, options)
39
40
  end
40
41
 
41
42
  it 'returns true' do
@@ -45,7 +46,7 @@ describe Mongo::Protocol::Update do
45
46
 
46
47
  context 'when the database is not equal' do
47
48
  let(:other) do
48
- described_class.new('tyler', coll, selector, update_doc, options)
49
+ described_class.new('tyler', collection_name, selector, update_doc, options)
49
50
  end
50
51
 
51
52
  it 'returns false' do
@@ -65,7 +66,7 @@ describe Mongo::Protocol::Update do
65
66
 
66
67
  context 'when the selector is not equal' do
67
68
  let(:other) do
68
- described_class.new(db, coll, { :a => 1 }, update_doc, options)
69
+ described_class.new(db, collection_name, { :a => 1 }, update_doc, options)
69
70
  end
70
71
 
71
72
  it 'returns false' do
@@ -75,7 +76,7 @@ describe Mongo::Protocol::Update do
75
76
 
76
77
  context 'when the update document is not equal' do
77
78
  let(:other) do
78
- described_class.new(db, coll, selector, { :a => 1 }, options)
79
+ described_class.new(db, collection_name, selector, { :a => 1 }, options)
79
80
  end
80
81
 
81
82
  it 'returns false' do
@@ -85,7 +86,7 @@ describe Mongo::Protocol::Update do
85
86
 
86
87
  context 'when the options are not equal' do
87
88
  let(:other) do
88
- described_class.new(db, coll, selector, update_doc,
89
+ described_class.new(db, collection_name, selector, update_doc,
89
90
  :flags => :upsert)
90
91
  end
91
92
 
@@ -487,7 +487,7 @@ describe Mongo::Server::ConnectionPool do
487
487
  expect {
488
488
  pool.check_out
489
489
  pool.check_out
490
- }.to raise_error(Timeout::Error)
490
+ }.to raise_error(::Timeout::Error)
491
491
  expect(pool.size).to eq(1)
492
492
  end
493
493
  end
@@ -532,7 +532,9 @@ describe Mongo::Server::Connection, retry: 3 do
532
532
  user: SpecConfig.instance.test_user.name,
533
533
  password: SpecConfig.instance.test_user.password,
534
534
  ))
535
- )
535
+ ).tap do |connection|
536
+ connection.connect!
537
+ end
536
538
  end
537
539
 
538
540
  let(:documents) do
@@ -627,14 +629,24 @@ describe Mongo::Server::Connection, retry: 3 do
627
629
  context 'linting' do
628
630
  require_linting
629
631
 
630
- it 'marks the connection no longer usable' do
632
+ it 'does not permit sending over the connection' do
631
633
  expect {
632
634
  connection.dispatch([ query_alice ])
633
635
  }.to raise_error(Mongo::Error::UnexpectedResponse)
634
636
 
635
637
  expect do
636
638
  connection.dispatch([ query_alice ]).documents
637
- end.to raise_error(Mongo::Error::LintError, /Reconnecting closed connections is no longer supported.*/)
639
+ end.to raise_error(Mongo::Error::LintError, /Trying to deliver a message over a disconnected connection/)
640
+ end
641
+
642
+ it 'marks the connection no longer usable' do
643
+ expect {
644
+ connection.dispatch([ query_alice ])
645
+ }.to raise_error(Mongo::Error::UnexpectedResponse)
646
+
647
+ expect do
648
+ connection.connect!
649
+ end.to raise_error(Mongo::Error::LintError, /Reconnecting closed connections is no longer supported/)
638
650
  end
639
651
  end
640
652
 
@@ -714,9 +726,15 @@ describe Mongo::Server::Connection, retry: 3 do
714
726
  end
715
727
 
716
728
  context 'when the message is a command' do
729
+ # Server description is frozen when linting is enabled, which is
730
+ # incompatible with expectations set on it in this test
731
+ skip_if_linting
717
732
 
718
733
  let(:selector) do
719
- { :getlasterror => '1' }
734
+ # The driver allows up to 16KiB for command overhead on top of
735
+ # the max bson object size reported by the server.
736
+ # Add that much padding.
737
+ { :getlasterror => '1', 'padding' => 'x'*16384 }
720
738
  end
721
739
 
722
740
  let(:command) do
@@ -730,7 +748,8 @@ describe Mongo::Server::Connection, retry: 3 do
730
748
  it 'checks the size against the max bson size' do
731
749
  # 100 works for non-x509 auth.
732
750
  # 10 is needed for x509 auth due to smaller payloads, apparently.
733
- expect_any_instance_of(Mongo::Server).to receive(:max_bson_object_size).at_least(:once).and_return(10)
751
+ expect_any_instance_of(Mongo::Server::Description).to receive(
752
+ :max_bson_object_size).at_least(:once).and_return(10)
734
753
  expect do
735
754
  reply
736
755
  end.to raise_exception(Mongo::Error::MaxBSONSize)
@@ -862,7 +881,9 @@ describe Mongo::Server::Connection, retry: 3 do
862
881
  context 'when the socket_timeout is negative' do
863
882
 
864
883
  let(:connection) do
865
- described_class.new(server, server.options)
884
+ described_class.new(server, server.options).tap do |connection|
885
+ connection.connect!
886
+ end
866
887
  end
867
888
 
868
889
  let(:message) do
@@ -871,7 +892,7 @@ describe Mongo::Server::Connection, retry: 3 do
871
892
 
872
893
  before do
873
894
  expect(message).to receive(:replyable?) { false }
874
- connection.send(:deliver, message)
895
+ connection.send(:deliver, message, nil)
875
896
 
876
897
  connection.send(:socket).instance_variable_set(:@timeout, -(Time.now.to_i))
877
898
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Mongo::Socket do
4
4
 
5
5
  let(:socket) do
6
- described_class.new(Socket::PF_INET)
6
+ described_class.new
7
7
  end
8
8
 
9
9
  describe '#address' do
@@ -1,82 +1,101 @@
1
1
  require 'lite_spec_helper'
2
2
 
3
- describe Mongo::SRV::Monitor do
3
+ describe Mongo::Srv::Monitor do
4
4
  describe '#scan!' do
5
5
  let(:hostname) do
6
- 'test1.test.build.10gen.cc.'
6
+ 'test1.test.build.10gen.cc'
7
7
  end
8
8
 
9
9
  let(:hosts) do
10
10
  [
11
- 'localhost.test.build.10gen.cc.:27017',
12
- 'localhost.test.build.10gen.cc.:27018',
11
+ 'localhost.test.build.10gen.cc:27017',
12
+ 'localhost.test.build.10gen.cc:27018',
13
13
  ]
14
14
  end
15
15
 
16
- let(:records) do
17
- double('records').tap do |records|
18
- allow(records).to receive(:hostname).and_return(hostname)
19
- allow(records).to receive(:hosts).and_return(hosts)
20
- allow(records).to receive(:empty?).and_return(false)
21
- allow(records).to receive(:min_ttl).and_return(nil)
16
+ let(:result) do
17
+ double('result').tap do |result|
18
+ allow(result).to receive(:hostname).and_return(hostname)
19
+ allow(result).to receive(:address_strs).and_return(hosts)
20
+ allow(result).to receive(:empty?).and_return(false)
21
+ allow(result).to receive(:min_ttl).and_return(nil)
22
22
  end
23
23
  end
24
24
 
25
+ let(:uri_resolver) do
26
+ double('uri resolver').tap do |resolver|
27
+ expect(resolver).to receive(:get_records).and_return(result)
28
+ end
29
+ end
30
+
31
+ let(:srv_uri) do
32
+ Mongo::URI.get("mongodb+srv://this.is.not.used")
33
+ end
25
34
 
26
35
  let(:cluster) do
27
- Mongo::Cluster.new(records.hosts, Mongo::Monitoring.new, { monitoring_io: false })
36
+ Mongo::Cluster.new(hosts, Mongo::Monitoring.new, monitoring_io: false)
28
37
  end
29
38
 
30
- let(:monitoring) do
31
- described_class.new(cluster, resolver, records)
39
+ let(:monitor) do
40
+ described_class.new(cluster, srv_uri: srv_uri)
32
41
  end
33
42
 
34
43
  before do
35
- monitoring.scan!
44
+ # monitor instantiation triggers cluster instantiation which
45
+ # performs real SRV lookups for the hostname.
46
+ # The next lookup (the one performed when cluster is already set up)
47
+ # is using our doubles.
48
+ RSpec::Mocks.with_temporary_scope do
49
+ allow(uri_resolver).to receive(:get_txt_options_string)
50
+ expect(Mongo::Srv::Resolver).to receive(:new).ordered.and_return(uri_resolver)
51
+ allow(resolver).to receive(:get_txt_options_string)
52
+ expect(Mongo::Srv::Resolver).to receive(:new).ordered.and_return(resolver)
53
+ monitor.send(:scan!)
54
+ end
36
55
  end
37
56
 
38
57
  context 'when a new DNS record is added' do
39
58
  let(:new_hosts) do
40
- hosts + ['test1.test.build.10gen.cc.:27019']
59
+ hosts + ['localhost.test.build.10gen.cc:27019']
41
60
  end
42
61
 
43
- let(:new_records) do
44
- double('records').tap do |records|
45
- allow(records).to receive(:hostname).and_return(hostname)
46
- allow(records).to receive(:hosts).and_return(new_hosts)
47
- allow(records).to receive(:empty?).and_return(false)
48
- allow(records).to receive(:min_ttl).and_return(nil)
62
+ let(:new_result) do
63
+ double('result').tap do |result|
64
+ allow(result).to receive(:hostname).and_return(hostname)
65
+ allow(result).to receive(:address_strs).and_return(new_hosts)
66
+ allow(result).to receive(:empty?).and_return(false)
67
+ allow(result).to receive(:min_ttl).and_return(nil)
49
68
  end
50
69
  end
51
70
 
52
71
  let(:resolver) do
53
- double('resolver').tap do |resolver|
54
- allow(resolver).to receive(:get_records).and_return(new_records)
72
+ double('monitor resolver').tap do |resolver|
73
+ expect(resolver).to receive(:get_records).and_return(new_result)
55
74
  end
56
75
  end
57
76
 
58
77
  it 'adds the new host to the cluster' do
59
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
78
+ expect(cluster.servers_list.map(&:address).map(&:to_s).sort).to eq(new_hosts.sort)
60
79
  end
61
80
  end
62
81
 
63
82
  context 'when a DNS record is removed' do
64
83
  let(:new_hosts) do
65
- hosts - ['test1.test.build.10gen.cc.:27018']
84
+ hosts - ['test1.test.build.10gen.cc:27018']
66
85
  end
67
86
 
68
- let(:new_records) do
69
- double('records').tap do |records|
70
- allow(records).to receive(:hostname).and_return(hostname)
71
- allow(records).to receive(:hosts).and_return(new_hosts)
72
- allow(records).to receive(:empty?).and_return(false)
73
- allow(records).to receive(:min_ttl).and_return(nil)
87
+ let(:new_result) do
88
+ double('result').tap do |result|
89
+ allow(result).to receive(:hostname).and_return(hostname)
90
+ allow(result).to receive(:address_strs).and_return(new_hosts)
91
+ allow(result).to receive(:empty?).and_return(false)
92
+ allow(result).to receive(:min_ttl).and_return(nil)
74
93
  end
75
94
  end
76
95
 
77
96
  let(:resolver) do
78
97
  double('resolver').tap do |resolver|
79
- allow(resolver).to receive(:get_records).and_return(new_records)
98
+ allow(resolver).to receive(:get_records).and_return(new_result)
80
99
  end
81
100
  end
82
101
 
@@ -87,21 +106,21 @@ describe Mongo::SRV::Monitor do
87
106
 
88
107
  context 'when a single DNS record is replaced' do
89
108
  let(:new_hosts) do
90
- hosts - ['test1.test.build.10gen.cc.:27018'] + ['test1.test.build.10gen.cc.:27019']
109
+ hosts - ['test1.test.build.10gen.cc:27018'] + ['test1.test.build.10gen.cc:27019']
91
110
  end
92
111
 
93
- let(:new_records) do
94
- double('records').tap do |records|
95
- allow(records).to receive(:hostname).and_return(hostname)
96
- allow(records).to receive(:hosts).and_return(new_hosts)
97
- allow(records).to receive(:empty?).and_return(false)
98
- allow(records).to receive(:min_ttl).and_return(nil)
112
+ let(:new_result) do
113
+ double('result').tap do |result|
114
+ allow(result).to receive(:hostname).and_return(hostname)
115
+ allow(result).to receive(:address_strs).and_return(new_hosts)
116
+ allow(result).to receive(:empty?).and_return(false)
117
+ allow(result).to receive(:min_ttl).and_return(nil)
99
118
  end
100
119
  end
101
120
 
102
121
  let(:resolver) do
103
122
  double('resolver').tap do |resolver|
104
- allow(resolver).to receive(:get_records).and_return(new_records)
123
+ allow(resolver).to receive(:get_records).and_return(new_result)
105
124
  end
106
125
  end
107
126
 
@@ -110,23 +129,23 @@ describe Mongo::SRV::Monitor do
110
129
  end
111
130
  end
112
131
 
113
- context 'when all DNS records are replaced with a single record' do
132
+ context 'when all DNS result are replaced with a single record' do
114
133
  let(:new_hosts) do
115
- ['test1.test.build.10gen.cc.:27019']
134
+ ['test1.test.build.10gen.cc:27019']
116
135
  end
117
136
 
118
- let(:new_records) do
119
- double('records').tap do |records|
120
- allow(records).to receive(:hostname).and_return(hostname)
121
- allow(records).to receive(:hosts).and_return(new_hosts)
122
- allow(records).to receive(:empty?).and_return(false)
123
- allow(records).to receive(:min_ttl).and_return(nil)
137
+ let(:new_result) do
138
+ double('result').tap do |result|
139
+ allow(result).to receive(:hostname).and_return(hostname)
140
+ allow(result).to receive(:address_strs).and_return(new_hosts)
141
+ allow(result).to receive(:empty?).and_return(false)
142
+ allow(result).to receive(:min_ttl).and_return(nil)
124
143
  end
125
144
  end
126
145
 
127
146
  let(:resolver) do
128
147
  double('resolver').tap do |resolver|
129
- allow(resolver).to receive(:get_records).and_return(new_records)
148
+ expect(resolver).to receive(:get_records).and_return(new_result)
130
149
  end
131
150
  end
132
151
 
@@ -135,26 +154,26 @@ describe Mongo::SRV::Monitor do
135
154
  end
136
155
  end
137
156
 
138
- context 'when all DNS records are replaced with multiple records' do
157
+ context 'when all DNS result are replaced with multiple result' do
139
158
  let(:new_hosts) do
140
159
  [
141
- 'test1.test.build.10gen.cc.:27019',
142
- 'test1.test.build.10gen.cc.:27020',
160
+ 'test1.test.build.10gen.cc:27019',
161
+ 'test1.test.build.10gen.cc:27020',
143
162
  ]
144
163
  end
145
164
 
146
- let(:new_records) do
147
- double('records').tap do |records|
148
- allow(records).to receive(:hostname).and_return(hostname)
149
- allow(records).to receive(:hosts).and_return(new_hosts)
150
- allow(records).to receive(:empty?).and_return(false)
151
- allow(records).to receive(:min_ttl).and_return(nil)
165
+ let(:new_result) do
166
+ double('result').tap do |result|
167
+ allow(result).to receive(:hostname).and_return(hostname)
168
+ allow(result).to receive(:address_strs).and_return(new_hosts)
169
+ allow(result).to receive(:empty?).and_return(false)
170
+ allow(result).to receive(:min_ttl).and_return(nil)
152
171
  end
153
172
  end
154
173
 
155
174
  let(:resolver) do
156
175
  double('resolver').tap do |resolver|
157
- allow(resolver).to receive(:get_records).and_return(new_records)
176
+ allow(resolver).to receive(:get_records).and_return(new_result)
158
177
  end
159
178
  end
160
179
 
@@ -166,7 +185,7 @@ describe Mongo::SRV::Monitor do
166
185
  context 'when the DNS lookup times out' do
167
186
  let(:resolver) do
168
187
  double('resolver').tap do |resolver|
169
- allow(resolver).to receive(:get_records).and_raise(Resolv::ResolvTimeout)
188
+ expect(resolver).to receive(:get_records).and_raise(Resolv::ResolvTimeout)
170
189
  end
171
190
  end
172
191
 
@@ -187,19 +206,19 @@ describe Mongo::SRV::Monitor do
187
206
  end
188
207
  end
189
208
 
190
- context 'when no DNS records are returned' do
191
- let(:new_records) do
192
- double('records').tap do |records|
193
- allow(records).to receive(:hostname).and_return(hostname)
194
- allow(records).to receive(:hosts).and_return([])
195
- allow(records).to receive(:empty?).and_return(true)
196
- allow(records).to receive(:min_ttl).and_return(nil)
209
+ context 'when no DNS result are returned' do
210
+ let(:new_result) do
211
+ double('result').tap do |result|
212
+ allow(result).to receive(:hostname).and_return(hostname)
213
+ allow(result).to receive(:address_strs).and_return([])
214
+ allow(result).to receive(:empty?).and_return(true)
215
+ allow(result).to receive(:min_ttl).and_return(nil)
197
216
  end
198
217
  end
199
218
 
200
219
  let(:resolver) do
201
220
  double('resolver').tap do |resolver|
202
- allow(resolver).to receive(:get_records).and_return(new_records)
221
+ allow(resolver).to receive(:get_records).and_return(new_result)
203
222
  end
204
223
  end
205
224
 
@@ -208,4 +227,4 @@ describe Mongo::SRV::Monitor do
208
227
  end
209
228
  end
210
229
  end
211
- end
230
+ end