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
@@ -10,6 +10,7 @@ describe 'Client construction' do
10
10
  ).merge(SpecConfig.instance.credentials_or_external_user(
11
11
  user: SpecConfig.instance.test_user.name,
12
12
  password: SpecConfig.instance.test_user.password,
13
+ auth_source: 'admin',
13
14
  ))
14
15
  end
15
16
 
@@ -113,7 +113,7 @@ describe 'Bulk writes with auto-encryption enabled' do
113
113
  it 'raises an exception' do
114
114
  expect do
115
115
  bulk_write.execute
116
- end.to raise_error(Mongo::Error::MaxBSONSize, /maximum allowed size: 16777216 bytes/)
116
+ end.to raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
117
117
  end
118
118
  end
119
119
  end
@@ -162,15 +162,19 @@ describe 'Bulk writes with auto-encryption enabled' do
162
162
  context 'when one operation is larger than 16MiB' do
163
163
  let(:requests) do
164
164
  [
165
- { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE - 100) } } },
165
+ { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE) } } },
166
166
  { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * size_limit } } },
167
167
  ]
168
168
  end
169
169
 
170
+ before do
171
+ expect(requests.first.to_bson.length).to be > Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE
172
+ end
173
+
170
174
  it 'raises an exception' do
171
175
  expect do
172
176
  bulk_write.execute
173
- end.to raise_error(Mongo::Error::MaxBSONSize, /maximum allowed size: 16777216 bytes/)
177
+ end.to raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
174
178
  end
175
179
  end
176
180
  end
@@ -255,7 +259,7 @@ describe 'Bulk writes with auto-encryption enabled' do
255
259
  it 'raises an exception' do
256
260
  expect do
257
261
  bulk_write.execute
258
- end.to raise_error(Mongo::Error::MaxBSONSize, /maximum allowed size: 16777216 bytes/)
262
+ end.to raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
259
263
  end
260
264
  end
261
265
  end
@@ -346,7 +350,7 @@ describe 'Bulk writes with auto-encryption enabled' do
346
350
  it 'raises an exception' do
347
351
  expect do
348
352
  perform_bulk_write
349
- end.to raise_error(Mongo::Error::MaxBSONSize, /maximum allowed size: 16777216 bytes/)
353
+ end.to raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
350
354
  end
351
355
  end
352
356
  end
@@ -18,7 +18,9 @@ describe 'Direct connection with RS name' do
18
18
  new_local_client(
19
19
  [SpecConfig.instance.addresses.first],
20
20
  SpecConfig.instance.test_options.merge(
21
- replica_set: replica_set_name, connect: :direct))
21
+ replica_set: replica_set_name, connect: :direct,
22
+ server_selection_timeout: 3.32,
23
+ ))
22
24
  end
23
25
 
24
26
  context 'in replica set' do
@@ -31,7 +33,8 @@ describe 'Direct connection with RS name' do
31
33
 
32
34
  it 'creates a working client' do
33
35
  expect do
34
- client.database.command(ismaster: 1)
36
+ res = client.database.command(ismaster: 1)
37
+ p res
35
38
  end.not_to raise_error
36
39
  end
37
40
  end
@@ -4,7 +4,9 @@ describe 'Connection pool populator integration' do
4
4
  let(:options) { {} }
5
5
 
6
6
  let(:server_options) do
7
- SpecConfig.instance.test_options.merge(options).merge(SpecConfig.instance.auth_options)
7
+ Mongo::Utils.shallow_symbolize_keys(Mongo::Client.canonicalize_ruby_options(
8
+ SpecConfig.instance.all_test_options,
9
+ )).update(options)
8
10
  end
9
11
 
10
12
  let(:address) do
@@ -269,7 +271,7 @@ describe 'Connection pool populator integration' do
269
271
  end
270
272
 
271
273
  describe 'when forking is enabled' do
272
- only_mri
274
+ require_mri
273
275
 
274
276
  context 'when min size is provided' do
275
277
  min_server_version '2.8'
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'runners/sdam_monitoring'
3
2
 
4
3
  describe 'Connections' do
5
4
  clean_slate
