mongo 2.13.0.beta1 → 2.14.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 (339) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -5
  4. data/Rakefile +50 -9
  5. data/lib/mongo.rb +13 -2
  6. data/lib/mongo/address.rb +1 -1
  7. data/lib/mongo/address/ipv4.rb +1 -1
  8. data/lib/mongo/address/ipv6.rb +1 -1
  9. data/lib/mongo/auth/aws/request.rb +31 -5
  10. data/lib/mongo/bulk_write.rb +18 -0
  11. data/lib/mongo/caching_cursor.rb +74 -0
  12. data/lib/mongo/client.rb +238 -31
  13. data/lib/mongo/cluster.rb +56 -20
  14. data/lib/mongo/cluster/sdam_flow.rb +13 -10
  15. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
  16. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  17. data/lib/mongo/cluster/topology/single.rb +2 -2
  18. data/lib/mongo/collection.rb +66 -24
  19. data/lib/mongo/collection/view.rb +24 -20
  20. data/lib/mongo/collection/view/aggregation.rb +25 -4
  21. data/lib/mongo/collection/view/builder/find_command.rb +38 -18
  22. data/lib/mongo/collection/view/explainable.rb +27 -8
  23. data/lib/mongo/collection/view/iterable.rb +72 -12
  24. data/lib/mongo/collection/view/readable.rb +19 -3
  25. data/lib/mongo/collection/view/writable.rb +55 -5
  26. data/lib/mongo/crypt/encryption_io.rb +6 -6
  27. data/lib/mongo/cursor.rb +16 -3
  28. data/lib/mongo/database.rb +37 -4
  29. data/lib/mongo/database/view.rb +18 -3
  30. data/lib/mongo/distinguishing_semaphore.rb +55 -0
  31. data/lib/mongo/error.rb +5 -0
  32. data/lib/mongo/error/invalid_read_concern.rb +28 -0
  33. data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
  34. data/lib/mongo/error/invalid_session.rb +2 -1
  35. data/lib/mongo/error/operation_failure.rb +11 -5
  36. data/lib/mongo/error/server_certificate_revoked.rb +22 -0
  37. data/lib/mongo/error/sessions_not_supported.rb +35 -0
  38. data/lib/mongo/error/unsupported_option.rb +14 -12
  39. data/lib/mongo/event/base.rb +6 -0
  40. data/lib/mongo/grid/file.rb +5 -0
  41. data/lib/mongo/grid/file/chunk.rb +2 -0
  42. data/lib/mongo/grid/fs_bucket.rb +15 -13
  43. data/lib/mongo/grid/stream/write.rb +9 -3
  44. data/lib/mongo/index/view.rb +3 -0
  45. data/lib/mongo/lint.rb +2 -1
  46. data/lib/mongo/logger.rb +3 -3
  47. data/lib/mongo/monitoring.rb +38 -0
  48. data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
  49. data/lib/mongo/monitoring/event/command_failed.rb +11 -0
  50. data/lib/mongo/monitoring/event/command_started.rb +37 -2
  51. data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
  52. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  53. data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
  54. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
  55. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
  56. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
  57. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  58. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  59. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  60. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  61. data/lib/mongo/monitoring/publishable.rb +6 -3
  62. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
  63. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  64. data/lib/mongo/operation.rb +2 -0
  65. data/lib/mongo/operation/aggregate/result.rb +9 -8
  66. data/lib/mongo/operation/collections_info/command.rb +5 -0
  67. data/lib/mongo/operation/collections_info/result.rb +18 -1
  68. data/lib/mongo/operation/delete/bulk_result.rb +2 -0
  69. data/lib/mongo/operation/delete/result.rb +3 -0
  70. data/lib/mongo/operation/explain/command.rb +4 -0
  71. data/lib/mongo/operation/explain/legacy.rb +4 -0
  72. data/lib/mongo/operation/explain/op_msg.rb +6 -0
  73. data/lib/mongo/operation/explain/result.rb +3 -0
  74. data/lib/mongo/operation/find/legacy/result.rb +2 -0
  75. data/lib/mongo/operation/find/result.rb +13 -0
  76. data/lib/mongo/operation/get_more/result.rb +3 -0
  77. data/lib/mongo/operation/indexes/result.rb +5 -0
  78. data/lib/mongo/operation/insert/bulk_result.rb +5 -0
  79. data/lib/mongo/operation/insert/result.rb +5 -0
  80. data/lib/mongo/operation/list_collections/result.rb +5 -0
  81. data/lib/mongo/operation/map_reduce/result.rb +10 -0
  82. data/lib/mongo/operation/parallel_scan/result.rb +4 -0
  83. data/lib/mongo/operation/result.rb +35 -6
  84. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
  85. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
  86. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
  87. data/lib/mongo/operation/shared/executable.rb +1 -0
  88. data/lib/mongo/operation/shared/idable.rb +2 -1
  89. data/lib/mongo/operation/shared/limited.rb +1 -0
  90. data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
  91. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
  92. data/lib/mongo/operation/shared/sessions_supported.rb +1 -0
  93. data/lib/mongo/operation/shared/specifiable.rb +1 -0
  94. data/lib/mongo/operation/shared/write.rb +1 -0
  95. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
  96. data/lib/mongo/operation/update/legacy/result.rb +7 -0
  97. data/lib/mongo/operation/update/result.rb +8 -0
  98. data/lib/mongo/operation/users_info/result.rb +3 -0
  99. data/lib/mongo/protocol/message.rb +47 -10
  100. data/lib/mongo/protocol/msg.rb +34 -1
  101. data/lib/mongo/protocol/query.rb +36 -0
  102. data/lib/mongo/protocol/serializers.rb +5 -2
  103. data/lib/mongo/query_cache.rb +242 -0
  104. data/lib/mongo/retryable.rb +8 -1
  105. data/lib/mongo/server.rb +15 -4
  106. data/lib/mongo/server/app_metadata.rb +27 -3
  107. data/lib/mongo/server/connection.rb +4 -4
  108. data/lib/mongo/server/connection_base.rb +38 -12
  109. data/lib/mongo/server/connection_common.rb +2 -2
  110. data/lib/mongo/server/connection_pool.rb +3 -0
  111. data/lib/mongo/server/description.rb +13 -1
  112. data/lib/mongo/server/monitor.rb +76 -44
  113. data/lib/mongo/server/monitor/connection.rb +57 -9
  114. data/lib/mongo/server/pending_connection.rb +14 -4
  115. data/lib/mongo/server/push_monitor.rb +173 -0
  116. data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
  117. data/lib/mongo/server_selector.rb +0 -1
  118. data/lib/mongo/server_selector/base.rb +583 -1
  119. data/lib/mongo/server_selector/nearest.rb +1 -6
  120. data/lib/mongo/server_selector/primary.rb +1 -6
  121. data/lib/mongo/server_selector/primary_preferred.rb +7 -10
  122. data/lib/mongo/server_selector/secondary.rb +1 -6
  123. data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
  124. data/lib/mongo/session.rb +7 -1
  125. data/lib/mongo/socket.rb +26 -12
  126. data/lib/mongo/socket/ocsp_cache.rb +97 -0
  127. data/lib/mongo/socket/ocsp_verifier.rb +368 -0
  128. data/lib/mongo/socket/ssl.rb +46 -25
  129. data/lib/mongo/socket/tcp.rb +1 -1
  130. data/lib/mongo/srv/monitor.rb +7 -13
  131. data/lib/mongo/srv/resolver.rb +14 -10
  132. data/lib/mongo/timeout.rb +2 -0
  133. data/lib/mongo/topology_version.rb +9 -0
  134. data/lib/mongo/uri.rb +21 -390
  135. data/lib/mongo/uri/options_mapper.rb +582 -0
  136. data/lib/mongo/uri/srv_protocol.rb +3 -2
  137. data/lib/mongo/utils.rb +73 -0
  138. data/lib/mongo/version.rb +1 -1
  139. data/spec/NOTES.aws-auth.md +12 -7
  140. data/spec/README.aws-auth.md +2 -2
  141. data/spec/README.md +63 -1
  142. data/spec/integration/awaited_ismaster_spec.rb +28 -0
  143. data/spec/integration/bson_symbol_spec.rb +4 -2
  144. data/spec/integration/bulk_write_spec.rb +67 -0
  145. data/spec/integration/change_stream_examples_spec.rb +6 -2
  146. data/spec/integration/change_stream_spec.rb +1 -1
  147. data/spec/integration/check_clean_slate_spec.rb +16 -0
  148. data/spec/integration/client_authentication_options_spec.rb +92 -28
  149. data/spec/integration/client_construction_spec.rb +1 -0
  150. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -5
  151. data/spec/integration/connect_single_rs_name_spec.rb +5 -2
  152. data/spec/integration/connection_pool_populator_spec.rb +4 -2
  153. data/spec/integration/connection_spec.rb +7 -4
  154. data/spec/integration/crud_spec.rb +4 -4
  155. data/spec/integration/cursor_reaping_spec.rb +54 -18
  156. data/spec/integration/docs_examples_spec.rb +6 -0
  157. data/spec/integration/fork_reconnect_spec.rb +56 -1
  158. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  159. data/spec/integration/heartbeat_events_spec.rb +4 -23
  160. data/spec/integration/ocsp_connectivity_spec.rb +26 -0
  161. data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
  162. data/spec/integration/ocsp_verifier_spec.rb +334 -0
  163. data/spec/integration/query_cache_spec.rb +1045 -0
  164. data/spec/integration/query_cache_transactions_spec.rb +190 -0
  165. data/spec/integration/read_concern_spec.rb +1 -1
  166. data/spec/integration/retryable_errors_spec.rb +1 -1
  167. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
  168. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +4 -2
  169. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
  170. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
  171. data/spec/integration/sdam_error_handling_spec.rb +122 -15
  172. data/spec/integration/sdam_events_spec.rb +80 -6
  173. data/spec/integration/sdam_prose_spec.rb +64 -0
  174. data/spec/integration/server_monitor_spec.rb +25 -1
  175. data/spec/integration/server_selection_spec.rb +36 -0
  176. data/spec/integration/size_limit_spec.rb +23 -5
  177. data/spec/integration/srv_monitoring_spec.rb +38 -3
  178. data/spec/integration/srv_spec.rb +56 -0
  179. data/spec/integration/ssl_uri_options_spec.rb +2 -2
  180. data/spec/integration/transactions_examples_spec.rb +17 -7
  181. data/spec/integration/zlib_compression_spec.rb +25 -0
  182. data/spec/lite_spec_helper.rb +20 -9
  183. data/spec/mongo/address_spec.rb +1 -1
  184. data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
  185. data/spec/mongo/auth/aws/request_spec.rb +76 -0
  186. data/spec/mongo/auth/scram_spec.rb +1 -1
  187. data/spec/mongo/auth/user_spec.rb +1 -1
  188. data/spec/mongo/bulk_write_spec.rb +2 -2
  189. data/spec/mongo/caching_cursor_spec.rb +70 -0
  190. data/spec/mongo/client_construction_spec.rb +386 -3
  191. data/spec/mongo/client_encryption_spec.rb +16 -10
  192. data/spec/mongo/client_spec.rb +85 -3
  193. data/spec/mongo/cluster/topology/replica_set_spec.rb +53 -10
  194. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  195. data/spec/mongo/cluster/topology/single_spec.rb +19 -8
  196. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  197. data/spec/mongo/cluster/topology_spec.rb +1 -1
  198. data/spec/mongo/cluster_spec.rb +37 -35
  199. data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -7
  200. data/spec/mongo/collection/view/explainable_spec.rb +87 -4
  201. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
  202. data/spec/mongo/collection/view/readable_spec.rb +36 -0
  203. data/spec/mongo/collection_spec.rb +572 -0
  204. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  205. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  206. data/spec/mongo/crypt/binary_spec.rb +1 -6
  207. data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
  208. data/spec/mongo/crypt/binding/context_spec.rb +2 -7
  209. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
  210. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
  211. data/spec/mongo/crypt/binding/status_spec.rb +1 -6
  212. data/spec/mongo/crypt/binding/version_spec.rb +1 -6
  213. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  214. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  215. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
  216. data/spec/mongo/crypt/status_spec.rb +1 -6
  217. data/spec/mongo/database_spec.rb +353 -8
  218. data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
  219. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  220. data/spec/mongo/error/operation_failure_spec.rb +40 -0
  221. data/spec/mongo/index/view_spec.rb +148 -2
  222. data/spec/mongo/logger_spec.rb +13 -11
  223. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  224. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
  225. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  226. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  227. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  228. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  229. data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
  230. data/spec/mongo/operation/insert/command_spec.rb +2 -2
  231. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
  232. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  233. data/spec/mongo/operation/update/command_spec.rb +2 -2
  234. data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
  235. data/spec/mongo/protocol/msg_spec.rb +10 -0
  236. data/spec/mongo/query_cache_spec.rb +280 -0
  237. data/spec/mongo/semaphore_spec.rb +51 -0
  238. data/spec/mongo/server/app_metadata_shared.rb +82 -2
  239. data/spec/mongo/server/connection_auth_spec.rb +2 -2
  240. data/spec/mongo/server/connection_pool_spec.rb +7 -3
  241. data/spec/mongo/server/connection_spec.rb +15 -8
  242. data/spec/mongo/server/description_spec.rb +18 -0
  243. data/spec/mongo/server_selector/nearest_spec.rb +23 -23
  244. data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
  245. data/spec/mongo/server_selector/primary_spec.rb +9 -9
  246. data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
  247. data/spec/mongo/server_selector/secondary_spec.rb +18 -18
  248. data/spec/mongo/server_selector_spec.rb +6 -6
  249. data/spec/mongo/session_spec.rb +35 -0
  250. data/spec/mongo/socket/ssl_spec.rb +4 -4
  251. data/spec/mongo/socket_spec.rb +1 -1
  252. data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
  253. data/spec/mongo/uri_option_parsing_spec.rb +11 -11
  254. data/spec/mongo/uri_spec.rb +68 -41
  255. data/spec/mongo/utils_spec.rb +39 -0
  256. data/spec/runners/auth.rb +3 -0
  257. data/spec/runners/change_streams/test.rb +3 -3
  258. data/spec/runners/cmap.rb +1 -1
  259. data/spec/runners/command_monitoring.rb +3 -34
  260. data/spec/runners/connection_string.rb +35 -124
  261. data/spec/runners/crud/context.rb +9 -5
  262. data/spec/runners/crud/operation.rb +59 -27
  263. data/spec/runners/crud/spec.rb +0 -8
  264. data/spec/runners/crud/test.rb +1 -1
  265. data/spec/runners/crud/test_base.rb +0 -19
  266. data/spec/runners/sdam.rb +2 -2
  267. data/spec/runners/server_selection.rb +242 -28
  268. data/spec/runners/transactions.rb +12 -12
  269. data/spec/runners/transactions/operation.rb +151 -25
  270. data/spec/runners/transactions/test.rb +62 -18
  271. data/spec/shared/LICENSE +20 -0
  272. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  273. data/spec/shared/lib/mrss/constraints.rb +303 -0
  274. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  275. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  276. data/spec/spec_helper.rb +3 -1
  277. data/spec/spec_tests/cmap_spec.rb +7 -3
  278. data/spec/spec_tests/command_monitoring_spec.rb +22 -12
  279. data/spec/spec_tests/crud_spec.rb +1 -1
  280. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -9
  281. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
  282. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  283. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  284. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  285. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  286. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  287. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  288. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  289. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  290. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  291. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  292. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  293. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  294. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  295. data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
  296. data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
  297. data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
  298. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
  299. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
  300. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
  301. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  302. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  303. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  304. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  305. data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
  306. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  307. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  308. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  309. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
  310. data/spec/spec_tests/max_staleness_spec.rb +4 -142
  311. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  312. data/spec/spec_tests/sdam_integration_spec.rb +13 -0
  313. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
  314. data/spec/spec_tests/server_selection_spec.rb +4 -116
  315. data/spec/spec_tests/uri_options_spec.rb +31 -33
  316. data/spec/stress/cleanup_spec.rb +17 -2
  317. data/spec/stress/connection_pool_stress_spec.rb +10 -8
  318. data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
  319. data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
  320. data/spec/support/certificates/atlas-ocsp.crt +41 -0
  321. data/spec/support/client_registry.rb +1 -0
  322. data/spec/support/client_registry_macros.rb +11 -2
  323. data/spec/support/cluster_config.rb +4 -0
  324. data/spec/support/common_shortcuts.rb +45 -0
  325. data/spec/support/constraints.rb +6 -253
  326. data/spec/support/event_subscriber.rb +123 -33
  327. data/spec/support/keyword_struct.rb +26 -0
  328. data/spec/support/matchers.rb +16 -0
  329. data/spec/support/ocsp +1 -0
  330. data/spec/support/session_registry.rb +52 -0
  331. data/spec/support/shared/server_selector.rb +13 -1
  332. data/spec/support/spec_config.rb +60 -13
  333. data/spec/support/spec_setup.rb +1 -1
  334. data/spec/support/utils.rb +84 -1
  335. metadata +1027 -937
  336. metadata.gz.sig +0 -0
  337. data/lib/mongo/server_selector/selectable.rb +0 -560
  338. data/spec/runners/sdam_monitoring.rb +0 -89
  339. data/spec/support/lite_constraints.rb +0 -141
