mongo 2.5.3 → 2.6.0

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 (394) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +1 -1
  5. data/README.md +3 -2
  6. data/lib/mongo.rb +2 -2
  7. data/lib/mongo/address.rb +10 -2
  8. data/lib/mongo/address/ipv4.rb +1 -1
  9. data/lib/mongo/address/ipv6.rb +26 -5
  10. data/lib/mongo/address/unix.rb +1 -1
  11. data/lib/mongo/auth.rb +10 -3
  12. data/lib/mongo/auth/cr.rb +4 -1
  13. data/lib/mongo/auth/cr/conversation.rb +4 -1
  14. data/lib/mongo/auth/ldap.rb +1 -1
  15. data/lib/mongo/auth/ldap/conversation.rb +1 -1
  16. data/lib/mongo/auth/roles.rb +1 -1
  17. data/lib/mongo/auth/scram.rb +24 -7
  18. data/lib/mongo/auth/scram/conversation.rb +52 -19
  19. data/lib/mongo/auth/stringprep.rb +114 -0
  20. data/lib/mongo/auth/stringprep/profiles/sasl.rb +73 -0
  21. data/lib/mongo/auth/stringprep/tables.rb +3232 -0
  22. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +174 -0
  23. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1170 -0
  24. data/lib/mongo/auth/user.rb +14 -3
  25. data/lib/mongo/auth/user/view.rb +1 -1
  26. data/lib/mongo/auth/x509.rb +1 -1
  27. data/lib/mongo/auth/x509/conversation.rb +1 -1
  28. data/lib/mongo/bson.rb +1 -1
  29. data/lib/mongo/bulk_write.rb +8 -8
  30. data/lib/mongo/bulk_write/combineable.rb +1 -1
  31. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  32. data/lib/mongo/bulk_write/result.rb +1 -1
  33. data/lib/mongo/bulk_write/result_combiner.rb +4 -4
  34. data/lib/mongo/bulk_write/transformable.rb +1 -1
  35. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  36. data/lib/mongo/bulk_write/validatable.rb +1 -1
  37. data/lib/mongo/client.rb +115 -24
  38. data/lib/mongo/cluster.rb +17 -10
  39. data/lib/mongo/cluster/app_metadata.rb +7 -1
  40. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  41. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
  42. data/lib/mongo/cluster/topology.rb +12 -2
  43. data/lib/mongo/cluster/topology/replica_set.rb +9 -1
  44. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  45. data/lib/mongo/cluster/topology/single.rb +1 -1
  46. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  47. data/lib/mongo/collection.rb +75 -19
  48. data/lib/mongo/collection/view.rb +1 -1
  49. data/lib/mongo/collection/view/aggregation.rb +1 -1
  50. data/lib/mongo/collection/view/builder.rb +1 -1
  51. data/lib/mongo/collection/view/builder/aggregation.rb +3 -3
  52. data/lib/mongo/collection/view/builder/find_command.rb +1 -1
  53. data/lib/mongo/collection/view/builder/flags.rb +1 -1
  54. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  55. data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
  56. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  57. data/lib/mongo/collection/view/change_stream.rb +193 -17
  58. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -20
  59. data/lib/mongo/collection/view/explainable.rb +1 -1
  60. data/lib/mongo/collection/view/immutable.rb +1 -1
  61. data/lib/mongo/collection/view/iterable.rb +2 -2
  62. data/lib/mongo/collection/view/map_reduce.rb +1 -1
  63. data/lib/mongo/collection/view/readable.rb +108 -29
  64. data/lib/mongo/collection/view/writable.rb +3 -3
  65. data/lib/mongo/cursor.rb +44 -4
  66. data/lib/mongo/cursor/builder.rb +1 -1
  67. data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
  68. data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
  69. data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
  70. data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
  71. data/lib/mongo/database.rb +46 -3
  72. data/lib/mongo/database/view.rb +11 -11
  73. data/lib/mongo/dbref.rb +1 -1
  74. data/lib/mongo/error.rb +57 -1
  75. data/lib/mongo/error/bulk_write_error.rb +2 -2
  76. data/lib/mongo/error/change_stream_resumable.rb +37 -0
  77. data/lib/mongo/error/closed_stream.rb +1 -1
  78. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  79. data/lib/mongo/error/failed_stringprep_validation.rb +38 -0
  80. data/lib/mongo/error/file_not_found.rb +1 -1
  81. data/lib/mongo/error/insufficient_iteration_count.rb +38 -0
  82. data/lib/mongo/error/invalid_application_name.rb +1 -1
  83. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  84. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  85. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  86. data/lib/mongo/error/invalid_database_name.rb +1 -1
  87. data/lib/mongo/error/invalid_document.rb +1 -1
  88. data/lib/mongo/error/invalid_file.rb +1 -1
  89. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  90. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  91. data/lib/mongo/error/invalid_nonce.rb +1 -1
  92. data/lib/mongo/error/invalid_read_option.rb +35 -0
  93. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  94. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  95. data/lib/mongo/error/invalid_session.rb +1 -1
  96. data/lib/mongo/error/invalid_signature.rb +1 -1
  97. data/lib/mongo/error/invalid_transaction_operation.rb +82 -0
  98. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  99. data/lib/mongo/error/invalid_update_document.rb +1 -1
  100. data/lib/mongo/error/invalid_uri.rb +1 -1
  101. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  102. data/lib/mongo/error/max_bson_size.rb +1 -1
  103. data/lib/mongo/error/max_message_size.rb +1 -1
  104. data/lib/mongo/error/mismatched_domain.rb +1 -1
  105. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  106. data/lib/mongo/error/missing_resume_token.rb +1 -1
  107. data/lib/mongo/error/multi_index_drop.rb +1 -1
  108. data/lib/mongo/error/need_primary_server.rb +1 -1
  109. data/lib/mongo/error/no_server_available.rb +1 -1
  110. data/lib/mongo/error/no_srv_records.rb +1 -1
  111. data/lib/mongo/error/operation_failure.rb +108 -14
  112. data/lib/mongo/error/parser.rb +50 -1
  113. data/lib/mongo/error/socket_error.rb +5 -2
  114. data/lib/mongo/error/socket_timeout_error.rb +5 -2
  115. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  116. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  117. data/lib/mongo/error/unexpected_response.rb +1 -1
  118. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  119. data/lib/mongo/error/unsupported_array_filters.rb +1 -1
  120. data/lib/mongo/error/unsupported_collation.rb +1 -1
  121. data/lib/mongo/error/unsupported_features.rb +1 -1
  122. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  123. data/lib/mongo/error/write_retryable.rb +27 -0
  124. data/lib/mongo/event.rb +10 -9
  125. data/lib/mongo/event/base.rb +33 -0
  126. data/lib/mongo/event/description_changed.rb +2 -2
  127. data/lib/mongo/event/listeners.rb +1 -1
  128. data/lib/mongo/event/member_discovered.rb +4 -2
  129. data/lib/mongo/event/primary_elected.rb +2 -2
  130. data/lib/mongo/event/publisher.rb +1 -1
  131. data/lib/mongo/event/standalone_discovered.rb +2 -2
  132. data/lib/mongo/event/subscriber.rb +1 -1
  133. data/lib/mongo/grid.rb +1 -1
  134. data/lib/mongo/grid/file.rb +1 -1
  135. data/lib/mongo/grid/file/chunk.rb +3 -3
  136. data/lib/mongo/grid/file/info.rb +26 -3
  137. data/lib/mongo/grid/fs_bucket.rb +1 -1
  138. data/lib/mongo/grid/stream.rb +1 -1
  139. data/lib/mongo/grid/stream/read.rb +1 -1
  140. data/lib/mongo/grid/stream/write.rb +1 -1
  141. data/lib/mongo/index.rb +1 -1
  142. data/lib/mongo/index/view.rb +1 -1
  143. data/lib/mongo/loggable.rb +1 -1
  144. data/lib/mongo/logger.rb +1 -1
  145. data/lib/mongo/monitoring.rb +99 -62
  146. data/lib/mongo/monitoring/command_log_subscriber.rb +2 -2
  147. data/lib/mongo/monitoring/event.rb +2 -1
  148. data/lib/mongo/monitoring/event/command_failed.rb +19 -6
  149. data/lib/mongo/monitoring/event/command_started.rb +14 -3
  150. data/lib/mongo/monitoring/event/command_succeeded.rb +5 -3
  151. data/lib/mongo/monitoring/event/secure.rb +1 -1
  152. data/lib/mongo/monitoring/event/server_closed.rb +2 -2
  153. data/lib/mongo/monitoring/event/server_description_changed.rb +2 -2
  154. data/lib/mongo/monitoring/event/server_opening.rb +11 -2
  155. data/lib/mongo/monitoring/event/topology_changed.rb +13 -2
  156. data/lib/mongo/monitoring/event/topology_closed.rb +2 -2
  157. data/lib/mongo/monitoring/event/topology_opening.rb +11 -2
  158. data/lib/mongo/monitoring/publishable.rb +10 -6
  159. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  160. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  161. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  162. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  163. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  164. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  165. data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
  166. data/lib/mongo/operation/create/op_msg.rb +9 -0
  167. data/lib/mongo/operation/create_index/op_msg.rb +9 -0
  168. data/lib/mongo/operation/create_user/command.rb +1 -1
  169. data/lib/mongo/operation/create_user/op_msg.rb +10 -1
  170. data/lib/mongo/operation/delete/op_msg.rb +3 -0
  171. data/lib/mongo/operation/distinct/op_msg.rb +9 -0
  172. data/lib/mongo/operation/drop/op_msg.rb +9 -0
  173. data/lib/mongo/operation/drop_database/op_msg.rb +9 -0
  174. data/lib/mongo/operation/drop_index/op_msg.rb +9 -0
  175. data/lib/mongo/operation/explain/op_msg.rb +3 -0
  176. data/lib/mongo/operation/find/op_msg.rb +3 -0
  177. data/lib/mongo/operation/get_more.rb +1 -1
  178. data/lib/mongo/operation/get_more/command.rb +1 -1
  179. data/lib/mongo/operation/get_more/legacy.rb +1 -1
  180. data/lib/mongo/operation/get_more/op_msg.rb +3 -0
  181. data/lib/mongo/operation/indexes/op_msg.rb +3 -0
  182. data/lib/mongo/operation/indexes/result.rb +1 -1
  183. data/lib/mongo/operation/insert/bulk_result.rb +32 -2
  184. data/lib/mongo/operation/insert/op_msg.rb +3 -0
  185. data/lib/mongo/operation/insert/result.rb +1 -1
  186. data/lib/mongo/operation/kill_cursors/op_msg.rb +9 -0
  187. data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
  188. data/lib/mongo/operation/list_collections/result.rb +5 -1
  189. data/lib/mongo/operation/map_reduce/op_msg.rb +3 -0
  190. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  191. data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
  192. data/lib/mongo/operation/remove_user/op_msg.rb +9 -0
  193. data/lib/mongo/operation/result.rb +27 -14
  194. data/lib/mongo/operation/shared/executable.rb +1 -0
  195. data/lib/mongo/operation/shared/sessions_supported.rb +78 -7
  196. data/lib/mongo/operation/shared/specifiable.rb +18 -2
  197. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
  198. data/lib/mongo/operation/update/op_msg.rb +3 -0
  199. data/lib/mongo/operation/update_user/command.rb +1 -1
  200. data/lib/mongo/operation/update_user/op_msg.rb +10 -1
  201. data/lib/mongo/operation/users_info/op_msg.rb +3 -0
  202. data/lib/mongo/options.rb +1 -1
  203. data/lib/mongo/options/mapper.rb +1 -1
  204. data/lib/mongo/options/redacted.rb +1 -1
  205. data/lib/mongo/protocol/bit_vector.rb +1 -1
  206. data/lib/mongo/protocol/compressed.rb +1 -1
  207. data/lib/mongo/protocol/delete.rb +1 -1
  208. data/lib/mongo/protocol/get_more.rb +7 -7
  209. data/lib/mongo/protocol/insert.rb +1 -1
  210. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  211. data/lib/mongo/protocol/message.rb +5 -5
  212. data/lib/mongo/protocol/msg.rb +9 -7
  213. data/lib/mongo/protocol/query.rb +1 -1
  214. data/lib/mongo/protocol/registry.rb +1 -1
  215. data/lib/mongo/protocol/reply.rb +10 -10
  216. data/lib/mongo/protocol/serializers.rb +1 -1
  217. data/lib/mongo/protocol/update.rb +1 -1
  218. data/lib/mongo/retryable.rb +22 -14
  219. data/lib/mongo/server.rb +1 -1
  220. data/lib/mongo/server/connectable.rb +1 -1
  221. data/lib/mongo/server/connection.rb +16 -4
  222. data/lib/mongo/server/connection_pool.rb +1 -1
  223. data/lib/mongo/server/connection_pool/queue.rb +1 -1
  224. data/lib/mongo/server/context.rb +1 -1
  225. data/lib/mongo/server/description.rb +14 -2
  226. data/lib/mongo/server/description/features.rb +10 -9
  227. data/lib/mongo/server/description/inspector.rb +1 -1
  228. data/lib/mongo/server/description/inspector/description_changed.rb +1 -1
  229. data/lib/mongo/server/description/inspector/member_discovered.rb +1 -1
  230. data/lib/mongo/server/description/inspector/primary_elected.rb +1 -1
  231. data/lib/mongo/server/description/inspector/standalone_discovered.rb +1 -1
  232. data/lib/mongo/server/monitor.rb +15 -3
  233. data/lib/mongo/server/monitor/connection.rb +1 -1
  234. data/lib/mongo/server_selector.rb +1 -1
  235. data/lib/mongo/server_selector/nearest.rb +1 -1
  236. data/lib/mongo/server_selector/primary.rb +1 -1
  237. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  238. data/lib/mongo/server_selector/secondary.rb +1 -1
  239. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  240. data/lib/mongo/server_selector/selectable.rb +7 -2
  241. data/lib/mongo/session.rb +389 -12
  242. data/lib/mongo/session/server_session.rb +7 -2
  243. data/lib/mongo/session/session_pool.rb +1 -1
  244. data/lib/mongo/socket.rb +1 -1
  245. data/lib/mongo/socket/ssl.rb +1 -1
  246. data/lib/mongo/socket/tcp.rb +1 -1
  247. data/lib/mongo/socket/unix.rb +1 -1
  248. data/lib/mongo/uri.rb +6 -4
  249. data/lib/mongo/uri/srv_protocol.rb +1 -1
  250. data/lib/mongo/version.rb +2 -2
  251. data/lib/mongo/write_concern.rb +1 -1
  252. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  253. data/lib/mongo/write_concern/normalizable.rb +1 -1
  254. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  255. data/mongo.gemspec +4 -1
  256. data/spec/atlas/atlas_connectivity_spec.rb +54 -0
  257. data/spec/integration/bulk_insert_spec.rb +78 -0
  258. data/spec/integration/change_stream_spec.rb +365 -0
  259. data/spec/integration/command_monitoring_spec.rb +92 -0
  260. data/spec/lite_spec_helper.rb +63 -0
  261. data/spec/mongo/address/ipv6_spec.rb +29 -1
  262. data/spec/mongo/address_spec.rb +34 -0
  263. data/spec/mongo/auth/scram/conversation_spec.rb +326 -120
  264. data/spec/mongo/auth/scram/negotiation_spec.rb +574 -0
  265. data/spec/mongo/auth/scram_spec.rb +107 -38
  266. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +113 -0
  267. data/spec/mongo/auth/stringprep_spec.rb +188 -0
  268. data/spec/mongo/auth/user/view_spec.rb +5 -2
  269. data/spec/mongo/auth/user_spec.rb +1 -1
  270. data/spec/mongo/bulk_write/result_spec.rb +120 -0
  271. data/spec/mongo/bulk_write_spec.rb +42 -2
  272. data/spec/mongo/client_spec.rb +121 -9
  273. data/spec/mongo/cluster/app_metadata_spec.rb +14 -1
  274. data/spec/mongo/cluster/topology_spec.rb +1 -23
  275. data/spec/mongo/collection/view/change_stream_spec.rb +62 -180
  276. data/spec/mongo/collection_spec.rb +45 -12
  277. data/spec/mongo/cursor/builder/get_more_command_spec.rb +7 -7
  278. data/spec/mongo/cursor_spec.rb +2 -2
  279. data/spec/mongo/database_spec.rb +3 -3
  280. data/spec/mongo/docs_examples_spec.rb +194 -0
  281. data/spec/mongo/error/operation_failure_spec.rb +152 -0
  282. data/spec/mongo/error/parser_spec.rb +127 -0
  283. data/spec/mongo/grid/fs_bucket_spec.rb +32 -0
  284. data/spec/mongo/grid/stream/write_spec.rb +40 -1
  285. data/spec/mongo/monitoring/event/command_failed_spec.rb +30 -0
  286. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -4
  287. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +29 -7
  288. data/spec/mongo/monitoring_spec.rb +28 -3
  289. data/spec/mongo/protocol/get_more_spec.rb +2 -2
  290. data/spec/mongo/retryable_spec.rb +252 -34
  291. data/spec/mongo/retryable_writes_spec.rb +468 -544
  292. data/spec/mongo/server/connection_spec.rb +5 -5
  293. data/spec/mongo/server/description_spec.rb +23 -6
  294. data/spec/mongo/session/server_session_spec.rb +2 -2
  295. data/spec/mongo/session/session_pool_spec.rb +2 -2
  296. data/spec/mongo/transactions_examples_spec.rb +227 -0
  297. data/spec/mongo/transactions_spec.rb +44 -0
  298. data/spec/spec_helper.rb +135 -49
  299. data/spec/spec_tests/change_streams_spec.rb +42 -0
  300. data/spec/{mongo → spec_tests}/command_monitoring_spec.rb +8 -2
  301. data/spec/{mongo → spec_tests}/connection_string_spec.rb +1 -1
  302. data/spec/{mongo → spec_tests}/crud_spec.rb +5 -7
  303. data/spec/{mongo → spec_tests}/dns_seedlist_discovery_spec.rb +1 -1
  304. data/spec/{mongo → spec_tests}/gridfs_spec.rb +0 -0
  305. data/spec/{mongo → spec_tests}/max_staleness_spec.rb +0 -0
  306. data/spec/spec_tests/retryable_writes_spec.rb +78 -0
  307. data/spec/{mongo → spec_tests}/sdam_monitoring_spec.rb +4 -3
  308. data/spec/{mongo → spec_tests}/sdam_spec.rb +7 -7
  309. data/spec/{mongo → spec_tests}/server_selection_rtt_spec.rb +0 -0
  310. data/spec/{mongo → spec_tests}/server_selection_spec.rb +0 -0
  311. data/spec/support/authorization.rb +18 -6
  312. data/spec/support/change_streams.rb +265 -0
  313. data/spec/support/change_streams/operation.rb +62 -0
  314. data/spec/support/change_streams_tests/change-streams-errors.yml +53 -0
  315. data/spec/support/change_streams_tests/change-streams.yml +299 -0
  316. data/spec/support/command_monitoring.rb +1 -1
  317. data/spec/support/command_monitoring/bulkWrite.yml +4 -28
  318. data/spec/support/command_monitoring/command.yml +19 -0
  319. data/spec/support/command_monitoring/find.yml +17 -19
  320. data/spec/support/command_monitoring/insertMany.yml +2 -8
  321. data/spec/support/command_monitoring/unacknowledgedBulkWrite.yml +34 -0
  322. data/spec/support/connection_string.rb +1 -1
  323. data/spec/support/constraints.rb +56 -0
  324. data/spec/support/crud.rb +9 -4
  325. data/spec/support/crud/read.rb +24 -3
  326. data/spec/support/crud/write.rb +7 -2
  327. data/spec/support/crud_tests/read/count-collation.yml +12 -2
  328. data/spec/support/crud_tests/read/count.yml +43 -5
  329. data/spec/support/gridfs.rb +1 -1
  330. data/spec/support/primary_socket.rb +21 -0
  331. data/spec/support/retryable_writes_tests/bulkWrite-serverErrors.yml +90 -0
  332. data/spec/support/retryable_writes_tests/bulkWrite.yml +99 -1
  333. data/spec/support/retryable_writes_tests/deleteOne-serverErrors.yml +50 -0
  334. data/spec/support/retryable_writes_tests/deleteOne.yml +10 -1
  335. data/spec/support/retryable_writes_tests/findOneAndDelete-serverErrors.yml +50 -0
  336. data/spec/support/retryable_writes_tests/findOneAndDelete.yml +39 -30
  337. data/spec/support/retryable_writes_tests/findOneAndReplace-serverErrors.yml +54 -0
  338. data/spec/support/retryable_writes_tests/findOneAndReplace.yml +9 -0
  339. data/spec/support/retryable_writes_tests/findOneAndUpdate-serverErrors.yml +54 -0
  340. data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +9 -0
  341. data/spec/support/retryable_writes_tests/insertMany-serverErrors.yml +59 -0
  342. data/spec/support/retryable_writes_tests/insertMany.yml +11 -6
  343. data/spec/support/retryable_writes_tests/insertOne-serverErrors.yml +471 -0
  344. data/spec/support/retryable_writes_tests/insertOne.yml +9 -0
  345. data/spec/support/retryable_writes_tests/replaceOne-serverErrors.yml +58 -0
  346. data/spec/support/retryable_writes_tests/replaceOne.yml +9 -0
  347. data/spec/support/retryable_writes_tests/updateOne-serverErrors.yml +58 -0
  348. data/spec/support/retryable_writes_tests/updateOne.yml +71 -53
  349. data/spec/support/sdam/rs/normalize_case_me.yml +100 -0
  350. data/spec/support/sdam/sharded/compatible.yml +38 -0
  351. data/spec/support/sdam/sharded/mongos_disconnect.yml +9 -3
  352. data/spec/support/sdam/sharded/multiple_mongoses.yml +6 -2
  353. data/spec/support/sdam/sharded/non_mongos_removed.yml +6 -2
  354. data/spec/support/sdam/sharded/too_new.yml +36 -0
  355. data/spec/support/sdam/sharded/too_old.yml +36 -0
  356. data/spec/support/sdam/single/compatible.yml +26 -0
  357. data/spec/support/sdam/single/direct_connection_external_ip.yml +3 -1
  358. data/spec/support/sdam/single/direct_connection_mongos.yml +3 -1
  359. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +3 -1
  360. data/spec/support/sdam/single/direct_connection_rsprimary.yml +3 -1
  361. data/spec/support/sdam/single/direct_connection_rssecondary.yml +3 -1
  362. data/spec/support/sdam/single/direct_connection_slave.yml +3 -1
  363. data/spec/support/sdam/single/direct_connection_standalone.yml +3 -1
  364. data/spec/support/sdam/single/not_ok_response.yml +6 -2
  365. data/spec/support/sdam/single/standalone_removed.yml +3 -1
  366. data/spec/support/sdam/single/too_new.yml +26 -0
  367. data/spec/support/sdam/single/too_old.yml +24 -0
  368. data/spec/support/shared/session.rb +107 -0
  369. data/spec/support/transactions.rb +391 -0
  370. data/spec/support/transactions/operation.rb +373 -0
  371. data/spec/support/transactions_tests/abort.yml +403 -0
  372. data/spec/support/transactions_tests/bulk.yml +267 -0
  373. data/spec/support/transactions_tests/causal-consistency.yml +173 -0
  374. data/spec/support/transactions_tests/commit.yml +593 -0
  375. data/spec/support/transactions_tests/delete.yml +184 -0
  376. data/spec/support/transactions_tests/error-labels.yml +948 -0
  377. data/spec/support/transactions_tests/errors.yml +125 -0
  378. data/spec/support/transactions_tests/findOneAndDelete.yml +126 -0
  379. data/spec/support/transactions_tests/findOneAndReplace.yml +140 -0
  380. data/spec/support/transactions_tests/findOneAndUpdate.yml +228 -0
  381. data/spec/support/transactions_tests/insert.yml +264 -0
  382. data/spec/support/transactions_tests/isolation.yml +125 -0
  383. data/spec/support/transactions_tests/read-pref.yml +340 -0
  384. data/spec/support/transactions_tests/reads.yml +298 -0
  385. data/spec/support/transactions_tests/retryable-abort.yml +1292 -0
  386. data/spec/support/transactions_tests/retryable-commit.yml +1332 -0
  387. data/spec/support/transactions_tests/retryable-writes.yml +208 -0
  388. data/spec/support/transactions_tests/run-command.yml +189 -0
  389. data/spec/support/transactions_tests/transaction-options.yml +877 -0
  390. data/spec/support/transactions_tests/update.yml +246 -0
  391. data/spec/support/transactions_tests/write-concern.yml +236 -0
  392. metadata +494 -359
  393. metadata.gz.sig +0 -0
  394. data/lib/csasl/csasl.bundle +0 -0
