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,173 @@
1
+ database_name: &database_name "ruby-driver"
2
+ collection_name: &collection_name "transactions-tests"
3
+
4
+ data:
5
+ - _id: 1
6
+ count: 0
7
+
8
+ tests:
9
+ - description: causal consistency
10
+
11
+ operations:
12
+ # Update a document without a transaction.
13
+ - &updateOne
14
+ name: updateOne
15
+ object: collection
16
+ arguments:
17
+ session: session0
18
+ filter: {_id: 1}
19
+ update:
20
+ $inc: {count: 1}
21
+ upsert: false
22
+ result:
23
+ matchedCount: 1
24
+ modifiedCount: 1
25
+ upsertedCount: 0
26
+ # Updating the same document inside a transaction.
27
+ # Casual consistency ensures that the transaction snapshot is causally
28
+ # after the first updateOne.
29
+ - name: startTransaction
30
+ object: session0
31
+ - *updateOne
32
+ - name: commitTransaction
33
+ object: session0
34
+
35
+ expectations:
36
+ - command_started_event:
37
+ command:
38
+ update: *collection_name
39
+ updates:
40
+ - q: {_id: 1}
41
+ u: {$inc: {count: 1}}
42
+ multi: false
43
+ upsert: false
44
+ ordered: true
45
+ lsid: session0
46
+ readConcern:
47
+ txnNumber:
48
+ startTransaction:
49
+ autocommit:
50
+ writeConcern:
51
+ command_name: update
52
+ database_name: *database_name
53
+ - command_started_event:
54
+ command:
55
+ update: *collection_name
56
+ updates:
57
+ - q: {_id: 1}
58
+ u: {$inc: {count: 1}}
59
+ multi: false
60
+ upsert: false
61
+ ordered: true
62
+ readConcern:
63
+ afterClusterTime: 42
64
+ lsid: session0
65
+ txnNumber:
66
+ $numberLong: "1"
67
+ startTransaction: true
68
+ autocommit: false
69
+ writeConcern:
70
+ command_name: update
71
+ database_name: *database_name
72
+ - command_started_event:
73
+ command:
74
+ commitTransaction: 1
75
+ lsid: session0
76
+ txnNumber:
77
+ $numberLong: "1"
78
+ startTransaction:
79
+ autocommit: false
80
+ writeConcern:
81
+ command_name: commitTransaction
82
+ database_name: admin
83
+
84
+ outcome:
85
+ collection:
86
+ data:
87
+ - _id: 1
88
+ count: 2
89
+
90
+ - description: causal consistency disabled
91
+
92
+ sessionOptions:
93
+ session0:
94
+ causalConsistency: false
95
+
96
+ operations:
97
+ # Insert a document without a transaction.
98
+ - name: insertOne
99
+ object: collection
100
+ arguments:
101
+ session: session0
102
+ document:
103
+ _id: 2
104
+ result:
105
+ insertedId: 2
106
+ - name: startTransaction
107
+ object: session0
108
+ - name: updateOne
109
+ object: collection
110
+ arguments:
111
+ session: session0
112
+ filter: {_id: 1}
113
+ update:
114
+ $inc: {count: 1}
115
+ upsert: false
116
+ result:
117
+ matchedCount: 1
118
+ modifiedCount: 1
119
+ upsertedCount: 0
120
+ - name: commitTransaction
121
+ object: session0
122
+
123
+ expectations:
124
+ - command_started_event:
125
+ command:
126
+ insert: *collection_name
127
+ documents:
128
+ - _id: 2
129
+ ordered: true
130
+ readConcern:
131
+ lsid: session0
132
+ txnNumber:
133
+ autocommit:
134
+ writeConcern:
135
+ command_name: insert
136
+ database_name: *database_name
137
+ - command_started_event:
138
+ command:
139
+ update: *collection_name
140
+ updates:
141
+ - q: {_id: 1}
142
+ u: {$inc: {count: 1}}
143
+ multi: false
144
+ upsert: false
145
+ ordered: true
146
+ # No afterClusterTime
147
+ readConcern:
148
+ lsid: session0
149
+ txnNumber:
150
+ $numberLong: "1"
151
+ startTransaction: true
152
+ autocommit: false
153
+ writeConcern:
154
+ command_name: update
155
+ database_name: *database_name
156
+ - command_started_event:
157
+ command:
158
+ commitTransaction: 1
159
+ lsid: session0
160
+ txnNumber:
161
+ $numberLong: "1"
162
+ startTransaction:
163
+ autocommit: false
164
+ writeConcern:
165
+ command_name: commitTransaction
166
+ database_name: admin
167
+
168
+ outcome:
169
+ collection:
170
+ data:
171
+ - _id: 1
172
+ count: 1
173
+ - _id: 2
@@ -0,0 +1,593 @@
1
+ database_name: &database_name "ruby-driver"
2
+ collection_name: &collection_name "transactions-tests"
3
+
4
+ data: []
5
+ tests:
6
+ - description: commit
7
+
8
+ operations:
9
+ - name: startTransaction
10
+ object: session0
11
+ - name: insertOne
12
+ object: collection
13
+ arguments:
14
+ session: session0
15
+ document:
16
+ _id: 1
17
+ result:
18
+ insertedId: 1
19
+ - name: commitTransaction
20
+ object: session0
21
+ # Again, to verify that txnNumber is incremented.
22
+ - name: startTransaction
23
+ object: session0
24
+ - name: insertOne
25
+ object: collection
26
+ arguments:
27
+ session: session0
28
+ document:
29
+ _id: 2
30
+ result:
31
+ insertedId: 2
32
+ - name: commitTransaction
33
+ object: session0
34
+
35
+ expectations:
36
+ - command_started_event:
37
+ command:
38
+ insert: *collection_name
39
+ documents:
40
+ - _id: 1
41
+ ordered: true
42
+ readConcern:
43
+ lsid: session0
44
+ txnNumber:
45
+ $numberLong: "1"
46
+ startTransaction: true
47
+ autocommit: false
48
+ writeConcern:
49
+ command_name: insert
50
+ database_name: *database_name
51
+ - command_started_event:
52
+ command:
53
+ commitTransaction: 1
54
+ lsid: session0
55
+ txnNumber:
56
+ $numberLong: "1"
57
+ startTransaction:
58
+ autocommit: false
59
+ writeConcern:
60
+ command_name: commitTransaction
61
+ database_name: admin
62
+ - command_started_event:
63
+ command:
64
+ insert: *collection_name
65
+ documents:
66
+ - _id: 2
67
+ ordered: true
68
+ readConcern:
69
+ afterClusterTime: 42
70
+ lsid: session0
71
+ txnNumber:
72
+ $numberLong: "2"
73
+ startTransaction: true
74
+ autocommit: false
75
+ writeConcern:
76
+ command_name: insert
77
+ database_name: *database_name
78
+ - command_started_event:
79
+ command:
80
+ commitTransaction: 1
81
+ lsid: session0
82
+ txnNumber:
83
+ $numberLong: "2"
84
+ startTransaction:
85
+ autocommit: false
86
+ writeConcern:
87
+ command_name: commitTransaction
88
+ database_name: admin
89
+
90
+ outcome:
91
+ collection:
92
+ data:
93
+ - _id: 1
94
+ - _id: 2
95
+
96
+ - description: rerun commit after empty transaction
97
+
98
+ operations:
99
+ - name: startTransaction
100
+ object: session0
101
+ - name: commitTransaction
102
+ object: session0
103
+ # Rerun the commit (which does not increment the txnNumber).
104
+ - name: commitTransaction
105
+ object: session0
106
+ - name: startTransaction
107
+ object: session0
108
+ - name: insertOne
109
+ object: collection
110
+ arguments:
111
+ session: session0
112
+ document:
113
+ _id: 1
114
+ result:
115
+ insertedId: 1
116
+ - name: commitTransaction
117
+ object: session0
118
+
119
+ expectations:
120
+ - command_started_event:
121
+ command:
122
+ insert: *collection_name
123
+ documents:
124
+ - _id: 1
125
+ ordered: true
126
+ readConcern:
127
+ lsid: session0
128
+ txnNumber:
129
+ $numberLong: "2"
130
+ startTransaction: true
131
+ autocommit: false
132
+ writeConcern:
133
+ command_name: insert
134
+ database_name: *database_name
135
+ - command_started_event:
136
+ command:
137
+ commitTransaction: 1
138
+ lsid: session0
139
+ txnNumber:
140
+ $numberLong: "2"
141
+ startTransaction:
142
+ autocommit: false
143
+ writeConcern:
144
+ command_name: commitTransaction
145
+ database_name: admin
146
+
147
+ outcome:
148
+ collection:
149
+ data:
150
+ - _id: 1
151
+
152
+ - description: multiple commits in a row
153
+
154
+ operations:
155
+ - name: startTransaction
156
+ object: session0
157
+ - name: insertOne
158
+ object: collection
159
+ arguments:
160
+ session: session0
161
+ document:
162
+ _id: 1
163
+ result:
164
+ insertedId: 1
165
+ - name: commitTransaction
166
+ object: session0
167
+ - name: commitTransaction
168
+ object: session0
169
+ - name: commitTransaction
170
+ object: session0
171
+
172
+ expectations:
173
+ - command_started_event:
174
+ command:
175
+ insert: *collection_name
176
+ documents:
177
+ - _id: 1
178
+ ordered: true
179
+ readConcern:
180
+ lsid: session0
181
+ txnNumber:
182
+ $numberLong: "1"
183
+ startTransaction: true
184
+ autocommit: false
185
+ writeConcern:
186
+ command_name: insert
187
+ database_name: *database_name
188
+ - command_started_event:
189
+ command:
190
+ commitTransaction: 1
191
+ lsid: session0
192
+ txnNumber:
193
+ $numberLong: "1"
194
+ startTransaction:
195
+ autocommit: false
196
+ writeConcern:
197
+ command_name: commitTransaction
198
+ database_name: admin
199
+ - command_started_event:
200
+ command:
201
+ commitTransaction: 1
202
+ lsid: session0
203
+ txnNumber:
204
+ $numberLong: "1"
205
+ startTransaction:
206
+ autocommit: false
207
+ writeConcern:
208
+ command_name: commitTransaction
209
+ database_name: admin
210
+ - command_started_event:
211
+ command:
212
+ commitTransaction: 1
213
+ lsid: session0
214
+ txnNumber:
215
+ $numberLong: "1"
216
+ startTransaction:
217
+ autocommit: false
218
+ writeConcern:
219
+ command_name: commitTransaction
220
+ database_name: admin
221
+
222
+ outcome:
223
+ collection:
224
+ data:
225
+ - _id: 1
226
+
227
+ - description: write concern error on commit
228
+
229
+ operations:
230
+ - name: startTransaction
231
+ object: session0
232
+ arguments:
233
+ options:
234
+ writeConcern:
235
+ w: 10
236
+ - name: insertOne
237
+ object: collection
238
+ arguments:
239
+ session: session0
240
+ document:
241
+ _id: 1
242
+ result:
243
+ insertedId: 1
244
+ - name: commitTransaction
245
+ object: session0
246
+ result:
247
+ # {
248
+ # 'ok': 1.0,
249
+ # 'writeConcernError': {
250
+ # 'code': 100,
251
+ # 'codeName': 'UnsatisfiableWriteConcern',
252
+ # 'errmsg': 'Not enough data-bearing nodes'
253
+ # }
254
+ # }
255
+ errorLabelsOmit: ["TransientTransactionError", "UnknownTransactionCommitResult"]
256
+
257
+ outcome:
258
+ collection:
259
+ data:
260
+ - _id: 1
261
+
262
+ - description: commit without start
263
+
264
+ operations:
265
+ - name: commitTransaction
266
+ object: session0
267
+ result:
268
+ errorContains: no transaction started
269
+
270
+ expectations: []
271
+
272
+ outcome:
273
+ collection:
274
+ data: []
275
+
276
+ - description: commit after no-op abort
277
+
278
+ operations:
279
+ - name: startTransaction
280
+ object: session0
281
+ - name: abortTransaction
282
+ object: session0
283
+ - name: commitTransaction
284
+ object: session0
285
+ result:
286
+ errorContains: Cannot call commitTransaction after calling abortTransaction
287
+
288
+ expectations: []
289
+
290
+ outcome:
291
+ collection:
292
+ data: []
293
+
294
+ - description: commit after abort
295
+
296
+ operations:
297
+ - name: startTransaction
298
+ object: session0
299
+ - name: insertOne
300
+ object: collection
301
+ arguments:
302
+ session: session0
303
+ document:
304
+ _id: 1
305
+ result:
306
+ insertedId: 1
307
+ - name: abortTransaction
308
+ object: session0
309
+ - name: commitTransaction
310
+ object: session0
311
+ result:
312
+ errorContains: Cannot call commitTransaction after calling abortTransaction
313
+
314
+ expectations:
315
+ - command_started_event:
316
+ command:
317
+ insert: *collection_name
318
+ documents:
319
+ - _id: 1
320
+ ordered: true
321
+ readConcern:
322
+ lsid: session0
323
+ txnNumber:
324
+ $numberLong: "1"
325
+ startTransaction: true
326
+ autocommit: false
327
+ writeConcern:
328
+ command_name: insert
329
+ database_name: *database_name
330
+ - command_started_event:
331
+ command:
332
+ abortTransaction: 1
333
+ lsid: session0
334
+ txnNumber:
335
+ $numberLong: "1"
336
+ startTransaction:
337
+ autocommit: false
338
+ writeConcern:
339
+ command_name: abortTransaction
340
+ database_name: admin
341
+
342
+ - description: multiple commits after empty transaction
343
+
344
+ operations:
345
+ - name: startTransaction
346
+ object: session0
347
+ - name: insertOne
348
+ object: collection
349
+ arguments:
350
+ session: session0
351
+ document:
352
+ _id: 1
353
+ result:
354
+ insertedId: 1
355
+ - name: abortTransaction
356
+ object: session0
357
+ # Increments txnNumber.
358
+ - name: startTransaction
359
+ object: session0
360
+ # These commits aren't sent to server, transaction is empty.
361
+ - name: commitTransaction
362
+ object: session0
363
+ - name: commitTransaction
364
+ object: session0
365
+ # Verify that previous, empty transaction incremented txnNumber.
366
+ - name: startTransaction
367
+ object: session0
368
+ - name: insertOne
369
+ object: collection
370
+ arguments:
371
+ session: session0
372
+ document:
373
+ _id: 1
374
+ result:
375
+ insertedId: 1
376
+ - name: abortTransaction
377
+ object: session0
378
+
379
+ expectations:
380
+ - command_started_event:
381
+ command:
382
+ insert: *collection_name
383
+ documents:
384
+ - _id: 1
385
+ ordered: true
386
+ readConcern:
387
+ lsid: session0
388
+ txnNumber:
389
+ $numberLong: "1"
390
+ startTransaction: true
391
+ autocommit: false
392
+ writeConcern:
393
+ command_name: insert
394
+ database_name: *database_name
395
+ - command_started_event:
396
+ command:
397
+ abortTransaction: 1
398
+ lsid: session0
399
+ txnNumber:
400
+ $numberLong: "1"
401
+ startTransaction:
402
+ autocommit: false
403
+ writeConcern:
404
+ command_name: abortTransaction
405
+ database_name: admin
406
+ - command_started_event:
407
+ command:
408
+ insert: *collection_name
409
+ documents:
410
+ - _id: 1
411
+ ordered: true
412
+ readConcern:
413
+ afterClusterTime: 42
414
+ lsid: session0
415
+ # txnNumber 2 was skipped.
416
+ txnNumber:
417
+ $numberLong: "3"
418
+ startTransaction: true
419
+ autocommit: false
420
+ writeConcern:
421
+ command_name: insert
422
+ database_name: *database_name
423
+ - command_started_event:
424
+ command:
425
+ abortTransaction: 1
426
+ lsid: session0
427
+ txnNumber:
428
+ $numberLong: "3"
429
+ startTransaction:
430
+ autocommit: false
431
+ writeConcern:
432
+ command_name: abortTransaction
433
+ database_name: admin
434
+
435
+ outcome:
436
+ collection:
437
+ data: []
438
+
439
+ - description: reset session state commit
440
+
441
+ operations:
442
+ - name: startTransaction
443
+ object: session0
444
+ - name: insertOne
445
+ object: collection
446
+ arguments:
447
+ session: session0
448
+ document:
449
+ _id: 1
450
+ result:
451
+ insertedId: 1
452
+ - name: commitTransaction
453
+ object: session0
454
+ # Running any operation after an ended transaction resets the session
455
+ # state to "no transaction".
456
+ - name: insertOne
457
+ object: collection
458
+ arguments:
459
+ session: session0
460
+ document:
461
+ _id: 2
462
+ result:
463
+ insertedId: 2
464
+ # Calling commit again should error instead of re-running the commit.
465
+ - name: commitTransaction
466
+ object: session0
467
+ result:
468
+ errorContains: no transaction started
469
+
470
+ expectations:
471
+ - command_started_event:
472
+ command:
473
+ insert: *collection_name
474
+ documents:
475
+ - _id: 1
476
+ ordered: true
477
+ readConcern:
478
+ lsid: session0
479
+ txnNumber:
480
+ $numberLong: "1"
481
+ startTransaction: true
482
+ autocommit: false
483
+ writeConcern:
484
+ command_name: insert
485
+ database_name: *database_name
486
+ - command_started_event:
487
+ command:
488
+ commitTransaction: 1
489
+ lsid: session0
490
+ txnNumber:
491
+ $numberLong: "1"
492
+ startTransaction:
493
+ autocommit: false
494
+ writeConcern:
495
+ command_name: commitTransaction
496
+ database_name: admin
497
+ - command_started_event:
498
+ command:
499
+ insert: *collection_name
500
+ documents:
501
+ - _id: 2
502
+ ordered: true
503
+ readConcern:
504
+ lsid: session0
505
+ txnNumber:
506
+ startTransaction:
507
+ autocommit:
508
+ command_name: insert
509
+ database_name: *database_name
510
+
511
+ outcome:
512
+ collection:
513
+ data:
514
+ - _id: 1
515
+ - _id: 2
516
+
517
+ - description: reset session state abort
518
+
519
+ operations:
520
+ - name: startTransaction
521
+ object: session0
522
+ - name: insertOne
523
+ object: collection
524
+ arguments:
525
+ session: session0
526
+ document:
527
+ _id: 1
528
+ result:
529
+ insertedId: 1
530
+ - name: abortTransaction
531
+ object: session0
532
+ # Running any operation after an ended transaction resets the session
533
+ # state to "no transaction".
534
+ - name: insertOne
535
+ object: collection
536
+ arguments:
537
+ session: session0
538
+ document:
539
+ _id: 2
540
+ result:
541
+ insertedId: 2
542
+ # Calling abort should error with "no transaction started" instead of
543
+ # "cannot call abortTransaction twice".
544
+ - name: abortTransaction
545
+ object: session0
546
+ result:
547
+ errorContains: no transaction started
548
+
549
+ expectations:
550
+ - command_started_event:
551
+ command:
552
+ insert: *collection_name
553
+ documents:
554
+ - _id: 1
555
+ ordered: true
556
+ readConcern:
557
+ lsid: session0
558
+ txnNumber:
559
+ $numberLong: "1"
560
+ startTransaction: true
561
+ autocommit: false
562
+ writeConcern:
563
+ command_name: insert
564
+ database_name: *database_name
565
+ - command_started_event:
566
+ command:
567
+ abortTransaction: 1
568
+ lsid: session0
569
+ txnNumber:
570
+ $numberLong: "1"
571
+ startTransaction:
572
+ autocommit: false
573
+ writeConcern:
574
+ command_name: abortTransaction
575
+ database_name: admin
576
+ - command_started_event:
577
+ command:
578
+ insert: *collection_name
579
+ documents:
580
+ - _id: 2
581
+ ordered: true
582
+ readConcern:
583
+ lsid: session0
584
+ txnNumber:
585
+ startTransaction:
586
+ autocommit:
587
+ command_name: insert
588
+ database_name: *database_name
589
+
590
+ outcome:
591
+ collection:
592
+ data:
593
+ - _id: 2