@@ -72,7 +72,7 @@ describe Mongo::Operation::Insert::OpMsg do
72
72
 
73
73
  describe 'write concern' do
74
74
  # https://jira.mongodb.org/browse/RUBY-2224
75
- skip_if_linting
75
+ require_no_linting
76
76
 
77
77
  context 'when write concern is not specified' do
78
78
 
@@ -99,7 +99,7 @@ describe Mongo::Operation::Insert::OpMsg do
99
99
 
100
100
  describe '#message' do
101
101
  # https://jira.mongodb.org/browse/RUBY-2224
102
- skip_if_linting
102
+ require_no_linting
103
103
 
104
104
  context 'when the server supports OP_MSG' do
105
105
  min_server_fcv '3.6'
@@ -167,7 +167,7 @@ describe Mongo::Operation::Insert::OpMsg do
167
167
 
168
168
  context 'when an implicit session is created and the topology is then updated and the server does not support sessions' do
169
169
  # Mocks on features are incompatible with linting
170
- skip_if_linting
170
+ require_no_linting
171
171
 
172
172
  let(:expected_global_args) do
173
173
  global_args.dup.tap do |args|
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Operation::SessionsSupported do
4
4
  # https://jira.mongodb.org/browse/RUBY-2224
5
- skip_if_linting
5
+ require_no_linting
6
6
 