@@ -26,6 +25,9 @@ describe 'Connections' do
26
25
  # RSpec::Expectations::ExpectationNotMetError: expected Mongo::Error::SocketError, got #<NameError: undefined method `write' for class `Mongo::Socket'>
27
26
  fails_on_jruby
28
27
 
28
+ # 4.4 has two monitors and thus our socket mocks get hit twice
29
+ max_server_version '4.2'
30
+
29
31
  let(:exception) { Mongo::Error::SocketError }
30
32
 
31
33
  let(:error) do
@@ -44,7 +46,8 @@ describe 'Connections' do
44
46
  end
45
47
 
46
48
  context 'with sdam event subscription' do
47
- let(:subscriber) { Mongo::SDAMMonitoring::TestSubscriber.new }
49
+
50
+ let(:subscriber) { EventSubscriber.new }
48
51
  let(:client) do
49
52
  ClientRegistry.instance.global_client('authorized').with(app_name: 'connection_integration').tap do |client|
50
53
  client.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber)
@@ -56,12 +59,12 @@ describe 'Connections' do
56
59
  end
57
60
 
58
61
  it 'publishes server description changed event' do
59
- expect(subscriber.events).to be_empty
62
+ expect(subscriber.succeeded_events).to be_empty
60
63
 
61
64
  wait_for_all_servers(client.cluster)
62
65
 
63
66
  connection
64
- subscriber.events.clear
67
+ subscriber.succeeded_events.clear
65
68
  error
66
69
 
67
70
  event = subscriber.first_event('server_description_changed_event')
@@ -127,13 +127,13 @@ describe 'CRUD operations' do
127
127
  describe 'upsert' do
128
128
  context 'with default write concern' do
129
129
  it 'upserts' do
130
- collection.count_documents({}).should == 0
130
+ collection.count_documents.should == 0
131
131
 
132
132
  res = collection.find(_id: 'foo').update_one({'$set' => {foo: 'bar'}}, upsert: true)
133
133
 
134
134
  res.documents.first['upserted'].length.should == 1
135
135
 
136
- collection.count_documents({}).should == 1
136
+ collection.count_documents.should == 1
137
137
  end
138
138
  end
139
139
 
@@ -147,7 +147,7 @@ describe 'CRUD operations' do
147
147
  end
148
148
 
149
149
  it 'upserts' do
150
- unack_collection.count_documents({}).should == 0
150
+ unack_collection.count_documents.should == 0
151
151
 
152
152
  res = unack_collection.find(_id: 'foo').update_one({'$set' => {foo: 'bar'}}, upsert: true)
153
153
 
@@ -155,7 +155,7 @@ describe 'CRUD operations' do
155
155
  # persisted (hopefully)
156
156
  sleep 0.25
157
157
 
158
- unack_collection.count_documents({}).should == 1
158
+ unack_collection.count_documents.should == 1
159
159
  end
160
160
  end
161
161
  end
@@ -3,7 +3,17 @@ require 'spec_helper'
3
3
  describe 'Cursor reaping' do
4
4
  # JRuby does reap cursors but GC.start does not force GC to run like it does
5
5
  # in MRI, I don't currently know how to force GC to run in JRuby
6
- only_mri
6
+ require_mri
7
+
8
+ around(:all) do |example|
9
+ saved_level = Mongo::Logger.logger.level
10
+ Mongo::Logger.logger.level = Logger::DEBUG
11
+ begin
12
+ example.run
13
+ ensure
14
+ Mongo::Logger.logger.level = saved_level
15
+ end
16
+ end
7
17
 
8
18
  let(:subscriber) { EventSubscriber.new }
9
19
 
@@ -37,37 +47,63 @@ describe 'Cursor reaping' do
37
47
  expect(events).to be_empty
38
48
  end
39
49
 
50
+ def abandon_cursors
51
+ [].tap do |cursor_ids|
52
+ # scopes are weird, having this result in a let block
53
+ # makes it not garbage collected
54
+ 10.times do
55
+ scope = collection.find.batch_size(2).no_cursor_timeout
56
+
57
+ # there is no API for retrieving the cursor
58
+ scope.each.first
59
+ # and keep the first cursor
60
+ cursor_ids << scope.instance_variable_get('@cursor').id
61
+ end
62
+ end
63
+ end
64
+
40
65
  # this let block is a kludge to avoid copy pasting all of this code
