mongo 2.13.2 → 2.15.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 (1150) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -2
  3. data.tar.gz.sig +0 -0
  4. data/README.md +5 -2
  5. data/Rakefile +46 -18
  6. data/lib/mongo.rb +35 -0
  7. data/lib/mongo/active_support.rb +3 -0
  8. data/lib/mongo/address.rb +3 -0
  9. data/lib/mongo/address/ipv4.rb +4 -1
  10. data/lib/mongo/address/ipv6.rb +4 -1
  11. data/lib/mongo/address/unix.rb +3 -0
  12. data/lib/mongo/address/validator.rb +3 -0
  13. data/lib/mongo/auth.rb +4 -1
  14. data/lib/mongo/auth/aws.rb +3 -0
  15. data/lib/mongo/auth/aws/conversation.rb +4 -4
  16. data/lib/mongo/auth/aws/credentials_retriever.rb +3 -0
  17. data/lib/mongo/auth/aws/request.rb +3 -0
  18. data/lib/mongo/auth/base.rb +17 -8
  19. data/lib/mongo/auth/conversation_base.rb +35 -0
  20. data/lib/mongo/auth/cr.rb +3 -0
  21. data/lib/mongo/auth/cr/conversation.rb +9 -29
  22. data/lib/mongo/auth/credential_cache.rb +3 -0
  23. data/lib/mongo/auth/gssapi.rb +3 -0
  24. data/lib/mongo/auth/gssapi/conversation.rb +7 -15
  25. data/lib/mongo/auth/ldap.rb +3 -0
  26. data/lib/mongo/auth/ldap/conversation.rb +6 -14
  27. data/lib/mongo/auth/roles.rb +3 -0
  28. data/lib/mongo/auth/sasl_conversation_base.rb +4 -13
  29. data/lib/mongo/auth/scram.rb +5 -2
  30. data/lib/mongo/auth/scram/conversation.rb +3 -0
  31. data/lib/mongo/auth/scram256.rb +3 -0
  32. data/lib/mongo/auth/scram256/conversation.rb +3 -0
  33. data/lib/mongo/auth/scram_conversation_base.rb +10 -34
  34. data/lib/mongo/auth/stringprep.rb +4 -1
  35. data/lib/mongo/auth/stringprep/profiles/sasl.rb +3 -0
  36. data/lib/mongo/auth/stringprep/tables.rb +3 -0
  37. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +2 -2
  38. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -1
  39. data/lib/mongo/auth/user.rb +3 -0
  40. data/lib/mongo/auth/user/view.rb +19 -9
  41. data/lib/mongo/auth/x509.rb +3 -0
  42. data/lib/mongo/auth/x509/conversation.rb +7 -25
  43. data/lib/mongo/background_thread.rb +16 -2
  44. data/lib/mongo/bson.rb +3 -0
  45. data/lib/mongo/bulk_write.rb +41 -18
  46. data/lib/mongo/bulk_write/combineable.rb +3 -0
  47. data/lib/mongo/bulk_write/ordered_combiner.rb +3 -0
  48. data/lib/mongo/bulk_write/result.rb +3 -0
  49. data/lib/mongo/bulk_write/result_combiner.rb +3 -0
  50. data/lib/mongo/bulk_write/transformable.rb +3 -0
  51. data/lib/mongo/bulk_write/unordered_combiner.rb +3 -0
  52. data/lib/mongo/bulk_write/validatable.rb +3 -0
  53. data/lib/mongo/caching_cursor.rb +77 -0
  54. data/lib/mongo/client.rb +133 -15
  55. data/lib/mongo/client_encryption.rb +3 -0
  56. data/lib/mongo/cluster.rb +32 -38
  57. data/lib/mongo/cluster/periodic_executor.rb +3 -0
  58. data/lib/mongo/cluster/reapers/cursor_reaper.rb +9 -2
  59. data/lib/mongo/cluster/reapers/socket_reaper.rb +3 -0
  60. data/lib/mongo/cluster/sdam_flow.rb +17 -0
  61. data/lib/mongo/cluster/topology.rb +3 -0
  62. data/lib/mongo/cluster/topology/base.rb +3 -0
  63. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -0
  64. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -0
  65. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +3 -0
  66. data/lib/mongo/cluster/topology/sharded.rb +3 -0
  67. data/lib/mongo/cluster/topology/single.rb +4 -1
  68. data/lib/mongo/cluster/topology/unknown.rb +3 -0
  69. data/lib/mongo/cluster_time.rb +3 -0
  70. data/lib/mongo/collection.rb +74 -17
  71. data/lib/mongo/collection/view.rb +27 -20
  72. data/lib/mongo/collection/view/aggregation.rb +29 -5
  73. data/lib/mongo/collection/view/builder.rb +3 -0
  74. data/lib/mongo/collection/view/builder/aggregation.rb +3 -0
  75. data/lib/mongo/collection/view/builder/find_command.rb +41 -18
  76. data/lib/mongo/collection/view/builder/flags.rb +3 -0
  77. data/lib/mongo/collection/view/builder/map_reduce.rb +3 -0
  78. data/lib/mongo/collection/view/builder/modifiers.rb +3 -0
  79. data/lib/mongo/collection/view/builder/op_query.rb +3 -0
  80. data/lib/mongo/collection/view/change_stream.rb +5 -2
  81. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -0
  82. data/lib/mongo/collection/view/explainable.rb +30 -8
  83. data/lib/mongo/collection/view/immutable.rb +3 -0
  84. data/lib/mongo/collection/view/iterable.rb +76 -13
  85. data/lib/mongo/collection/view/map_reduce.rb +5 -2
  86. data/lib/mongo/collection/view/readable.rb +68 -23
  87. data/lib/mongo/collection/view/writable.rb +32 -15
  88. data/lib/mongo/crypt.rb +3 -0
  89. data/lib/mongo/crypt/auto_decryption_context.rb +3 -0
  90. data/lib/mongo/crypt/auto_encrypter.rb +4 -1
  91. data/lib/mongo/crypt/auto_encryption_context.rb +3 -0
  92. data/lib/mongo/crypt/binary.rb +3 -0
  93. data/lib/mongo/crypt/binding.rb +4 -1
  94. data/lib/mongo/crypt/context.rb +3 -0
  95. data/lib/mongo/crypt/data_key_context.rb +3 -0
  96. data/lib/mongo/crypt/encryption_io.rb +9 -6
  97. data/lib/mongo/crypt/explicit_decryption_context.rb +3 -0
  98. data/lib/mongo/crypt/explicit_encrypter.rb +3 -0
  99. data/lib/mongo/crypt/explicit_encryption_context.rb +3 -0
  100. data/lib/mongo/crypt/handle.rb +3 -0
  101. data/lib/mongo/crypt/hooks.rb +3 -0
  102. data/lib/mongo/crypt/kms_context.rb +3 -0
  103. data/lib/mongo/crypt/status.rb +3 -0
  104. data/lib/mongo/cursor.rb +22 -5
  105. data/lib/mongo/cursor/builder.rb +3 -0
  106. data/lib/mongo/cursor/builder/get_more_command.rb +3 -0
  107. data/lib/mongo/cursor/builder/kill_cursors_command.rb +3 -0
  108. data/lib/mongo/cursor/builder/op_get_more.rb +3 -0
  109. data/lib/mongo/cursor/builder/op_kill_cursors.rb +3 -0
  110. data/lib/mongo/database.rb +32 -6
  111. data/lib/mongo/database/view.rb +4 -1
  112. data/lib/mongo/dbref.rb +3 -0
  113. data/lib/mongo/distinguishing_semaphore.rb +3 -0
  114. data/lib/mongo/error.rb +14 -1
  115. data/lib/mongo/error/auth_error.rb +3 -0
  116. data/lib/mongo/error/bulk_write_error.rb +20 -3
  117. data/lib/mongo/error/change_stream_resumable.rb +3 -0
  118. data/lib/mongo/error/closed_stream.rb +3 -0
  119. data/lib/mongo/error/connection_check_out_timeout.rb +3 -0
  120. data/lib/mongo/error/connection_perished.rb +3 -0
  121. data/lib/mongo/error/credential_check_error.rb +3 -0
  122. data/lib/mongo/error/crypt_error.rb +3 -0
  123. data/lib/mongo/error/extra_file_chunk.rb +3 -0
  124. data/lib/mongo/error/failed_string_prep_validation.rb +3 -0
  125. data/lib/mongo/error/file_not_found.rb +3 -0
  126. data/lib/mongo/error/handshake_error.rb +3 -0
  127. data/lib/mongo/error/insufficient_iteration_count.rb +3 -0
  128. data/lib/mongo/error/internal_driver_error.rb +25 -0
  129. data/lib/mongo/error/invalid_address.rb +3 -0
  130. data/lib/mongo/error/invalid_application_name.rb +3 -0
  131. data/lib/mongo/error/invalid_bulk_operation.rb +3 -0
  132. data/lib/mongo/error/invalid_bulk_operation_type.rb +3 -0
  133. data/lib/mongo/error/invalid_collection_name.rb +3 -0
  134. data/lib/mongo/error/invalid_cursor_operation.rb +3 -0
  135. data/lib/mongo/error/invalid_database_name.rb +3 -0
  136. data/lib/mongo/error/invalid_document.rb +3 -0
  137. data/lib/mongo/error/invalid_file.rb +3 -0
  138. data/lib/mongo/error/invalid_file_revision.rb +3 -0
  139. data/lib/mongo/error/invalid_min_pool_size.rb +3 -0
  140. data/lib/mongo/error/invalid_nonce.rb +3 -0
  141. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  142. data/lib/mongo/error/invalid_read_option.rb +3 -0
  143. data/lib/mongo/error/invalid_replacement_document.rb +3 -0
  144. data/lib/mongo/error/invalid_server_auth_host.rb +3 -0
  145. data/lib/mongo/error/invalid_server_auth_response.rb +3 -0
  146. data/lib/mongo/error/invalid_server_preference.rb +3 -0
  147. data/lib/mongo/error/invalid_session.rb +3 -0
  148. data/lib/mongo/error/invalid_signature.rb +3 -0
  149. data/lib/mongo/error/invalid_transaction_operation.rb +3 -0
  150. data/lib/mongo/error/invalid_txt_record.rb +3 -0
  151. data/lib/mongo/error/invalid_update_document.rb +3 -0
  152. data/lib/mongo/error/invalid_uri.rb +3 -0
  153. data/lib/mongo/error/invalid_write_concern.rb +3 -0
  154. data/lib/mongo/error/kms_error.rb +3 -0
  155. data/lib/mongo/error/lint_error.rb +3 -0
  156. data/lib/mongo/error/max_bson_size.rb +3 -0
  157. data/lib/mongo/error/max_message_size.rb +3 -0
  158. data/lib/mongo/error/mismatched_domain.rb +3 -0
  159. data/lib/mongo/error/missing_file_chunk.rb +3 -0
  160. data/lib/mongo/error/missing_password.rb +3 -0
  161. data/lib/mongo/error/missing_resume_token.rb +3 -0
  162. data/lib/mongo/error/missing_scram_server_signature.rb +3 -0
  163. data/lib/mongo/error/mongocryptd_spawn_error.rb +3 -0
  164. data/lib/mongo/error/multi_index_drop.rb +3 -0
  165. data/lib/mongo/error/need_primary_server.rb +3 -0
  166. data/lib/mongo/error/no_server_available.rb +3 -0
  167. data/lib/mongo/error/no_srv_records.rb +3 -0
  168. data/lib/mongo/error/notable.rb +3 -0
  169. data/lib/mongo/error/operation_failure.rb +26 -4
  170. data/lib/mongo/error/parser.rb +69 -13
  171. data/lib/mongo/error/pool_closed_error.rb +3 -0
  172. data/lib/mongo/error/raise_original_error.rb +3 -0
  173. data/lib/mongo/error/sdam_error_detection.rb +16 -5
  174. data/lib/mongo/error/server_api_conflict.rb +26 -0
  175. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  176. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  177. data/lib/mongo/error/session_ended.rb +3 -0
  178. data/lib/mongo/error/sessions_not_supported.rb +3 -0
  179. data/lib/mongo/error/socket_error.rb +3 -0
  180. data/lib/mongo/error/socket_timeout_error.rb +3 -0
  181. data/lib/mongo/error/unchangeable_collection_option.rb +3 -0
  182. data/lib/mongo/error/unexpected_chunk_length.rb +3 -0
  183. data/lib/mongo/error/unexpected_response.rb +3 -0
  184. data/lib/mongo/error/unknown_payload_type.rb +3 -0
  185. data/lib/mongo/error/unmet_dependency.rb +24 -0
  186. data/lib/mongo/error/unsupported_array_filters.rb +3 -0
  187. data/lib/mongo/error/unsupported_collation.rb +3 -0
  188. data/lib/mongo/error/unsupported_features.rb +3 -0
  189. data/lib/mongo/error/unsupported_message_type.rb +3 -0
  190. data/lib/mongo/error/unsupported_option.rb +17 -12
  191. data/lib/mongo/error/write_retryable.rb +3 -0
  192. data/lib/mongo/event.rb +3 -0
  193. data/lib/mongo/event/base.rb +3 -0
  194. data/lib/mongo/event/listeners.rb +3 -0
  195. data/lib/mongo/event/publisher.rb +3 -0
  196. data/lib/mongo/event/subscriber.rb +3 -0
  197. data/lib/mongo/grid.rb +3 -0
  198. data/lib/mongo/grid/file.rb +3 -0
  199. data/lib/mongo/grid/file/chunk.rb +4 -1
  200. data/lib/mongo/grid/file/info.rb +3 -0
  201. data/lib/mongo/grid/fs_bucket.rb +65 -44
  202. data/lib/mongo/grid/stream.rb +3 -0
  203. data/lib/mongo/grid/stream/read.rb +22 -7
  204. data/lib/mongo/grid/stream/write.rb +3 -0
  205. data/lib/mongo/id.rb +3 -0
  206. data/lib/mongo/index.rb +3 -0
  207. data/lib/mongo/index/view.rb +24 -11
  208. data/lib/mongo/lint.rb +5 -1
  209. data/lib/mongo/loggable.rb +3 -0
  210. data/lib/mongo/logger.rb +6 -3
  211. data/lib/mongo/monitoring.rb +20 -8
  212. data/lib/mongo/monitoring/cmap_log_subscriber.rb +3 -0
  213. data/lib/mongo/monitoring/command_log_subscriber.rb +3 -0
  214. data/lib/mongo/monitoring/event.rb +3 -0
  215. data/lib/mongo/monitoring/event/cmap.rb +3 -0
  216. data/lib/mongo/monitoring/event/cmap/base.rb +3 -0
  217. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +3 -0
  218. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +3 -0
  219. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +3 -0
  220. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +3 -0
  221. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +3 -0
  222. data/lib/mongo/monitoring/event/cmap/connection_created.rb +3 -0
  223. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +3 -0
  224. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +3 -0
  225. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +3 -0
  226. data/lib/mongo/monitoring/event/cmap/pool_created.rb +3 -0
  227. data/lib/mongo/monitoring/event/command_failed.rb +32 -5
  228. data/lib/mongo/monitoring/event/command_started.rb +20 -2
  229. data/lib/mongo/monitoring/event/command_succeeded.rb +29 -3
  230. data/lib/mongo/monitoring/event/secure.rb +39 -5
  231. data/lib/mongo/monitoring/event/server_closed.rb +3 -0
  232. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -1
  233. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +32 -18
  234. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +3 -0
  235. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +30 -16
  236. data/lib/mongo/monitoring/event/server_opening.rb +3 -0
  237. data/lib/mongo/monitoring/event/topology_changed.rb +3 -0
  238. data/lib/mongo/monitoring/event/topology_closed.rb +3 -0
  239. data/lib/mongo/monitoring/event/topology_opening.rb +3 -0
  240. data/lib/mongo/monitoring/publishable.rb +32 -10
  241. data/lib/mongo/monitoring/sdam_log_subscriber.rb +3 -0
  242. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +3 -0
  243. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +3 -0
  244. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +3 -0
  245. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +3 -0
  246. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +3 -0
  247. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +3 -0
  248. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +3 -0
  249. data/lib/mongo/operation.rb +7 -2
  250. data/lib/mongo/operation/aggregate.rb +3 -0
  251. data/lib/mongo/operation/aggregate/command.rb +3 -0
  252. data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
  253. data/lib/mongo/operation/aggregate/result.rb +12 -8
  254. data/lib/mongo/operation/collections_info.rb +21 -1
  255. data/lib/mongo/operation/collections_info/command.rb +5 -2
  256. data/lib/mongo/operation/collections_info/result.rb +5 -0
  257. data/lib/mongo/operation/command.rb +3 -0
  258. data/lib/mongo/operation/command/command.rb +3 -0
  259. data/lib/mongo/operation/command/op_msg.rb +3 -0
  260. data/lib/mongo/operation/context.rb +102 -0
  261. data/lib/mongo/operation/count.rb +3 -0
  262. data/lib/mongo/operation/count/command.rb +3 -0
  263. data/lib/mongo/operation/count/op_msg.rb +3 -0
  264. data/lib/mongo/operation/create.rb +3 -0
  265. data/lib/mongo/operation/create/command.rb +3 -0
  266. data/lib/mongo/operation/create/op_msg.rb +3 -0
  267. data/lib/mongo/operation/create_index.rb +3 -0
  268. data/lib/mongo/operation/create_index/command.rb +3 -0
  269. data/lib/mongo/operation/create_index/op_msg.rb +3 -0
  270. data/lib/mongo/operation/create_user.rb +3 -0
  271. data/lib/mongo/operation/create_user/command.rb +3 -0
  272. data/lib/mongo/operation/create_user/op_msg.rb +3 -0
  273. data/lib/mongo/operation/delete.rb +3 -0
  274. data/lib/mongo/operation/delete/bulk_result.rb +5 -0
  275. data/lib/mongo/operation/delete/command.rb +3 -0
  276. data/lib/mongo/operation/delete/legacy.rb +3 -0
  277. data/lib/mongo/operation/delete/op_msg.rb +3 -0
  278. data/lib/mongo/operation/delete/result.rb +6 -0
  279. data/lib/mongo/operation/distinct.rb +3 -0
  280. data/lib/mongo/operation/distinct/command.rb +3 -0
  281. data/lib/mongo/operation/distinct/op_msg.rb +3 -0
  282. data/lib/mongo/operation/drop.rb +3 -0
  283. data/lib/mongo/operation/drop/command.rb +3 -0
  284. data/lib/mongo/operation/drop/op_msg.rb +3 -0
  285. data/lib/mongo/operation/drop_database.rb +3 -0
  286. data/lib/mongo/operation/drop_database/command.rb +3 -0
  287. data/lib/mongo/operation/drop_database/op_msg.rb +3 -0
  288. data/lib/mongo/operation/drop_index.rb +3 -0
  289. data/lib/mongo/operation/drop_index/command.rb +3 -0
  290. data/lib/mongo/operation/drop_index/op_msg.rb +3 -0
  291. data/lib/mongo/operation/explain.rb +3 -0
  292. data/lib/mongo/operation/explain/command.rb +7 -0
  293. data/lib/mongo/operation/explain/legacy.rb +7 -0
  294. data/lib/mongo/operation/explain/op_msg.rb +9 -0
  295. data/lib/mongo/operation/explain/result.rb +6 -0
  296. data/lib/mongo/operation/find.rb +3 -0
  297. data/lib/mongo/operation/find/command.rb +3 -0
  298. data/lib/mongo/operation/find/legacy.rb +3 -0
  299. data/lib/mongo/operation/find/legacy/result.rb +5 -0
  300. data/lib/mongo/operation/find/op_msg.rb +3 -0
  301. data/lib/mongo/operation/find/result.rb +16 -0
  302. data/lib/mongo/operation/get_more.rb +3 -0
  303. data/lib/mongo/operation/get_more/command.rb +3 -0
  304. data/lib/mongo/operation/get_more/legacy.rb +3 -0
  305. data/lib/mongo/operation/get_more/op_msg.rb +3 -0
  306. data/lib/mongo/operation/get_more/result.rb +6 -0
  307. data/lib/mongo/operation/indexes.rb +18 -1
  308. data/lib/mongo/operation/indexes/command.rb +3 -0
  309. data/lib/mongo/operation/indexes/legacy.rb +3 -0
  310. data/lib/mongo/operation/indexes/op_msg.rb +3 -0
  311. data/lib/mongo/operation/indexes/result.rb +8 -0
  312. data/lib/mongo/operation/insert.rb +3 -0
  313. data/lib/mongo/operation/insert/bulk_result.rb +8 -0
  314. data/lib/mongo/operation/insert/command.rb +5 -2
  315. data/lib/mongo/operation/insert/legacy.rb +5 -2
  316. data/lib/mongo/operation/insert/op_msg.rb +5 -2
  317. data/lib/mongo/operation/insert/result.rb +8 -0
  318. data/lib/mongo/operation/kill_cursors.rb +3 -0
  319. data/lib/mongo/operation/kill_cursors/command.rb +3 -0
  320. data/lib/mongo/operation/kill_cursors/legacy.rb +3 -0
  321. data/lib/mongo/operation/kill_cursors/op_msg.rb +3 -0
  322. data/lib/mongo/operation/list_collections.rb +3 -0
  323. data/lib/mongo/operation/list_collections/command.rb +3 -0
  324. data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
  325. data/lib/mongo/operation/list_collections/result.rb +12 -1
  326. data/lib/mongo/operation/map_reduce.rb +3 -0
  327. data/lib/mongo/operation/map_reduce/command.rb +3 -0
  328. data/lib/mongo/operation/map_reduce/op_msg.rb +3 -0
  329. data/lib/mongo/operation/map_reduce/result.rb +13 -0
  330. data/lib/mongo/operation/op_msg_base.rb +3 -0
  331. data/lib/mongo/operation/parallel_scan.rb +3 -0
  332. data/lib/mongo/operation/parallel_scan/command.rb +4 -2
  333. data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
  334. data/lib/mongo/operation/parallel_scan/result.rb +7 -0
  335. data/lib/mongo/operation/remove_user.rb +3 -0
  336. data/lib/mongo/operation/remove_user/command.rb +3 -0
  337. data/lib/mongo/operation/remove_user/op_msg.rb +3 -0
  338. data/lib/mongo/operation/result.rb +40 -6
  339. data/lib/mongo/operation/shared/bypass_document_validation.rb +4 -0
  340. data/lib/mongo/operation/shared/causal_consistency_supported.rb +4 -0
  341. data/lib/mongo/operation/shared/executable.rb +25 -14
  342. data/lib/mongo/operation/shared/executable_no_validate.rb +5 -2
  343. data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -0
  344. data/lib/mongo/operation/shared/idable.rb +5 -1
  345. data/lib/mongo/operation/shared/limited.rb +4 -0
  346. data/lib/mongo/operation/shared/object_id_generator.rb +4 -0
  347. data/lib/mongo/operation/shared/op_msg_or_command.rb +4 -7
  348. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +4 -7
  349. data/lib/mongo/operation/shared/polymorphic_lookup.rb +3 -0
  350. data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
  351. data/lib/mongo/operation/shared/polymorphic_result.rb +3 -0
  352. data/lib/mongo/operation/shared/read_preference_supported.rb +41 -36
  353. data/lib/mongo/operation/shared/response_handling.rb +26 -23
  354. data/lib/mongo/operation/shared/result/aggregatable.rb +4 -0
  355. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +3 -0
  356. data/lib/mongo/operation/shared/sessions_supported.rb +20 -4
  357. data/lib/mongo/operation/shared/specifiable.rb +4 -0
  358. data/lib/mongo/operation/shared/write.rb +12 -18
  359. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -0
  360. data/lib/mongo/operation/update.rb +3 -0
  361. data/lib/mongo/operation/update/bulk_result.rb +3 -0
  362. data/lib/mongo/operation/update/command.rb +3 -0
  363. data/lib/mongo/operation/update/legacy.rb +3 -0
  364. data/lib/mongo/operation/update/legacy/result.rb +10 -0
  365. data/lib/mongo/operation/update/op_msg.rb +3 -0
  366. data/lib/mongo/operation/update/result.rb +11 -0
  367. data/lib/mongo/operation/update_user.rb +3 -0
  368. data/lib/mongo/operation/update_user/command.rb +3 -0
  369. data/lib/mongo/operation/update_user/op_msg.rb +3 -0
  370. data/lib/mongo/operation/users_info.rb +3 -0
  371. data/lib/mongo/operation/users_info/command.rb +3 -0
  372. data/lib/mongo/operation/users_info/op_msg.rb +3 -0
  373. data/lib/mongo/operation/users_info/result.rb +6 -0
  374. data/lib/mongo/options.rb +3 -0
  375. data/lib/mongo/options/mapper.rb +3 -0
  376. data/lib/mongo/options/redacted.rb +3 -0
  377. data/lib/mongo/protocol.rb +3 -0
  378. data/lib/mongo/protocol/bit_vector.rb +3 -0
  379. data/lib/mongo/protocol/compressed.rb +54 -5
  380. data/lib/mongo/protocol/delete.rb +3 -0
  381. data/lib/mongo/protocol/get_more.rb +3 -0
  382. data/lib/mongo/protocol/insert.rb +3 -0
  383. data/lib/mongo/protocol/kill_cursors.rb +3 -0
  384. data/lib/mongo/protocol/message.rb +23 -2
  385. data/lib/mongo/protocol/msg.rb +39 -16
  386. data/lib/mongo/protocol/query.rb +18 -14
  387. data/lib/mongo/protocol/registry.rb +3 -0
  388. data/lib/mongo/protocol/reply.rb +3 -0
  389. data/lib/mongo/protocol/serializers.rb +3 -0
  390. data/lib/mongo/protocol/update.rb +3 -0
  391. data/lib/mongo/query_cache.rb +275 -0
  392. data/lib/mongo/retryable.rb +12 -2
  393. data/lib/mongo/semaphore.rb +3 -0
  394. data/lib/mongo/server.rb +29 -16
  395. data/lib/mongo/server/app_metadata.rb +89 -33
  396. data/lib/mongo/server/connection.rb +9 -1
  397. data/lib/mongo/server/connection_base.rb +35 -20
  398. data/lib/mongo/server/connection_common.rb +36 -3
  399. data/lib/mongo/server/connection_pool.rb +14 -6
  400. data/lib/mongo/server/connection_pool/populator.rb +3 -0
  401. data/lib/mongo/server/context.rb +3 -0
  402. data/lib/mongo/server/description.rb +35 -11
  403. data/lib/mongo/server/description/features.rb +13 -9
  404. data/lib/mongo/server/monitor.rb +27 -14
  405. data/lib/mongo/server/monitor/app_metadata.rb +4 -1
  406. data/lib/mongo/server/monitor/connection.rb +60 -50
  407. data/lib/mongo/server/pending_connection.rb +39 -22
  408. data/lib/mongo/server/push_monitor.rb +33 -18
  409. data/lib/mongo/server/push_monitor/connection.rb +3 -0
  410. data/lib/mongo/server/round_trip_time_averager.rb +6 -3
  411. data/lib/mongo/server_selector.rb +3 -0
  412. data/lib/mongo/server_selector/base.rb +11 -4
  413. data/lib/mongo/server_selector/nearest.rb +6 -4
  414. data/lib/mongo/server_selector/primary.rb +6 -4
  415. data/lib/mongo/server_selector/primary_preferred.rb +6 -4
  416. data/lib/mongo/server_selector/secondary.rb +6 -4
  417. data/lib/mongo/server_selector/secondary_preferred.rb +8 -11
  418. data/lib/mongo/session.rb +23 -12
  419. data/lib/mongo/session/server_session.rb +3 -0
  420. data/lib/mongo/session/session_pool.rb +7 -2
  421. data/lib/mongo/socket.rb +42 -10
  422. data/lib/mongo/socket/ocsp_cache.rb +100 -0
  423. data/lib/mongo/socket/ocsp_verifier.rb +376 -0
  424. data/lib/mongo/socket/ssl.rb +56 -24
  425. data/lib/mongo/socket/tcp.rb +3 -0
  426. data/lib/mongo/socket/unix.rb +3 -0
  427. data/lib/mongo/srv.rb +3 -0
  428. data/lib/mongo/srv/monitor.rb +10 -24
  429. data/lib/mongo/srv/resolver.rb +17 -10
  430. data/lib/mongo/srv/result.rb +3 -0
  431. data/lib/mongo/timeout.rb +5 -0
  432. data/lib/mongo/topology_version.rb +4 -1
  433. data/lib/mongo/uri.rb +24 -390
  434. data/lib/mongo/uri/options_mapper.rb +623 -0
  435. data/lib/mongo/uri/srv_protocol.rb +6 -2
  436. data/lib/mongo/utils.rb +57 -1
  437. data/lib/mongo/version.rb +4 -1
  438. data/lib/mongo/write_concern.rb +3 -0
  439. data/lib/mongo/write_concern/acknowledged.rb +3 -0
  440. data/lib/mongo/write_concern/base.rb +3 -0
  441. data/lib/mongo/write_concern/unacknowledged.rb +3 -0
  442. data/spec/NOTES.aws-auth.md +12 -7
  443. data/spec/README.md +87 -2
  444. data/spec/atlas/atlas_connectivity_spec.rb +3 -0
  445. data/spec/atlas/operations_spec.rb +3 -0
  446. data/spec/integration/auth_spec.rb +28 -15
  447. data/spec/integration/awaited_ismaster_spec.rb +8 -5
  448. data/spec/integration/aws_auth_request_spec.rb +3 -0
  449. data/spec/integration/aws_credentials_retriever_spec.rb +3 -0
  450. data/spec/integration/bson_symbol_spec.rb +4 -1
  451. data/spec/integration/bulk_insert_spec.rb +3 -0
  452. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  453. data/spec/integration/bulk_write_spec.rb +51 -0
  454. data/spec/integration/change_stream_examples_spec.rb +3 -0
  455. data/spec/integration/change_stream_spec.rb +8 -5
  456. data/spec/integration/check_clean_slate_spec.rb +3 -0
  457. data/spec/integration/client_authentication_options_spec.rb +76 -36
  458. data/spec/integration/client_connectivity_spec.rb +4 -1
  459. data/spec/integration/client_construction_aws_auth_spec.rb +3 -0
  460. data/spec/integration/client_construction_spec.rb +3 -0
  461. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +3 -0
  462. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +3 -0
  463. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -0
  464. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +3 -0
  465. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +3 -0
  466. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +3 -0
  467. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +3 -0
  468. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +4 -1
  469. data/spec/integration/client_side_encryption/client_close_spec.rb +3 -0
  470. data/spec/integration/client_side_encryption/corpus_spec.rb +3 -0
  471. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +3 -0
  472. data/spec/integration/client_side_encryption/data_key_spec.rb +3 -0
  473. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +3 -0
  474. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +3 -0
  475. data/spec/integration/client_side_encryption/views_spec.rb +3 -0
  476. data/spec/integration/client_spec.rb +5 -2
  477. data/spec/integration/client_update_spec.rb +3 -0
  478. data/spec/integration/collection_indexes_prose_spec.rb +3 -0
  479. data/spec/integration/command_monitoring_spec.rb +63 -25
  480. data/spec/integration/command_spec.rb +3 -0
  481. data/spec/integration/connect_single_rs_name_spec.rb +6 -3
  482. data/spec/integration/connection_pool_populator_spec.rb +7 -2
  483. data/spec/integration/connection_spec.rb +12 -7
  484. data/spec/integration/crud_spec.rb +31 -0
  485. data/spec/integration/cursor_reaping_spec.rb +57 -18
  486. data/spec/integration/docs_examples_spec.rb +11 -1
  487. data/spec/integration/error_detection_spec.rb +3 -0
  488. data/spec/integration/fork_reconnect_spec.rb +64 -3
  489. data/spec/integration/get_more_spec.rb +3 -0
  490. data/spec/integration/grid_fs_bucket_spec.rb +4 -1
  491. data/spec/integration/heartbeat_events_spec.rb +7 -4
  492. data/spec/integration/mmapv1_spec.rb +3 -0
  493. data/spec/integration/mongos_pinning_spec.rb +3 -0
  494. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  495. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  496. data/spec/integration/ocsp_verifier_spec.rb +355 -0
  497. data/spec/integration/operation_failure_code_spec.rb +4 -1
  498. data/spec/integration/operation_failure_message_spec.rb +90 -0
  499. data/spec/integration/query_cache_spec.rb +1048 -0
  500. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  501. data/spec/integration/read_concern_spec.rb +3 -0
  502. data/spec/integration/read_preference_spec.rb +3 -0
  503. data/spec/integration/reconnect_spec.rb +4 -1
  504. data/spec/integration/retryable_errors_spec.rb +3 -0
  505. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +3 -0
  506. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +4 -0
  507. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +3 -0
  508. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +3 -0
  509. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +3 -0
  510. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +5 -0
  511. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -0
  512. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +3 -0
  513. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +3 -0
  514. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +3 -0
  515. data/spec/integration/retryable_writes/shared/supports_retries.rb +3 -0
  516. data/spec/integration/retryable_writes_errors_spec.rb +3 -0
  517. data/spec/integration/sdam_error_handling_spec.rb +74 -3
  518. data/spec/integration/sdam_events_spec.rb +14 -10
  519. data/spec/integration/sdam_prose_spec.rb +4 -1
  520. data/spec/integration/secondary_reads_spec.rb +102 -0
  521. data/spec/integration/server_description_spec.rb +3 -0
  522. data/spec/integration/server_monitor_spec.rb +4 -1
  523. data/spec/integration/server_selection_spec.rb +39 -0
  524. data/spec/integration/server_selector_spec.rb +3 -0
  525. data/spec/integration/server_spec.rb +3 -0
  526. data/spec/integration/shell_examples_spec.rb +3 -0
  527. data/spec/integration/size_limit_spec.rb +3 -0
  528. data/spec/integration/snappy_compression_spec.rb +28 -0
  529. data/spec/integration/srv_monitoring_spec.rb +42 -4
  530. data/spec/integration/srv_spec.rb +59 -0
  531. data/spec/integration/ssl_uri_options_spec.rb +3 -0
  532. data/spec/integration/step_down_spec.rb +3 -0
  533. data/spec/integration/time_zone_querying_spec.rb +3 -0
  534. data/spec/integration/transactions_api_examples_spec.rb +3 -0
  535. data/spec/integration/transactions_examples_spec.rb +26 -7
  536. data/spec/integration/truncated_utf8_spec.rb +26 -0
  537. data/spec/integration/versioned_api_examples_spec.rb +69 -0
  538. data/spec/integration/x509_auth_spec.rb +4 -1
  539. data/spec/integration/zlib_compression_spec.rb +4 -1
  540. data/spec/integration/zstd_compression_spec.rb +29 -0
  541. data/spec/kerberos/kerberos_spec.rb +3 -0
  542. data/spec/lite_spec_helper.rb +18 -4
  543. data/spec/mongo/address/ipv4_spec.rb +3 -0
  544. data/spec/mongo/address/ipv6_spec.rb +3 -0
  545. data/spec/mongo/address/unix_spec.rb +3 -0
  546. data/spec/mongo/address/validator_spec.rb +3 -0
  547. data/spec/mongo/address_spec.rb +19 -12
  548. data/spec/mongo/auth/aws/request_region_spec.rb +3 -0
  549. data/spec/mongo/auth/aws/request_spec.rb +3 -0
  550. data/spec/mongo/auth/cr_spec.rb +3 -0
  551. data/spec/mongo/auth/gssapi/conversation_spec.rb +3 -0
  552. data/spec/mongo/auth/invalid_mechanism_spec.rb +3 -0
  553. data/spec/mongo/auth/ldap/conversation_spec.rb +4 -1
  554. data/spec/mongo/auth/ldap_spec.rb +8 -1
  555. data/spec/mongo/auth/scram/conversation_spec.rb +3 -0
  556. data/spec/mongo/auth/scram256/conversation_spec.rb +3 -0
  557. data/spec/mongo/auth/scram_negotiation_spec.rb +4 -1
  558. data/spec/mongo/auth/scram_spec.rb +4 -1
  559. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  560. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  561. data/spec/mongo/auth/user/view_spec.rb +3 -0
  562. data/spec/mongo/auth/user_spec.rb +4 -1
  563. data/spec/mongo/auth/x509/conversation_spec.rb +6 -3
  564. data/spec/mongo/auth/x509_spec.rb +3 -0
  565. data/spec/mongo/auth_spec.rb +3 -0
  566. data/spec/mongo/bson_spec.rb +3 -0
  567. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
  568. data/spec/mongo/bulk_write/result_spec.rb +3 -0
  569. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
  570. data/spec/mongo/bulk_write_spec.rb +5 -2
  571. data/spec/mongo/caching_cursor_spec.rb +73 -0
  572. data/spec/mongo/client_construction_spec.rb +268 -36
  573. data/spec/mongo/client_encryption_spec.rb +3 -0
  574. data/spec/mongo/client_spec.rb +67 -0
  575. data/spec/mongo/cluster/cursor_reaper_spec.rb +3 -0
  576. data/spec/mongo/cluster/periodic_executor_spec.rb +3 -0
  577. data/spec/mongo/cluster/socket_reaper_spec.rb +3 -0
  578. data/spec/mongo/cluster/topology/replica_set_spec.rb +13 -10
  579. data/spec/mongo/cluster/topology/sharded_spec.rb +6 -3
  580. data/spec/mongo/cluster/topology/single_spec.rb +20 -8
  581. data/spec/mongo/cluster/topology/unknown_spec.rb +4 -1
  582. data/spec/mongo/cluster/topology_spec.rb +4 -1
  583. data/spec/mongo/cluster_spec.rb +10 -18
  584. data/spec/mongo/cluster_time_spec.rb +3 -0
  585. data/spec/mongo/collection/view/aggregation_spec.rb +3 -0
  586. data/spec/mongo/collection/view/builder/find_command_spec.rb +3 -0
  587. data/spec/mongo/collection/view/builder/flags_spec.rb +3 -0
  588. data/spec/mongo/collection/view/builder/modifiers_spec.rb +3 -0
  589. data/spec/mongo/collection/view/builder/op_query_spec.rb +3 -0
  590. data/spec/mongo/collection/view/change_stream_resume_spec.rb +8 -3
  591. data/spec/mongo/collection/view/change_stream_spec.rb +16 -0
  592. data/spec/mongo/collection/view/explainable_spec.rb +90 -4
  593. data/spec/mongo/collection/view/immutable_spec.rb +3 -0
  594. data/spec/mongo/collection/view/iterable_spec.rb +3 -0
  595. data/spec/mongo/collection/view/map_reduce_spec.rb +5 -0
  596. data/spec/mongo/collection/view/readable_spec.rb +69 -0
  597. data/spec/mongo/collection/view/writable_spec.rb +3 -0
  598. data/spec/mongo/collection/view_spec.rb +3 -0
  599. data/spec/mongo/collection_crud_spec.rb +4360 -0
  600. data/spec/mongo/collection_ddl_spec.rb +537 -0
  601. data/spec/mongo/collection_spec.rb +8 -4787
  602. data/spec/mongo/crypt/auto_decryption_context_spec.rb +4 -1
  603. data/spec/mongo/crypt/auto_encrypter_spec.rb +3 -0
  604. data/spec/mongo/crypt/auto_encryption_context_spec.rb +4 -1
  605. data/spec/mongo/crypt/binary_spec.rb +3 -5
  606. data/spec/mongo/crypt/binding/binary_spec.rb +3 -5
  607. data/spec/mongo/crypt/binding/context_spec.rb +4 -6
  608. data/spec/mongo/crypt/binding/helpers_spec.rb +3 -5
  609. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +4 -6
  610. data/spec/mongo/crypt/binding/status_spec.rb +3 -5
  611. data/spec/mongo/crypt/binding/version_spec.rb +3 -5
  612. data/spec/mongo/crypt/binding_unloaded_spec.rb +3 -0
  613. data/spec/mongo/crypt/data_key_context_spec.rb +3 -0
  614. data/spec/mongo/crypt/encryption_io_spec.rb +3 -0
  615. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +4 -1
  616. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +4 -1
  617. data/spec/mongo/crypt/handle_spec.rb +3 -0
  618. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +3 -0
  619. data/spec/mongo/crypt/status_spec.rb +3 -5
  620. data/spec/mongo/cursor/builder/get_more_command_spec.rb +7 -2
  621. data/spec/mongo/cursor/builder/op_get_more_spec.rb +7 -2
  622. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +7 -2
  623. data/spec/mongo/cursor_spec.rb +74 -7
  624. data/spec/mongo/database_spec.rb +119 -10
  625. data/spec/mongo/dbref_spec.rb +3 -0
  626. data/spec/mongo/distinguishing_semaphore_spec.rb +3 -0
  627. data/spec/mongo/error/bulk_write_error_spec.rb +6 -3
  628. data/spec/mongo/error/crypt_error_spec.rb +3 -0
  629. data/spec/mongo/error/max_bson_size_spec.rb +3 -0
  630. data/spec/mongo/error/no_server_available_spec.rb +4 -1
  631. data/spec/mongo/error/notable_spec.rb +3 -0
  632. data/spec/mongo/error/operation_failure_heavy_spec.rb +3 -0
  633. data/spec/mongo/error/operation_failure_spec.rb +94 -31
  634. data/spec/mongo/error/parser_spec.rb +40 -6
  635. data/spec/mongo/error/unsupported_option_spec.rb +3 -0
  636. data/spec/mongo/event/publisher_spec.rb +3 -0
  637. data/spec/mongo/event/subscriber_spec.rb +3 -0
  638. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  639. data/spec/mongo/grid/file/info_spec.rb +3 -0
  640. data/spec/mongo/grid/file_spec.rb +4 -1
  641. data/spec/mongo/grid/fs_bucket_spec.rb +22 -5
  642. data/spec/mongo/grid/stream/read_spec.rb +33 -10
  643. data/spec/mongo/grid/stream/write_spec.rb +3 -0
  644. data/spec/mongo/grid/stream_spec.rb +3 -0
  645. data/spec/mongo/id_spec.rb +3 -0
  646. data/spec/mongo/index/view_spec.rb +11 -2
  647. data/spec/mongo/lint_spec.rb +3 -0
  648. data/spec/mongo/logger_spec.rb +16 -11
  649. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  650. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +3 -0
  651. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +3 -0
  652. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +3 -0
  653. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +3 -0
  654. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +3 -0
  655. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +3 -0
  656. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +3 -0
  657. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +3 -0
  658. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +3 -0
  659. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +3 -0
  660. data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
  661. data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
  662. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
  663. data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
  664. data/spec/mongo/monitoring/event/server_closed_spec.rb +4 -1
  665. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +3 -0
  666. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
  667. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
  668. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
  669. data/spec/mongo/monitoring/event/server_opening_spec.rb +4 -1
  670. data/spec/mongo/monitoring/event/topology_changed_spec.rb +4 -1
  671. data/spec/mongo/monitoring/event/topology_closed_spec.rb +4 -1
  672. data/spec/mongo/monitoring/event/topology_opening_spec.rb +4 -1
  673. data/spec/mongo/monitoring_spec.rb +3 -0
  674. data/spec/mongo/operation/aggregate/result_spec.rb +7 -2
  675. data/spec/mongo/operation/aggregate_spec.rb +5 -1
  676. data/spec/mongo/operation/collections_info_spec.rb +7 -1
  677. data/spec/mongo/operation/command_spec.rb +11 -5
  678. data/spec/mongo/operation/create_index_spec.rb +9 -3
  679. data/spec/mongo/operation/create_user_spec.rb +9 -3
  680. data/spec/mongo/operation/delete/bulk_spec.rb +12 -6
  681. data/spec/mongo/operation/delete/command_spec.rb +3 -0
  682. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -3
  683. data/spec/mongo/operation/delete_spec.rb +14 -7
  684. data/spec/mongo/operation/drop_index_spec.rb +9 -2
  685. data/spec/mongo/operation/find/legacy_spec.rb +7 -2
  686. data/spec/mongo/operation/get_more_spec.rb +6 -1
  687. data/spec/mongo/operation/indexes_spec.rb +8 -1
  688. data/spec/mongo/operation/insert/bulk_spec.rb +13 -7
  689. data/spec/mongo/operation/insert/command_spec.rb +5 -2
  690. data/spec/mongo/operation/insert/op_msg_spec.rb +6 -3
  691. data/spec/mongo/operation/insert_spec.rb +18 -12
  692. data/spec/mongo/operation/kill_cursors_spec.rb +3 -0
  693. data/spec/mongo/operation/limited_spec.rb +3 -0
  694. data/spec/mongo/operation/map_reduce_spec.rb +8 -2
  695. data/spec/mongo/operation/read_preference_legacy_spec.rb +35 -42
  696. data/spec/mongo/operation/read_preference_op_msg_spec.rb +7 -4
  697. data/spec/mongo/operation/remove_user_spec.rb +9 -3
  698. data/spec/mongo/operation/result_spec.rb +10 -5
  699. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  700. data/spec/mongo/operation/update/bulk_spec.rb +12 -6
  701. data/spec/mongo/operation/update/command_spec.rb +5 -2
  702. data/spec/mongo/operation/update/op_msg_spec.rb +6 -3
  703. data/spec/mongo/operation/update_spec.rb +13 -7
  704. data/spec/mongo/operation/update_user_spec.rb +7 -1
  705. data/spec/mongo/options/redacted_spec.rb +3 -0
  706. data/spec/mongo/protocol/compressed_spec.rb +29 -12
  707. data/spec/mongo/protocol/delete_spec.rb +3 -0
  708. data/spec/mongo/protocol/get_more_spec.rb +3 -0
  709. data/spec/mongo/protocol/insert_spec.rb +3 -0
  710. data/spec/mongo/protocol/kill_cursors_spec.rb +3 -0
  711. data/spec/mongo/protocol/msg_spec.rb +4 -1
  712. data/spec/mongo/protocol/query_spec.rb +6 -3
  713. data/spec/mongo/protocol/registry_spec.rb +3 -0
  714. data/spec/mongo/protocol/reply_spec.rb +3 -0
  715. data/spec/mongo/protocol/update_spec.rb +3 -0
  716. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  717. data/spec/mongo/query_cache_spec.rb +283 -0
  718. data/spec/mongo/retryable_spec.rb +6 -2
  719. data/spec/mongo/semaphore_spec.rb +3 -0
  720. data/spec/mongo/server/app_metadata_spec.rb +46 -21
  721. data/spec/mongo/server/connection_auth_spec.rb +6 -9
  722. data/spec/mongo/server/connection_common_spec.rb +24 -0
  723. data/spec/mongo/server/connection_pool/populator_spec.rb +6 -1
  724. data/spec/mongo/server/connection_pool_spec.rb +11 -4
  725. data/spec/mongo/server/connection_spec.rb +48 -25
  726. data/spec/mongo/server/description/features_spec.rb +3 -0
  727. data/spec/mongo/server/description_query_methods_spec.rb +4 -1
  728. data/spec/mongo/server/description_spec.rb +625 -594
  729. data/spec/mongo/server/monitor/app_metadata_spec.rb +3 -1
  730. data/spec/mongo/server/monitor/connection_spec.rb +57 -7
  731. data/spec/mongo/server/monitor_spec.rb +22 -11
  732. data/spec/mongo/server/round_trip_time_averager_spec.rb +3 -0
  733. data/spec/mongo/server_selector/nearest_spec.rb +8 -2
  734. data/spec/mongo/server_selector/primary_preferred_spec.rb +8 -2
  735. data/spec/mongo/server_selector/primary_spec.rb +8 -2
  736. data/spec/mongo/server_selector/secondary_preferred_spec.rb +14 -8
  737. data/spec/mongo/server_selector/secondary_spec.rb +8 -2
  738. data/spec/mongo/server_selector_spec.rb +7 -3
  739. data/spec/mongo/server_spec.rb +18 -2
  740. data/spec/mongo/session/server_session_spec.rb +3 -0
  741. data/spec/mongo/session/session_pool_spec.rb +3 -0
  742. data/spec/mongo/session_spec.rb +3 -0
  743. data/spec/mongo/session_transaction_spec.rb +7 -12
  744. data/spec/mongo/socket/ssl_spec.rb +47 -4
  745. data/spec/mongo/socket/tcp_spec.rb +3 -0
  746. data/spec/mongo/socket/unix_spec.rb +3 -0
  747. data/spec/mongo/socket_spec.rb +5 -2
  748. data/spec/mongo/srv/monitor_spec.rb +3 -0
  749. data/spec/mongo/srv/result_spec.rb +3 -0
  750. data/spec/mongo/timeout_spec.rb +3 -0
  751. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  752. data/spec/mongo/uri/srv_protocol_spec.rb +68 -33
  753. data/spec/mongo/uri_option_parsing_spec.rb +14 -11
  754. data/spec/mongo/uri_spec.rb +71 -41
  755. data/spec/mongo/utils_spec.rb +56 -0
  756. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  757. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  758. data/spec/mongo/write_concern_spec.rb +3 -0
  759. data/spec/runners/auth.rb +25 -1
  760. data/spec/runners/change_streams/outcome.rb +3 -0
  761. data/spec/runners/change_streams/spec.rb +3 -0
  762. data/spec/runners/change_streams/test.rb +4 -1
  763. data/spec/runners/cmap.rb +3 -0
  764. data/spec/runners/cmap/verifier.rb +3 -0
  765. data/spec/runners/command_monitoring.rb +3 -0
  766. data/spec/runners/connection_string.rb +34 -124
  767. data/spec/runners/crud.rb +22 -0
  768. data/spec/runners/crud/context.rb +3 -0
  769. data/spec/runners/crud/operation.rb +3 -0
  770. data/spec/runners/crud/outcome.rb +3 -0
  771. data/spec/runners/crud/requirement.rb +67 -3
  772. data/spec/runners/crud/spec.rb +3 -0
  773. data/spec/runners/crud/test.rb +3 -0
  774. data/spec/runners/crud/test_base.rb +3 -19
  775. data/spec/runners/crud/verifier.rb +11 -0
  776. data/spec/runners/gridfs.rb +3 -0
  777. data/spec/runners/read_write_concern_document.rb +3 -0
  778. data/spec/runners/sdam.rb +6 -3
  779. data/spec/runners/sdam/verifier.rb +3 -0
  780. data/spec/runners/server_selection.rb +4 -1
  781. data/spec/runners/server_selection_rtt.rb +4 -1
  782. data/spec/runners/transactions.rb +3 -0
  783. data/spec/runners/transactions/operation.rb +16 -2
  784. data/spec/runners/transactions/spec.rb +3 -0
  785. data/spec/runners/transactions/test.rb +6 -2
  786. data/spec/runners/unified.rb +99 -0
  787. data/spec/runners/unified/assertions.rb +282 -0
  788. data/spec/runners/unified/change_stream_operations.rb +29 -0
  789. data/spec/runners/unified/crud_operations.rb +206 -0
  790. data/spec/runners/unified/ddl_operations.rb +106 -0
  791. data/spec/runners/unified/entity_map.rb +42 -0
  792. data/spec/runners/unified/error.rb +28 -0
  793. data/spec/runners/unified/event_subscriber.rb +104 -0
  794. data/spec/runners/unified/exceptions.rb +24 -0
  795. data/spec/runners/unified/grid_fs_operations.rb +58 -0
  796. data/spec/runners/unified/support_operations.rb +253 -0
  797. data/spec/runners/unified/test.rb +423 -0
  798. data/spec/runners/unified/test_group.rb +31 -0
  799. data/spec/runners/unified/using_hash.rb +34 -0
  800. data/spec/shared/bin/get-mongodb-download-url +17 -0
  801. data/spec/shared/bin/s3-copy +45 -0
  802. data/spec/shared/bin/s3-upload +69 -0
  803. data/spec/shared/lib/mrss/cluster_config.rb +226 -0
  804. data/spec/shared/lib/mrss/constraints.rb +82 -6
  805. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  806. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  807. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  808. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  809. data/spec/shared/lib/mrss/utils.rb +15 -0
  810. data/spec/shared/share/Dockerfile.erb +322 -0
  811. data/spec/shared/share/haproxy-1.conf +16 -0
  812. data/spec/shared/share/haproxy-2.conf +17 -0
  813. data/spec/shared/shlib/distro.sh +73 -0
  814. data/spec/shared/shlib/server.sh +317 -0
  815. data/spec/shared/shlib/set_env.sh +131 -0
  816. data/spec/solo/clean_exit_spec.rb +24 -0
  817. data/spec/spec_helper.rb +11 -4
  818. data/spec/spec_tests/auth_spec.rb +30 -13
  819. data/spec/spec_tests/change_streams_spec.rb +3 -0
  820. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  821. data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
  822. data/spec/spec_tests/cmap_spec.rb +10 -3
  823. data/spec/spec_tests/collection_management_spec.rb +13 -0
  824. data/spec/spec_tests/command_monitoring_spec.rb +31 -26
  825. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  826. data/spec/spec_tests/connection_string_spec.rb +3 -0
  827. data/spec/spec_tests/crud_spec.rb +3 -0
  828. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  829. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +5 -6
  830. data/spec/spec_tests/data/change_streams/{change-streams-resume-whitelist.yml → change-streams-resume-allowlist.yml} +58 -58
  831. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +46 -46
  832. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -2
  833. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  834. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  835. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  836. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  837. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  838. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  839. data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
  840. data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
  841. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  842. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  843. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +1 -0
  844. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +1 -0
  845. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +1 -1
  846. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +6 -5
  847. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -0
  848. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +6 -5
  849. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -0
  850. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +6 -5
  851. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -0
  852. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +1 -1
  853. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +1 -1
  854. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +1 -1
  855. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  856. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  857. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  858. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +3 -1
  859. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +1 -1
  860. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +1 -1
  861. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +1 -1
  862. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +1 -1
  863. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +1 -1
  864. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +1 -1
  865. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +1 -1
  866. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +1 -1
  867. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +1 -1
  868. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +1 -1
  869. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +1 -1
  870. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  871. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +1 -1
  872. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +30 -24
  873. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +5 -4
  874. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +2 -1
  875. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +2 -1
  876. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +2 -1
  877. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +2 -1
  878. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +2 -1
  879. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  880. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml} +5 -4
  881. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterOrSecondary.yml → non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml} +5 -4
  882. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMaster.yml → non-stale-topologyVersion-greater-NotWritablePrimary.yml} +5 -4
  883. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +2 -1
  884. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +2 -1
  885. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +2 -1
  886. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +2 -1
  887. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  888. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml} +5 -4
  889. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterOrSecondary.yml → non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml} +5 -4
  890. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMaster.yml → non-stale-topologyVersion-missing-NotWritablePrimary.yml} +5 -4
  891. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +2 -1
  892. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +2 -1
  893. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +2 -1
  894. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +2 -1
  895. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  896. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml} +5 -4
  897. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml} +5 -4
  898. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMaster.yml → non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml} +5 -4
  899. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +2 -1
  900. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +2 -1
  901. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +2 -1
  902. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +2 -1
  903. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  904. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterNoSlaveOk.yml → post-42-NotPrimaryNoSecondaryOk.yml} +5 -4
  905. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterOrSecondary.yml → post-42-NotPrimaryOrSecondary.yml} +5 -4
  906. data/spec/spec_tests/data/sdam/errors/{post-42-NotMaster.yml → post-42-NotWritablePrimary.yml} +5 -4
  907. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +2 -1
  908. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +2 -1
  909. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +2 -1
  910. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +2 -1
  911. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMaster.yml → pre-42-LegacyNotPrimary.yml} +6 -5
  912. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  913. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterOrSecondary.yml → pre-42-NotPrimaryOrSecondary.yml} +5 -4
  914. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterNoSlaveOk.yml → pre-42-NotWritablePrimary.yml} +6 -5
  915. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +2 -1
  916. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +2 -1
  917. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  918. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +4 -2
  919. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +4 -2
  920. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterNoSlaveOk.yml → stale-generation-NotPrimaryNoSecondaryOk.yml} +7 -5
  921. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterOrSecondary.yml → stale-generation-NotPrimaryOrSecondary.yml} +7 -5
  922. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMaster.yml → stale-generation-NotWritablePrimary.yml} +7 -5
  923. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +4 -2
  924. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +4 -2
  925. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  926. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  927. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMaster.yml → stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  928. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  929. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  930. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  931. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  932. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +4 -2
  933. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +6 -4
  934. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +6 -4
  935. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  936. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  937. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMaster.yml → stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  938. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  939. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  940. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  941. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  942. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +4 -2
  943. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +6 -4
  944. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +6 -4
  945. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +2 -1
  946. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +2 -1
  947. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  948. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterNoSlaveOk.yml → stale-topologyVersion-NotPrimaryNoSecondaryOk.yml} +7 -6
  949. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterOrSecondary.yml → stale-topologyVersion-NotPrimaryOrSecondary.yml} +7 -6
  950. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMaster.yml → stale-topologyVersion-NotWritablePrimary.yml} +7 -6
  951. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +2 -1
  952. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +2 -1
  953. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  954. data/spec/spec_tests/data/sdam/rs/compatible.yml +4 -2
  955. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -1
  956. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -1
  957. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +2 -1
  958. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +2 -1
  959. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +2 -1
  960. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +2 -1
  961. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +2 -1
  962. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +4 -2
  963. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +4 -2
  964. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -1
  965. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +2 -1
  966. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +2 -1
  967. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +4 -2
  968. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -1
  969. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +2 -1
  970. data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
  971. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
  972. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
  973. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +3 -1
  974. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +3 -1
  975. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +3 -1
  976. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
  977. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
  978. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
  979. data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
  980. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
  981. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
  982. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
  983. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
  984. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
  985. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
  986. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +8 -4
  987. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
  988. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
  989. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
  990. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
  991. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
  992. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
  993. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
  994. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
  995. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +2 -1
  996. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +5 -3
  997. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
  998. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +4 -2
  999. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
  1000. data/spec/spec_tests/data/sdam/rs/repeated.yml +9 -5
  1001. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +2 -1
  1002. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
  1003. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
  1004. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +4 -2
  1005. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +2 -1
  1006. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
  1007. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
  1008. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +4 -2
  1009. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
  1010. data/spec/spec_tests/data/sdam/rs/too_new.yml +4 -2
  1011. data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
  1012. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +4 -2
  1013. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +10 -5
  1014. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +4 -2
  1015. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
  1016. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +6 -3
  1017. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
  1018. data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
  1019. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +2 -1
  1020. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
  1021. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
  1022. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
  1023. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
  1024. data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
  1025. data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
  1026. data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
  1027. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +2 -1
  1028. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -1
  1029. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +2 -1
  1030. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -1
  1031. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -1
  1032. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -1
  1033. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -1
  1034. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +4 -2
  1035. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +2 -1
  1036. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
  1037. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
  1038. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
  1039. data/spec/spec_tests/data/sdam/single/{direct_connection_slave.yml → standalone_using_legacy_hello.yml} +3 -3
  1040. data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
  1041. data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
  1042. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +4 -2
  1043. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +1 -1
  1044. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +2 -2
  1045. data/spec/spec_tests/data/sdam_integration/{isMaster-command-error.yml → hello-command-error.yml} +19 -29
  1046. data/spec/spec_tests/data/sdam_integration/{isMaster-network-error.yml → hello-network-error.yml} +9 -15
  1047. data/spec/spec_tests/data/sdam_integration/{isMaster-timeout.yml → hello-timeout.yml} +7 -13
  1048. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +14 -3
  1049. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +2 -4
  1050. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +2 -1
  1051. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +2 -1
  1052. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +3 -2
  1053. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +2 -1
  1054. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +3 -3
  1055. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  1056. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +4 -4
  1057. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  1058. data/spec/spec_tests/data/transactions/error-labels.yml +3 -0
  1059. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
  1060. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +2 -0
  1061. data/spec/spec_tests/data/transactions/pin-mongos.yml +6 -3
  1062. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1063. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1064. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  1065. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1066. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1067. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1068. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1069. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1070. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1071. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1072. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1073. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  1074. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  1075. data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
  1076. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  1077. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  1078. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  1079. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
  1080. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
  1081. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1082. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1083. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1084. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1085. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +12 -1
  1086. data/spec/spec_tests/gridfs_spec.rb +3 -0
  1087. data/spec/spec_tests/max_staleness_spec.rb +3 -0
  1088. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +3 -0
  1089. data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
  1090. data/spec/spec_tests/read_write_concern_operaton_spec.rb +3 -0
  1091. data/spec/spec_tests/retryable_reads_spec.rb +3 -0
  1092. data/spec/spec_tests/retryable_writes_spec.rb +9 -6
  1093. data/spec/spec_tests/sdam_integration_spec.rb +3 -0
  1094. data/spec/spec_tests/sdam_monitoring_spec.rb +4 -1
  1095. data/spec/spec_tests/sdam_spec.rb +4 -1
  1096. data/spec/spec_tests/server_selection_rtt_spec.rb +3 -0
  1097. data/spec/spec_tests/server_selection_spec.rb +3 -0
  1098. data/spec/spec_tests/transactions_api_spec.rb +3 -0
  1099. data/spec/spec_tests/transactions_spec.rb +3 -0
  1100. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1101. data/spec/spec_tests/unified_spec.rb +18 -0
  1102. data/spec/spec_tests/uri_options_spec.rb +50 -33
  1103. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1104. data/spec/stress/cleanup_spec.rb +3 -0
  1105. data/spec/stress/connection_pool_stress_spec.rb +3 -0
  1106. data/spec/stress/connection_pool_timing_spec.rb +3 -0
  1107. data/spec/stress/fork_reconnect_stress_spec.rb +7 -4
  1108. data/spec/support/authorization.rb +3 -0
  1109. data/spec/support/aws_utils.rb +3 -0
  1110. data/spec/support/aws_utils/base.rb +3 -0
  1111. data/spec/support/aws_utils/inspector.rb +3 -0
  1112. data/spec/support/aws_utils/orchestrator.rb +3 -0
  1113. data/spec/support/aws_utils/provisioner.rb +3 -0
  1114. data/spec/support/background_thread_registry.rb +4 -1
  1115. data/spec/support/certificates/README.md +3 -2
  1116. data/spec/support/certificates/atlas-ocsp-ca.crt +118 -0
  1117. data/spec/support/certificates/atlas-ocsp.crt +152 -0
  1118. data/spec/support/client_registry.rb +12 -5
  1119. data/spec/support/client_registry_macros.rb +17 -5
  1120. data/spec/support/cluster_tools.rb +4 -1
  1121. data/spec/support/common_shortcuts.rb +84 -6
  1122. data/spec/support/constraints.rb +9 -253
  1123. data/spec/support/crypt.rb +3 -0
  1124. data/spec/support/dns.rb +3 -0
  1125. data/spec/support/event_subscriber.rb +9 -0
  1126. data/spec/support/json_ext_formatter.rb +3 -0
  1127. data/spec/support/keyword_struct.rb +3 -0
  1128. data/spec/support/local_resource_registry.rb +3 -0
  1129. data/spec/support/matchers.rb +20 -1
  1130. data/spec/support/monitoring_ext.rb +3 -0
  1131. data/spec/support/ocsp +1 -0
  1132. data/spec/support/primary_socket.rb +3 -0
  1133. data/spec/support/sdam_formatter_integration.rb +3 -0
  1134. data/spec/support/session_registry.rb +55 -0
  1135. data/spec/{mongo/server/app_metadata_shared.rb → support/shared/app_metadata.rb} +39 -8
  1136. data/spec/support/shared/protocol.rb +3 -0
  1137. data/spec/support/shared/scram_conversation.rb +3 -0
  1138. data/spec/support/shared/server_selector.rb +6 -3
  1139. data/spec/support/shared/session.rb +5 -2
  1140. data/spec/support/spec_config.rb +111 -12
  1141. data/spec/support/spec_setup.rb +51 -38
  1142. data/spec/support/utils.rb +106 -5
  1143. metadata +1177 -982
  1144. metadata.gz.sig +3 -2
  1145. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
  1146. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  1147. data/spec/support/child_process_helper.rb +0 -78
  1148. data/spec/support/cluster_config.rb +0 -207
  1149. data/spec/support/lite_constraints.rb +0 -141
  1150. data/spec/support/spec_organizer.rb +0 -129
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require 'spec_helper'
2
5
 