7
7
  let(:selector) do
8
8
  BSON::Document.new(name: 'test')
@@ -69,7 +69,7 @@ describe Mongo::Operation::Update::Command do
69
69
 
70
70
  describe 'write concern' do
71
71
  # https://jira.mongodb.org/browse/RUBY-2224
72
- skip_if_linting
72
+ require_no_linting
73
73
 
74
74
  context 'when write concern is not specified' do
75
75
 
@@ -96,7 +96,7 @@ describe Mongo::Operation::Update::Command do
96
96
 
97
97
  describe '#message' do
98
98
  # https://jira.mongodb.org/browse/RUBY-2224
99
- skip_if_linting
99
+ require_no_linting
100
100
 
101
101
  context 'when the server does not support OP_MSG' do
102
102
  max_server_version '3.4'
@@ -78,7 +78,7 @@ describe Mongo::Operation::Update::OpMsg do
78
78
 
79
79
  describe 'write concern' do
80
80
  # https://jira.mongodb.org/browse/RUBY-2224
81
- skip_if_linting
81
+ require_no_linting
82
82
 
83
83
  context 'when write concern is not specified' do
84
84
 
@@ -105,7 +105,7 @@ describe Mongo::Operation::Update::OpMsg do
105
105
 
106
106
  describe '#message' do
