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
@@ -40,3 +40,22 @@ tests:
40
40
  -
41
41
  command_failed_event:
42
42
  command_name: "count"
43
+ -
44
+ description: "A successful command with a non-primary read preference"
45
+ operation:
46
+ name: "count"
47
+ arguments:
48
+ filter: { _id: 1 }
49
+ read_preference: { mode: "primaryPreferred" }
50
+ expectations:
51
+ -
52
+ command_started_event:
53
+ command:
54
+ count: *collection_name
55
+ query: { _id: 1 }
56
+ command_name: "count"
57
+ database_name: *database_name
58
+ -
59
+ command_succeeded_event:
60
+ reply: { ok: 1.0, n: 1 }
61
+ command_name: "count"
@@ -42,17 +42,15 @@ tests:
42
42
  arguments:
43
43
  filter: { _id: { $gt: 1 } }
44
44
  sort: { _id: 1 }
45
- skip: 2
45
+ skip: {"$numberLong": "2"}
46
46
  modifiers:
47
47
  $comment: "test"
48
48
  $hint: { _id: 1 }
49
49
  $max: { _id: 6 }
50
- $maxScan: 5000
51
50
  $maxTimeMS: 6000
52
51
  $min: { _id: 0 }
53
52
  $returnKey: false
54
53
  $showDiskLoc: false
55
- $snapshot: false
56
54
  expectations:
57
55
  -
58
56
  command_started_event:
@@ -60,16 +58,14 @@ tests:
60
58
  find: *collection_name
61
59
  filter: { _id: { $gt: 1 } }
62
60
  sort: { _id: 1 }
63
- skip: 2
61
+ skip: {"$numberLong": "2"}
64
62
  comment: "test"
65
63
  hint: { _id: 1 }
66
64
  max: { _id: 6 }
67
- maxScan: 5000
68
65
  maxTimeMS: 6000
69
66
  min: { _id: 0 }
70
67
  returnKey: false
71
68
  showRecordId: false
72
- snapshot: false
73
69
  command_name: "find"
74
70
  database_name: *database_name
75
71
  -
@@ -90,7 +86,7 @@ tests:
90
86
  arguments:
91
87
  filter: { _id: { $gte: 1 }}
92
88
  sort: { _id: 1 }
93
- batchSize: 3
89
+ batchSize: {"$numberLong": "3"}
94
90
  expectations:
95
91
  -
96
92
  command_started_event:
@@ -98,7 +94,7 @@ tests:
98
94
  find: *collection_name
99
95
  filter: { _id: { $gte : 1 }}
100
96
  sort: { _id: 1 }
101
- batchSize: 3
97
+ batchSize: {"$numberLong": "3"}
102
98
  command_name: "find"
103
99
  database_name: *database_name
104
100
  -
@@ -118,7 +114,7 @@ tests:
118
114
  command:
119
115
  getMore: { $numberLong: "42" }
120
116
  collection: *collection_name
121
- batchSize: 3
117
+ batchSize: {"$numberLong": "3"}
122
118
  command_name: "getMore"
123
119
  database_name: *database_name
124
120
  -
@@ -140,8 +136,8 @@ tests:
140
136
  arguments:
141
137
  filter: { _id: { $gte: 1 }}
142
138
  sort: { _id: 1 }
143
- batchSize: 3
144
- limit: 4
139
+ batchSize: {"$numberLong": "3"}
140
+ limit: {"$numberLong": "4"}
145
141
  expectations:
146
142
  -
147
143
  command_started_event:
@@ -149,8 +145,8 @@ tests:
149
145
  find: *collection_name
150
146
  filter: { _id: { $gte : 1 }}
151
147
  sort: { _id: 1 }
152
- batchSize: 3
153
- limit: 4
148
+ batchSize: {"$numberLong": "3"}
149
+ limit: {"$numberLong": "4"}
154
150
  command_name: "find"
155
151
  database_name: *database_name
156
152
  -
@@ -170,7 +166,7 @@ tests:
170
166
  command:
171
167
  getMore: { $numberLong: "42" }
172
168
  collection: *collection_name
173
- batchSize: 1
169
+ batchSize: { $numberLong: "1" }
174
170
  command_name: "getMore"
175
171
  database_name: *database_name
176
172
  -
@@ -201,13 +197,15 @@ tests:
201
197
  -
202
198
  description: "A successful find event with a getmore and the server kills the cursor"
