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
@@ -35,32 +35,63 @@ describe Mongo::Auth::SCRAM do
35
35
  Mongo::Server::Connection.new(server, TEST_OPTIONS)
36
36
  end
37
37
 
38
- describe '#login' do
38
+ context 'when SCRAM-SHA-1 is used' do
39
39
 
40
- context 'when the user is not authorized' do
40
+ describe '#login' do
41
41
 
42
- let(:user) do
43
- Mongo::Auth::User.new(
44
- database: 'driver',
45
- user: 'notauser',
46
- password: 'password'
47
- )
48
- end
42
+ context 'when the user is not authorized' do
49
43
 
50
- let(:cr) do
51
- described_class.new(user)
52
- end
44
+ let(:user) do
45
+ Mongo::Auth::User.new(
46
+ database: 'driver',
47
+ user: 'notauser',
48
+ password: 'password',
49
+ auth_mech: 'SCRAM-SHA-1'
50
+ )
51
+ end
53
52
 
54
- it 'raises an exception', if: list_command_enabled? do
55
- expect {
56
- cr.login(connection)
57
- }.to raise_error(Mongo::Auth::Unauthorized)
53
+ let(:cr) do
54
+ described_class.new(user)
55
+ end
56
+
57
+ it 'raises an exception', if: scram_sha_1_enabled? do
58
+ expect {
59
+ cr.login(connection)
60
+ }.to raise_error(Mongo::Auth::Unauthorized)
61
+ end
62
+
63
+ context 'when compression is used', if: testing_compression? do
64
+
65
+ it 'does not compress the message' do
66
+ expect(Mongo::Protocol::Compressed).not_to receive(:new)
67
+ expect {
68
+ cr.login(connection)
69
+ }.to raise_error(Mongo::Auth::Unauthorized)
70
+ end
71
+ end
58
72
  end
59
73
 
60
- context 'when compression is used', if: testing_compression? do
74
+ context 'when the user is authorized for the database' do
61
75
 
62
- it 'does not compress the message' do
63
- expect(Mongo::Protocol::Compressed).not_to receive(:new)
76
+ let(:cr) do
77
+ described_class.new(root_user)
78
+ end
79
+
80
+ let(:login) do
81
+ cr.login(connection).documents[0]
82
+ end
83
+
84
+ after do
85
+ root_user.instance_variable_set(:@client_key, nil)
86
+ end
87
+
88
+ it 'logs the user into the connection and caches the client key', if: scram_sha_1_enabled? do
89
+ expect(login['ok']).to eq(1)
90
+ expect(root_user.send(:client_key)).not_to be_nil
91
+ end
92
+
93
+ it 'raises an exception when an incorrect client key is set', if: scram_sha_1_enabled? do
94
+ root_user.instance_variable_set(:@client_key, "incorrect client key")
64
95
  expect {
65
96
  cr.login(connection)
66
97
  }.to raise_error(Mongo::Auth::Unauthorized)
@@ -69,30 +100,68 @@ describe Mongo::Auth::SCRAM do
69
100
  end
70
101
  end
71
102
 
72
- context 'when the user is authorized for the database' do
103
+ context 'when SCRAM-SHA-256 is used' do
73
104
 
74
- let(:cr) do
75
- described_class.new(root_user)
76
- end
105
+ describe '#login' do
77
106
 
78
- let(:login) do
79
- cr.login(connection).documents[0]
80
- end
107
+ context 'when the user is not authorized' do
81
108
 
82
- after do
83
- root_user.instance_variable_set(:@client_key, nil)
84
- end
109
+ let(:user) do
110
+ Mongo::Auth::User.new(
111
+ database: 'driver',
112
+ user: 'notauser',
113
+ password: 'password',
114
+ auth_mech: 'SCRAM-SHA-256'
115
+ )
116
+ end
85
117
 
86
- it 'logs the user into the connection and caches the client key', if: list_command_enabled? do
87
- expect(login['ok']).to eq(1)
88
- expect(root_user.send(:client_key)).not_to be_nil
89
- end
118
+ let(:cr) do
119
+ described_class.new(user)
120
+ end
121
+
122
+ it 'raises an exception', if: scram_sha_256_enabled? do
123
+ expect {
124
+ cr.login(connection)
125
+ }.to raise_error(Mongo::Auth::Unauthorized)
126
+ end
127
+
128
+ context 'when compression is used', if: scram_sha_256_enabled? && testing_compression? do
129
+
130
+ it 'does not compress the message' do
131
+ expect(Mongo::Protocol::Compressed).not_to receive(:new)
132
+ expect {
133
+ cr.login(connection)
134
+ }.to raise_error(Mongo::Auth::Unauthorized)
135
+ end
136
+ end
137
+ end
138
+
139
+ context 'when the user is authorized for the database' do
140
+
141
+ let(:cr) do
142
+ described_class.new(test_user)
143
+ end
144
+
145
+ let(:login) do
146
+ cr.login(connection).documents[0]
147
+ end
148
+
149
+ after do
150
+ test_user.instance_variable_set(:@client_key, nil)
151
+ end
152
+
153
+ it 'logs the user into the connection and caches the client key', if: scram_sha_256_enabled? do
154
+ expect(login['ok']).to eq(1)
155
+ expect(test_user.send(:client_key)).not_to be_nil
156
+ end
90
157
 
