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
@@ -0,0 +1,194 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::SessionsSupported do
4
+
5
+ let(:selector) do
6
+ BSON::Document.new(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::SessionsSupported
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_read_preference' do
38
+
39
+ let(:read_pref) do
40
+ Mongo::ServerSelector.get(:mode => mode)
41
+ end
42
+
43
+ let(:actual) do
44
+ sel = operation.send(:selector).dup
45
+ operation.send(:add_read_preference, sel, server)
46
+ sel
47
+ end
48
+
49
+ let(:expected_read_preference) do
50
+ {mode: mode.to_s.gsub(/_(.)/) { $1.upcase }}
51
+ end
52
+
53
+ shared_examples_for 'adds read preference' do
54
+
55
+ let(:expected) do
56
+ selector.merge(:$readPreference => expected_read_preference)
57
+ end
58
+
59
+ it 'adds read preference' do
60
+ expect(actual).to eq(expected)
61
+ end
62
+ end
63
+
64
+ shared_examples_for 'does not modify selector' do
65
+
66
+ it 'does not modify selector' do
67
+ expect(actual).to eq(selector)
68
+ end
69
+ end
70
+
71
+ shared_examples_for 'does not send read preference' do
72
+ ([nil] + %i(primary primary_preferred secondary secondary_preferred nearest)).each do |_mode|
73
+ active_mode = _mode
74
+
75
+ context "when read preference mode is #{active_mode}" do
76
+ let(:mode) { active_mode }
77
+
78
+ it_behaves_like 'does not modify selector'
79
+ end
80
+ end
81
+ end
82
+
83
+ shared_examples_for 'sends user-specified read preference' do
84
+ %i(primary primary_preferred secondary secondary_preferred nearest).each do |_mode|
85
+ active_mode = _mode
86
+
87
+ context "when read preference mode is #{active_mode}" do
88
+ let(:mode) { active_mode }
89
+
90
+ it_behaves_like 'adds read preference'
91
+ end
92
+ end
93
+
94
+ context "when read preference mode is nil" do
95
+ let(:mode) { nil }
96
+
97
+ let(:expected_read_preference) do
98
+ {mode: 'primary'}
99
+ end
100
+
101
+ it_behaves_like 'adds read preference'
102
+ end
103
+ end
104
+
105
+ shared_examples_for 'changes read preference to allow secondary reads' do
106
+
107
+ %i(primary_preferred secondary secondary_preferred nearest).each do |_mode|
108
+ active_mode = _mode
109
+
110
+ context "when read preference mode is #{active_mode}" do
111
+ let(:mode) { active_mode }
112
+
113
+ it_behaves_like 'adds read preference'
114
+ end
115
+ end
116
+
117
+ context "when read preference mode is primary" do
118
+ let(:mode) { :primary }
119
+
120
+ let(:expected_read_preference) do
121
+ {mode: 'primaryPreferred'}
122
+ end
123
+
124
+ it_behaves_like 'adds read preference'
125
+ end
126
+
127
+ context "when read preference mode is nil" do
128
+ let(:mode) { nil }
129
+
130
+ let(:expected_read_preference) do
131
+ {mode: 'primaryPreferred'}
132
+ end
133
+
134
+ it_behaves_like 'adds read preference'
135
+ end
136
+ end
137
+
138
+ context 'in single topology' do
139
+ let(:single?) { true }
140
+
141
+ context 'when the server is a standalone' do
142
+
143
+ let(:standalone?) { true }
144
+ let(:mongos?) { false }
145
+
146
+ it_behaves_like 'does not send read preference'
147
+ end
148
+
149
+ context 'when the server is a mongos' do
150
+
151
+ let(:standalone?) { false }
152
+ let(:mongos?) { true }
153
+
154
+ it_behaves_like 'changes read preference to allow secondary reads'
155
+ end
156
+
157
+ context 'when the server is a replica set member' do
158
+
159
+ let(:standalone?) { false }
160
+ let(:mongos?) { false }
161
+
162
+ it_behaves_like 'changes read preference to allow secondary reads'
163
+ end
164
+ end
165
+
166
+ context 'not in single topology' do
167
+ let(:single?) { false }
168
+
169
+ context 'when the server is a standalone' do
170
+
171
+ let(:standalone?) { true }
172
+ let(:mongos?) { false }
173
+
174
+ it_behaves_like 'does not send read preference'
175
+ end
176
+
177
+ context 'when the server is a mongos' do
178
+
179
+ let(:standalone?) { false }
180
+ let(:mongos?) { true }
181
+
182
+ it_behaves_like 'sends user-specified read preference'
183
+ end
184
+
185
+ context 'when the server is a replica set member' do
186
+
187
+ let(:standalone?) { false }
188
+ let(:mongos?) { false }
189
+
190
+ it_behaves_like 'sends user-specified read preference'
191
+ end
192
+ end
193
+ end
194
+ end
@@ -22,7 +22,7 @@ describe Mongo::Operation::RemoveUser do
22
22
  context 'when user removal was successful' do
23
23
 
24
24
  let!(:response) do
25
- operation.execute(root_authorized_primary)
25
+ operation.execute(root_authorized_primary, client: nil)
26
26
  end
27
27
 
28
28
  it 'removes the user from the database' do
@@ -33,12 +33,12 @@ describe Mongo::Operation::RemoveUser do
33
33
  context 'when removal was not successful' do
34
34
 
35
35
  before do
36
- operation.execute(root_authorized_primary)
36
+ operation.execute(root_authorized_primary, client: nil)
37
37
  end
38
38
 
39
39
  it 'raises an exception' do
40
40
  expect {
41
- operation.execute(root_authorized_primary)
41
+ operation.execute(root_authorized_primary, client: nil)
42
42
  }.to raise_error(Mongo::Error::OperationFailure)
43
43
  end
44
44
  end
@@ -98,7 +98,7 @@ describe Mongo::Operation::Update do
98
98
  end
99
99
 
100
100
  it 'updates the document' do
101
- op.bulk_execute(authorized_primary)
101
+ op.bulk_execute(authorized_primary, client: nil)
102
102
  expect(authorized_collection.find(field: 'blah').count).to eq(1)
103
103
  end
104
104
  end
@@ -122,7 +122,7 @@ describe Mongo::Operation::Update do
122
122
  end
123
123
 
124
124
  it 'updates the documents' do
125
- op.bulk_execute(authorized_primary)
125
+ op.bulk_execute(authorized_primary, client: nil)
126
126
  expect(authorized_collection.find(field: 'blah').count).to eq(2)
127
127
  end
128
128
  end
@@ -154,7 +154,7 @@ describe Mongo::Operation::Update do
154
154
  context 'when write concern is acknowledged' do
155
155
 
156
156
  it 'aborts after first error' do
157
- failing_update.bulk_execute(authorized_primary)
157
+ failing_update.bulk_execute(authorized_primary, client: nil)
158
158
  expect(authorized_collection.find(other: 'blah').count).to eq(0)
159
159
  end
160
160
  end
@@ -166,7 +166,7 @@ describe Mongo::Operation::Update do
166
166
  end
167
167
 
168
168
  it 'aborts after first error' do
169
- failing_update.bulk_execute(authorized_primary)
169
+ failing_update.bulk_execute(authorized_primary, client: nil)
170
170
  expect(authorized_collection.find(other: 'blah').count).to eq(0)
171
171
  end
172
172
  end
@@ -199,7 +199,7 @@ describe Mongo::Operation::Update do
199
199
  context 'when write concern is acknowledged' do
200
200
 
201
201
  it 'does not abort after first error' do
202
- failing_update.bulk_execute(authorized_primary)
202
+ failing_update.bulk_execute(authorized_primary, client: nil)
203
203
  expect(authorized_collection.find(other: 'blah').count).to eq(1)
204
204
  end
205
205
  end
@@ -211,7 +211,7 @@ describe Mongo::Operation::Update do
211
211
  end
212
212
 
213
213
  it 'does not abort after first error' do
214
- failing_update.bulk_execute(authorized_primary)
214
+ failing_update.bulk_execute(authorized_primary, client: nil)
215
215
  expect(authorized_collection.find(other: 'blah').count).to eq(1)
216
216
  end
217
217
  end
@@ -108,12 +108,7 @@ describe Mongo::Operation::Update::OpMsg do
108
108
  end
109
109
 
110
110
  let(:expected_payload_1) do
111
- {
112
- type: 1,
113
- payload: { identifier: 'updates',
114
- sequence: updates
115
- }
116
- }
111
+ Mongo::Protocol::Msg::Section1.new('updates', updates)
117
112
  end
118
113
 
119
114
  let(:session) do
@@ -150,6 +145,8 @@ describe Mongo::Operation::Update::OpMsg do
150
145
  end
151
146
 
152
147
  context 'when an implicit session is created and the topology is then updated and the server does not support sessions' do
148
+ # Mocks on features are incompatible with linting
149
+ skip_if_linting
153
150
 
154
151
  let(:expected_global_args) do
155
152
  global_args.dup.tap do |args|
@@ -100,7 +100,7 @@ describe Mongo::Operation::Update do
100
100
  end
101
101
 
102
102
  let(:result) do
103
- update.execute(authorized_primary)
103
+ update.execute(authorized_primary, client: nil)
104
104
  end
105
105
 
106
106
  it 'updates the document' do
@@ -128,7 +128,7 @@ describe Mongo::Operation::Update do
128
128
 
129
129
  it 'raises an exception' do
130
130
  expect {
131
- update.execute(authorized_primary)
131
+ update.execute(authorized_primary, client: nil)
132
132
  }.to raise_error(Mongo::Error::OperationFailure)
133
133
  end
134
134
  end
@@ -152,7 +152,7 @@ describe Mongo::Operation::Update do
152
152
  end
153
153
 
154
154
  let(:result) do
155
- update.execute(authorized_primary)
155
+ update.execute(authorized_primary, client: nil)
156
156
  end
157
157
 
158
158
  it 'updates the documents' do
@@ -180,7 +180,7 @@ describe Mongo::Operation::Update do
180
180
 
181
181
  it 'raises an exception' do
182
182
  expect {
183
- update.execute(authorized_primary)
183
+ update.execute(authorized_primary, client: nil)
184
184
  }.to raise_error(Mongo::Error::OperationFailure)
185
185
  end
186
186
  end
@@ -193,7 +193,7 @@ describe Mongo::Operation::Update do
193
193
 
194
194
  it 'raises an error' do
195
195
  expect {
196
- update.execute(authorized_primary)
196
+ update.execute(authorized_primary, client: nil)
197
197
  }.to raise_error(Mongo::Error::MaxBSONSize)
198
198
  end
199
199
  end
@@ -205,7 +205,7 @@ describe Mongo::Operation::Update do
205
205
  end
206
206
 
207
207
  let(:result) do
208
- update.execute(authorized_primary)
208
+ update.execute(authorized_primary, client: nil)
209
209
  end
210
210
 
211
211
  it 'inserts the document' do
@@ -243,7 +243,7 @@ describe Mongo::Operation::Update do
243
243
  end
244
244
 
245
245
  let(:result) do
246
- update.execute(authorized_primary)
246
+ update.execute(authorized_primary, client: nil)
247
247
  end
248
248
 
249
249
  before do
@@ -35,7 +35,7 @@ describe Mongo::Operation::UpdateUser do
35
35
  context 'when user update was successful' do
36
36
 
37
37
  let!(:response) do
38
- operation.execute(root_authorized_primary)
38
+ operation.execute(root_authorized_primary, client: nil)
39
39
  end
40
40
 
41
41
  it 'updates the user in the database' do
@@ -1,8 +1,8 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
2
 
3
3
  describe Mongo::Protocol::Compressed do
4
4
 
5
- let(:original_message) { Mongo::Protocol::Query.new(SpecConfig.instance.test_db, TEST_COLL, { ping: 1 }) }
5
+ let(:original_message) { Mongo::Protocol::Query.new(SpecConfig.instance.test_db, 'protocol-test', { ping: 1 }) }
6
6
  let(:compressor) { 'zlib' }
7
7
  let(:level) { nil }
8
8
 
@@ -53,7 +53,6 @@ describe Mongo::Protocol::Compressed do
53
53
  end
54
54
 
55
55
  context 'when the original message is not replyable' do
56
- min_server_fcv '3.6'
57
56
 
58
57
  let(:original_message) do
59
58
  Mongo::Protocol::Msg.new([:more_to_come], {}, { ping: 1 })
@@ -1,16 +1,17 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
+ require 'support/shared/protocol'
2
3
 
3
4
  describe Mongo::Protocol::Delete do
4
5
 
5
6
  let(:opcode) { 2006 }
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(:options) { Hash.new }
11
12
 
12
13
  let(:message) do
13
- described_class.new(db, coll, selector, options)
14
+ described_class.new(db, collection_name, selector, options)
14
15
  end
15
16
 
16
17
  describe '#initialize' do
@@ -41,7 +42,7 @@ describe Mongo::Protocol::Delete do
41
42
 
42
43
  context 'when the fields are equal' do
43
44
  let(:other) do
44
- described_class.new(db, coll, selector, options)
45
+ described_class.new(db, collection_name, selector, options)
45
46
  end
46
47
 
47
48
  it 'returns true' do
@@ -51,7 +52,7 @@ describe Mongo::Protocol::Delete do
51
52
 
52
53
  context 'when the database is not equal' do
53
54
  let(:other) do
54
- described_class.new('tyler', coll, selector, options)
55
+ described_class.new('tyler', collection_name, selector, options)
55
56
  end
56
57
 
57
58
  it 'returns false' do
@@ -71,7 +72,7 @@ describe Mongo::Protocol::Delete do
71
72
 
72
73
  context 'when the selector is not equal' do
73
74
  let(:other) do
74
- described_class.new(db, coll, { :a => 1 }, options)
75
+ described_class.new(db, collection_name, { :a => 1 }, options)
75
76
  end
76
77
 
77
78
  it 'returns false' do
@@ -81,7 +82,7 @@ describe Mongo::Protocol::Delete do
81
82
 
82
83
  context 'when the options are not equal' do
83
84
  let(:other) do
84
- described_class.new(db, coll, selector, :flags => [:single_remove])
85
+ described_class.new(db, collection_name, selector, :flags => [:single_remove])
85
86
  end
86
87
 
87
88
  it 'returns false' do
@@ -1,16 +1,17 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
+ require 'support/shared/protocol'
2
3
 
3
4
  describe Mongo::Protocol::GetMore do
4
5
 
5
6
  let(:opcode) { 2005 }
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(:limit) { 25 }
10
11
  let(:cursor_id) { 12345 }
11
12
 
12
13
  let(:message) do
13
- described_class.new(db, coll, limit, cursor_id)
14
+ described_class.new(db, collection_name, limit, cursor_id)
14
15
  end
15
16
 
16
17
  describe '#initialize' do
@@ -34,7 +35,7 @@ describe Mongo::Protocol::GetMore do
34
35
 
35
36
  context 'when the fields are equal' do
36
37
  let(:other) do
37
- described_class.new(db, coll, limit, cursor_id)
38
+ described_class.new(db, collection_name, limit, cursor_id)
38
39
  end
39
40
 
40
41
  it 'returns true' do
@@ -44,7 +45,7 @@ describe Mongo::Protocol::GetMore do
44
45
 
45
46
  context 'when the database is not equal' do
46
47
  let(:other) do
47
- described_class.new('tyler', coll, limit, cursor_id)
48
+ described_class.new('tyler', collection_name, limit, cursor_id)
48
49
  end
49
50
 
50
51
  it 'returns false' do
@@ -64,7 +65,7 @@ describe Mongo::Protocol::GetMore do
64
65
 
65
66
  context 'when the limit is not equal' do
66
67
  let(:other) do
67
- described_class.new(db, coll, 123, cursor_id)
68
+ described_class.new(db, collection_name, 123, cursor_id)
68
69
  end
69
70
 
70
71
  it 'returns false' do
@@ -74,7 +75,7 @@ describe Mongo::Protocol::GetMore do
74
75
 
75
76
  context 'when the cursor id is not equal' do
76
77
  let(:other) do
77
- described_class.new(db, coll, limit, 7777)
78
+ described_class.new(db, collection_name, limit, 7777)
78
79
  end
79
80
 
80
81
  it 'returns false' do