203
199
  ignore_if_server_version_less_than: "3.1"
200
+ ignore_if_topology_type:
201
+ - "sharded"
204
202
  operation:
205
203
  name: "find"
206
204
  arguments:
207
205
  filter: { _id: { $gte: 1 }}
208
206
  sort: { _id: 1 }
209
- batchSize: 3
210
- limit: 4
207
+ batchSize: {"$numberLong": "3"}
208
+ limit: {"$numberLong": "4"}
211
209
  expectations:
212
210
  -
213
211
  command_started_event:
@@ -215,8 +213,8 @@ tests:
215
213
  find: *collection_name
216
214
  filter: { _id: { $gte : 1 }}
217
215
  sort: { _id: 1 }
218
- batchSize: 3
219
- limit: 4
216
+ batchSize: {"$numberLong": "3"}
217
+ limit: {"$numberLong": "4"}
220
218
  command_name: "find"
221
219
  database_name: *database_name
222
220
  -
@@ -236,7 +234,7 @@ tests:
236
234
  command:
237
235
  getMore: { $numberLong: "42" }
238
236
  collection: *collection_name
239
- batchSize: 3
237
+ batchSize: { $numberLong: "1" }
240
238
  command_name: "getMore"
241
239
  database_name: *database_name
242
240
  -
@@ -12,7 +12,6 @@ tests:
12
12
  arguments:
13
13
  documents:
14
14
  - { _id: 2, x: 22 }
15
- - { _id: 3, x: 33 }
16
15
  expectations:
17
16
  -
18
17
  command_started_event:
@@ -20,13 +19,12 @@ tests:
20
19
  insert: *collection_name
21
20
  documents:
22
21
  - { _id: 2, x: 22 }
23
- - { _id: 3, x: 33 }
24
22
  ordered: true
25
23
  command_name: "insert"
26
24
  database_name: *database_name
27
25
  -
28
26
  command_succeeded_event:
29
- reply: { ok: 1.0, n: 2 }
27
+ reply: { ok: 1.0, n: 1 }
30
28
  command_name: "insert"
31
29
  -
32
30
  description: "A successful insert many command with write errors"
@@ -35,7 +33,6 @@ tests:
35
33
  arguments:
36
34
  documents:
37
35
  - { _id: 1, x: 11 }
38
- - { _id: 2, x: 22 }
39
36
  expectations:
40
37
  -
41
38
  command_started_event:
@@ -43,7 +40,6 @@ tests:
43
40
  insert: *collection_name
44
41
  documents:
45
42
  - { _id: 1, x: 11 }
46
- - { _id: 2, x: 22 }
47
43
  ordered: true
48
44
  command_name: "insert"
49
45
  database_name: *database_name
@@ -62,7 +58,6 @@ tests:
62
58
  arguments:
63
59
  documents:
64
60
  - { _id: 2, x: 22 }
65
- - { _id: 3, x: 33 }
66
61
  ordered: false
67
62
  expectations:
68
63
  -
@@ -71,11 +66,10 @@ tests:
71
66
  insert: *collection_name
72
67
  documents:
73
68
  - { _id: 2, x: 22 }
74
- - { _id: 3, x: 33 }
75
69
  ordered: false
76
70
  command_name: "insert"
77
71
  database_name: *database_name
78
72
  -
79
73
  command_succeeded_event:
80
- reply: { ok: 1.0, n: 2 }
74
+ reply: { ok: 1.0, n: 1 }
81
75
  command_name: "insert"
