mongo 2.11.4 → 2.12.3

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -106,12 +106,7 @@ describe Mongo::Operation::Insert::OpMsg do
106
106
  end
107
107
 
108
108
  let!(:expected_payload_1) do
109
- {
110
- type: 1,
111
- payload: { identifier: 'documents',
112
- sequence: op.documents
113
- }
114
- }
109
+ Mongo::Protocol::Msg::Section1.new('documents', op.documents)
115
110
  end
116
111
 
117
112
  let(:session) do
@@ -158,6 +153,8 @@ describe Mongo::Operation::Insert::OpMsg do
158
153
  end
159
154
 
160
155
  context 'when an implicit session is created and the topology is then updated and the server does not support sessions' do
156
+ # Mocks on features are incompatible with linting
157
+ skip_if_linting
161
158
 
162
159
  let(:expected_global_args) do
163
160
  global_args.dup.tap do |args|
@@ -83,7 +83,7 @@ describe Mongo::Operation::Insert do
83
83
  end
84
84
 
85
85
  let(:inserted_ids) do
86
- insert.execute(authorized_primary).inserted_ids
86
+ insert.execute(authorized_primary, client: nil).inserted_ids
87
87
  end
88
88
 
89
89
  let(:collection_ids) do
@@ -112,7 +112,7 @@ describe Mongo::Operation::Insert do
112
112
  context 'when the insert succeeds' do
113
113
 
114
114
  let!(:response) do
115
- insert.execute(authorized_primary)
115
+ insert.execute(authorized_primary, client: nil)
116
116
  end
117
117
 
118
118
  it 'reports the correct written count' do
@@ -144,8 +144,8 @@ describe Mongo::Operation::Insert do
144
144
 
145
145
  it 'raises an error' do
146
146
  expect {
147
- failing_insert.execute(authorized_primary)
148
- failing_insert.execute(authorized_primary)
147
+ failing_insert.execute(authorized_primary, client: nil)
148
+ failing_insert.execute(authorized_primary, client: nil)
149
149
  }.to raise_error(Mongo::Error::OperationFailure)
150
150
  end
151
151
  end
@@ -163,7 +163,7 @@ describe Mongo::Operation::Insert do
163
163
  end
164
164
 
165
165
  let!(:response) do
166
- insert.execute(authorized_primary)
166
+ insert.execute(authorized_primary, client: nil)
167
167
  end
168
168
 
169
169
  it 'reports the correct written count' do
@@ -195,8 +195,8 @@ describe Mongo::Operation::Insert do
195
195
 
196
196
  it 'raises an error' do
197
197
  expect {
198
- failing_insert.execute(authorized_primary)
199
- failing_insert.execute(authorized_primary)
198
+ failing_insert.execute(authorized_primary, client: nil)
199
+ failing_insert.execute(authorized_primary, client: nil)
200
200
  }.to raise_error(Mongo::Error::OperationFailure)
201
201
  end
202
202
  end
@@ -221,8 +221,8 @@ describe Mongo::Operation::Insert do
221
221
 
222
222
  it 'raises an error' do
223
223
  expect {
224
- failing_insert.execute(authorized_primary)
225
- failing_insert.execute(authorized_primary)
224
+ failing_insert.execute(authorized_primary, client: nil)
225
+ failing_insert.execute(authorized_primary, client: nil)
226
226
  }.to raise_error(Mongo::Error::OperationFailure)
227
227
  end
228
228
 
@@ -236,13 +236,13 @@ describe Mongo::Operation::Insert do
236
236
 
237
237
  it 'raises an error' do
238
238
  expect {
239
- insert.execute(authorized_primary)
239
+ insert.execute(authorized_primary, client: nil)
240
240
  }.to raise_error(Mongo::Error::MaxBSONSize)
241
241
  end
242
242
 
243
243
  it 'does not insert the document' do
244
244
  expect {
245
- insert.execute(authorized_primary)
245
+ insert.execute(authorized_primary, client: nil)
246
246
  }.to raise_error(Mongo::Error::MaxBSONSize)
247
247
  expect(authorized_collection.find.count).to eq(0)
