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
@@ -47,13 +47,13 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
47
47
  end
48
48
  end
49
49
 
50
- shared_examples_for 'a getmore command builder' do
50
+ shared_examples_for 'a getMore command builder' do
51
51
 
52
52
  it 'includes the database name' do
53
53
  expect(specification[:db_name]).to eq(TEST_DB)
54
54
  end
55
55
 
56
- it 'includes getmore with cursor id' do
56
+ it 'includes getMore with cursor id' do
57
57
  expect(selector[:getMore]).to eq(cursor.id)
58
58
  end
59
59
 
@@ -68,7 +68,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
68
68
  Mongo::Collection::View.new(authorized_collection)
69
69
  end
70
70
 
71
- it_behaves_like 'a getmore command builder'
71
+ it_behaves_like 'a getMore command builder'
72
72
 
73
73
  it 'does not include max time' do
74
74
  expect(selector[:maxTimeMS]).to be_nil
@@ -85,7 +85,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
85
85
  Mongo::Collection::View.new(authorized_collection, {}, batch_size: 10)
86
86
  end
87
87
 
88
- it_behaves_like 'a getmore command builder'
88
+ it_behaves_like 'a getMore command builder'
89
89
 
90
90
  it 'does not include max time' do
91
91
  expect(selector[:maxTimeMS]).to be_nil
@@ -104,7 +104,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
104
104
  Mongo::Collection::View.new(authorized_collection, {}, max_await_time_ms: 100)
105
105
  end
106
106
 
107
- it_behaves_like 'a getmore command builder'
107
+ it_behaves_like 'a getMore command builder'
108
108
 
109
109
  it 'does not include max time' do
110
110
  expect(selector[:maxTimeMS]).to be_nil
@@ -133,7 +133,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
133
133
  )
134
134
  end
135
135
 
136
- it_behaves_like 'a getmore command builder'
136
+ it_behaves_like 'a getMore command builder'
137
137
 
138
138
  it 'includes max time' do
139
139
  expect(selector[:maxTimeMS]).to eq(100)
@@ -159,7 +159,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
159
159
  )
160
160
  end
161
161
 
162
- it_behaves_like 'a getmore command builder'
162
+ it_behaves_like 'a getMore command builder'
163
163
 
164
164
  it 'does not include max time' do
165
165
  expect(selector[:maxTimeMS]).to be_nil
@@ -61,7 +61,7 @@ describe Mongo::Cursor do
61
61
  authorized_collection.delete_many
62
62
  end
63
63
 
64
- context 'when a getmore gets a socket error' do
64
+ context 'when a getMore gets a socket error' do
65
65
 
66
66
  let(:op) do
67
67
  double('operation')
@@ -374,7 +374,7 @@ describe Mongo::Cursor do
374
374
  end
375
375
  end
376
376
 
377
- context 'when a getmore is needed to retrieve all results', if: sessions_enabled? && !sharded? do
377
+ context 'when a getMore is needed to retrieve all results', if: sessions_enabled? && !sharded? do
378
378
 
379
379
  let(:documents) do
380
380
  (1..4).map{ |i| { field: "test#{i}" }}
@@ -122,7 +122,7 @@ describe Mongo::Database do
122
122
 
123
123
  context 'when specifying a batch size' do
124
124
 
125
- it 'returns the stripped names of the collections' do
125
+ it 'returns the stripped names of the collections', unless: need_to_skip_on_sharded_auth_40? do
126
126
  expect(database.collection_names(batch_size: 1).to_a).to include('users')
127
127
  end
128
128
  end
@@ -141,7 +141,7 @@ describe Mongo::Database do
141
141
  end
142
142
  end
143
143
 
144
- it 'returns all collections' do
144
+ it 'returns all collections', unless: need_to_skip_on_sharded_auth_40? do
145
145
  expect(database.collection_names(batch_size: 1).select { |c| c =~ /dalmatians/}.size).to eq(2)
146
146
  end
147
147
 
@@ -268,7 +268,7 @@ describe Mongo::Database do
268
268
 
269
269
 
270
270
  let(:full_command) do
271
- EventSubscriber.started_events.find { |cmd| cmd.command_name == :ismaster }.command
271
+ EventSubscriber.started_events.find { |cmd| cmd.command_name == 'ismaster' }.command
272
272
  end
273
273
 
274
274
  it 'does not add a afterClusterTime field' do