@@ -0,0 +1,34 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+
4
+ collection_name: &collection_name "test"
5
+ database_name: &database_name "ruby-driver"
6
+
7
+ tests:
8
+ -
9
+ description: "A successful unordered bulk write with an unacknowledged write concern"
10
+ comment: "On a 2.4 server, no GLE is sent and requires a client-side manufactured reply"
11
+ operation:
12
+ name: "bulkWrite"
13
+ arguments:
14
+ requests:
15
+ - name: "insertOne"
16
+ arguments:
17
+ document: { _id: "unorderedBulkWriteInsertW0", x: 44 }
18
+ options: { ordered: false }
19
+ writeConcern: { w: 0 }
20
+ expectations:
21
+ -
22
+ command_started_event:
23
+ command:
24
+ insert: *collection_name
25
+ documents:
26
+ - { _id: "unorderedBulkWriteInsertW0", x: 44 }
27
+ ordered: false
28
+ writeConcern: { w: 0 }
29
+ command_name: "insert"
30
+ database_name: *database_name
31
+ -
32
+ command_succeeded_event:
33
+ reply: { ok: 1.0 }
34
+ command_name: "insert"
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -0,0 +1,56 @@
1
+ module Constraints
2
+ def min_server_version(version)
3
+ unless version =~ /^\d+\.\d+$/
4
+ raise ArgumentError, "Version can only be major.minor: #{version}"
5
+ end
6
+
7
+ before do
8
+ client = authorized_client
9
+ $server_version ||= client.database.command(buildInfo: 1).first['version']
10
+
11
+ if version > $server_version
12
+ skip "Server version #{version} required, we have #{$server_version}"
13
+ end
14
+ end
15
+ end
16
+
17
+ def require_sessions
18
+ before do
19
+ unless sessions_enabled?
20
+ skip 'Sessions are not enabled'
21
+ end
22
+ end
23
+ end
24
+
25
+ def require_topology(*topologies)
26
+ topologies = topologies.map { |t| t.to_s }
27
+ invalid_topologies = topologies - %w(single replica_set sharded)
28
+ unless invalid_topologies.empty?
29
+ raise ArgumentError, "Invalid topologies requested: #{invalid_topologies.join(', ')}"
30
+ end
31
+ before do
32
+ topology = authorized_client.cluster.topology.class.name.sub(/.*::/, '')
33
+ topology = topology.gsub(/([A-Z])/) { |match| '_' + match.downcase }.sub(/^_/, '')
34
+ unless topologies.include?(topology)
35
+ skip "Topology #{topologies.join(' or ')} required, we have #{topology}"
36
+ end
37
+ end
38
+ end
39
+
40
+ # Constrain tests that use TimeoutInterrupt to MRI (and Unix)
41
+ def only_mri
42
+ before do
43
+ if RUBY_PLATFORM =~ /\bjava\b/
44
+ skip "MRI required, we have #{RUBY_PLATFORM}"
45
+ end
46
+ end
47
+ end
48
+
49
+ def max_example_run_time(timeout)
50
+ around do |example|
51
+ TimeoutInterrupt.timeout(timeout) do
52
+ example.run
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -125,7 +125,8 @@ module Mongo
125
125
  # @since 2.0.0
126
126
  attr_reader :description
127
127
 
128
- FAIL_POINT_BASE_COMMAND = { configureFailPoint: "onPrimaryTransactionalWrite" }
128
+ # Spec tests have configureFailPoint as a string, make it a string here too
129
+ FAIL_POINT_BASE_COMMAND = { 'configureFailPoint' => "onPrimaryTransactionalWrite" }
129
130
 
130
131
  # Instantiate the new CRUDTest.
131
132
  #
@@ -139,7 +140,9 @@ module Mongo
139
140
  # @since 2.0.0
140
141
  def initialize(data, test)
141
142
  @data = data
142
- @fail_point_command = FAIL_POINT_BASE_COMMAND.merge(test['failPoint']) if test['failPoint']
143
+ if test['failPoint']
144
+ @fail_point_command = FAIL_POINT_BASE_COMMAND.merge(test['failPoint'])
145
+ end
143
146
  @description = test['description']
144
147
  @operation = Operation.get(test['operation'])
145
148
  @outcome = test['outcome']
@@ -169,7 +172,9 @@ module Mongo
169
172
  end
170
173
 
171
174
  def set_up_fail_point(collection)
172
- collection.client.use(:admin).command(@fail_point_command) if @fail_point_command
175
+ if @fail_point_command
176
+ collection.client.use(:admin).command(@fail_point_command)
177
+ end
173
178
  end
174
179
 
175
180
  def clear_fail_point(collection)
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -70,7 +70,7 @@ module Mongo
70
70
  #
71
71
  # @since 2.0.0
72
72
  def execute(collection)
73
- send(name.to_sym, collection)
73
+ send(camel_to_snake(name), collection)
74
74
  end
75
75
 
76
76
  # Whether the operation is expected to have restuls.
@@ -96,6 +96,22 @@ module Mongo
96
96
  collection.count(filter, options)
97
97
  end
98
98
 