@@ -0,0 +1,574 @@
1
+ require 'spec_helper'
2
+ require 'cgi'
3
+
4
+ # In order to properly test that a user that can be authenticated with either SCRAM-SHA-1 or
5
+ # SCRAM-SHA-256 uses SCRAM-SHA-256 by default, we need to monkey patch the authenticate method to
6
+ # save the authentication method chosen.
7
+ #
8
+ # Note that this will cease to be effective if the tests are parallelized, so another strategy for
9
+ # testing the above condition will need to be implemented.
10
+ module Mongo
11
+ class Server
12
+ class Connection
13
+ @last_mechanism_used = nil
14
+
15
+ class << self
16
+ attr_accessor :last_mechanism_used
17
+ end
18
+
19
+ alias old_authenticate! authenticate!
20
+
21
+ def authenticate!
22
+ Connection.last_mechanism_used = options[:auth_mech] || default_mechanism
23
+ old_authenticate!
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ describe 'SCRAM-SHA auth mechanism negotiation', if: scram_sha_256_enabled? do
30
+
31
+ URI_OPTION_MAP = {
32
+ :auth_source => 'authsource',
33
+ :replica_set => 'replicaSet',
34
+ }
35
+
36
+ let(:create_user!) do
37
+ ADMIN_AUTHORIZED_TEST_CLIENT.with(
38
+ database: 'admin',
39
+ app_name: 'this is used solely to force the new client to create its own cluster',
40
+ ).database.command(
41
+ createUser: user.name,
42
+ pwd: user.password,
43
+ roles: ['root'],
44
+ mechanisms: auth_mechanisms
45
+ ) rescue Mongo::Error::OperationFailure
46
+ end
47
+
48
+ let(:password) do
49
+ user.password
50
+ end
51
+
52
+ let(:result) do
53
+ client.database['admin'].find(nil, limit: 1).first
54
+ end
55
+
56
+ context 'when the configuration is specified in code' do
57
+
58
+ let(:client) do
59
+ opts = {
60
+ database: 'admin',
61
+ user: user.name,
62
+ password: password
63
+ }.tap do |o|
64
+ o[:auth_mech] = auth_mech if auth_mech
65
+ end
66
+
67
+ Mongo::Client.new(
68
+ ADDRESSES,
69
+ TEST_OPTIONS.merge(opts)
70
+ )
71
+ end
72
+
73
+ context 'when the user exists' do
74
+
75
+ context 'when the user only can use SCRAM-SHA-1 to authenticate' do
76
+
77
+ let(:auth_mechanisms) do
78
+ ['SCRAM-SHA-1']
79
+ end
80
+
81
+ let(:user) do
82
+ Mongo::Auth::User.new(
83
+ user: 'sha1',
84
+ password: 'sha1',
85
+ auth_mech: auth_mech
86
+ )
87
+ end
88
+
89
+ context 'when no auth mechanism is specified' do
90
+
91
+ let(:auth_mech) do
92
+ nil
93
+ end
94
+
95
+ it 'authenticates successfully' do
96
+ create_user!
97
+
98
+ expect { result }.not_to raise_error
99
+ end
100
+ end
101
+
102
+ context 'when SCRAM-SHA-1 is specified as the auth mechanism' do
103
+
104
+ let(:auth_mech) do
105
+ :scram
106
+ end
107
+
108
+ it 'authenticates successfully' do
109
+ create_user!
110
+
111
+ expect { result }.not_to raise_error
112
+ end
113
+ end
114
+
115
+
116
+ context 'when SCRAM-SHA-256 is specified as the auth mechanism' do
117
+
118
+ let(:auth_mech) do
119
+ :scram256
120
+ end
121
+
122
+ it 'fails with a Mongo::Auth::Unauthorized error' do
123
+ create_user!
124
+ expect { result }.to raise_error(Mongo::Auth::Unauthorized)
125
+ end
126
+ end
127
+ end
128
+
129
+ context 'when the user only can use SCRAM-SHA-256 to authenticate' do
130
+
131
+ let(:auth_mechanisms) do
132
+ ['SCRAM-SHA-256']
133
+ end
134
+
135
+ let(:user) do
136
+ Mongo::Auth::User.new(
137
+ user: 'sha256',
138
+ password: 'sha256',
139
+ auth_mech: auth_mech
140
+ )
141
+ end
142
+
143
+ context 'when no auth mechanism is specified' do
144
+
145
+ let(:auth_mech) do
146
+ nil
147
+ end
148
+
149
+ it 'authenticates successfully' do
150
+ create_user!
151
+
152
+ expect { client.database['admin'].find(options = { limit: 1 }).first }.not_to raise_error
153
+ end
154
+ end
155
+
156
+ context 'when SCRAM-SHA-1 is specified as the auth mechanism' do
157
+
158
+ let(:auth_mech) do
159
+ :scram
160
+ end
161
+
162
+ it 'fails with a Mongo::Auth::Unauthorized error' do
163
+ create_user!
164
+
165
+ expect { result }.to raise_error(Mongo::Auth::Unauthorized)
166
+ end
167
+ end
168
+
169
+ context 'when SCRAM-SHA-256 is specified as the auth mechanism' do
170
+
171
+ let(:auth_mech) do
172
+ :scram256
173
+ end
174
+
175
+ it 'authenticates successfully' do
176
+ create_user!
177
+
178
+ expect { result }.not_to raise_error
179
+ end
180
+ end
181
+ end
182
+
183
+ context 'when the user only can use either SCRAM-SHA-1 or SCRAM-SHA-256 to authenticate' do
184
+
185
+ let(:auth_mechanisms) do
186
+ ['SCRAM-SHA-1', 'SCRAM-SHA-256']
187
+ end
188
+
189
+ let(:user) do
190
+ Mongo::Auth::User.new(
191
+ user: 'both',
192
+ password: 'both',
193
+ auth_mech: auth_mech
194
+ )
195
+ end
196
+
197
+ context 'when no auth mechanism is specified' do
198
+
199
+ let(:auth_mech) do
200
+ nil
201
+ end
202
+
203
+ it 'authenticates successfully' do
204
+ create_user!
205
+
206
+ expect { result }.not_to raise_error
207
+ end
208
+ end
209
+
210
+ context 'when SCRAM-SHA-1 is specified as the auth mechanism' do
211
+
212
+ let(:auth_mech) do
213
+ :scram
214
+ end
215
+
216
+ it 'authenticates successfully' do
217
+ create_user!
218
+
219
+ expect { result }.not_to raise_error
220
+ end
221
+ end
222
+
223
+ context 'when SCRAM-SHA-256 is specified as the auth mechanism' do
224
+
225
+ let(:auth_mech) do
226
+ :scram256
227
+ end
228
+
229
+ it 'authenticates successfully with SCRAM-SHA-256' do
230
+ create_user!
231
+
232
+ Mongo::Server::Connection.last_mechanism_used = nil
233
+ expect { result }.not_to raise_error
234
+ expect(Mongo::Server::Connection.last_mechanism_used).to eq(:scram256)
235
+ end
236
+ end
237
+ end
238
+ end
239
+
240
+ context 'when the user does not exist' do
241
+
242
+ let(:auth_mech) do
243
+ nil
244
+ end
245
+
246
+ let(:user) do
247
+ Mongo::Auth::User.new(
248
+ user: 'nonexistent',
249
+ password: 'nonexistent',
250
+ )
251
+ end
252
+
253
+ it 'fails with a Mongo::Auth::Unauthorized error' do
254
+ expect { result }.to raise_error(Mongo::Auth::Unauthorized)
255
+ end
256
+ end
257
+
258
+ context 'when the username and password provided require saslprep' do
259
+
260
+ let(:auth_mech) do
261
+ nil
262
+ end
263
+
264
+ let(:auth_mechanisms) do
265
+ ['SCRAM-SHA-256']
266
+ end
267
+
268
+ context 'when the username and password as ASCII' do
269
+
270
+ let(:user) do
271
+ Mongo::Auth::User.new(
272
+ user: 'IX',
273
+ password: 'IX'
274
+ )
275
+ end
276
+
277
+ let(:password) do
278
+ "I\u00ADX"
279
+ end
280
+
281
+ it 'authenticates successfully after saslprepping password' do
282
+ create_user!
283
+
284
+ expect { result }.not_to raise_error
285
+ end
286
+ end
287
+
288
+ context 'when the username and password are non-ASCII' do
289
+
290
+ let(:user) do
291
+ Mongo::Auth::User.new(
292
+ user: "\u2168",
293
+ password: "\u2163"
294
+ )
295
+ end
296
+
297
+ let(:password) do
298
+ "I\u00ADV"
299
+ end
300
+
301
+ it 'authenticates successfully after saslprepping password' do
302
+ create_user!
303
+
304
+ expect { result }.not_to raise_error
305
+ end
306
+ end
307
+ end
308
+ end
309
+
310
+ context 'when the configuration is specified in the URI' do
311
+
312
+ let(:uri) do
313
+ "mongodb://#{user.name}:#{password}@#{ADDRESSES.join(',')}/admin".tap do |uri|
314
+ first = true
315
+
316
+ if defined?(URI_OPTIONS)
317
+ URI_OPTIONS.each do |k, v|
318
+ uri << (first ? '?' : '&')
319
+ first = false
320
+
321
+ k = URI_OPTION_MAP[k] || k
322
+
323
+ uri << "#{k}=#{v}"
324
+ end
325
+ end
326
+
327
+ if auth_mech
328
+ uri << (first ? '?' : '&')
329
+
330
+ uri << "authMechanism=#{Mongo::URI::AUTH_MECH_MAP.key(auth_mech)}"
331
+ end
332
+ end
333
+ end
334
+
335
+ let(:client) do
336
+ Mongo::Client.new(uri, SSL_OPTIONS)
337
+ end
338
+
339
+ context 'when the user exists' do
340
+
341
+ context 'when the user only can use SCRAM-SHA-1 to authenticate' do
342
+
343
+ let(:auth_mechanisms) do
344
+ ['SCRAM-SHA-1']
345
+ end
346
+
347
+ let(:user) do
348
+ Mongo::Auth::User.new(
349
+ user: 'sha1',
350
+ password: 'sha1',
351
+ auth_mech: auth_mech
352
+ )
353
+ end
354
+
355
+ context 'when no auth mechanism is specified' do
356
+
357
+ let(:auth_mech) do
358
+ nil
359
+ end
360
+
361
+ it 'authenticates successfully' do
362
+ create_user!
363
+
364
+ expect { result }.not_to raise_error
365
+ end
366
+ end
367
+
368
+ context 'when SCRAM-SHA-1 is specified as the auth mechanism' do
369
+
370
+ let(:auth_mech) do
371
+ :scram
372
+ end
373
+
374
+ it 'authenticates successfully' do
375
+ create_user!
376
+
377
+ expect { result }.not_to raise_error
378
+ end
379
+ end
380
+
381
+ context 'when SCRAM-SHA-256 is specified as the auth mechanism' do
382
+
383
+ let(:auth_mech) do
384
+ :scram256
385
+ end
386
+
387
+ it 'fails with a Mongo::Auth::Unauthorized error' do
388
+ create_user!
389
+ expect { result }.to raise_error(Mongo::Auth::Unauthorized)
390
+ end
391
+ end
392
+ end
393
+
394
+ context 'when the user only can use SCRAM-SHA-256 to authenticate' do
395
+
396
+ let(:auth_mechanisms) do
397
+ ['SCRAM-SHA-256']
398
+ end
399
+
400
+ let(:user) do
401
+ Mongo::Auth::User.new(
402
+ user: 'sha256',
403
+ password: 'sha256',
404
+ auth_mech: auth_mech
405
+ )
406
+ end
407
+
408
+ context 'when no auth mechanism is specified' do
409
+
410
+ let(:auth_mech) do
411
+ nil
412
+ end
413
+
414
+ it 'authenticates successfully' do
415
+ create_user!
416
+
417
+ expect { client.database['admin'].find(options = { limit: 1 }).first }.not_to raise_error
418
+ end
419
+ end
420
+
421
+ context 'when SCRAM-SHA-1 is specified as the auth mechanism' do
422
+
423
+ let(:auth_mech) do
424
+ :scram
425
+ end
426
+
427
+ it 'fails with a Mongo::Auth::Unauthorized error' do
428
+ create_user!
429
+
430
+ expect { result }.to raise_error(Mongo::Auth::Unauthorized)
431
+ end
432
+ end
433
+
434
+ context 'when SCRAM-SHA-256 is specified as the auth mechanism' do
435
+
436
+ let(:auth_mech) do
437
+ :scram256
438
+ end
439
+
440
+ it 'authenticates successfully' do
441
+ create_user!
442
+
443
+ expect { result }.not_to raise_error
444
+ end
445
+ end
446
+ end
447
+
448
+ context 'when the user only can use either SCRAM-SHA-1 or SCRAM-SHA-256 to authenticate' do
449
+
450
+ let(:auth_mechanisms) do
451
+ ['SCRAM-SHA-1', 'SCRAM-SHA-256']
452
+ end
453
+
454
+ let(:user) do
455
+ Mongo::Auth::User.new(
456
+ user: 'both',
457
+ password: 'both',
458
+ auth_mech: auth_mech
459
+ )
460
+ end
461
+
462
+ context 'when no auth mechanism is specified' do
463
+
464
+ let(:auth_mech) do
465
+ nil
466
+ end
467
+
468
+ it 'authenticates successfully' do
469
+ create_user!
470
+
471
+ expect { result }.not_to raise_error
472
+ end
473
+ end
474
+
475
+ context 'when SCRAM-SHA-1 is specified as the auth mechanism' do
476
+
477
+ let(:auth_mech) do
478
+ :scram
479
+ end
480
+
481
+ it 'authenticates successfully' do
482
+ create_user!
483
+
484
+ expect { result }.not_to raise_error
485
+ end
486
+ end
487
+
488
+ context 'when SCRAM-SHA-256 is specified as the auth mechanism' do
489
+
490
+ let(:auth_mech) do
491
+ :scram256
492
+ end
493
+
494
+ it 'authenticates successfully with SCRAM-SHA-256' do
495
+ create_user!
496
+
497
+ Mongo::Server::Connection.last_mechanism_used = nil
498
+ expect { result }.not_to raise_error
499
+ expect(Mongo::Server::Connection.last_mechanism_used).to eq(:scram256)
500
+ end
501
+ end
502
+ end
503
+ end
504
+
505
+ context 'when the user does not exist' do
506
+
507
+ let(:auth_mech) do
508
+ nil
509
+ end
510
+
511
+ let(:user) do
512
+ Mongo::Auth::User.new(
513
+ user: 'nonexistent',
514
+ password: 'nonexistent',
515
+ )
516
+ end
517
+
518
+ it 'fails with a Mongo::Auth::Unauthorized error' do
519
+ expect { result }.to raise_error(Mongo::Auth::Unauthorized)
520
+ end
521
+ end
522
+
523
+ context 'when the username and password provided require saslprep' do
524
+
525
+ let(:auth_mech) do
526
+ nil
527
+ end
528
+
529
+ let(:auth_mechanisms) do
530
+ ['SCRAM-SHA-256']
531
+ end
532
+
533
+ context 'when the username and password as ASCII' do
534
+
535
+ let(:user) do
536
+ Mongo::Auth::User.new(
537
+ user: 'IX',
538
+ password: 'IX'
539
+ )
540
+ end
541
+
542
+ let(:password) do
543
+ "I\u00ADX"
544
+ end
545
+
546
+ it 'authenticates successfully after saslprepping password' do
547
+ create_user!
548
+
549
+ expect { result }.not_to raise_error
550
+ end
551
+ end
552
+
553
+ context 'when the username and password are non-ASCII' do
554
+
555
+ let(:user) do
556
+ Mongo::Auth::User.new(
557
+ user: "\u2168",
558
+ password: "\u2163"
559
+ )
560
+ end
561
+
562
+ let(:password) do
563
+ "I\u00ADV"
564
+ end
565
+
566
+ it 'authenticates successfully after saslprepping password' do
567
+ create_user!
568
+
569
+ expect { result }.not_to raise_error
570
+ end
571
+ end
572
+ end
573
+ end
574
+ end