@@ -0,0 +1,194 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'aggregation examples in Ruby' do
4
+
5
+ let(:client) do
6
+ authorized_client
7
+ end
8
+
9
+ context 'Aggregation Example 1 - Simple aggregation' do
10
+
11
+ let(:example_code) do
12
+
13
+ # Start Aggregation Example 1
14
+
15
+ client[:sales].aggregate(
16
+ [
17
+ { '$match' => { 'items.fruit' => 'banana' } },
18
+ { '$sort' => { 'date' => 1 } }
19
+ ])
20
+
21
+ # End Aggregation Example 1
22
+ end
23
+
24
+ it 'successfully executes the aggregation' do
25
+ example_code.to_a
26
+ end
27
+ end
28
+
29
+ context 'Aggregation Example 2 - $match, $group, $project, $unwind, $sum, $sort, $dayOfWeek' do
30
+
31
+ let(:example_code) do
32
+
33
+ # Start Aggregation Example 2
34
+
35
+ client[:sales].aggregate(
36
+ [
37
+ { '$unwind' => '$items' },
38
+ { '$match' => { 'items.fruit' => 'banana' } },
39
+ { '$group' => {
40
+ '_id' => { 'day' => { '$dayOfWeek' => '$date' } },
41
+ 'count' => { '$sum' => '$items.quantity' } }
42
+ },
43
+ { '$project' => {
44
+ 'dayOfWeek' => '$_id.day',
45
+ 'numberSold' => '$count',
46
+ '_id' => 0 }
47
+ },
48
+ { '$sort' => { 'numberSold' => 1 } }
49
+ ])
50
+
51
+ # End Aggregation Example 2
52
+ end
53
+
54
+ it 'successfully executes the aggregation' do
55
+ example_code.to_a
56
+ end
57
+ end
58
+
59
+ context 'Aggregation Example 3 - $unwind, $group, $sum, $dayOfWeek, $multiply, $project, $cond' do
60
+
61
+ let(:example_code) do
62
+
63
+ # Start Aggregation Example 3
64
+
65
+ client[:sales].aggregate(
66
+ [
67
+ { '$unwind' => '$items' },
68
+ { '$group' => {
69
+ '_id' => { 'day' => { '$dayOfWeek' => '$date' } },
70
+ 'items_sold' => { '$sum' => '$items.quantity' },
71
+ 'revenue' => { '$sum' => { '$multiply' => [ '$items.quantity', '$items.price' ] } } }
72
+ },
73
+ { '$project' => { 'day' => '$_id.day',
74
+ 'revenue' => 1,
75
+ 'items_sold' => 1,
76
+ 'discount' => {
77
+ '$cond' => { 'if' => { '$lte' => ['$revenue', 250]},
78
+ 'then' => 25, 'else' => 0 } } }
79
+ }
80
+ ])
81
+
82
+ # End Aggregation Example 3
83
+ end
84
+
85
+ it 'successfully executes the aggregation' do
86
+ example_code.to_a
87
+ end
88
+ end
89
+
90
+ context 'Aggregation Example 4 - $lookup, $filter, $match', if: op_msg_enabled? do
91
+
92
+ let(:example_code) do
93
+
94
+ # Start Aggregation Example 4
95
+
96
+ client[:sales].aggregate(
97
+ [
98
+ { '$lookup' => {
99
+ 'from' => 'air_airlines',
100
+ 'let' => { 'constituents' => '$airlines' },
101
+ 'pipeline' => [ { '$match' => { '$expr' =>
102
+ { '$in' => ['$name', '$$constituents'] } } }],
103
+ 'as' => 'airlines' }
104
+ },
105
+ { '$project' => { '_id' => 0,
106
+ 'name' => 1,
107
+ 'airlines' => {
108
+ '$filter' => { 'input' => '$airlines',
109
+ 'as' => 'airline',
110
+ 'cond' => { '$eq' => ['$$airline.country', 'Canada'] } } } }
111
+ }
112
+ ])
113
+
114
+ # End Aggregation Example 4
115
+ end
116
+
117
+ it 'successfully executes the aggregation' do
118
+ example_code.to_a
119
+ end
120
+ end
121
+
122
+ context 'runCommand Example 1' do
123
+
124
+ let(:example_code) do
125
+
126
+ # Start runCommand Example 1
127
+
128
+ client.database.command(buildInfo: 1)
129
+
130
+ # End runCommand Example 1
131
+ end
132
+
133
+ it 'successfully executes the command' do
134
+ example_code
135
+ end
136
+ end
137
+
138
+ context 'runCommand Example 2' do
139
+
140
+ before do
141
+ client[:restaurants].create
142
+ end
143
+
144
+ after do
145
+ client[:restaurants].drop
146
+ end
147
+
148
+ let(:example_code) do
149
+
150
+ # Start runCommand Example 2
151
+
152
+ client.database.command(collStats: 'restaurants')
153
+
154
+ # End runCommand Example 2
155
+ end
156
+
157
+ it 'successfully executes the command' do
158
+ example_code
159
+ end
160
+ end
161
+
162
+ context 'Index Example 1 - build simple ascending index' do
163
+
164
+ let(:example_code) do
165
+
166
+ # Start Index Example 1
167
+
168
+ client[:records].indexes.create_one(score: 1)
169
+
170
+ # End Index Example 1
171
+ end
172
+
173
+ it 'successfully executes the command' do
174
+ example_code
175
+ end
176
+ end
177
+
178
+ context 'Index Example 2 - build multikey index with partial filter expression' do
179
+
180
+ let(:example_code) do
181
+
182
+ # Start Index Example 2
183
+
184
+ client[:records].indexes.create_one({ cuisine: 1, name: 1 },
185
+ { partialFilterExpression: { rating: { '$gt' => 5 } } })
186
+
187
+ # End Index Example 2
188
+ end
189
+
190
+ it 'successfully executes the command' do
191
+ example_code
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,152 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Error::OperationFailure do
4
+
5
+ describe '#code' do
6
+ subject do
7
+ described_class.new('not master (10107)', nil,
8
+ :code => 10107, :code_name => 'NotMaster')
9
+ end
10
+
11
+ it 'returns the code' do
12
+ expect(subject.code).to eq(10107)
13
+ end
14
+ end
15
+
16
+ describe '#code_name' do
17
+ subject do
18
+ described_class.new('not master (10107)', nil,
19
+ :code => 10107, :code_name => 'NotMaster')
20
+ end
21
+
22
+ it 'returns the code name' do
23
+ expect(subject.code_name).to eq('NotMaster')
24
+ end
25
+ end
26
+
27
+ describe '#write_retryable?' do
28
+ context 'when there is a read retryable message' do
29
+ let(:error) { Mongo::Error::OperationFailure.new('problem: socket exception', nil) }
30
+
31
+ it 'returns false' do
32
+ expect(error.write_retryable?).to eql(false)
33
+ end
34
+ end
35
+
36
+ context 'when there is a write retryable message' do
37
+ let(:error) { Mongo::Error::OperationFailure.new('problem: node is recovering', nil) }
38
+
39
+ it 'returns true' do
40
+ expect(error.write_retryable?).to eql(true)
41
+ end
42
+ end
43
+
44
+ context 'when there is a non-retryable message' do
45
+ let(:error) { Mongo::Error::OperationFailure.new('something happened', nil) }
46
+
47
+ it 'returns false' do
48
+ expect(error.write_retryable?).to eql(false)
49
+ end
50
+ end
51
+
52
+ context 'when there is a retryable code' do
53
+ let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
54
+ :code => 91, :code_name => 'ShutdownInProgress') }
55
+
56
+ it 'returns true' do
57
+ expect(error.write_retryable?).to eql(true)
58
+ end
59
+ end
60
+
61
+ context 'when there is a non-retryable code' do
62
+ let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
63
+ :code => 43, :code_name => 'SomethingHappened') }
64
+
65
+ it 'returns false' do
66
+ expect(error.write_retryable?).to eql(false)
67
+ end
68
+ end
69
+ end
70
+
71
+ describe '#change_stream_resumable?' do
72
+ context 'when there is a network error' do
73
+ context 'getMore' do
74
+ let(:error) { Mongo::Error::OperationFailure.new('problem: socket exception',
75
+ Mongo::Operation::GetMore::Result.new([])) }
76
+
77
+ it 'returns true' do
78
+ expect(error.change_stream_resumable?).to be true
79
+ end
80
+ end
81
+
82
+ context 'not getMore' do
83
+ let(:error) { Mongo::Error::OperationFailure.new('problem: socket exception', nil) }
84
+
85
+ it 'returns false' do
86
+ expect(error.change_stream_resumable?).to be false
87
+ end
88
+ end
89
+ end
90
+
91
+ context 'when there is a resumable message' do
92
+ context 'getMore response' do
93
+ let(:error) { Mongo::Error::OperationFailure.new('problem: node is recovering',
94
+ Mongo::Operation::GetMore::Result.new([])) }
95
+
96
+ it 'returns true' do
97
+ expect(error.change_stream_resumable?).to eql(true)
98
+ end
99
+ end
100
+
101
+ context 'not a getMore response' do
102
+ let(:error) { Mongo::Error::OperationFailure.new('problem: node is recovering', nil) }
103
+
104
+ it 'returns false' do
105
+ expect(error.change_stream_resumable?).to eql(false)
106
+ end
107
+ end
108
+ end
109
+
110
+ context 'when there is a resumable code' do
111
+ context 'getMore response' do
112
+ let(:error) { Mongo::Error::OperationFailure.new('no message',
113
+ Mongo::Operation::GetMore::Result.new([]),
114
+ :code => 91, :code_name => 'ShutdownInProgress') }
115
+
116
+ it 'returns true' do
117
+ expect(error.change_stream_resumable?).to eql(true)
118
+ end
119
+ end
120
+
121
+ context 'not a getMore response' do
122
+ let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
123
+ :code => 91, :code_name => 'ShutdownInProgress') }
124
+
125
+ it 'returns false' do
126
+ expect(error.change_stream_resumable?).to eql(false)
127
+ end
128
+ end
129
+ end
130
+
131
+ context 'when there is a non-resumable code' do
132
+ context 'getMore response' do
133
+ let(:error) { Mongo::Error::OperationFailure.new('no message',
134
+ Mongo::Operation::GetMore::Result.new([]),
135
+ :code => 136, :code_name => 'CappedPositionLost') }
136
+
137
+ it 'returns false' do
138
+ expect(error.change_stream_resumable?).to eql(false)
139
+ end
140
+ end
141
+
142
+ context 'not a getMore response' do
143
+ let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
144
+ :code => 136, :code_name => 'CappedPositionLost') }
145
+
146
+ it 'returns false' do
147
+ expect(error.change_stream_resumable?).to eql(false)
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end