99
+ def count_documents(collection)
100
+ options = ARGUMENT_MAP.reduce({}) do |opts, (key, value)|
101
+ opts.merge!(key => arguments[value]) if arguments[value]
102
+ opts
103
+ end
104
+ collection.count_documents(filter, options)
105
+ end
106
+
107
+ def estimated_document_count(collection)
108
+ options = ARGUMENT_MAP.reduce({}) do |opts, (key, value)|
109
+ opts.merge!(key => arguments[value]) if arguments[value]
110
+ opts
111
+ end
112
+ collection.estimated_document_count(options)
113
+ end
114
+
99
115
  def aggregate(collection)
100
116
  collection.aggregate(pipeline, options).to_a
101
117
  end
@@ -111,7 +127,12 @@ module Mongo
111
127
 
112
128
  def options
113
129
  ARGUMENT_MAP.reduce({}) do |opts, (key, value)|
114
- arguments[value] ? opts.merge!(key => arguments[value]) : opts
130
+ value = if arguments[value].is_a?(Hash) && arguments[value]['$numberLong']
131
+ arguments[value]['$numberLong'].to_i
132
+ else
133
+ arguments[value]
134
+ end
135
+ value ? opts.merge!(key => value) : opts
115
136
  end
116
137
  end
117
138
 
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -167,7 +167,12 @@ module Mongo
167
167
  end
168
168
 
169
169
  def options
170
- ARGUMENT_MAP.reduce({}) do |opts, (key, value)|
170
+ args = (arguments['options'] || {}).reduce({}) do |a, kv|
171
+ a[kv.first.to_sym] = kv.last
172
+ a
173
+ end
174
+
175
+ ARGUMENT_MAP.reduce(args) do |opts, (key, value)|
171
176
  arguments.key?(value) ? opts.merge!(key => send(key)) : opts
172
177
  end
173
178
  end
@@ -4,12 +4,22 @@ minServerVersion: '3.4'
4
4
 
5
5
  tests:
6
6
  -
7
- description: "Count with collation"
7
+ description: "Count documents with collation"
8
8
  operation:
9
- name: count
9
+ name: countDocuments
10
10
  arguments:
11
11
  filter: { x: 'ping' }
12
12
  collation: { locale: 'en_US', strength: 2 } # https://docs.mongodb.com/master/reference/collation/#collation-document
13
13
 
14
14
  outcome:
15
15
  result: 1
16
+ -
17
+ description: "Deprecated count with collation"
18
+ operation:
19
+ name: count
20
+ arguments:
21
+ filter: { x: 'ping' }
22
+ collation: { locale: 'en_US', strength: 2 }
23
+
24
+ outcome:
25
+ result: 1
@@ -5,7 +5,45 @@ data:
5
5
 
6
6
  tests:
7
7
  -
8
- description: "Count without a filter"
8
+ description: "Estimated document count"
9
+ operation:
10
+ name: estimatedDocumentCount
11
+ arguments: { }
12
+
13
+ outcome:
14
+ result: 3
15
+ -
16
+ description: "Count documents without a filter"
17
+ operation:
18
+ name: countDocuments
19
+ arguments:
20
+ filter: { }
21
+
22
+ outcome:
23
+ result: 3
24
+ -
25
+ description: "Count documents with a filter"
26
+ operation:
27
+ name: countDocuments
28
+ arguments:
29
+ filter:
30
+ _id: {$gt: 1}
31
+
32
+ outcome:
33
+ result: 2
34
+ -
35
+ description: "Count documents with skip and limit"
36
+ operation:
37
+ name: countDocuments
38
+ arguments:
39
+ filter: {}
40
+ skip: 1
41
+ limit: 3
42
+
43
+ outcome:
44
+ result: 2
45
+ -
46
+ description: "Deprecated count without a filter"
9
47
  operation:
10
48
  name: count
11
49
  arguments:
@@ -14,17 +52,17 @@ tests:
14
52
  outcome:
15
53
  result: 3
16
54
  -
17
- description: "Count with a filter"
55
+ description: "Deprecated count with a filter"
18
56
  operation:
19
57
  name: count
20
58
  arguments:
21
- filter:
59
+ filter:
22
60
  _id: {$gt: 1}
23
61
 
24
62
  outcome:
25
63
  result: 2
26
64
  -
27
- description: "Count with skip and limit"
65
+ description: "Deprecated count with skip and limit"
28
66
  operation:
29
67
  name: count
30
68
  arguments:
@@ -33,4 +71,4 @@ tests:
33
71
  limit: 3
34
72
 
35
73
  outcome:
36
- result: 2
74
+ result: 2