248
248
  end
@@ -273,7 +273,7 @@ describe Mongo::Operation::Insert do
273
273
  end
274
274
 
275
275
  let(:response) do
276
- op.execute(authorized_primary)
276
+ op.execute(authorized_primary, client: nil)
277
277
  end
278
278
 
279
279
  it 'uses op codes instead of write commands' do
@@ -97,7 +97,7 @@ describe Mongo::Operation::MapReduce do
97
97
  context 'when the map/reduce succeeds' do
98
98
 
99
99
  let(:response) do
100
- op.execute(authorized_primary)
100
+ op.execute(authorized_primary, client: nil)
101
101
  end
102
102
 
103
103
  it 'returns the response' do
@@ -117,7 +117,7 @@ describe Mongo::Operation::MapReduce do
117
117
 
118
118
  it 'raises an exception' do
119
119
  expect {
120
- op.execute(authorized_primary)
120
+ op.execute(authorized_primary, client: nil)
121
121
  }.to raise_error(Mongo::Error::OperationFailure)
122
122
  end
123
123
  end
@@ -0,0 +1,351 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::ReadPreferenceSupported do
4
+
5
+ let(:selector) do
6
+ { name: 'test' }
7
+ end
8
+
9
+ let(:options) do
10
+ {}
11
+ end
12
+
13
+ let(:cluster) do
14
+ double('cluster').tap do |cluster|
15
+ allow(cluster).to receive(:single?).and_return(single?)
16
+ end
17
+ end
18
+
19
+ let(:operation) do
20
+ Class.new do
21
+ include Mongo::Operation::ReadPreferenceSupported
22
+ end.new.tap do |op|
23
+ allow(op).to receive(:read).and_return(read_pref)
24
+ allow(op).to receive(:selector).and_return(selector)
25
+ allow(op).to receive(:options).and_return(options)
26
+ end
27
+ end
28
+
29
+ let(:server) do
30
+ double('server').tap do |server|
31
+ allow(server).to receive(:cluster).and_return(cluster)
32
+ allow(server).to receive(:mongos?).and_return(mongos?)
33
+ allow(server).to receive(:standalone?).and_return(standalone?)
34
+ end
35
+ end
36
+
37
+ describe '#add_slave_ok_flag_maybe' do
38
+
39
+ let(:actual) do
40
+ operation.send(:add_slave_ok_flag_maybe, operation.send(:options), server)
41
+ end
42
+
43
+ shared_examples_for 'sets the slave_ok flag as expected' do
44
+ it 'sets the slave_ok flag as expected' do
45
+ expect(actual).to eq(expected)
46
+ end
47
+ end
48
+
49
+ shared_examples_for 'never sets slave_ok' do
50
+
51
+ let(:expected) do
52
+ { }
53
+ end
54
+
55
+ context 'when no read preference is specified' do
56
+ let(:read_pref) { Mongo::ServerSelector.get }
57
+
58
+ it_behaves_like 'sets the slave_ok flag as expected'
59
+ end
60
+
61
+ context 'when primary read preference is specified' do
62
+ let(:read_pref) { Mongo::ServerSelector.get(:mode => :primary) }
63
+
64
+ it_behaves_like 'sets the slave_ok flag as expected'
65
+ end
66
+
67
+ context 'when secondary read preference is specified' do
68
+ let(:read_pref) { Mongo::ServerSelector.get(:mode => :secondary) }
69
+
70
+ it_behaves_like 'sets the slave_ok flag as expected'
71
+ end
72
+ end
73
+
74
+ shared_examples_for 'always sets slave_ok' do
75
+
76
+ let(:expected) do
77
+ { :flags => [ :slave_ok ] }
78
+ end
79
+
80
+ context 'when no read preference is specified' do
81
+ let(:read_pref) { Mongo::ServerSelector.get }
82
+
83
+ it_behaves_like 'sets the slave_ok flag as expected'
84
+ end
85
+
86
+ context 'when primary read preference is specified' do
87
+ let(:read_pref) { Mongo::ServerSelector.get(:mode => :primary) }
88
+
89
+ it_behaves_like 'sets the slave_ok flag as expected'
90
+ end
91
+
92
+ context 'when secondary read preference is specified' do
93
+ let(:read_pref) { Mongo::ServerSelector.get(:mode => :secondary) }
94
+
95
+ it_behaves_like 'sets the slave_ok flag as expected'
96
+ end
97
+ end
98
+
99
+ shared_examples_for 'sets slave_ok if read preference is specified and is not primary' do
100
+
101
+ context 'when there is no read preference set' do
102
+
103
+ let(:read_pref) { Mongo::ServerSelector.get }
104
+
105
+ let(:expected) do
106
+ { }
107
+ end
108
+
109
+ it_behaves_like 'sets the slave_ok flag as expected'
110
+ end
111
+
112
+ context 'when there is a read preference' do
113
+
114
+ context 'when the read preference requires the slave_ok flag' do
115
+
116
+ let(:read_pref) { Mongo::ServerSelector.get(:mode => :secondary) }
117
+
118
+ let(:expected) do
119
+ { :flags => [ :slave_ok ] }
120
+ end
121
+
122
+ it_behaves_like 'sets the slave_ok flag as expected'
123
+ end
124
+
125
+ context 'when the read preference does not require the slave_ok flag' do
126
+
127
+ let(:read_pref) { Mongo::ServerSelector.get(:mode => :primary) }
128
+
129
+ let(:expected) do
130
+ { }
131
+ end
132
+
133
+ it_behaves_like 'sets the slave_ok flag as expected'
134
+ end
135
+ end
136
+ end
137
+
138
+ context 'when the topology is Single' do
139
+
140
+ let(:single?) { true }
141
+ let(:mongos?) { false }
142
+
143
+ context 'when the server is a standalone' do
144
+
145
+ let(:standalone?) { true }
146
+
147
+ it_behaves_like 'never sets slave_ok'
148
+ end
149
+
150
+ context 'when the server is a mongos' do
151
+
152
+ let(:standalone?) { false }
153
+ let(:mongos?) { true }
154
+
155
+ it_behaves_like 'always sets slave_ok'
156
+ end
157
+
158
+ context 'when the server is a replica set member' do
159
+
160
+ let(:standalone?) { false }
161
+ let(:mongos?) { false }
162
+
163
+ it_behaves_like 'always sets slave_ok'
164
+ end
165
+ end
166
+
167
+ context 'when the topology is not Single' do
168
+
169
+ let(:single?) { false }
170
+ let(:mongos?) { false }
171
+
172
+ context 'when the server is a standalone' do
173
+
174
+ let(:standalone?) { true }
175
+
176
+ it_behaves_like 'never sets slave_ok'
177
+ end
178
+
179
+ context 'when the server is a mongos' do
180
+
181
+ let(:standalone?) { false }
182
+ let(:mongos?) { true }
183
+
184
+ it_behaves_like 'sets slave_ok if read preference is specified and is not primary'
185
+ end
186
+
187
+ context 'when the server is a replica set member' do
188
+
189
+ let(:standalone?) { false }
190
+ let(:mongos?) { false }
191
+
192
+ it_behaves_like 'sets slave_ok if read preference is specified and is not primary'
193
+ end
194
+ end
195
+ end
196
+
197
+ describe '#update_selector_for_read_pref' do
198
+
199
+ let(:read_pref) do
200
+ Mongo::ServerSelector.get(:mode => mode)
201
+ end
202
+
203
+ # Behavior of sending $readPreference is the same regardless of topology.
204
+ shared_examples_for '$readPreference in the command' do
205
+ let(:actual) do
206
+ operation.send(:update_selector_for_read_pref, operation.send(:selector), server)
207
+ end
208
+
209
+ let(:expected_read_preference) do
210
+ {mode: mode.to_s.gsub(/_(.)/) { $1.upcase }}
211
+ end
212
+
213
+ shared_examples_for 'adds read preference moving existing contents to $query' do
214
+
215
+ let(:expected) do
216
+ { :$query => selector, :$readPreference => expected_read_preference }
217
+ end
218
+
219
+ it 'moves existing selector contents under $query and adds read preference' do
220
+ expect(actual).to eq(expected)
221
+ end
222
+
223
+ context 'when the selector already has $query in it' do
224
+
225
+ let(:selector) do
226
+ { :$query => { :name => 'test' },
227
+ :$orderby => { :name => -1 } }
228
+ end
229
+
230
+ let(:expected) do
231
+ selector.merge(:$readPreference => expected_read_preference)
232
+ end
233
+
234
+ it 'keeps existing $query and adds read preference' do
235
+ expect(actual).to eq(expected)
236
+ end
237
+ end
238
+ end
239
+
240
+ shared_examples_for 'does not modify selector' do
241
+
242
+ it 'does not modify selector' do
243
+ expect(actual).to eq(selector)
244
+ end
245
+ end
246
+
247
+ shared_examples_for 'does not send read preference' do
248
+ ([nil] + %i(primary primary_preferred secondary secondary_preferred nearest)).each do |_mode|
249
+ active_mode = _mode
250
+
251
+ context "when read preference mode is #{active_mode}" do
252
+ let(:mode) { active_mode }
253
+
254
+ it_behaves_like 'does not modify selector'
255
+ end
256
+ end
257
+ end
258
+
259
+ context 'when the server is a standalone' do
260
+
261
+ let(:standalone?) { true }
262
+ let(:mongos?) { false }
263
+
264
+ it_behaves_like 'does not send read preference'
265
+ end
266
+
267
+ context 'when the server is a mongos' do
268
+
269
+ let(:standalone?) { false }
270
+ let(:mongos?) { true }
271
+
272
+ context 'when the read preference mode is nil' do
273
+
274
+ let(:mode) { nil }
275
+
276
+ it_behaves_like 'does not modify selector'
277
+ end
278
+
279
+ context 'when the read preference mode is primary' do
280
+
281
+ let(:mode) { :primary }
282
+
283
+ it_behaves_like 'does not modify selector'
284
+ end
285
+
286
+ context 'when the read preference mode is primary_preferred' do
287
+
288
+ let(:mode) { :primary_preferred }
289
+
290
+ it_behaves_like 'adds read preference moving existing contents to $query'
291
+ end
292
+
293
+ context 'when the read preference mode is secondary' do
294
+
295
+ let(:mode) { :secondary }
296
+
297
+ it_behaves_like 'adds read preference moving existing contents to $query'
298
+ end
299
+
300
+ context 'when the read preference mode is secondary_preferred' do
301
+
302
+ let(:mode) { :secondary_preferred }
303
+
304
+ it_behaves_like 'does not modify selector'
305
+
306
+ context 'when there are fields in the selector besides :mode' do
307
+ let(:read_pref) do
308
+ Mongo::ServerSelector.get(:mode => mode, tag_sets: ['dc' => 'nyc'])
309
+ end
310
+
311
+ let(:expected_read_preference) do
312
+ {mode: mode.to_s.gsub(/_(.)/) { $1.upcase }, tags: ['dc' => 'nyc']}
313
+ end
314
+
315
+ it_behaves_like 'adds read preference moving existing contents to $query'
316
+ end
317
+ end
318
+
319
+ context 'when the read preference mode is nearest' do
320
+
321
+ let(:mode) { :nearest }
322
+
323
+ it_behaves_like 'adds read preference moving existing contents to $query'
324
+ end
325
+ end
326
+
327
+ context 'when the server is a replica set member' do
328
+
329
+ let(:standalone?) { false }
330
+ let(:mongos?) { false }
331
+
332
+ # $readPreference is not sent to replica set nodes running legacy
333
+ # servers - the allowance of secondary reads is handled by slave_ok
334
+ # flag.
335
+ it_behaves_like 'does not send read preference'
336
+ end
337
+ end
338
+
339
+ context 'in single topology' do
340
+ let(:single?) { true }
341
+
342
+ it_behaves_like '$readPreference in the command'
343
+ end
344
+
345
+ context 'not in single topology' do
346
+ let(:single?) { false }
347
+
348
+ it_behaves_like '$readPreference in the command'
349
+ end
350
+ end
351
+ end