3
6
  describe Mongo::Server::Description::Features do
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require 'spec_helper'
2
5
 
3
6
  # For conciseness these tests are arranged by description types
@@ -93,7 +96,7 @@ describe Mongo::Server::Description do
93
96
  end
94
97
 
95
98
  context 'primary' do
96
- let(:desc_options) { {'ismaster' => true,
99
+ let(:desc_options) { {'isWritablePrimary' => true,
97
100
  'minWireVersion' => 2, 'maxWireVersion' => 8,
98
101
  'setName' => 'foo', 'ok' => ok} }
99
102
 
@@ -1,815 +1,846 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require 'spec_helper'
2
5
 
3
6
  describe Mongo::Server::Description do
4
7
 
5
- let(:replica) do
6
- {
7
- 'setName' => 'mongodb_set',
8
- 'ismaster' => true,
9
- 'secondary' => false,
10
- 'hosts' => [
11
- '127.0.0.1:27018',
12
- '127.0.0.1:27019'
13
- ],
14
- 'arbiters' => [
15
- '127.0.0.1:27120'
16
- ],
17
- 'primary' => authorized_primary.address.to_s,
18
- 'tags' => { 'rack' => 'a' },
19
- 'me' => '127.0.0.1:27019',
20
- 'maxBsonObjectSize' => 16777216,
21
- 'maxMessageSizeBytes' => 48000000,
22
- 'maxWriteBatchSize' => 1000,
23
- 'maxWireVersion' => 2,
24
- 'minWireVersion' => 1,
25
- 'localTime' => Time.now,
26
- 'lastWrite' => { 'lastWriteDate' => Time.now },
27
- 'logicalSessionTimeoutMinutes' => 7,
28
- 'operationTime' => 1,
29
- '$clusterTime' => 1,
30
- 'ok' => 1
31
- }
32
- end
33
-
34
- let(:address) do
35
- Mongo::Address.new(authorized_primary.address.to_s)
36
- end
37
-
38
- let(:monitoring) do
39
- Mongo::Monitoring.new(monitoring: false)
40
- end
41
-
42
- declare_topology_double
43
-
44
- let(:cluster) do
45
- double('cluster').tap do |cl|
46
- allow(cl).to receive(:topology).and_return(topology)
47
- allow(cl).to receive(:app_metadata).and_return(app_metadata)
48
- allow(cl).to receive(:options).and_return({})
49
- end
50
- end
51
-
52
- describe '#initialize' do
53
- context 'when Time.now is mocked' do
54
- it 'does not freeze mocked time' do
55
- obj = Time.now
56
- expect(Time).to receive(:now).at_least(:once).and_return(obj)
57
- expect(obj.frozen?).to be false
58
-
59
- description = described_class.new(address, replica)
60
- expect(description.last_update_time).to eq(obj)
61
- expect(obj.frozen?).to be false
8
+ %w[ismaster isWritablePrimary].each do |primary_param|
9
+ context "#{primary_param} as primary parameter" do
10
+
11
+ let(:replica) do
12
+ {
13
+ 'setName' => 'mongodb_set',
14
+ primary_param => true,
15
+ 'secondary' => false,
16
+ 'hosts' => [
17
+ '127.0.0.1:27018',
18
+ '127.0.0.1:27019'
19
+ ],
20
+ 'arbiters' => [
21
+ '127.0.0.1:27120'
22
+ ],
23
+ 'primary' => authorized_primary.address.to_s,
24
+ 'tags' => { 'rack' => 'a' },
25
+ 'me' => '127.0.0.1:27019',
26
+ 'maxBsonObjectSize' => 16777216,
27
+ 'maxMessageSizeBytes' => 48000000,
28
+ 'maxWriteBatchSize' => 1000,
29
+ 'maxWireVersion' => 2,
30
+ 'minWireVersion' => 1,
31
+ 'localTime' => Time.now,
32
+ 'lastWrite' => { 'lastWriteDate' => Time.now },
33
+ 'logicalSessionTimeoutMinutes' => 7,
34
+ 'operationTime' => 1,
35
+ '$clusterTime' => 1,
36
+ 'connectionId' => 11,
37
+ 'ok' => 1
38
+ }
39
+ end
40
+
41
+ let(:address) do
42
+ Mongo::Address.new(authorized_primary.address.to_s)
43
+ end
44
+
45
+ let(:monitoring) do
46
+ Mongo::Monitoring.new(monitoring: false)
47
+ end
48
+
49
+ declare_topology_double
50
+
51
+ let(:cluster) do
52
+ double('cluster').tap do |cl|
53
+ allow(cl).to receive(:topology).and_return(topology)
54
+ allow(cl).to receive(:app_metadata).and_return(app_metadata)
55
+ allow(cl).to receive(:options).and_return({})
56
+ end
62
57
  end
63
- end
64
- end
65
58
 
66
- describe '#arbiters' do
59
+ describe '#arbiters' do
67
60
 
68
- context 'when the replica set has arbiters' do
61
+ context 'when the replica set has arbiters' do
69
62
 
70
- let(:description) do
71
- described_class.new(address, replica)
72
- end
63
+ let(:description) do
64
+ described_class.new(address, replica)
65
+ end
73
66
 
74
- it 'returns the arbiters' do
75
- expect(description.arbiters).to eq([ '127.0.0.1:27120' ])
76
- end
77
- end
67
+ it 'returns the arbiters' do
68
+ expect(description.arbiters).to eq([ '127.0.0.1:27120' ])
69
+ end
70
+ end
78
71
 
79
- context 'when the replica set has no arbiters' do
72
+ context 'when the replica set has no arbiters' do
80
73
 
81
- let(:description) do
82
- described_class.new(address, {})
83
- end
74
+ let(:description) do
75
+ described_class.new(address, {})
76
+ end
84
77
 
85
- it 'returns an empty array' do
86
- expect(description.arbiters).to be_empty
87
- end
88
- end
78
+ it 'returns an empty array' do
79
+ expect(description.arbiters).to be_empty
80
+ end
81
+ end
89
82
 
90
- context 'when the addresses are not lowercase' do
83
+ context 'when the addresses are not lowercase' do
91
84
 
92
- let(:config) do
93
- replica.merge(
94
- {
95
- 'arbiters' => [
96
- 'SERVER:27017'
97
- ],
98
- }
99
- )
100
- end
85
+ let(:config) do
86
+ replica.merge(
87
+ {
88
+ 'arbiters' => [
89
+ 'SERVER:27017'
90
+ ],
91
+ }
92
+ )
93
+ end
101
94
 
102
- let(:description) do
103
- described_class.new(address, config)
104
- end
95
+ let(:description) do
96
+ described_class.new(address, config)
97
+ end
105
98
 
106
- it 'normalizes the addresses to lowercase' do
107
- expect(description.arbiters).to eq(['server:27017'])
99
+ it 'normalizes the addresses to lowercase' do
100
+ expect(description.arbiters).to eq(['server:27017'])
101
+ end
102
+ end
108
103
  end
109
- end
110
- end
111
104
 
112
- describe '#hosts' do
105
+ describe '#hosts' do
113
106
 
114
- let(:description) do
115
- described_class.new(address, replica)
116
- end
107
+ let(:description) do
108
+ described_class.new(address, replica)
109
+ end
117
110
 
118
- it 'returns all the hosts in the replica set' do
119
- expect(description.hosts).to eq([ '127.0.0.1:27018', '127.0.0.1:27019' ])
120
- end
111
+ it 'returns all the hosts in the replica set' do
112
+ expect(description.hosts).to eq([ '127.0.0.1:27018', '127.0.0.1:27019' ])
113
+ end
121
114
 
122
- context 'when the addresses are not lowercase' do
115
+ context 'when the addresses are not lowercase' do
123
116
 
124
- let(:config) do
125
- replica.merge(
126
- {
117
+ let(:config) do
118
+ replica.merge(
119
+ {
127
120
  'hosts' => [
128
- 'SERVER:27017'
121
+ 'SERVER:27017'
129
122
  ],
130
- }
131
- )
132
- end
123
+ }
124
+ )
125
+ end
133
126
 
134
- let(:description) do
135
- described_class.new(address, config)
136
- end
127
+ let(:description) do
128
+ described_class.new(address, config)
129
+ end
137
130
 
138
- it 'normalizes the addresses to lowercase' do
139
- expect(description.hosts).to eq(['server:27017'])
131
+ it 'normalizes the addresses to lowercase' do
132
+ expect(description.hosts).to eq(['server:27017'])
133
+ end
134
+ end
140
135
  end
141
- end
142
- end
143
136
 
144
- describe '#max_bson_object_size' do
137
+ describe '#max_bson_object_size' do
145
138
 
146
- let(:description) do
147
- described_class.new(address, replica)
148
- end
139
+ let(:description) do
140
+ described_class.new(address, replica)
141
+ end
149
142
 
150
- it 'returns the value' do
151
- expect(description.max_bson_object_size).to eq(16777216)
152
- end
153
- end
143
+ it 'returns the value' do
144
+ expect(description.max_bson_object_size).to eq(16777216)
145
+ end
146
+ end
154
147
 
155
- describe '#max_message_size' do
148
+ describe '#max_message_size' do
156
149
 
157
- let(:description) do
158
- described_class.new(address, replica)
159
- end
150
+ let(:description) do
151
+ described_class.new(address, replica)
152
+ end
160
153
 
161
- it 'returns the value' do
162
- expect(description.max_message_size).to eq(48000000)
163
- end
164
- end
154
+ it 'returns the value' do
155
+ expect(description.max_message_size).to eq(48000000)
156
+ end
157
+ end
165
158
 
166
- describe '#max_write_batch_size' do
159
+ describe '#max_write_batch_size' do
167
160
 
168
- let(:description) do
169
- described_class.new(address, replica)
170
- end
161
+ let(:description) do
162
+ described_class.new(address, replica)
163
+ end
171
164
 
172
- it 'returns the value' do
173
- expect(description.max_write_batch_size).to eq(1000)
174
- end
175
- end
165
+ it 'returns the value' do
166
+ expect(description.max_write_batch_size).to eq(1000)
167
+ end
168
+ end
176
169
 
177
- describe '#max_wire_version' do
170
+ describe '#max_wire_version' do
178
171
 
179
- context 'when the max wire version is provided' do
172
+ context 'when the max wire version is provided' do
180
173
 
181
- let(:description) do
182
- described_class.new(address, replica)
183
- end
174
+ let(:description) do
175
+ described_class.new(address, replica)
176
+ end
184
177
 
185
- it 'returns the value' do
186
- expect(description.max_wire_version).to eq(2)
187
- end
188
- end
178
+ it 'returns the value' do
179
+ expect(description.max_wire_version).to eq(2)
180
+ end
181
+ end
189
182
 
190
- context 'when the max wire version is not provided' do
183
+ context 'when the max wire version is not provided' do
191
184
 
192
- let(:description) do
193
- described_class.new(address, {})
194
- end
185
+ let(:description) do
186
+ described_class.new(address, {})
187
+ end
195
188
 
196
- it 'returns the default' do
197
- expect(description.max_wire_version).to eq(0)
189
+ it 'returns the default' do
190
+ expect(description.max_wire_version).to eq(0)
191
+ end
192
+ end
198
193
  end
199
- end
200
- end
201
194
 
202
- describe '#min_wire_version' do
195
+ describe '#min_wire_version' do
203
196
 
204
- context 'when the min wire version is provided' do
197
+ context 'when the min wire version is provided' do
205
198
 
206
- let(:description) do
207
- described_class.new(address, replica)
208
- end
199
+ let(:description) do
200
+ described_class.new(address, replica)
201
+ end
209
202
 
210
- it 'returns the value' do
211
- expect(description.min_wire_version).to eq(1)
212
- end
213
- end
203
+ it 'returns the value' do
204
+ expect(description.min_wire_version).to eq(1)
205
+ end
206
+ end
214
207
 
215
- context 'when the min wire version is not provided' do
208
+ context 'when the min wire version is not provided' do
216
209
 
217
- let(:description) do
218
- described_class.new(address, {})
219
- end
210
+ let(:description) do
211
+ described_class.new(address, {})
212
+ end
220
213
 
221
- it 'returns the default' do
222
- expect(description.min_wire_version).to eq(0)
214
+ it 'returns the default' do
215
+ expect(description.min_wire_version).to eq(0)
216
+ end
217
+ end
223
218
  end
224
- end
225
- end
226
219
 
227
- describe '#tags' do
220
+ describe '#tags' do
228
221
 
229
- context 'when the server has tags' do
222
+ context 'when the server has tags' do
230
223
 
231
- let(:description) do
232
- described_class.new(address, replica)
233
- end
224
+ let(:description) do
225
+ described_class.new(address, replica)
226
+ end
234
227
 
235
- it 'returns the tags' do
236
- expect(description.tags).to eq(replica['tags'])
237
- end
238
- end
228
+ it 'returns the tags' do
229
+ expect(description.tags).to eq(replica['tags'])
230
+ end
231
+ end
239
232
 
240
- context 'when the server does not have tags' do
233
+ context 'when the server does not have tags' do
241
234
 
242
- let(:config) do
243
- { 'ismaster' => true }
244
- end
235
+ let(:config) do
236
+ { primary_param => true }
237
+ end
245
238
 
246
- let(:description) do
247
- described_class.new(address, config)
248
- end
239
+ let(:description) do
240
+ described_class.new(address, config)
241
+ end
249
242
 
250
- it 'returns an empty hash' do
251
- expect(description.tags).to eq({})
243
+ it 'returns an empty hash' do
244
+ expect(description.tags).to eq({})
245
+ end
246
+ end
252
247
  end
253
- end
254
- end
255
248
 
256
- describe '#passives' do
249
+ describe '#passives' do
257
250
 
258
- context 'when passive servers exists' do
251
+ context 'when passive servers exists' do
259
252
 
260
- let(:description) do
261
- described_class.new(address, { 'passives' => [ '127.0.0.1:27025' ] })
262
- end
253
+ let(:description) do
254
+ described_class.new(address, { 'passives' => [ '127.0.0.1:27025' ] })
255
+ end
263
256
 
264
- it 'returns a list of the passives' do
265
- expect(description.passives).to eq([ '127.0.0.1:27025' ])
266
- end
267
- end
257
+ it 'returns a list of the passives' do
258
+ expect(description.passives).to eq([ '127.0.0.1:27025' ])
259
+ end
260
+ end
268
261
 
269
- context 'when no passive servers exist' do
262
+ context 'when no passive servers exist' do
270
263
 
271
- let(:description) do
272
- described_class.new(address, replica)
273
- end
264
+ let(:description) do
265
+ described_class.new(address, replica)
266
+ end
274
267
 
275
- it 'returns an empty array' do
276
- expect(description.passives).to be_empty
277
- end
278
- end
268
+ it 'returns an empty array' do
269
+ expect(description.passives).to be_empty
270
+ end
271
+ end
279
272
 
280
- context 'when the addresses are not lowercase' do
273
+ context 'when the addresses are not lowercase' do
281
274
 
282
- let(:config) do
283
- replica.merge(
284
- {
275
+ let(:config) do
276
+ replica.merge(
277
+ {
285
278
  'passives' => [
286
- 'SERVER:27017'
279
+ 'SERVER:27017'
287
280
  ],
288
- }
289
- )
290
- end
281
+ }
282
+ )
283
+ end
291
284
 
292
- let(:description) do
293
- described_class.new(address, config)
294
- end
285
+ let(:description) do
286
+ described_class.new(address, config)
287
+ end
295
288
 
296
- it 'normalizes the addresses to lowercase' do
297
- expect(description.passives).to eq(['server:27017'])
298
- end
289
+ it 'normalizes the addresses to lowercase' do
290
+ expect(description.passives).to eq(['server:27017'])
291
+ end
299
292
 
300
- it 'normalizes the addresses to lowercase' do
293
+ it 'normalizes the addresses to lowercase' do
301
294
 
295
+ end
296
+ end
302
297
  end
303
- end
304
- end
305
298
 
306
- describe '#primary?' do
299
+ describe '#primary?' do
307
300
 
308
- context 'when the server is a primary' do
301
+ context 'when the server is a primary' do
309
302
 
310
- context 'when the hostname contains no capital letters' do
303
+ context 'when the hostname contains no capital letters' do
311
304
 
312
- let(:description) do
313
- described_class.new(address, replica)
314
- end
305
+ let(:description) do
306
+ described_class.new(address, replica)
307
+ end
308
+
309
+ it 'returns true' do
310
+ expect(description).to be_primary
311
+ end
312
+ end
313
+
314
+ context 'when the hostname contains capital letters' do
315
315
 
316
- it 'returns true' do
317
- expect(description).to be_primary
316
+ let(:description) do
317
+ described_class.new('localhost:27017',
318
+ { primary_param => true, 'ok' => 1,
319
+ 'minWireVersion' => 2, 'maxWireVersion' => 3,
320
+ 'primary' => 'LOCALHOST:27017',
321
+ 'setName' => 'itsASet!'})
322
+ end
323
+
324
+ it 'returns true' do
325
+ expect(description).to be_primary
326
+ end
327
+ end
318
328
  end
319
329
  end
320
330
 
321
- context 'when the hostname contains capital letters' do
331
+ describe '#average_round_trip_time' do
322
332
 
323
333
  let(:description) do
324
- described_class.new('localhost:27017',
325
- { 'ismaster' => true, 'ok' => 1,
326
- 'minWireVersion' => 2, 'maxWireVersion' => 3,
327
- 'primary' => 'LOCALHOST:27017',
328
- 'setName' => 'itsASet!'})
334
+ described_class.new(address, { 'secondary' => false }, 4.5)
329
335
  end
330
336
 
331
- it 'returns true' do
332
- expect(description).to be_primary
337
+ it 'defaults to nil' do
338
+ expect(described_class.new(address).average_round_trip_time).to be nil
339
+ end
340
+
341
+ it 'can be set via the constructor' do
342
+ expect(description.average_round_trip_time).to eq(4.5)
333
343
  end
334
344
  end
335
- end
336
- end
337
345
 
338
- describe '#average_round_trip_time' do
346
+ describe '#replica_set_name' do
339
347
 
340
- let(:description) do
341
- described_class.new(address, { 'secondary' => false }, 4.5)
342
- end
348
+ context 'when the server is in a replica set' do
343
349
 
344
- it 'defaults to nil' do
345
- expect(described_class.new(address).average_round_trip_time).to be nil
346
- end
350
+ let(:description) do
351
+ described_class.new(address, replica)
352
+ end
347
353
 
348
- it 'can be set via the constructor' do
349
- expect(description.average_round_trip_time).to eq(4.5)
350
- end
351
- end
354
+ it 'returns the replica set name' do
355
+ expect(description.replica_set_name).to eq('mongodb_set')
356
+ end
357
+ end
352
358
 
353
- describe '#replica_set_name' do
359
+ context 'when the server is not in a replica set' do
354
360
 
355
- context 'when the server is in a replica set' do
361
+ let(:description) do
362
+ described_class.new(address, {})
363
+ end
356
364
 
357
- let(:description) do
358
- described_class.new(address, replica)
365
+ it 'returns nil' do
366
+ expect(description.replica_set_name).to be_nil
367
+ end
368
+ end
359
369
  end
360
370
 
361
- it 'returns the replica set name' do
362
- expect(description.replica_set_name).to eq('mongodb_set')
363
- end
364
- end
371
+ describe '#servers' do
365
372
 
366
- context 'when the server is not in a replica set' do
373
+ let(:config) do
374
+ replica.merge({ 'passives' => [ '127.0.0.1:27025' ]})
375
+ end
367
376
 
368
- let(:description) do
369
- described_class.new(address, {})
370
- end
377
+ let(:description) do
378
+ described_class.new(address, config)
379
+ end
371
380
 
372
- it 'returns nil' do
373
- expect(description.replica_set_name).to be_nil
381
+ it 'returns the hosts + arbiters + passives' do
382
+ expect(description.servers).to eq(
383
+ [ '127.0.0.1:27018', '127.0.0.1:27019', '127.0.0.1:27120', '127.0.0.1:27025' ]
384
+ )
385
+ end
374
386
  end
375
- end
376
- end
377
387
 
378
- describe '#servers' do
388
+ describe '#server_type' do
379
389
 
380
- let(:config) do
381
- replica.merge({ 'passives' => [ '127.0.0.1:27025' ]})
382
- end
390
+ context 'when the server is an arbiter' do
383
391
 
384
- let(:description) do
385
- described_class.new(address, config)
386
- end
392
+ let(:description) do
393
+ described_class.new(address, { 'arbiterOnly' => true,
394
+ 'minWireVersion' => 2, 'maxWireVersion' => 3,
395
+ 'setName' => 'test', 'ok' => 1 })
396
+ end
387
397
 
388
- it 'returns the hosts + arbiters + passives' do
389
- expect(description.servers).to eq(
390
- [ '127.0.0.1:27018', '127.0.0.1:27019', '127.0.0.1:27120', '127.0.0.1:27025' ]
391
- )
392
- end
393
- end
398
+ it 'returns :arbiter' do
399
+ expect(description.server_type).to eq(:arbiter)
400
+ end
401
+ end
394
402
 
395
- describe '#server_type' do
403
+ context 'when the server is a ghost' do
396
404
 
397
- context 'when the server is an arbiter' do
405
+ let(:description) do
406
+ described_class.new(address, { 'isreplicaset' => true,
407
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
408
+ end
398
409
 
399
- let(:description) do
400
- described_class.new(address, { 'arbiterOnly' => true,
401
- 'minWireVersion' => 2, 'maxWireVersion' => 3,
402
- 'setName' => 'test', 'ok' => 1 })
403
- end
410
+ it 'returns :ghost' do
411
+ expect(description.server_type).to eq(:ghost)
412
+ end
413
+ end
404
414
 
405
- it 'returns :arbiter' do
406
- expect(description.server_type).to eq(:arbiter)
407
- end
408
- end
415
+ context 'when the server is a mongos' do
416
+
417
+ let(:config) do
418
+ { 'msg' => 'isdbgrid', primary_param => true,
419
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 }
420
+ end
421
+
422
+ let(:description) do
423
+ described_class.new(address, config)
424
+ end
425
+
426
+ it 'returns :sharded' do
427
+ expect(description.server_type).to eq(:sharded)
428
+ end
429
+
430
+ context 'when client and server addresses are different' do
431
+ let(:config) do
432
+ { 'msg' => 'isdbgrid', primary_param => true,
433
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1,
434
+ 'me' => '127.0.0.1',
435
+ }
436
+ end
437
+
438
+ let(:address) do
439
+ Mongo::Address.new('localhost')
440
+ end
441
+
442
+ it 'returns :sharded' do
443
+ expect(description.server_type).to eq(:sharded)
444
+ end
445
+ end
446
+ end
409
447
 
410
- context 'when the server is a ghost' do
448
+ context 'when the server is a primary' do
411
449
 
412
- let(:description) do
413
- described_class.new(address, { 'isreplicaset' => true,
414
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
415
- end
450
+ let(:description) do
451
+ described_class.new(address, replica)
452
+ end
416
453
 
417
- it 'returns :ghost' do
418
- expect(description.server_type).to eq(:ghost)
419
- end
420
- end
454
+ it 'returns :primary' do
455
+ expect(description.server_type).to eq(:primary)
456
+ end
457
+ end
421
458
 
422
- context 'when the server is a mongos' do
459
+ context 'when the server is a secondary' do
423
460
 
424
- let(:config) do
425
- { 'msg' => 'isdbgrid', 'ismaster' => true,
426
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 }
427
- end
461
+ let(:description) do
462
+ described_class.new(address, { 'secondary' => true,
463
+ 'minWireVersion' => 2, 'maxWireVersion' => 3,
464
+ 'setName' => 'test', 'ok' => 1 })
465
+ end
428
466
 
429
- let(:description) do
430
- described_class.new(address, config)
431
- end
467
+ it 'returns :secondary' do
468
+ expect(description.server_type).to eq(:secondary)
469
+ end
470
+ end
432
471
 
433
- it 'returns :sharded' do
434
- expect(description.server_type).to eq(:sharded)
435
- end
472
+ context 'when the server is standalone' do
436
473
 
437
- context 'when client and server addresses are different' do
438
- let(:config) do
439
- { 'msg' => 'isdbgrid', 'ismaster' => true,
440
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1,
441
- 'me' => '127.0.0.1',
442
- }
443
- end
474
+ let(:description) do
475
+ described_class.new(address, { primary_param => true,
476
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
477
+ end
444
478
 
445
- let(:address) do
446
- Mongo::Address.new('localhost')
479
+ it 'returns :standalone' do
480
+ expect(description.server_type).to eq(:standalone)
481
+ end
447
482
  end
448
483
 
449
- it 'returns :sharded' do
450
- expect(description.server_type).to eq(:sharded)
451
- end
452
- end
453
- end
484
+ context 'when the server is hidden' do
454
485
 
455
- context 'when the server is a primary' do
486
+ let(:description) do
487
+ described_class.new(address, { primary_param => false,
488
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'setName' => 'test',
489
+ 'hidden' => true, 'ok' => 1 })
490
+ end
456
491
 
457
- let(:description) do
458
- described_class.new(address, replica)
459
- end
492
+ it 'returns :other' do
493
+ expect(description.server_type).to eq(:other)
494
+ end
495
+ end
460
496
 
461
- it 'returns :primary' do
462
- expect(description.server_type).to eq(:primary)
463
- end
464
- end
497
+ context 'when the server is other' do
465
498
 
466
- context 'when the server is a secondary' do
499
+ let(:description) do
500
+ described_class.new(address, { primary_param => false,
501
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'setName' => 'test',
502
+ 'ok' => 1 })
503
+ end
467
504
 
468
- let(:description) do
469
- described_class.new(address, { 'secondary' => true,
470
- 'minWireVersion' => 2, 'maxWireVersion' => 3,
471
- 'setName' => 'test', 'ok' => 1 })
472
- end
505
+ it 'returns :other' do
506
+ expect(description.server_type).to eq(:other)
507
+ end
508
+ end
473
509
 
474
- it 'returns :secondary' do
475
- expect(description.server_type).to eq(:secondary)
476
- end
477
- end
510
+ context 'when the description has no configuration' do
478
511
 
479
- context 'when the server is standalone' do
512
+ let(:description) do
513
+ described_class.new(address)
514
+ end
480
515
 
481
- let(:description) do
482
- described_class.new(address, { 'ismaster' => true,
483
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
516
+ it 'returns :unknown' do
517
+ expect(description.server_type).to eq(:unknown)
518
+ end
519
+ end
484
520
  end
485
521
 
486
- it 'returns :standalone' do
487
- expect(description.server_type).to eq(:standalone)
488
- end
489
- end
522
+ describe '#is_server?' do
490
523
 
491
- context 'when the server is hidden' do
524
+ let(:listeners) do
525
+ Mongo::Event::Listeners.new
526
+ end
492
527
 
493
- let(:description) do
494
- described_class.new(address, { 'ismaster' => false,
495
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'setName' => 'test',
496
- 'hidden' => true, 'ok' => 1 })
497
- end
528
+ let(:server) do
529
+ Mongo::Server.new(address, cluster, monitoring, listeners,
530
+ monitoring_io: false)
531
+ end
498
532
 
499
- it 'returns :other' do
500
- expect(description.server_type).to eq(:other)
501
- end
502
- end
533
+ let(:description) do
534
+ described_class.new(address, {})
535
+ end
503
536
 
504
- context 'when the server is other' do
537
+ context 'when the server address matches the description address' do
505
538
 
506
- let(:description) do
507
- described_class.new(address, { 'ismaster' => false,
508
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'setName' => 'test',
509
- 'ok' => 1 })
510
- end
539
+ it 'returns true' do
540
+ expect(description.is_server?(server)).to be(true)
541
+ end
542
+ end
511
543
 
512
- it 'returns :other' do
513
- expect(description.server_type).to eq(:other)
514
- end
515
- end
544
+ context 'when the server address does not match the description address' do
516
545
 
517
- context 'when the description has no configuration' do
546
+ let(:other_address) do
547
+ Mongo::Address.new('127.0.0.1:27020')
548
+ end
518
549
 
519
- let(:description) do
520
- described_class.new(address)
521
- end
550
+ let(:server) do
551
+ Mongo::Server.new(other_address, cluster, monitoring, listeners,
552
+ monitoring_io: false)
553
+ end
522
554
 
523
- it 'returns :unknown' do
524
- expect(description.server_type).to eq(:unknown)
555
+ it 'returns false' do
556
+ expect(description.is_server?(server)).to be(false)
557
+ end
558
+ end
525
559
  end
526
- end
527
- end
528
560
 
529
- describe '#is_server?' do
561
+ describe '#me_mismatch?' do
530
562
 
531
- let(:listeners) do
532
- Mongo::Event::Listeners.new
533
- end
563
+ let(:description) do
564
+ described_class.new(address, config)
565
+ end
534
566
 
535
- let(:server) do
536
- Mongo::Server.new(address, cluster, monitoring, listeners,
537
- monitoring_io: false)
538
- end
567
+ context 'when the server address matches the me field' do
539
568
 
540
- let(:description) do
541
- described_class.new(address, {})
542
- end
569
+ let(:config) do
570
+ replica.merge('me' => address.to_s)
571
+ end
572
+
573
+ it 'returns false' do
574
+ expect(description.me_mismatch?).to be(false)
575
+ end
576
+ end
543
577
 
544
- context 'when the server address matches the description address' do
578
+ context 'when the server address does not match the me field' do
545
579
 
546
- it 'returns true' do
547
- expect(description.is_server?(server)).to be(true)
548
- end
549
- end
580
+ let(:config) do
581
+ replica.merge('me' => 'localhost:27020')
582
+ end
550
583
 
551
- context 'when the server address does not match the description address' do
584
+ it 'returns true' do
585
+ expect(description.me_mismatch?).to be(true)
586
+ end
587
+ end
552
588
 
553
- let(:other_address) do
554
- Mongo::Address.new('127.0.0.1:27020')
555
- end
589
+ context 'when there is no me field' do
556
590
 
557
- let(:server) do
558
- Mongo::Server.new(other_address, cluster, monitoring, listeners,
559
- monitoring_io: false)
560
- end
591
+ let(:config) do
592
+ replica.tap do |r|
593
+ r.delete('me')
594
+ end
595
+ end
561
596
 
562
- it 'returns false' do
563
- expect(description.is_server?(server)).to be(false)
597
+ it 'returns false' do
598
+ expect(description.me_mismatch?).to be(false)
599
+ end
600
+ end
564
601
  end
565
- end
566
- end
567
602
 
568
- describe '#me_mismatch?' do
603
+ describe '#lists_server?' do
569
604
 
570
- let(:description) do
571
- described_class.new(address, config)
572
- end
605
+ let(:description) do
606
+ described_class.new(address, replica)
607
+ end
573
608
 
574
- context 'when the server address matches the me field' do
609
+ let(:server_address) do
610
+ Mongo::Address.new('127.0.0.1:27018')
611
+ end
575
612
 
576
- let(:config) do
577
- replica.merge('me' => address.to_s)
578
- end
613
+ let(:listeners) do
614
+ Mongo::Event::Listeners.new
615
+ end
579
616
 
580
- it 'returns false' do
581
- expect(description.me_mismatch?).to be(false)
582
- end
583
- end
617
+ let(:server) do
618
+ Mongo::Server.new(server_address, cluster, monitoring, listeners,
619
+ monitoring_io: false)
620
+ end
584
621
 
585
- context 'when the server address does not match the me field' do
622
+ context 'when the server is included in the description hosts list' do
586
623
 
587
- let(:config) do
588
- replica.merge('me' => 'localhost:27020')
589
- end
624
+ it 'returns true' do
625
+ expect(description.lists_server?(server)).to be(true)
626
+ end
627
+ end
590
628
 
591
- it 'returns true' do
592
- expect(description.me_mismatch?).to be(true)
593
- end
594
- end
629
+ context 'when the server is not included in the description hosts list' do
595
630
 
596
- context 'when there is no me field' do
631
+ let(:server_address) do
632
+ Mongo::Address.new('127.0.0.1:27017')
633
+ end
597
634
 
598
- let(:config) do
599
- replica.tap do |r|
600
- r.delete('me')
635
+ it 'returns false' do
636
+ expect(description.lists_server?(server)).to be(false)
637
+ end
601
638
  end
602
639
  end
603
640
 
604
- it 'returns false' do
605
- expect(description.me_mismatch?).to be(false)
606
- end
607
- end
608
- end
609
-
610
- describe '#lists_server?' do
641
+ describe '#replica_set_member?' do
611
642
 
612
- let(:description) do
613
- described_class.new(address, replica)
614
- end
643
+ context 'when the description is from a mongos' do
615
644
 
616
- let(:server_address) do
617
- Mongo::Address.new('127.0.0.1:27018')
618
- end
645
+ let(:config) do
646
+ { 'msg' => 'isdbgrid', primary_param => true }
647
+ end
619
648
 
620
- let(:listeners) do
621
- Mongo::Event::Listeners.new
622
- end
649
+ let(:description) do
650
+ described_class.new(address, config)
651
+ end
623
652
 
624
- let(:server) do
625
- Mongo::Server.new(server_address, cluster, monitoring, listeners,
626
- monitoring_io: false)
627
- end
628
-
629
- context 'when the server is included in the description hosts list' do
630
-
631
- it 'returns true' do
632
- expect(description.lists_server?(server)).to be(true)
633
- end
634
- end
653
+ it 'returns false' do
654
+ expect(description.replica_set_member?).to be(false)
655
+ end
656
+ end
635
657
 
636
- context 'when the server is not included in the description hosts list' do
658
+ context 'when the description is from a standalone' do
637
659
 
638
- let(:server_address) do
639
- Mongo::Address.new('127.0.0.1:27017')
640
- end
660
+ let(:description) do
661
+ described_class.new(address, { primary_param => true,
662
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
663
+ end
641
664
 
642
- it 'returns false' do
643
- expect(description.lists_server?(server)).to be(false)
644
- end
645
- end
646
- end
665
+ it 'returns false' do
666
+ expect(description.replica_set_member?).to be(false)
667
+ end
668
+ end
647
669
 
648
- describe '#replica_set_member?' do
670
+ context 'when the description is from a replica set member' do
649
671
 
650
- context 'when the description is from a mongos' do
672
+ let(:description) do
673
+ described_class.new(address, replica)
674
+ end
651
675
 
652
- let(:config) do
653
- { 'msg' => 'isdbgrid', 'ismaster' => true }
676
+ it 'returns true' do
677
+ expect(description.replica_set_member?).to be(true)
678
+ end
679
+ end
654
680
  end
655
681
 
656
- let(:description) do
657
- described_class.new(address, config)
658
- end
682
+ describe '#logical_session_timeout_minutes' do
659
683
 
660
- it 'returns false' do
661
- expect(description.replica_set_member?).to be(false)
662
- end
663
- end
684
+ context 'when a logical session timeout value is in the config' do
664
685
 
665
- context 'when the description is from a standalone' do
686
+ let(:description) do
687
+ described_class.new(address, replica)
688
+ end
666
689
 
667
- let(:description) do
668
- described_class.new(address, { 'ismaster' => true,
669
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
670
- end
690
+ it 'returns the logical session timeout value' do
691
+ expect(description.logical_session_timeout).to eq(7)
692
+ end
693
+ end
671
694
 
672
- it 'returns false' do
673
- expect(description.replica_set_member?).to be(false)
674
- end
675
- end
695
+ context 'when a logical session timeout value is not in the config' do
676
696
 
677
- context 'when the description is from a replica set member' do
697
+ let(:description) do
698
+ described_class.new(address, { primary_param => true,
699
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
700
+ end
678
701
 
679
- let(:description) do
680
- described_class.new(address, replica)
702
+ it 'returns nil' do
703
+ expect(description.logical_session_timeout).to be(nil)
704
+ end
705
+ end
681
706
  end
682
707
 
683
- it 'returns true' do
684
- expect(description.replica_set_member?).to be(true)
685
- end
686
- end
687
- end
708
+ describe '#==' do
688
709
 
689
- describe '#logical_session_timeout_minutes' do
690
-
691
- context 'when a logical session timeout value is in the config' do
710
+ let(:description) do
711
+ described_class.new(address, replica)
712
+ end
692
713
 
693
- let(:description) do
694
- described_class.new(address, replica)
695
- end
714
+ let(:other) do
715
+ described_class.new(address, replica.merge(
716
+ 'localTime' => 1,
717
+ 'lastWrite' => { 'lastWriteDate' => 1 },
718
+ 'operationTime' => 2,
719
+ '$clusterTime' => 2
720
+ ))
721
+ end
696
722
 
697
- it 'returns the logical session timeout value' do
698
- expect(description.logical_session_timeout).to eq(7)
699
- end
700
- end
723
+ it 'excludes certain fields' do
724
+ expect(description == other).to be(true)
725
+ end
701
726
 
702
- context 'when a logical session timeout value is not in the config' do
727
+ context 'when the classes do not match' do
703
728
 
704
- let(:description) do
705
- described_class.new(address, { 'ismaster' => true,
706
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
707
- end
729
+ let(:description) do
730
+ described_class.new(address, replica)
731
+ end
708
732
 
709
- it 'returns nil' do
710
- expect(description.logical_session_timeout).to be(nil)
711
- end
712
- end
713
- end
733
+ it 'returns false' do
734
+ expect(description == Array.new).to be(false)
735
+ end
736
+ end
714
737
 
715
- describe '#==' do
738
+ context 'when the configs match' do
716
739
 
717
- let(:description) do
718
- described_class.new(address, replica)
719
- end
740
+ let(:description) do
741
+ described_class.new(address, replica)
742
+ end
720
743
 
721
- let(:other) do
722
- described_class.new(address, replica.merge(
723
- 'localTime' => 1,
724
- 'lastWrite' => { 'lastWriteDate' => 1 },
725
- 'operationTime' => 2,
726
- '$clusterTime' => 2
727
- ))
728
- end
744
+ let(:other) do
745
+ described_class.new(address, replica)
746
+ end
729
747
 
730
- it 'excludes certain fields' do
731
- expect(description == other).to be(true)
732
- end
748
+ it 'returns true' do
749
+ expect(description == other).to be(true)
750
+ end
751
+ end
733
752
 
734
- context 'when the classes do not match' do
753
+ context 'when the configs match, but have different connectionId values' do
735
754
 
736
- let(:description) do
737
- described_class.new(address, replica)
738
- end
755
+ let(:description) do
756
+ described_class.new(address, replica)
757
+ end
739
758
 
740
- it 'returns false' do
741
- expect(description == Array.new).to be(false)
742
- end
743
- end
759
+ let(:other) do
760
+ described_class.new(address, replica.merge(
761
+ 'connectionId' => 12
762
+ ))
763
+ end
744
764
 
745
- context 'when the configs match' do
765
+ it 'returns true' do
766
+ expect(description == other).to be(true)
767
+ end
768
+ end
746
769
 
747
- let(:description) do
748
- described_class.new(address, replica)
749
- end
770
+ context 'when the configs do not match' do
750
771
 
751
- let(:other) do
752
- described_class.new(address, replica)
753
- end
772
+ let(:description) do
773
+ described_class.new(address, replica)
774
+ end
754
775
 
755
- it 'returns true' do
756
- expect(description == other).to be(true)
757
- end
758
- end
776
+ let(:other) do
777
+ described_class.new(address, { primary_param => true,
778
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
779
+ end
759
780
 
760
- context 'when the configs do not match' do
781
+ it 'returns false' do
782
+ expect(description == other).to be(false)
783
+ end
784
+ end
761
785
 
762
- let(:description) do
763
- described_class.new(address, replica)
786
+ context 'when one config is a subset of the other' do
787
+ let(:one) do
788
+ described_class.new(address, { primary_param => true,
789
+ 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
790
+ end
791
+
792
+ let(:two) do
793
+ described_class.new(address, { primary_param => true,
794
+ 'minWireVersion' => 2, 'maxWireVersion' => 3,
795
+ 'ok' => 1, 'setName' => 'mongodb_set' })
796
+ end
797
+
798
+ it 'returns false when first config is the receiver' do
799
+ expect(one == two).to be false
800
+ end
801
+
802
+ it 'returns false when second config is the receiver' do
803
+ expect(two == one).to be false
804
+ end
805
+ end
764
806
  end
765
807
 
766
- let(:other) do
767
- described_class.new(address, { 'ismaster' => true,
768
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
769
- end
808
+ describe '#last_update_time' do
809
+ context 'stub description' do
810
+ let(:description) { described_class.new(address) }
770
811
 
771
- it 'returns false' do
772
- expect(description == other).to be(false)
773
- end
774
- end
812
+ it 'is present' do
813
+ expect(description.last_update_time).to be_a(Time)
814
+ end
815
+ end
775
816
 
776
- context 'when one config is a subset of the other' do
777
- let(:one) do
778
- described_class.new(address, { 'ismaster' => true,
779
- 'minWireVersion' => 2, 'maxWireVersion' => 3, 'ok' => 1 })
780
- end
817
+ context 'filled out description' do
818
+ let(:description) { described_class.new(address, replica) }
781
819
 
782
- let(:two) do
783
- described_class.new(address, { 'ismaster' => true,
784
- 'minWireVersion' => 2, 'maxWireVersion' => 3,
785
- 'ok' => 1, 'setName' => 'mongodb_set' })
820
+ it 'is present' do
821
+ expect(description.last_update_time).to be_a(Time)
822
+ end
823
+ end
786
824
  end
787
825
 
788
- it 'returns false when first config is the receiver' do
789
- expect(one == two).to be false
790
- end
826
+ describe '#last_update_monotime' do
827
+ context 'stub description' do
828
+ let(:description) { described_class.new(address) }
791
829
 
792
- it 'returns false when second config is the receiver' do
793
- expect(two == one).to be false
794
- end
795
- end
796
- end
830
+ it 'is present' do
831
+ expect(description.last_update_monotime).to be_a(Float)
832
+ end
833
+ end
797
834
 
798
- describe '#last_update_time' do
799
- context 'stub description' do
800
- let(:description) { described_class.new(address) }
835
+ context 'filled out description' do
836
+ let(:description) { described_class.new(address, replica) }
801
837
 
802
- it 'is present' do
803
- expect(description.last_update_time).to be_a(Time)
838
+ it 'is present' do
839
+ expect(description.last_update_monotime).to be_a(Float)
840
+ end
841
+ end
804
842
  end
805
843
  end
806
844
 
807
- context 'filled out description' do
808
- let(:description) { described_class.new(address, replica) }
809
-
810
- it 'is present' do
811
- expect(description.last_update_time).to be_a(Time)
812
- end
813
- end
814
845
  end
815
846
  end