107
107
  # https://jira.mongodb.org/browse/RUBY-2224
108
- skip_if_linting
108
+ require_no_linting
109
109
 
110
110
  context 'when the server supports OP_MSG' do
111
111
  min_server_fcv '3.6'
@@ -159,7 +159,7 @@ describe Mongo::Operation::Update::OpMsg do
159
159
 
160
160
  context 'when an implicit session is created and the topology is then updated and the server does not support sessions' do
161
161
  # Mocks on features are incompatible with linting
162
- skip_if_linting
162
+ require_no_linting
163
163
 
164
164
  let(:expected_global_args) do
165
165
  global_args.dup.tap do |args|
@@ -425,6 +425,16 @@ describe Mongo::Protocol::Msg do
425
425
  expect(message.serialize).to be_a(BSON::ByteBuffer)
426
426
  end
427
427
  end
428
+
429
+ [:more_to_come, :exhaust_allowed].each do |flag|
430
+ context "with #{flag} flag" do
431
+ let(:flags) { [flag] }
432
+
433
+ it "round trips #{flag} flag" do
434
+ expect(deserialized.flags).to eq(flags)
435
+ end
436
+ end
437
+ end
428
438
  end
429
439
 
430
440
  describe '#deserialize' do
@@ -0,0 +1,280 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::QueryCache do
4
+
5
+ around do |spec|
6
+ Mongo::QueryCache.clear
7
+ Mongo::QueryCache.cache { spec.run }
8
+ end
9
+
10
+ before do
11
+ authorized_collection.delete_many
12
+ end
13
+
14
+ let(:subscriber) { EventSubscriber.new }
15
+
16
+ let(:client) do
17
+ authorized_client.tap do |client|
18
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
19
+ end
20
+ end
21
+
22
+ let(:authorized_collection) { client['collection_spec'] }
23
+
24
+ let(:events) do
25
+ subscriber.command_started_events('find')
26
+ end
27
+
28
+ describe '#enabled' do
29
+
30
+ context 'when query cache is disabled' do
31
+
32
+ before do
33
+ Mongo::QueryCache.enabled = false
34
+ end
35
+
36
+ it 'disables the query cache' do
37
+ expect(Mongo::QueryCache.enabled?).to be(false)
38
+ end
39
+ end
40
+
41
+ context 'when query cache is enabled' do
42
+
43
+ before do
44
+ Mongo::QueryCache.enabled = true
45
+ end
46
+
47
+ it 'enables the query cache' do
48
+ expect(Mongo::QueryCache.enabled?).to be(true)
49
+ end
50
+ end
51
+ end
52
+
53
+ describe '#cache' do
54
+
55
+ before do
56
+ Mongo::QueryCache.enabled = false
57
+ end
58
+
59
+ it 'enables the query cache inside the block' do
60
+ Mongo::QueryCache.cache do
61
+ expect(Mongo::QueryCache.enabled?).to be(true)
62
+ end
63
+ expect(Mongo::QueryCache.enabled?).to be(false)
64
+ end
65
+ end
66
+
67
+ describe '#uncached' do
68
+
69
+ it 'disables the query cache inside the block' do
70
+ Mongo::QueryCache.uncached do
71
+ expect(Mongo::QueryCache.enabled?).to be(false)
72
+ end
73
+ expect(Mongo::QueryCache.enabled?).to be(true)
74
+ end
75
+ end
76
+
77
+ describe '#cache_table' do
78
+
79
+ before do
80
+ authorized_collection.insert_one({ name: 'testing' })
81
+ authorized_collection.find(name: 'testing').to_a
82
+ end
83
+
84
+ it 'gets the cached query' do
85
+ expect(Mongo::QueryCache.send(:cache_table).length).to eq(1)
86
+ authorized_collection.find(name: 'testing').to_a
87
+ expect(events.length).to eq(1)
88
+ end
89
+ end
90
+
91
+ describe '#clear' do
92
+
93
+ before do
94
+ authorized_collection.insert_one({ name: 'testing' })
95
+ authorized_collection.find(name: 'testing').to_a
96
+ end
97
+
98
+ it 'clears the cache' do
99
+ expect(Mongo::QueryCache.send(:cache_table).length).to eq(1)
100
+ Mongo::QueryCache.clear
101
+ expect(Mongo::QueryCache.send(:cache_table).length).to eq(0)
102
+ end
103
+ end
104
+
105
+ describe '#set' do
106
+ let(:caching_cursor) { double("Mongo::CachingCursor") }
107
+ let(:namespace) { 'db.coll' }
108
+ let(:selector) { { field: 'value' } }
109
+ let(:skip) { 5 }
110
+ let(:sort) { { field: 'asc' } }
111
+ let(:limit) { 5 }
112
+ let(:projection) { { field: 1 } }
113
+ let(:collation) { { locale: 'fr_CA' } }
114
+ let(:read_concern) { { level: :majority } }
115
+ let(:read_preference) { { mode: :secondary } }
116
+
117
+ let(:options) do
118
+ {
119
+ namespace: namespace,
120
+ selector: selector,
121
+ skip: skip,
122
+ sort: sort,
123
+ limit: limit,
124
+ projection: projection,
125
+ collation: collation,
126
+ read_concern: read_concern,
127
+ read_preference: read_preference,
128
+ }
129
+ end
130
+
131
+ it 'stores the cursor at the correct key' do
132
+ Mongo::QueryCache.set(caching_cursor, **options)
133
+ expect(Mongo::QueryCache.send(:cache_table)[namespace][[namespace, selector, skip, sort, projection, collation, read_concern, read_preference]]).to eq(caching_cursor)
134
+ end
135
+ end
136
+
137
+ describe '#get' do
138
+ let(:view) { double("Mongo::Collection::View") }
139
+ let(:result) { double("Mongo::Operation::Result") }
140
+ let(:server) { double("Mongo::Server") }
141
+ let(:caching_cursor) { Mongo::CachingCursor.new(view, result, server) }
142
+
143
+ let(:options) do
144
+ {
145
+ namespace: 'db.coll',
146
+ selector: { field: 'value' },
147
+ }
148
+ end
149
+
150
+ before do
151
+ allow(result).to receive(:cursor_id) { 0 }
152
+ allow(result).to receive(:namespace) { 'db.coll' }
153
+ allow(view).to receive(:limit) { nil }
154
+ end
155
+
156
+ context 'when there is no entry in the cache' do
157
+ it 'returns nil' do
158
+ expect(Mongo::QueryCache.get(**options)).to be_nil
159
+ end
160
+ end
161
+
162
+ context 'when there is an entry in the cache' do
163
+ before do
164
+ Mongo::QueryCache.set(caching_cursor, **caching_cursor_options)
165
+ end
166
+
167
+ context 'when that entry has no limit' do
168
+ let(:caching_cursor_options) do
169
+ {
170
+ namespace: 'db.coll',
171
+ selector: { field: 'value' },
172
+ }
173
+ end
174
+
175
+ let(:query_options) do
176
+ caching_cursor_options.merge(limit: limit)
177
+ end
178
+
179
+ context 'when the query has a limit' do
180
+ let(:limit) { 5 }
181
+
182
+ it 'returns the caching cursor' do
183
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
184
+ end
185
+ end
186
+
187
+ context 'when the query has no limit' do
188
+ let(:limit) { nil }
189
+
190
+ it 'returns the caching cursor' do
191
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
192
+ end
193
+ end
194
+ end
195
+
196
+ context 'when that entry has a limit' do
197
+ let(:caching_cursor_options) do
198
+ {
199
+ namespace: 'db.coll',
200
+ selector: { field: 'value' },
201
+ limit: 5,
202
+ }
203
+ end
204
+
205
+ let(:query_options) do
206
+ caching_cursor_options.merge(limit: limit)
207
+ end
208
+
209
+ before do
210
+ allow(view).to receive(:limit) { 5 }
211
+ end
212
+
213
+ context 'and the new query has a smaller limit' do
214
+ let(:limit) { 4 }
215
+
216
+ it 'returns the caching cursor' do
217
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
218
+ end
219
+ end
220
+
221
+ context 'and the new query has a larger limit' do
222
+ let(:limit) { 6 }
223
+
224
+ it 'returns nil' do
225
+ expect(Mongo::QueryCache.get(**query_options)).to be_nil
226
+ end
227
+ end
228
+
229
+ context 'and the new query has the same limit' do
230
+ let(:limit) { 5 }
231
+
232
+ it 'returns the caching cursor' do
233
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
234
+ end
235
+ end
236
+
237
+ context 'and the new query has no limit' do
238
+ let(:limit) { nil }
239
+
240
+ it 'returns nil' do
241
+ expect(Mongo::QueryCache.get(**query_options)).to be_nil
242
+ end
243
+ end
244
+ end
245
+ end
246
+ end
247
+
248
+ describe '#clear_namespace' do
249
+ let(:caching_cursor) { double("Mongo::CachingCursor") }
250
+ let(:namespace1) { 'db.coll' }
251
+ let(:namespace2) { 'db.coll2' }
252
+ let(:namespace3) { 'db.coll3' }
253
+ let(:selector) { { field: 'value' } }
254
+
255
+ before do
256
+ Mongo::QueryCache.set(caching_cursor, namespace: namespace1, selector: selector)
257
+ Mongo::QueryCache.set(caching_cursor, namespace: namespace2, selector: selector)
258
+ Mongo::QueryCache.set(caching_cursor, namespace: namespace3, selector: selector, multi_collection: true)
259
+ end
260
+
261
+ it 'returns nil' do
262
+ expect(Mongo::QueryCache.clear_namespace(namespace1)).to be_nil
263
+ end
264
+
265
+ it 'clears the specified namespace in the query cache' do
266
+ Mongo::QueryCache.clear_namespace(namespace1)
267
+ expect(Mongo::QueryCache.send(:cache_table)[namespace1]).to be_nil
268
+ end
269
+
270
+ it 'does not clear other namespaces in the query cache' do
271
+ Mongo::QueryCache.clear_namespace(namespace1)
272
+ expect(Mongo::QueryCache.send(:cache_table)[namespace2]).not_to be_nil
273
+ end
274
+
275
+ it 'clears the nil namespace' do
276
+ Mongo::QueryCache.clear_namespace(namespace1)
277
+ expect(Mongo::QueryCache.send(:cache_table)[nil]).to be_nil
278
+ end
279
+ end
280
+ end
@@ -0,0 +1,51 @@
1
+ require 'lite_spec_helper'
2
+
3
+ describe Mongo::Semaphore do
4
+ let(:semaphore) do
5
+ described_class.new
6
+ end
7
+
8
+ it 'waits until signaled' do
9
+ consumer = Thread.new do
10
+ semaphore.wait(3)
11
+ end
12
+
13
+ # Context switch to start the thread
14
+ sleep 0.1
15
+
16
+ start_time = Time.now
17
+ semaphore.signal
18
+ consumer.join
19
+
20
+ (Time.now - start_time).should < 1
21
+ end
22
+
23
+ it 'waits until broadcast' do
24
+ consumer = Thread.new do
25
+ semaphore.wait(3)
26
+ end
27
+
28
+ # Context switch to start the thread
29
+ sleep 0.1
30
+
31
+ start_time = Time.now
32
+ semaphore.broadcast
33
+ consumer.join
34
+
35
+ (Time.now - start_time).should < 1
36
+ end
37
+
38
+ it 'times out' do
39
+ consumer = Thread.new do
40
+ semaphore.wait(2)
41
+ end
42
+
43
+ # Context switch to start the thread
44
+ sleep 0.1
45
+
46
+ start_time = Time.now
47
+ consumer.join
48
+
49
+ (Time.now - start_time).should > 1
50
+ end
51
+ end
@@ -10,7 +10,7 @@ shared_examples 'app metadata document' do
10
10
 