41
66
  let(:cursor_id_and_kill_event) do
42
67
  expect(Mongo::Operation::KillCursors).to receive(:new).at_least(:once).and_call_original
43
68
 
44
- cursor_id = nil
45
-
46
- # scopes are weird, having this result in a let block
47
- # makes it not garbage collected
48
- 2.times do
49
- scope = collection.find.batch_size(2).no_cursor_timeout
69
+ cursor_ids = abandon_cursors
50
70
 
51
- # there is no API for retrieving the cursor
52
- scope.each.first
53
- # and keep the first cursor
54
- cursor_id ||= scope.instance_variable_get('@cursor').id
71
+ cursor_ids.each do |cursor_id|
72
+ expect(cursor_id).to be_a(Integer)
73
+ expect(cursor_id > 0).to be true
55
74
  end
56
75
 
57
- expect(cursor_id).to be_a(Integer)
58
- expect(cursor_id > 0).to be true
59
-
60
76
  GC.start
77
+ sleep 1
61
78
 
62
79
  # force periodic executor to run because its frequency is not configurable
63
80
  client.cluster.instance_variable_get('@periodic_executor').execute
64
81
 
65
82
  started_event = subscriber.started_events.detect do |event|
66
- event.command['killCursors'] &&
67
- event.command['cursors'].map { |c| Utils.int64_value(c) }.include?(cursor_id)
83
+ event.command['killCursors']
84
+ end
85
+ started_event.should_not be nil
86
+
87
+ found_cursor_id = nil
88
+ started_event = subscriber.started_events.detect do |event|
89
+ found = false
90
+ if event.command['killCursors']
91
+ cursor_ids.each do |cursor_id|
92
+ if event.command['cursors'].map { |c| Utils.int64_value(c) }.include?(cursor_id)
93
+ found_cursor_id = cursor_id
94
+ found = true
95
+ break
96
+ end
97
+ end
98
+ end
99
+ found
100
+ end
101
+
102
+ if started_event.nil?
103
+ p subscriber.started_events
68
104
  end
69
105
 
70
- expect(started_event).not_to be_nil
106
+ started_event.should_not be nil
71
107
 
72
108
  succeeded_event = subscriber.succeeded_events.detect do |event|
73
109
  event.command_name == 'killCursors' && event.request_id == started_event.request_id
@@ -77,7 +113,7 @@ describe 'Cursor reaping' do
77
113
 
78
114
  expect(succeeded_event.reply['ok']).to eq 1
79
115
 
80
- [cursor_id, succeeded_event]
116
+ [found_cursor_id, succeeded_event]
81
117
  end
82
118
 
83
119
  it 'is reaped' do
@@ -1,6 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'aggregation examples in Ruby' do
4
+ before(:all) do
5
+ # In sharded clusters we need to ensure the database exists before running
6
+ # the tests in this file.
7
+ ClientRegistry.instance.global_client('authorized')['_placeholder'].create
8
+ end
9
+
4
10
  let(:client) do
5
11
  authorized_client
6
12
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe 'fork reconnect' do
4
4
  require_fork
5
- only_mri
5
+ require_mri
6
6
 
7
7
  # On multi-shard sharded clusters a succeeding write request does not
8
8
  # guarantee that the next operation will succeed (since it could be sent to
@@ -139,5 +139,60 @@ describe 'fork reconnect' do
139
139
  # performed by the child is recovered from.
140
140
  client['foo'].find(test: 1)
141
141
  end