91
- it 'raises an exception when an incorrect client key is set', if: list_command_enabled? do
92
- root_user.instance_variable_set(:@client_key, "incorrect client key")
93
- expect {
94
- cr.login(connection)
95
- }.to raise_error(Mongo::Auth::Unauthorized)
158
+ it 'raises an exception when an incorrect client key is set', if: scram_sha_256_enabled? do
159
+ test_user.instance_variable_set(:@client_key, "incorrect client key")
160
+ expect {
161
+ cr.login(connection)
162
+ }.to raise_error(Mongo::Auth::Unauthorized)
163
+ end
164
+ end
96
165
  end
97
166
  end
98
167
  end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::StringPrep::Profiles::SASL do
4
+ let(:prepared_data) do
5
+ Mongo::Auth::StringPrep.prepare(
6
+ data,
7
+ mappings,
8
+ prohibited,
9
+ options
10
+ )
11
+ end
12
+
13
+ let(:mappings) do
14
+ Mongo::Auth::StringPrep::Profiles::SASL::MAPPINGS
15
+ end
16
+
17
+ let(:prohibited) do
18
+ Mongo::Auth::StringPrep::Profiles::SASL::PROHIBITED
19
+ end
20
+
21
+ let(:options) do
22
+ {
23
+ normalize: true,
24
+ bidi: true
25
+ }
26
+ end
27
+
28
+ describe 'StringPrep#prepare' do
29
+ context 'when there is unnecessary punctuation' do
30
+ let(:data) do
31
+ "I\u00ADX"
32
+ end
33
+
34
+ it 'removes the punctuation' do
35
+ expect(prepared_data).to eq('IX')
36
+ end
37
+ end
38
+
39
+ context 'when there are non-ASCII spaces' do
40
+ let(:data) do
41
+ "I\u2000X"
42
+ end
43
+
44
+ it 'replaces them with ASCII spaces' do
45
+ expect(prepared_data).to eq('I X')
46
+ end
47
+ end
48
+
49
+ context 'when the input is ASCII' do
50
+ let(:data) do
51
+ 'user'
52
+ end
53
+
54
+ it 'returns the same string' do
55
+ expect(prepared_data).to eq('user')
56
+ end
57
+ end
58
+
59
+ context 'when the data contains uppercase characters' do
60
+ let(:data) do
61
+ 'USER'
62
+ end
63
+
64
+ it 'preserves case' do
65
+ expect(prepared_data).to eq('USER')
66
+ end
67
+ end
68
+
69
+ context 'when the data contains single-character codes' do
70
+ let(:data) do
71
+ "\u00AA"
72
+ end
73
+
74
+ it 'normalizes the codes' do
75
+ expect(prepared_data).to eq('a')
76
+ end
77
+ end
78
+
79
+ context 'when the data contains multi-character codes' do
80
+ let(:data) do
81
+ "\u2168"
82
+ end
83
+
84
+ it 'normalizes the codes' do
85
+ expect(prepared_data).to eq('IX')
86
+ end
87
+ end
88
+
89
+ context 'when the data contains prohibited input' do
90
+ let(:data) do
91
+ "\u0007"
92
+ end
93
+
94
+ it 'raises an error' do
95
+ expect {
96
+ prepared_data
97
+ }.to raise_error(Mongo::Error::FailedStringPrepValidation)
98
+ end
99
+ end
100
+
101
+ context 'when the data contains invalid bidi input' do
102
+ let(:data) do
103
+ "\u0627\u0031"
104
+ end
105
+
106
+ it 'raises an error' do
107
+ expect {
108
+ prepared_data
109
+ }.to raise_error(Mongo::Error::FailedStringPrepValidation)
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,188 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::StringPrep do
4
+ include Mongo::Auth::StringPrep
5
+
6
+ describe '#prepare' do
7
+ let(:prepared_data) do
8
+ prepare(data, mappings, prohibited, options)
9
+ end
10
+
11
+ context 'with no options' do
12
+ let(:mappings) do
13
+ []
14
+ end
15
+
16
+ let(:prohibited) do
17
+ []
18
+ end
19
+
20
+ let(:options) do
21
+ {}
22
+ end
23
+
24
+ context 'when the data has invalid bidi' do
25
+ let(:data) do
26
+ "\u0627\u0031"
27
+ end
28
+
29
+ it 'does not raise an error' do
30
+ expect(prepared_data).to eq("\u0627\u0031")
31
+ end
32
+ end
33
+
34
+ context 'when the data has unicode codes' do
35
+ let(:data) do
36
+ "ua\u030Aer"
37
+ end
38
+
39
+ it 'does not normalize the data' do
40
+ expect(prepared_data).to eq("ua\u030Aer")
41
+ end
42
+ end
43
+ end
44
+
45
+ context 'with options specified' do
46
+ let (:mappings) do
47
+ [Mongo::Auth::StringPrep::Tables::B1, Mongo::Auth::StringPrep::Tables::B2]
48
+ end
49
+
50
+ let (:prohibited) do
51
+ [
52
+ Mongo::Auth::StringPrep::Tables::C1_1,
53
+ Mongo::Auth::StringPrep::Tables::C1_2,
54
+ Mongo::Auth::StringPrep::Tables::C6,
55
+ ]
56
+ end
57
+
58
+ let (:options) do
59
+ {
60
+ normalize: true,
61
+ bidi: true,
62
+ }
63
+ end
64
+
65
+ context 'when the input is empty' do
66
+ let(:data) do
67
+ ''
68
+ end
69
+
70
+ it 'returns the empty string' do
71
+ expect(prepared_data).to eq('')
72
+ end
73
+ end
74
+
75
+ context 'when the input is ASCII' do
76
+ let(:data) do
77
+ 'user'
78
+ end
79
+
80
+ it 'returns the same string on ASCII input' do
81
+ expect(prepared_data).to eq('user')
82
+ end
83
+ end
84
+
85
+ context 'when the input contains zero-width spaces' do
86
+ let(:data) do
87
+ "u\u200Ber"
88
+ end
89
+
90
+ it 'removes the zero-width spaces' do
91
+ expect(prepared_data).to eq('uer')
92
+ end
93
+ end
94
+
95
+ context 'when the input contains non-ASCII characters' do
96
+ let(:data) do
97
+ "u\u00DFer"
98
+ end
99
+
100
+ it 'maps the non-ASCII characters to ASCII' do
101
+ expect(prepared_data).to eq('usser')
102
+ end
103
+ end
104
+
105
+ context 'when the input contains unicode codes' do
106
+ let(:data) do
107
+ "ua\u030Aer"
108
+ end
109
+
110
+ it 'unicode normalizes the input' do
111
+ expect(prepared_data).to eq("u\u00e5er")
112
+ end
113
+ end
114
+
115
+ context 'when the input contains prohibited characters' do
116
+ let(:data) do
117
+ "u\uFFFDer"
118
+ end
119
+
120
+ it 'raises an error' do
121
+ expect {
122
+ prepared_data
123
+ }.to raise_error(Mongo::Error::FailedStringPrepValidation)
124
+ end
125
+ end
126
+
127
+ context 'when the data is proper bidi' do
128
+ let(:data) do
129
+ "\u0627\u0031\u0628"
130
+ end
131
+
132
+ it 'does not raise an error' do
133
+ expect(
134
+ prepared_data
135
+ ).to eq("\u0627\u0031\u0628")
136
+ end
137
+ end
138
+
139
+ context 'when bidi input contains prohibited bidi characters' do
140
+ let(:data) do
141
+ "\u0627\u0589\u0628"
142
+ end
143
+
144
+ it 'raises an error' do
145
+ expect {
146
+ prepared_data
147
+ }.to raise_error(Mongo::Error::FailedStringPrepValidation)
148
+ end
149
+ end
150
+
151
+ context 'when bidi input has an invalid first bidi character' do
152
+ let(:data) do
153
+ "\u0031\u0627"
154
+ end
155
+
156
+ it 'raises an error' do
157
+ expect {
158
+ prepared_data
159
+ }.to raise_error(Mongo::Error::FailedStringPrepValidation)
160
+ end
161
+ end
162
+
163
+ context 'when bidi input has an invalid last bidi character' do
164
+ let(:data) do
165
+ "\u0627\u0031"
166
+ end
167
+
168
+ it 'raises an error' do
169
+ expect {
170
+ prepared_data
171
+ }.to raise_error(Mongo::Error::FailedStringPrepValidation)
172
+ end
173
+ end
174
+
175
+ context 'when bidi input has a bad character' do
176
+ let(:data) do
177
+ "\u206D"
178
+ end
179
+
180
+ it 'raises an error' do
181
+ expect {
182
+ prepared_data
183
+ }.to raise_error(Mongo::Error::FailedStringPrepValidation)
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end