11
11
  it 'includes operating system information' do
12
12
  document[:client][:os][:type].should == 'linux'
13
- if BSON::Environment.jruby?
13
+ if BSON::Environment.jruby? || RUBY_VERSION >= '3.0'
14
14
  document[:client][:os][:name].should == 'linux'
15
15
  else
16
16
  document[:client][:os][:name].should == 'linux-gnu'
@@ -19,7 +19,7 @@ shared_examples 'app metadata document' do
19
19
  end
20
20
 
21
21
  context 'mri' do
22
- only_mri
22
+ require_mri
23
23
 
24
24
  it 'includes Ruby version' do
25
25
  document[:client][:platform].should start_with("Ruby #{RUBY_VERSION}")
@@ -53,4 +53,84 @@ shared_examples 'app metadata document' do
53
53
  end
54
54
  end
55
55
  end
56
+
57
+ context 'when wrapping libraries are specified' do
58
+ let(:app_metadata) do
59
+ described_class.new(wrapping_libraries: wrapping_libraries)
60
+ end
61
+
62
+ context 'one' do
63
+ let(:wrapping_libraries) { [wrapping_library] }
64
+
65
+ context 'no fields' do
66
+ let(:wrapping_library) do
67
+ {}
68
+ end
69
+
70
+ it 'adds empty strings' do
71
+ document[:client][:driver][:name].should == 'mongo-ruby-driver|'
72
+ document[:client][:driver][:version].should == "#{Mongo::VERSION}|"
73
+ document[:client][:platform].should =~ /\AJ?Ruby[^|]+\|\z/
74
+ end
75
+ end
76
+
77
+ context 'some fields' do
78
+ let(:wrapping_library) do
79
+ {name: 'Mongoid'}
80
+ end
81
+
82
+ it 'adds the fields' do
83
+ document[:client][:driver][:name].should == 'mongo-ruby-driver|Mongoid'
84
+ document[:client][:driver][:version].should == "#{Mongo::VERSION}|"
85
+ document[:client][:platform].should =~ /\AJ?Ruby[^|]+\|\z/
86
+ end
87
+ end
88
+
89
+ context 'all fields' do
90
+ let(:wrapping_library) do
91
+ {name: 'Mongoid', version: '7.1.2', platform: 'OS9000'}
92
+ end
93
+
94
+ it 'adds the fields' do
95
+ document[:client][:driver][:name].should == 'mongo-ruby-driver|Mongoid'
96
+ document[:client][:driver][:version].should == "#{Mongo::VERSION}|7.1.2"
97
+ document[:client][:platform].should =~ /\AJ?Ruby[^|]+\|OS9000\z/
98
+ end
99
+ end
100
+ end
101
+
102
+ context 'two' do
103
+ context 'some fields' do
104
+ let(:wrapping_libraries) do
105
+ [
106
+ {name: 'Mongoid', version: '42'},
107
+ # All libraries should be specifying their versions, in theory,
108
+ # but test not specifying a version.
109
+ {version: '4.0', platform: 'OS9000'},
110
+ ]
111
+ end
112
+
113
+ it 'adds the fields' do
114
+ document[:client][:driver][:name].should == 'mongo-ruby-driver|Mongoid|'
115
+ document[:client][:driver][:version].should == "#{Mongo::VERSION}|42|4.0"
116
+ document[:client][:platform].should =~ /\AJ?Ruby[^|]+\|\|OS9000\z/
117
+ end
118
+ end
119
+
120
+ context 'a realistic Mongoid & Rails wrapping' do
121
+ let(:wrapping_libraries) do
122
+ [
123
+ {name: 'Mongoid', version: '7.1.2'},
124
+ {name: 'Rails', version: '6.0.3'},
125
+ ]
126
+ end
127
+
128
+ it 'adds the fields' do
129
+ document[:client][:driver][:name].should == 'mongo-ruby-driver|Mongoid|Rails'
130
+ document[:client][:driver][:version].should == "#{Mongo::VERSION}|7.1.2|6.0.3"
131
+ document[:client][:platform].should =~ /\AJ?Ruby[^|]+\|\|\z/
132
+ end
133
+ end
134
+ end
135
+ end
56
136
  end