142
+
143
+ # Test from Driver Sessions Spec
144
+ # * Create ClientSession
145
+ # * Record its lsid
146
+ # * Delete it (so the lsid is pushed into the pool)
147
+ # * Fork
148
+ # * In the parent, create a ClientSession and assert its lsid is the same.
149
+ # * In the child, create a ClientSession and assert its lsid is different.
150
+ describe 'session pool' do
151
+ it 'is cleared after fork' do
152
+ session = client.get_session
153
+ parent_lsid = session.session_id
154
+ session.end_session
155
+ if pid = fork
156
+ pid, status = Process.wait2(pid)
157
+ status.exitstatus.should == 0
158
+ else
159
+ Utils.wrap_forked_child do
160
+ client.reconnect
161
+ child_session = client.get_session
162
+ child_lsid = child_session.session_id
163
+ expect(child_lsid).not_to eq(parent_lsid)
164
+ end
165
+ end
166
+
167
+ expect(client.get_session.session_id).to eq(parent_lsid)
168
+ end
169
+
170
+ # Test from Driver Sessions Spec
171
+ # * Create ClientSession
172
+ # * Record its lsid
173
+ # * Fork
174
+ # * In the parent, return the ClientSession to the pool, create a new ClientSession, and assert its lsid is the same.
175
+ # * In the child, return the ClientSession to the pool, create a new ClientSession, and assert its lsid is different.
176
+ it 'does not return parent process sessions to child process pool' do
177
+ session = client.get_session
178
+ parent_lsid = session.session_id
179
+
180
+ if pid = fork
181
+ pid, status = Process.wait2(pid)
182
+ status.exitstatus.should == 0
183
+ else
184
+ Utils.wrap_forked_child do
185
+ client.reconnect
186
+ session.end_session
187
+ child_session = client.get_session
188
+ child_lsid = child_session.session_id
189
+ expect(child_lsid).not_to eq(parent_lsid)
190
+ end
191
+ end
192
+
193
+ session.end_session
194
+ expect(client.get_session.session_id).to eq(parent_lsid)
195
+ end
196
+ end
142
197
  end
143
198
  end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'GridFS bucket integration' do
4
+ let(:fs) do
5
+ authorized_client.database.fs
6
+ end
7
+
8
+ describe 'UTF-8 string write' do
9
+ let(:data) { "hello\u2210" }
10
+
11
+ before do
12
+ data.length.should_not == data.bytesize
13
+ end
14
+
15
+ shared_examples 'round-trips' do
16
+ it 'round-trips' do
17
+ stream = fs.open_upload_stream('test') do |stream|
18
+ stream.write(data_to_write)
19
+ end
20
+
21
+ actual = nil
22
+ fs.open_download_stream(stream.file_id) do |stream|
23
+ actual = stream.read
24
+ end
25
+
26
+ actual.encoding.name.should == 'ASCII-8BIT'
27
+ actual.should == data.dup.force_encoding('binary')
28
+ end
29
+ end
30
+
31
+ context 'in binary encoding' do
32
+ let(:data_to_write) do
33
+ data.force_encoding('binary').freeze
34
+ end
35
+
36
+ it_behaves_like 'round-trips'
37
+ end
38
+
39
+ context 'in UTF-8 encoding' do
40
+ let(:data_to_write) do
41
+ data.encoding.name.should == 'UTF-8'
42
+ data.freeze
43
+ end
44
+
45
+ it_behaves_like 'round-trips'
46
+ end
47
+ end
48
+ end
@@ -1,33 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
- class TestHeartbeatSubscriber
4
- def initialize
5
- @started_events = []
6
- @succeeded_events = []
7
- @failed_events = []
8
- end
9
-
10
- attr_reader :started_events, :succeeded_events, :failed_events
11
-
12
- def started(event)
13
- @started_events << event
14
- end
15
-
16
- def succeeded(event)
17
- @succeeded_events << event
18
- end
19
-
20
- def failed(event)
21
- @failed_events << event
22
- end
23
- end
24
-
25
3
  describe 'Heartbeat events' do
26
4
  class HeartbeatEventsSpecTestException < StandardError; end
27
5
 
6
+ # 4.4 has two monitors and thus issues heartbeats multiple times
7
+ max_server_version '4.2'
8
+
28
9
  clean_slate_for_all
29
10
 
30
- let(:subscriber) { TestHeartbeatSubscriber.new }
11
+ let(:subscriber) { EventSubscriber.new }
31
12
 
32
13
  before do
33
14
  Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)