mongo 2.13.1 → 2.19.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +36 -39
- data/Rakefile +49 -20
- data/bin/mongo_console +2 -0
- data/lib/mongo/active_support.rb +3 -0
- data/lib/mongo/address/ipv4.rb +4 -1
- data/lib/mongo/address/ipv6.rb +4 -1
- data/lib/mongo/address/unix.rb +3 -0
- data/lib/mongo/address/validator.rb +3 -0
- data/lib/mongo/address.rb +4 -1
- data/lib/mongo/auth/aws/conversation.rb +4 -8
- data/lib/mongo/auth/aws/credentials.rb +38 -0
- data/lib/mongo/auth/aws/credentials_cache.rb +75 -0
- data/lib/mongo/auth/aws/credentials_retriever.rb +174 -36
- data/lib/mongo/auth/aws/request.rb +3 -2
- data/lib/mongo/auth/aws.rb +8 -5
- data/lib/mongo/auth/base.rb +25 -9
- data/lib/mongo/auth/conversation_base.rb +35 -0
- data/lib/mongo/auth/cr/conversation.rb +9 -29
- data/lib/mongo/auth/cr.rb +3 -0
- data/lib/mongo/auth/credential_cache.rb +3 -0
- data/lib/mongo/auth/gssapi/conversation.rb +7 -15
- data/lib/mongo/auth/gssapi.rb +3 -0
- data/lib/mongo/auth/ldap/conversation.rb +6 -14
- data/lib/mongo/auth/ldap.rb +3 -0
- data/lib/mongo/auth/roles.rb +19 -16
- data/lib/mongo/auth/sasl_conversation_base.rb +4 -13
- data/lib/mongo/auth/scram/conversation.rb +3 -0
- data/lib/mongo/auth/scram.rb +5 -2
- data/lib/mongo/auth/scram256/conversation.rb +3 -0
- data/lib/mongo/auth/scram256.rb +3 -0
- data/lib/mongo/auth/scram_conversation_base.rb +10 -34
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +3 -0
- data/lib/mongo/auth/stringprep/tables.rb +3 -0
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +2 -2
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
- data/lib/mongo/auth/stringprep.rb +4 -1
- data/lib/mongo/auth/user/view.rb +19 -9
- data/lib/mongo/auth/user.rb +3 -0
- data/lib/mongo/auth/x509/conversation.rb +7 -25
- data/lib/mongo/auth/x509.rb +3 -0
- data/lib/mongo/auth.rb +16 -2
- data/lib/mongo/background_thread.rb +16 -2
- data/lib/mongo/bson.rb +3 -0
- data/lib/mongo/bulk_write/combineable.rb +3 -0
- data/lib/mongo/bulk_write/ordered_combiner.rb +3 -0
- data/lib/mongo/bulk_write/result.rb +13 -1
- data/lib/mongo/bulk_write/result_combiner.rb +5 -4
- data/lib/mongo/bulk_write/transformable.rb +3 -0
- data/lib/mongo/bulk_write/unordered_combiner.rb +3 -0
- data/lib/mongo/bulk_write/validatable.rb +3 -0
- data/lib/mongo/bulk_write.rb +156 -45
- data/lib/mongo/caching_cursor.rb +77 -0
- data/lib/mongo/client.rb +367 -41
- data/lib/mongo/client_encryption.rb +217 -10
- data/lib/mongo/cluster/periodic_executor.rb +7 -3
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +101 -43
- data/lib/mongo/cluster/reapers/socket_reaper.rb +4 -1
- data/lib/mongo/cluster/sdam_flow.rb +67 -17
- data/lib/mongo/cluster/topology/base.rb +16 -9
- data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -0
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -0
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +3 -0
- data/lib/mongo/cluster/topology/sharded.rb +3 -0
- data/lib/mongo/cluster/topology/single.rb +4 -1
- data/lib/mongo/cluster/topology/unknown.rb +3 -0
- data/lib/mongo/cluster/topology.rb +31 -8
- data/lib/mongo/cluster.rb +210 -116
- data/lib/mongo/cluster_time.rb +3 -0
- data/lib/mongo/collection/helpers.rb +43 -0
- data/lib/mongo/collection/queryable_encryption.rb +162 -0
- data/lib/mongo/collection/view/aggregation.rb +94 -24
- data/lib/mongo/collection/view/builder/aggregation.rb +19 -17
- data/lib/mongo/collection/view/builder/map_reduce.rb +18 -49
- data/lib/mongo/collection/view/builder.rb +3 -4
- data/lib/mongo/collection/view/change_stream/retryable.rb +3 -0
- data/lib/mongo/collection/view/change_stream.rb +71 -22
- data/lib/mongo/collection/view/explainable.rb +30 -8
- data/lib/mongo/collection/view/immutable.rb +3 -0
- data/lib/mongo/collection/view/iterable.rb +121 -24
- data/lib/mongo/collection/view/map_reduce.rb +76 -25
- data/lib/mongo/collection/view/readable.rb +147 -67
- data/lib/mongo/collection/view/writable.rb +296 -162
- data/lib/mongo/collection/view.rb +42 -41
- data/lib/mongo/collection.rb +356 -89
- data/lib/mongo/condition_variable.rb +58 -0
- data/lib/mongo/config/options.rb +63 -0
- data/lib/mongo/config/validators/option.rb +27 -0
- data/lib/mongo/config.rb +43 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +3 -0
- data/lib/mongo/crypt/auto_encrypter.rb +142 -15
- data/lib/mongo/crypt/auto_encryption_context.rb +3 -0
- data/lib/mongo/crypt/binary.rb +3 -0
- data/lib/mongo/crypt/binding.rb +717 -151
- data/lib/mongo/crypt/context.rb +74 -5
- data/lib/mongo/crypt/data_key_context.rb +15 -104
- data/lib/mongo/crypt/encryption_io.rb +101 -64
- data/lib/mongo/crypt/explicit_decryption_context.rb +3 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +235 -29
- data/lib/mongo/crypt/explicit_encryption_context.rb +78 -21
- data/lib/mongo/crypt/explicit_encryption_expression_context.rb +30 -0
- data/lib/mongo/crypt/handle.rb +171 -86
- data/lib/mongo/crypt/hooks.rb +28 -2
- data/lib/mongo/crypt/kms/aws/credentials.rb +83 -0
- data/lib/mongo/crypt/kms/aws/master_document.rb +78 -0
- data/lib/mongo/crypt/kms/aws.rb +20 -0
- data/lib/mongo/crypt/kms/azure/access_token.rb +54 -0
- data/lib/mongo/crypt/kms/azure/credentials.rb +103 -0
- data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +122 -0
- data/lib/mongo/crypt/kms/azure/master_document.rb +79 -0
- data/lib/mongo/crypt/kms/azure.rb +21 -0
- data/lib/mongo/crypt/kms/credentials.rb +96 -0
- data/lib/mongo/crypt/kms/gcp/credentials.rb +127 -0
- data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +58 -0
- data/lib/mongo/crypt/kms/gcp/master_document.rb +99 -0
- data/lib/mongo/crypt/kms/gcp.rb +21 -0
- data/lib/mongo/crypt/kms/kmip/credentials.rb +68 -0
- data/lib/mongo/crypt/kms/kmip/master_document.rb +74 -0
- data/lib/mongo/crypt/kms/kmip.rb +19 -0
- data/lib/mongo/crypt/kms/local/credentials.rb +65 -0
- data/lib/mongo/crypt/kms/local/master_document.rb +43 -0
- data/lib/mongo/crypt/kms/local.rb +19 -0
- data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
- data/lib/mongo/crypt/kms.rb +122 -0
- data/lib/mongo/crypt/kms_context.rb +3 -0
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
- data/lib/mongo/crypt/status.rb +11 -2
- data/lib/mongo/crypt.rb +18 -0
- data/lib/mongo/cursor/kill_spec.rb +76 -0
- data/lib/mongo/cursor.rb +150 -43
- data/lib/mongo/database/view.rb +55 -10
- data/lib/mongo/database.rb +95 -25
- data/lib/mongo/dbref.rb +4 -105
- data/lib/mongo/distinguishing_semaphore.rb +4 -1
- data/lib/mongo/error/auth_error.rb +3 -0
- data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
- data/lib/mongo/error/bulk_write_error.rb +49 -5
- data/lib/mongo/error/change_stream_resumable.rb +3 -0
- data/lib/mongo/error/client_closed.rb +24 -0
- data/lib/mongo/error/closed_stream.rb +3 -0
- data/lib/mongo/error/connection_check_out_timeout.rb +3 -0
- data/lib/mongo/error/connection_perished.rb +5 -0
- data/lib/mongo/error/connection_unavailable.rb +27 -0
- data/lib/mongo/error/credential_check_error.rb +3 -0
- data/lib/mongo/error/crypt_error.rb +3 -0
- data/lib/mongo/error/extra_file_chunk.rb +3 -0
- data/lib/mongo/error/failed_string_prep_validation.rb +3 -0
- data/lib/mongo/error/file_not_found.rb +3 -0
- data/lib/mongo/error/handshake_error.rb +3 -0
- data/lib/mongo/error/insufficient_iteration_count.rb +3 -0
- data/lib/mongo/error/internal_driver_error.rb +25 -0
- data/lib/mongo/error/invalid_address.rb +3 -0
- data/lib/mongo/error/invalid_application_name.rb +3 -0
- data/lib/mongo/error/invalid_bulk_operation.rb +3 -0
- data/lib/mongo/error/invalid_bulk_operation_type.rb +3 -0
- data/lib/mongo/error/invalid_collection_name.rb +3 -0
- data/lib/mongo/error/invalid_config_option.rb +21 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +3 -0
- data/lib/mongo/error/invalid_database_name.rb +3 -0
- data/lib/mongo/error/invalid_document.rb +3 -0
- data/lib/mongo/error/invalid_file.rb +3 -0
- data/lib/mongo/error/invalid_file_revision.rb +3 -0
- data/lib/mongo/error/invalid_max_connecting.rb +28 -0
- data/lib/mongo/error/invalid_min_pool_size.rb +3 -0
- data/lib/mongo/error/invalid_nonce.rb +3 -0
- data/lib/mongo/error/invalid_read_concern.rb +31 -0
- data/lib/mongo/error/invalid_read_option.rb +4 -1
- data/lib/mongo/error/invalid_replacement_document.rb +30 -9
- data/lib/mongo/error/invalid_server_auth_host.rb +3 -0
- data/lib/mongo/error/invalid_server_auth_response.rb +3 -0
- data/lib/mongo/error/invalid_server_preference.rb +3 -0
- data/lib/mongo/error/invalid_session.rb +3 -0
- data/lib/mongo/error/invalid_signature.rb +3 -0
- data/lib/mongo/error/invalid_transaction_operation.rb +3 -0
- data/lib/mongo/error/invalid_txt_record.rb +3 -0
- data/lib/mongo/error/invalid_update_document.rb +30 -7
- data/lib/mongo/error/invalid_uri.rb +3 -0
- data/lib/mongo/error/invalid_write_concern.rb +3 -0
- data/lib/mongo/error/kms_error.rb +3 -0
- data/lib/mongo/error/labelable.rb +72 -0
- data/lib/mongo/error/lint_error.rb +3 -0
- data/lib/mongo/error/max_bson_size.rb +3 -0
- data/lib/mongo/error/max_message_size.rb +3 -0
- data/lib/mongo/error/mismatched_domain.rb +3 -0
- data/lib/mongo/error/missing_connection.rb +27 -0
- data/lib/mongo/error/missing_file_chunk.rb +11 -2
- data/lib/mongo/error/missing_password.rb +3 -0
- data/lib/mongo/error/missing_resume_token.rb +3 -0
- data/lib/mongo/error/missing_scram_server_signature.rb +3 -0
- data/lib/mongo/error/missing_service_id.rb +26 -0
- data/lib/mongo/error/mongocryptd_spawn_error.rb +3 -0
- data/lib/mongo/error/multi_index_drop.rb +3 -0
- data/lib/mongo/error/need_primary_server.rb +3 -0
- data/lib/mongo/error/no_server_available.rb +3 -0
- data/lib/mongo/error/no_service_connection_available.rb +49 -0
- data/lib/mongo/error/no_srv_records.rb +3 -0
- data/lib/mongo/error/notable.rb +24 -0
- data/lib/mongo/error/operation_failure.rb +57 -87
- data/lib/mongo/error/parser.rb +69 -13
- data/lib/mongo/error/pool_cleared_error.rb +40 -0
- data/lib/mongo/error/pool_closed_error.rb +6 -16
- data/lib/mongo/error/pool_error.rb +45 -0
- data/lib/mongo/error/pool_paused_error.rb +40 -0
- data/lib/mongo/error/raise_original_error.rb +3 -0
- data/lib/mongo/error/read_write_retryable.rb +108 -0
- data/lib/mongo/error/sdam_error_detection.rb +16 -5
- data/lib/mongo/error/server_api_conflict.rb +26 -0
- data/lib/mongo/error/server_api_not_supported.rb +27 -0
- data/lib/mongo/error/server_certificate_revoked.rb +25 -0
- data/lib/mongo/error/server_not_usable.rb +36 -0
- data/lib/mongo/error/session_ended.rb +3 -0
- data/lib/mongo/error/session_not_materialized.rb +29 -0
- data/lib/mongo/error/sessions_not_supported.rb +3 -0
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +31 -0
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
- data/lib/mongo/error/socket_error.rb +3 -0
- data/lib/mongo/error/socket_timeout_error.rb +3 -0
- data/lib/mongo/error/unchangeable_collection_option.rb +3 -0
- data/lib/mongo/error/unexpected_chunk_length.rb +3 -0
- data/lib/mongo/error/unexpected_response.rb +3 -0
- data/lib/mongo/error/unknown_payload_type.rb +3 -0
- data/lib/mongo/error/unmet_dependency.rb +24 -0
- data/lib/mongo/error/unsupported_array_filters.rb +3 -0
- data/lib/mongo/error/unsupported_collation.rb +3 -0
- data/lib/mongo/error/unsupported_features.rb +3 -0
- data/lib/mongo/error/unsupported_message_type.rb +3 -0
- data/lib/mongo/error/unsupported_option.rb +17 -12
- data/lib/mongo/error/write_retryable.rb +3 -0
- data/lib/mongo/error.rb +31 -38
- data/lib/mongo/event/base.rb +3 -0
- data/lib/mongo/event/listeners.rb +3 -0
- data/lib/mongo/event/publisher.rb +3 -0
- data/lib/mongo/event/subscriber.rb +3 -0
- data/lib/mongo/event.rb +3 -0
- data/lib/mongo/grid/file/chunk.rb +6 -2
- data/lib/mongo/grid/file/info.rb +5 -1
- data/lib/mongo/grid/file.rb +3 -0
- data/lib/mongo/grid/fs_bucket.rb +86 -46
- data/lib/mongo/grid/stream/read.rb +28 -7
- data/lib/mongo/grid/stream/write.rb +3 -0
- data/lib/mongo/grid/stream.rb +3 -0
- data/lib/mongo/grid.rb +3 -0
- data/lib/mongo/id.rb +10 -5
- data/lib/mongo/index/view.rb +68 -58
- data/lib/mongo/index.rb +3 -0
- data/lib/mongo/lint.rb +5 -1
- data/lib/mongo/loggable.rb +5 -2
- data/lib/mongo/logger.rb +6 -3
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/base.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +17 -4
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
- data/lib/mongo/monitoring/event/cmap.rb +4 -0
- data/lib/mongo/monitoring/event/command_failed.rb +38 -5
- data/lib/mongo/monitoring/event/command_started.rb +23 -3
- data/lib/mongo/monitoring/event/command_succeeded.rb +36 -3
- data/lib/mongo/monitoring/event/secure.rb +39 -5
- data/lib/mongo/monitoring/event/server_closed.rb +3 -0
- data/lib/mongo/monitoring/event/server_description_changed.rb +4 -1
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +32 -18
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +3 -0
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +30 -16
- data/lib/mongo/monitoring/event/server_opening.rb +3 -0
- data/lib/mongo/monitoring/event/topology_changed.rb +3 -0
- data/lib/mongo/monitoring/event/topology_closed.rb +3 -0
- data/lib/mongo/monitoring/event/topology_opening.rb +3 -0
- data/lib/mongo/monitoring/event.rb +3 -0
- data/lib/mongo/monitoring/publishable.rb +38 -12
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring.rb +20 -8
- data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
- data/lib/mongo/operation/aggregate/result.rb +12 -8
- data/lib/mongo/operation/aggregate.rb +4 -2
- data/lib/mongo/operation/collections_info/result.rb +24 -1
- data/lib/mongo/operation/collections_info.rb +10 -2
- data/lib/mongo/operation/command/op_msg.rb +9 -0
- data/lib/mongo/operation/command.rb +4 -2
- data/lib/mongo/operation/context.rb +138 -0
- data/lib/mongo/operation/count/op_msg.rb +12 -0
- data/lib/mongo/operation/count.rb +4 -2
- data/lib/mongo/operation/create/op_msg.rb +13 -0
- data/lib/mongo/operation/create.rb +4 -2
- data/lib/mongo/operation/create_index/op_msg.rb +21 -4
- data/lib/mongo/operation/create_index.rb +4 -2
- data/lib/mongo/operation/create_user/op_msg.rb +3 -0
- data/lib/mongo/operation/create_user.rb +4 -2
- data/lib/mongo/operation/delete/bulk_result.rb +5 -0
- data/lib/mongo/operation/delete/op_msg.rb +13 -1
- data/lib/mongo/operation/delete/result.rb +6 -0
- data/lib/mongo/operation/delete.rb +3 -2
- data/lib/mongo/operation/distinct/op_msg.rb +13 -0
- data/lib/mongo/operation/distinct.rb +4 -2
- data/lib/mongo/operation/drop/op_msg.rb +3 -0
- data/lib/mongo/operation/drop.rb +4 -2
- data/lib/mongo/operation/drop_database/op_msg.rb +3 -0
- data/lib/mongo/operation/drop_database.rb +4 -2
- data/lib/mongo/operation/drop_index/op_msg.rb +8 -1
- data/lib/mongo/operation/drop_index.rb +4 -2
- data/lib/mongo/operation/explain/op_msg.rb +17 -0
- data/lib/mongo/operation/explain/result.rb +6 -0
- data/lib/mongo/operation/explain.rb +4 -3
- data/lib/mongo/operation/find/builder/command.rb +111 -0
- data/lib/mongo/operation/find/builder/flags.rb +61 -0
- data/lib/mongo/operation/find/builder/modifiers.rb +89 -0
- data/lib/mongo/operation/find/builder.rb +20 -0
- data/lib/mongo/operation/find/op_msg.rb +15 -0
- data/lib/mongo/operation/find/result.rb +16 -0
- data/lib/mongo/operation/find.rb +5 -3
- data/lib/mongo/operation/get_more/command_builder.rb +42 -0
- data/lib/mongo/operation/get_more/op_msg.rb +4 -0
- data/lib/mongo/operation/get_more/result.rb +6 -0
- data/lib/mongo/operation/get_more.rb +5 -3
- data/lib/mongo/operation/indexes/op_msg.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +8 -0
- data/lib/mongo/operation/indexes.rb +4 -3
- data/lib/mongo/operation/insert/bulk_result.rb +13 -1
- data/lib/mongo/operation/insert/op_msg.rb +11 -5
- data/lib/mongo/operation/insert/result.rb +14 -3
- data/lib/mongo/operation/insert.rb +3 -2
- data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
- data/lib/mongo/operation/kill_cursors/op_msg.rb +13 -0
- data/lib/mongo/operation/kill_cursors.rb +5 -3
- data/lib/mongo/operation/list_collections/op_msg.rb +7 -1
- data/lib/mongo/operation/list_collections/result.rb +12 -1
- data/lib/mongo/operation/list_collections.rb +4 -2
- data/lib/mongo/operation/map_reduce/op_msg.rb +4 -1
- data/lib/mongo/operation/map_reduce/result.rb +29 -0
- data/lib/mongo/operation/map_reduce.rb +4 -2
- data/lib/mongo/operation/op_msg_base.rb +3 -0
- data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
- data/lib/mongo/operation/parallel_scan/result.rb +7 -0
- data/lib/mongo/operation/parallel_scan.rb +4 -2
- data/lib/mongo/operation/remove_user/op_msg.rb +3 -0
- data/lib/mongo/operation/remove_user.rb +4 -2
- data/lib/mongo/operation/result.rb +67 -11
- data/lib/mongo/operation/shared/bypass_document_validation.rb +4 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +4 -0
- data/lib/mongo/operation/shared/executable.rb +61 -17
- data/lib/mongo/operation/shared/executable_no_validate.rb +5 -2
- data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -0
- data/lib/mongo/operation/shared/idable.rb +5 -1
- data/lib/mongo/operation/shared/limited.rb +4 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +4 -0
- data/lib/mongo/operation/shared/op_msg_executable.rb +59 -0
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +3 -0
- data/lib/mongo/operation/shared/polymorphic_result.rb +3 -0
- data/lib/mongo/operation/shared/read_preference_supported.rb +44 -37
- data/lib/mongo/operation/shared/response_handling.rb +32 -27
- data/lib/mongo/operation/shared/result/aggregatable.rb +4 -0
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +3 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +55 -20
- data/lib/mongo/operation/shared/specifiable.rb +15 -29
- data/lib/mongo/operation/shared/validatable.rb +87 -0
- data/lib/mongo/operation/shared/write.rb +28 -28
- data/lib/mongo/operation/shared/write_concern_supported.rb +4 -0
- data/lib/mongo/operation/update/bulk_result.rb +3 -0
- data/lib/mongo/operation/update/op_msg.rb +12 -4
- data/lib/mongo/operation/update/result.rb +11 -0
- data/lib/mongo/operation/update.rb +3 -2
- data/lib/mongo/operation/update_user/op_msg.rb +3 -0
- data/lib/mongo/operation/update_user.rb +4 -2
- data/lib/mongo/operation/users_info/op_msg.rb +3 -0
- data/lib/mongo/operation/users_info/result.rb +6 -0
- data/lib/mongo/operation/users_info.rb +4 -2
- data/lib/mongo/operation/write_command/op_msg.rb +43 -0
- data/lib/mongo/operation/write_command.rb +31 -0
- data/lib/mongo/operation.rb +17 -4
- data/lib/mongo/options/mapper.rb +3 -0
- data/lib/mongo/options/redacted.rb +3 -0
- data/lib/mongo/options.rb +3 -0
- data/lib/mongo/protocol/bit_vector.rb +6 -1
- data/lib/mongo/protocol/caching_hash.rb +52 -0
- data/lib/mongo/protocol/compressed.rb +54 -5
- data/lib/mongo/protocol/get_more.rb +3 -0
- data/lib/mongo/protocol/kill_cursors.rb +3 -0
- data/lib/mongo/protocol/message.rb +27 -10
- data/lib/mongo/protocol/msg.rb +61 -17
- data/lib/mongo/protocol/query.rb +53 -32
- data/lib/mongo/protocol/registry.rb +3 -0
- data/lib/mongo/protocol/reply.rb +3 -0
- data/lib/mongo/protocol/serializers.rb +27 -17
- data/lib/mongo/protocol.rb +4 -3
- data/lib/mongo/query_cache.rb +300 -0
- data/lib/mongo/retryable/base_worker.rb +91 -0
- data/lib/mongo/retryable/read_worker.rb +296 -0
- data/lib/mongo/retryable/write_worker.rb +364 -0
- data/lib/mongo/retryable.rb +33 -446
- data/lib/mongo/semaphore.rb +4 -1
- data/lib/mongo/server/app_metadata/environment.rb +259 -0
- data/lib/mongo/server/app_metadata/platform.rb +114 -0
- data/lib/mongo/server/app_metadata/truncator.rb +142 -0
- data/lib/mongo/server/app_metadata.rb +117 -94
- data/lib/mongo/server/connection.rb +126 -22
- data/lib/mongo/server/connection_base.rb +49 -21
- data/lib/mongo/server/connection_common.rb +76 -3
- data/lib/mongo/server/connection_pool/generation_manager.rb +115 -0
- data/lib/mongo/server/connection_pool/populator.rb +35 -30
- data/lib/mongo/server/connection_pool.rb +776 -206
- data/lib/mongo/server/description/features.rb +34 -25
- data/lib/mongo/server/description/load_balancer.rb +33 -0
- data/lib/mongo/server/description.rb +126 -17
- data/lib/mongo/server/monitor/app_metadata.rb +4 -1
- data/lib/mongo/server/monitor/connection.rb +66 -50
- data/lib/mongo/server/monitor.rb +62 -32
- data/lib/mongo/server/pending_connection.rb +77 -44
- data/lib/mongo/server/push_monitor/connection.rb +3 -0
- data/lib/mongo/server/push_monitor.rb +54 -20
- data/lib/mongo/server/round_trip_time_averager.rb +6 -3
- data/lib/mongo/server.rb +197 -67
- data/lib/mongo/server_selector/base.rb +65 -11
- data/lib/mongo/server_selector/nearest.rb +6 -4
- data/lib/mongo/server_selector/primary.rb +6 -4
- data/lib/mongo/server_selector/primary_preferred.rb +6 -4
- data/lib/mongo/server_selector/secondary.rb +6 -4
- data/lib/mongo/server_selector/secondary_preferred.rb +8 -11
- data/lib/mongo/server_selector.rb +3 -0
- data/lib/mongo/session/server_session.rb +3 -0
- data/lib/mongo/session/session_pool.rb +26 -2
- data/lib/mongo/session.rb +164 -38
- data/lib/mongo/socket/ocsp_cache.rb +99 -0
- data/lib/mongo/socket/ocsp_verifier.rb +344 -0
- data/lib/mongo/socket/ssl.rb +56 -24
- data/lib/mongo/socket/tcp.rb +6 -0
- data/lib/mongo/socket/unix.rb +3 -0
- data/lib/mongo/socket.rb +71 -16
- data/lib/mongo/srv/monitor.rb +10 -26
- data/lib/mongo/srv/resolver.rb +41 -13
- data/lib/mongo/srv/result.rb +3 -0
- data/lib/mongo/srv.rb +3 -0
- data/lib/mongo/timeout.rb +6 -1
- data/lib/mongo/topology_version.rb +4 -1
- data/lib/mongo/uri/options_mapper.rb +867 -0
- data/lib/mongo/uri/srv_protocol.rb +13 -11
- data/lib/mongo/uri.rb +100 -400
- data/lib/mongo/utils.rb +44 -1
- data/lib/mongo/version.rb +4 -1
- data/lib/mongo/write_concern/acknowledged.rb +3 -0
- data/lib/mongo/write_concern/base.rb +3 -0
- data/lib/mongo/write_concern/unacknowledged.rb +3 -0
- data/lib/mongo/write_concern.rb +3 -0
- data/lib/mongo.rb +58 -0
- data/mongo.gemspec +16 -7
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.md +106 -3
- data/spec/atlas/atlas_connectivity_spec.rb +3 -0
- data/spec/atlas/operations_spec.rb +5 -7
- data/spec/integration/auth_spec.rb +58 -15
- data/spec/integration/awaited_ismaster_spec.rb +9 -6
- data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
- data/spec/integration/aws_auth_request_spec.rb +4 -1
- data/spec/integration/aws_credentials_retriever_spec.rb +34 -1
- data/spec/integration/aws_lambda_examples_spec.rb +68 -0
- data/spec/integration/bson_symbol_spec.rb +8 -3
- data/spec/integration/bulk_insert_spec.rb +3 -0
- data/spec/integration/bulk_write_error_message_spec.rb +74 -0
- data/spec/integration/bulk_write_spec.rb +67 -0
- data/spec/integration/change_stream_examples_spec.rb +3 -0
- data/spec/integration/change_stream_spec.rb +18 -9
- data/spec/integration/check_clean_slate_spec.rb +3 -0
- data/spec/integration/client_authentication_options_spec.rb +76 -36
- data/spec/integration/client_connectivity_spec.rb +4 -1
- data/spec/integration/client_construction_aws_auth_spec.rb +14 -2
- data/spec/integration/client_construction_spec.rb +153 -8
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +13 -10
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +172 -169
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -1
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +3 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +43 -4
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +148 -2
- data/spec/integration/client_side_encryption/automatic_data_encryption_keys_prose_spec.rb +153 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +6 -3
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +6 -3
- data/spec/integration/client_side_encryption/client_close_spec.rb +4 -1
- data/spec/integration/client_side_encryption/corpus_spec.rb +67 -35
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +42 -42
- data/spec/integration/client_side_encryption/data_key_spec.rb +101 -8
- data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +159 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +62 -0
- data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +150 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +9 -6
- data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
- data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
- data/spec/integration/client_side_encryption/mongocryptd_prose_spec.rb +105 -0
- data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +49 -0
- data/spec/integration/client_side_encryption/on_demand_azure_credentials_spec.rb +46 -0
- data/spec/integration/client_side_encryption/on_demand_gcp_credentials_spec.rb +47 -0
- data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +114 -0
- data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +536 -0
- data/spec/integration/client_side_encryption/rewrap_prose_spec.rb +114 -0
- data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +89 -0
- data/spec/integration/client_side_encryption/views_spec.rb +4 -1
- data/spec/integration/client_spec.rb +14 -4
- data/spec/integration/client_update_spec.rb +9 -2
- data/spec/integration/collection_indexes_prose_spec.rb +3 -0
- data/spec/integration/command_monitoring_spec.rb +64 -26
- data/spec/integration/command_spec.rb +5 -24
- data/spec/integration/connect_single_rs_name_spec.rb +6 -3
- data/spec/integration/connection/faas_env_spec.rb +62 -0
- data/spec/integration/connection_pool_populator_spec.rb +33 -8
- data/spec/integration/connection_spec.rb +58 -36
- data/spec/integration/crud_spec.rb +217 -1
- data/spec/integration/cursor_pinning_spec.rb +125 -0
- data/spec/integration/cursor_reaping_spec.rb +62 -19
- data/spec/integration/docs_examples_spec.rb +12 -2
- data/spec/integration/error_detection_spec.rb +3 -0
- data/spec/integration/fork_reconnect_spec.rb +73 -9
- data/spec/integration/get_more_spec.rb +4 -1
- data/spec/integration/grid_fs_bucket_spec.rb +7 -4
- data/spec/integration/heartbeat_events_spec.rb +8 -5
- data/spec/integration/map_reduce_spec.rb +81 -0
- data/spec/integration/mmapv1_spec.rb +3 -0
- data/spec/integration/mongos_pinning_spec.rb +3 -0
- data/spec/integration/ocsp_connectivity_spec.rb +29 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
- data/spec/integration/ocsp_verifier_spec.rb +358 -0
- data/spec/integration/operation_failure_code_spec.rb +4 -1
- data/spec/integration/operation_failure_message_spec.rb +91 -0
- data/spec/integration/query_cache_spec.rb +1343 -0
- data/spec/integration/query_cache_transactions_spec.rb +193 -0
- data/spec/integration/read_concern_spec.rb +4 -1
- data/spec/integration/read_preference_spec.rb +20 -13
- data/spec/integration/reconnect_spec.rb +39 -13
- data/spec/integration/retryable_errors_spec.rb +4 -1
- data/spec/integration/retryable_reads_errors_spec.rb +110 -0
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +5 -2
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +5 -1
- data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +3 -0
- data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +5 -0
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/supports_retries.rb +3 -0
- data/spec/integration/retryable_writes_errors_spec.rb +162 -1
- data/spec/integration/sdam_error_handling_spec.rb +159 -8
- data/spec/integration/sdam_events_spec.rb +94 -31
- data/spec/integration/sdam_prose_spec.rb +7 -4
- data/spec/integration/secondary_reads_spec.rb +103 -0
- data/spec/integration/server_description_spec.rb +3 -0
- data/spec/integration/server_monitor_spec.rb +7 -2
- data/spec/integration/server_selection_spec.rb +39 -0
- data/spec/integration/server_selector_spec.rb +29 -7
- data/spec/integration/server_spec.rb +27 -25
- data/spec/integration/shell_examples_spec.rb +3 -0
- data/spec/integration/size_limit_spec.rb +7 -1
- data/spec/integration/snappy_compression_spec.rb +28 -0
- data/spec/integration/snapshot_query_examples_spec.rb +129 -0
- data/spec/integration/srv_monitoring_spec.rb +82 -5
- data/spec/integration/srv_spec.rb +60 -0
- data/spec/integration/ssl_uri_options_spec.rb +3 -0
- data/spec/integration/step_down_spec.rb +28 -7
- data/spec/integration/time_zone_querying_spec.rb +3 -0
- data/spec/integration/transaction_pinning_spec.rb +134 -0
- data/spec/integration/transactions_api_examples_spec.rb +3 -0
- data/spec/integration/transactions_examples_spec.rb +26 -7
- data/spec/integration/truncated_utf8_spec.rb +26 -0
- data/spec/integration/versioned_api_examples_spec.rb +120 -0
- data/spec/integration/x509_auth_spec.rb +5 -2
- data/spec/integration/zlib_compression_spec.rb +4 -1
- data/spec/integration/zstd_compression_spec.rb +29 -0
- data/spec/kerberos/kerberos_spec.rb +3 -0
- data/spec/lite_spec_helper.rb +59 -16
- data/spec/mongo/address/ipv4_spec.rb +3 -0
- data/spec/mongo/address/ipv6_spec.rb +10 -0
- data/spec/mongo/address/unix_spec.rb +4 -0
- data/spec/mongo/address/validator_spec.rb +3 -0
- data/spec/mongo/address_spec.rb +33 -13
- data/spec/mongo/auth/aws/credential_cache_spec.rb +63 -0
- data/spec/mongo/auth/aws/credentials_retriever_spec.rb +90 -0
- data/spec/mongo/auth/aws/credentials_spec.rb +46 -0
- data/spec/mongo/auth/aws/request_region_spec.rb +3 -0
- data/spec/mongo/auth/aws/request_spec.rb +3 -0
- data/spec/mongo/auth/cr_spec.rb +6 -24
- data/spec/mongo/auth/gssapi/conversation_spec.rb +3 -0
- data/spec/mongo/auth/invalid_mechanism_spec.rb +3 -0
- data/spec/mongo/auth/ldap/conversation_spec.rb +4 -1
- data/spec/mongo/auth/ldap_spec.rb +10 -4
- data/spec/mongo/auth/scram/conversation_spec.rb +26 -23
- data/spec/mongo/auth/scram256/conversation_spec.rb +23 -20
- data/spec/mongo/auth/scram_negotiation_spec.rb +5 -1
- data/spec/mongo/auth/scram_spec.rb +5 -3
- data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
- data/spec/mongo/auth/stringprep_spec.rb +3 -0
- data/spec/mongo/auth/user/view_spec.rb +99 -1
- data/spec/mongo/auth/user_spec.rb +4 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +6 -3
- data/spec/mongo/auth/x509_spec.rb +5 -3
- data/spec/mongo/auth_spec.rb +3 -0
- data/spec/mongo/bson_spec.rb +3 -0
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
- data/spec/mongo/bulk_write/result_spec.rb +18 -1
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
- data/spec/mongo/bulk_write_spec.rb +149 -25
- data/spec/mongo/caching_cursor_spec.rb +73 -0
- data/spec/mongo/client_construction_spec.rb +1112 -546
- data/spec/mongo/client_encryption_spec.rb +27 -30
- data/spec/mongo/client_spec.rb +445 -139
- data/spec/mongo/cluster/cursor_reaper_spec.rb +66 -23
- data/spec/mongo/cluster/periodic_executor_spec.rb +6 -1
- data/spec/mongo/cluster/socket_reaper_spec.rb +3 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +13 -10
- data/spec/mongo/cluster/topology/sharded_spec.rb +6 -3
- data/spec/mongo/cluster/topology/single_spec.rb +20 -8
- data/spec/mongo/cluster/topology/unknown_spec.rb +4 -1
- data/spec/mongo/cluster/topology_spec.rb +4 -1
- data/spec/mongo/cluster_spec.rb +183 -192
- data/spec/mongo/cluster_time_spec.rb +3 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +181 -83
- data/spec/mongo/collection/view/builder/find_command_spec.rb +7 -0
- data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +8 -3
- data/spec/mongo/collection/view/change_stream_spec.rb +18 -2
- data/spec/mongo/collection/view/explainable_spec.rb +90 -4
- data/spec/mongo/collection/view/immutable_spec.rb +3 -0
- data/spec/mongo/collection/view/iterable_spec.rb +3 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +46 -2
- data/spec/mongo/collection/view/readable_spec.rb +868 -1
- data/spec/mongo/collection/view/writable_spec.rb +147 -32
- data/spec/mongo/collection/view_spec.rb +3 -0
- data/spec/mongo/collection_crud_spec.rb +4471 -0
- data/spec/mongo/collection_ddl_spec.rb +587 -0
- data/spec/mongo/collection_spec.rb +106 -4839
- data/spec/mongo/condition_variable_spec.rb +104 -0
- data/spec/mongo/config/options_spec.rb +76 -0
- data/spec/mongo/config_spec.rb +74 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +21 -2
- data/spec/mongo/crypt/auto_encrypter_spec.rb +266 -5
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +21 -2
- data/spec/mongo/crypt/binary_spec.rb +3 -5
- data/spec/mongo/crypt/binding/binary_spec.rb +3 -5
- data/spec/mongo/crypt/binding/context_spec.rb +71 -23
- data/spec/mongo/crypt/binding/helpers_spec.rb +3 -5
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +21 -52
- data/spec/mongo/crypt/binding/status_spec.rb +3 -5
- data/spec/mongo/crypt/binding/version_spec.rb +50 -5
- data/spec/mongo/crypt/binding_unloaded_spec.rb +17 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +45 -114
- data/spec/mongo/crypt/encryption_io_spec.rb +5 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +36 -2
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +98 -2
- data/spec/mongo/crypt/handle_spec.rb +189 -155
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +3 -0
- data/spec/mongo/crypt/hooks_spec.rb +30 -0
- data/spec/mongo/crypt/kms/azure/credentials_retriever_spec.rb +86 -0
- data/spec/mongo/crypt/kms/credentials_spec.rb +373 -0
- data/spec/mongo/crypt/kms_spec.rb +62 -0
- data/spec/mongo/crypt/status_spec.rb +3 -5
- data/spec/mongo/crypt_spec.rb +21 -0
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +11 -2
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +11 -2
- data/spec/mongo/cursor_spec.rb +230 -19
- data/spec/mongo/database_spec.rb +263 -25
- data/spec/mongo/distinguishing_semaphore_spec.rb +9 -6
- data/spec/mongo/error/bulk_write_error_spec.rb +6 -3
- data/spec/mongo/error/crypt_error_spec.rb +3 -0
- data/spec/mongo/error/max_bson_size_spec.rb +3 -0
- data/spec/mongo/error/no_server_available_spec.rb +4 -1
- data/spec/mongo/error/notable_spec.rb +3 -0
- data/spec/mongo/error/operation_failure_heavy_spec.rb +53 -1
- data/spec/mongo/error/operation_failure_spec.rb +94 -31
- data/spec/mongo/error/parser_spec.rb +40 -6
- data/spec/mongo/error/unsupported_option_spec.rb +3 -0
- data/spec/mongo/event/publisher_spec.rb +3 -0
- data/spec/mongo/event/subscriber_spec.rb +3 -0
- data/spec/mongo/grid/file/chunk_spec.rb +7 -4
- data/spec/mongo/grid/file/info_spec.rb +3 -0
- data/spec/mongo/grid/file_spec.rb +4 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +40 -17
- data/spec/mongo/grid/stream/read_spec.rb +33 -10
- data/spec/mongo/grid/stream/write_spec.rb +6 -9
- data/spec/mongo/grid/stream_spec.rb +4 -1
- data/spec/mongo/id_spec.rb +4 -1
- data/spec/mongo/index/view_spec.rb +138 -4
- data/spec/mongo/lint_spec.rb +4 -1
- data/spec/mongo/logger_spec.rb +16 -11
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +4 -1
- data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
- data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
- data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
- data/spec/mongo/monitoring/event/server_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +3 -0
- data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
- data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
- data/spec/mongo/monitoring/event/server_opening_spec.rb +4 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +4 -1
- data/spec/mongo/monitoring_spec.rb +3 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +7 -2
- data/spec/mongo/operation/aggregate_spec.rb +5 -1
- data/spec/mongo/operation/collections_info_spec.rb +7 -1
- data/spec/mongo/operation/command_spec.rb +11 -5
- data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
- data/spec/mongo/operation/create_index_spec.rb +9 -3
- data/spec/mongo/operation/create_user_spec.rb +9 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +12 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +20 -8
- data/spec/mongo/operation/delete_spec.rb +13 -36
- data/spec/mongo/operation/drop_index_spec.rb +9 -2
- data/spec/mongo/operation/find/builder/flags_spec.rb +109 -0
- data/spec/mongo/operation/find/builder/modifiers_spec.rb +213 -0
- data/spec/mongo/operation/indexes_spec.rb +8 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +14 -8
- data/spec/mongo/operation/insert/op_msg_spec.rb +25 -14
- data/spec/mongo/operation/insert_spec.rb +17 -43
- data/spec/mongo/operation/limited_spec.rb +3 -0
- data/spec/mongo/operation/map_reduce_spec.rb +8 -2
- data/spec/mongo/operation/read_preference_legacy_spec.rb +39 -42
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +33 -5
- data/spec/mongo/operation/remove_user_spec.rb +9 -3
- data/spec/mongo/operation/result_spec.rb +30 -5
- data/spec/mongo/operation/specifiable_spec.rb +3 -0
- data/spec/mongo/operation/update/bulk_spec.rb +13 -7
- data/spec/mongo/operation/update/op_msg_spec.rb +20 -8
- data/spec/mongo/operation/update_spec.rb +12 -35
- data/spec/mongo/operation/update_user_spec.rb +7 -1
- data/spec/mongo/options/redacted_spec.rb +4 -1
- data/spec/mongo/protocol/caching_hash_spec.rb +37 -0
- data/spec/mongo/protocol/compressed_spec.rb +29 -12
- data/spec/mongo/protocol/get_more_spec.rb +3 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +3 -0
- data/spec/mongo/protocol/msg_spec.rb +48 -66
- data/spec/mongo/protocol/query_spec.rb +6 -3
- data/spec/mongo/protocol/registry_spec.rb +3 -0
- data/spec/mongo/protocol/reply_spec.rb +3 -0
- data/spec/mongo/query_cache_middleware_spec.rb +55 -0
- data/spec/mongo/query_cache_spec.rb +453 -0
- data/spec/mongo/retryable_spec.rb +42 -7
- data/spec/mongo/semaphore_spec.rb +9 -6
- data/spec/mongo/server/app_metadata/environment_spec.rb +209 -0
- data/spec/mongo/server/app_metadata/truncator_spec.rb +158 -0
- data/spec/mongo/server/app_metadata_spec.rb +55 -52
- data/spec/mongo/server/connection_auth_spec.rb +9 -10
- data/spec/mongo/server/connection_common_spec.rb +87 -0
- data/spec/mongo/server/connection_pool/populator_spec.rb +22 -3
- data/spec/mongo/server/connection_pool_spec.rb +635 -58
- data/spec/mongo/server/connection_spec.rb +226 -204
- data/spec/mongo/server/description/features_spec.rb +27 -0
- data/spec/mongo/server/description_query_methods_spec.rb +4 -1
- data/spec/mongo/server/description_spec.rb +625 -594
- data/spec/mongo/server/monitor/app_metadata_spec.rb +3 -1
- data/spec/mongo/server/monitor/connection_spec.rb +81 -9
- data/spec/mongo/server/monitor_spec.rb +31 -18
- data/spec/mongo/server/push_monitor_spec.rb +95 -0
- data/spec/mongo/server/round_trip_time_averager_spec.rb +3 -0
- data/spec/mongo/server_selector/nearest_spec.rb +8 -2
- data/spec/mongo/server_selector/primary_preferred_spec.rb +8 -2
- data/spec/mongo/server_selector/primary_spec.rb +8 -2
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +14 -8
- data/spec/mongo/server_selector/secondary_spec.rb +8 -2
- data/spec/mongo/server_selector_spec.rb +143 -18
- data/spec/mongo/server_spec.rb +49 -6
- data/spec/mongo/session/server_session_spec.rb +3 -0
- data/spec/mongo/session/session_pool_spec.rb +45 -10
- data/spec/mongo/session_spec.rb +29 -6
- data/spec/mongo/session_transaction_spec.rb +17 -36
- data/spec/mongo/socket/ssl_spec.rb +91 -75
- data/spec/mongo/socket/tcp_spec.rb +3 -0
- data/spec/mongo/socket/unix_spec.rb +4 -0
- data/spec/mongo/socket_spec.rb +5 -2
- data/spec/mongo/srv/monitor_spec.rb +3 -0
- data/spec/mongo/srv/result_spec.rb +3 -0
- data/spec/mongo/timeout_spec.rb +3 -0
- data/spec/mongo/tls_context_hooks_spec.rb +40 -0
- data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +330 -36
- data/spec/mongo/uri_option_parsing_spec.rb +52 -16
- data/spec/mongo/uri_spec.rb +238 -42
- data/spec/mongo/utils_spec.rb +42 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
- data/spec/mongo/write_concern_spec.rb +3 -0
- data/spec/runners/auth.rb +26 -2
- data/spec/runners/change_streams/outcome.rb +3 -0
- data/spec/runners/change_streams/spec.rb +4 -1
- data/spec/runners/change_streams/test.rb +5 -2
- data/spec/runners/cmap/verifier.rb +4 -1
- data/spec/runners/cmap.rb +192 -46
- data/spec/runners/command_monitoring.rb +4 -1
- data/spec/runners/connection_string.rb +48 -126
- data/spec/runners/crud/context.rb +3 -0
- data/spec/runners/crud/operation.rb +21 -7
- data/spec/runners/crud/outcome.rb +3 -0
- data/spec/runners/crud/requirement.rb +76 -6
- data/spec/runners/crud/spec.rb +9 -3
- data/spec/runners/crud/test.rb +4 -1
- data/spec/runners/crud/test_base.rb +4 -20
- data/spec/runners/crud/verifier.rb +20 -4
- data/spec/runners/crud.rb +23 -1
- data/spec/runners/gridfs.rb +4 -1
- data/spec/runners/read_write_concern_document.rb +4 -1
- data/spec/runners/sdam/verifier.rb +3 -0
- data/spec/runners/sdam.rb +9 -5
- data/spec/runners/server_selection.rb +5 -2
- data/spec/runners/server_selection_rtt.rb +5 -2
- data/spec/runners/transactions/operation.rb +30 -10
- data/spec/runners/transactions/spec.rb +5 -2
- data/spec/runners/transactions/test.rb +69 -21
- data/spec/runners/transactions.rb +14 -8
- data/spec/runners/unified/assertions.rb +379 -0
- data/spec/runners/unified/change_stream_operations.rb +52 -0
- data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
- data/spec/runners/unified/crud_operations.rb +332 -0
- data/spec/runners/unified/ddl_operations.rb +255 -0
- data/spec/runners/unified/entity_map.rb +42 -0
- data/spec/runners/unified/error.rb +29 -0
- data/spec/runners/unified/event_subscriber.rb +110 -0
- data/spec/runners/unified/exceptions.rb +24 -0
- data/spec/runners/unified/grid_fs_operations.rb +79 -0
- data/spec/runners/unified/support_operations.rb +333 -0
- data/spec/runners/unified/test.rb +585 -0
- data/spec/runners/unified/test_group.rb +31 -0
- data/spec/runners/unified/thread_operations.rb +73 -0
- data/spec/runners/unified.rb +109 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +378 -0
- data/spec/shared/lib/mrss/docker_runner.rb +295 -0
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +330 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +74 -0
- data/spec/shared/shlib/server.sh +416 -0
- data/spec/shared/shlib/set_env.sh +169 -0
- data/spec/solo/clean_exit_spec.rb +22 -0
- data/spec/spec_helper.rb +11 -5
- data/spec/spec_tests/auth_spec.rb +30 -13
- data/spec/spec_tests/change_streams_unified_spec.rb +14 -0
- data/spec/spec_tests/client_side_encryption_spec.rb +27 -1
- data/spec/spec_tests/client_side_encryption_unified_spec.rb +26 -0
- data/spec/spec_tests/cmap_spec.rb +41 -17
- data/spec/spec_tests/collection_management_spec.rb +13 -0
- data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
- data/spec/spec_tests/connection_string_spec.rb +3 -0
- data/spec/spec_tests/crud_spec.rb +3 -10
- data/spec/spec_tests/crud_unified_spec.rb +13 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +41 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +103 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +120 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1169 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1069 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +307 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams.yml +927 -0
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
- data/spec/spec_tests/data/client_side_encryption/awsTemporary.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
- data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +5 -4
- data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/fle2v2-BypassQueryAnalysis.yml +89 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +82 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection-OldServer.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +937 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +66 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +100 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +79 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +58 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +200 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +96 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +89 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +43 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +44 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +241 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +422 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +182 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +239 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +235 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +252 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +1687 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +293 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +905 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +1684 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +1680 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +1697 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +329 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +424 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +226 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +327 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +319 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +336 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +913 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +292 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +518 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +911 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +907 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +924 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +325 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +424 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +224 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +323 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +319 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +338 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +241 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +423 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +182 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +239 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +235 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +254 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +241 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +422 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +182 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +239 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +235 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +254 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +43 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +210 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +169 -0
- data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +3 -1
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
- data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
- data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
- data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
- data/spec/spec_tests/data/cmap/connection-must-have-id.yml +2 -0
- data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -1
- data/spec/spec_tests/data/cmap/pool-checkin.yml +5 -0
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +8 -2
- data/spec/spec_tests/data/cmap/pool-checkout-custom-maxConnecting-is-enforced.yml +50 -0
- data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-is-enforced.yml +81 -0
- data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-timeout.yml +71 -0
- data/spec/spec_tests/data/cmap/pool-checkout-minPoolSize-connection-maxConnecting.yml +64 -0
- data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +6 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +8 -0
- data/spec/spec_tests/data/cmap/pool-checkout-returned-connection-maxConnecting.yml +88 -0
- data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +49 -0
- data/spec/spec_tests/data/cmap/pool-clear-interrupting-pending-connections.yml +43 -0
- data/spec/spec_tests/data/cmap/pool-clear-min-size.yml +41 -0
- data/spec/spec_tests/data/cmap/pool-clear-paused.yml +18 -0
- data/spec/spec_tests/data/cmap/pool-clear-ready.yml +39 -0
- data/spec/spec_tests/data/cmap/pool-clear-schedule-run-interruptInUseConnections-false.yml +48 -0
- data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-create-max-size.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-create-min-size-error.yml +43 -0
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +12 -0
- data/spec/spec_tests/data/cmap/pool-ready-ready.yml +22 -0
- data/spec/spec_tests/data/cmap/pool-ready.yml +30 -0
- data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +2 -0
- data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +6 -1
- data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
- data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
- data/spec/spec_tests/data/collection_management/modifyCollection-errorResponse.yml +59 -0
- data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
- data/spec/spec_tests/data/collection_management/timeseries-collection.yml +164 -0
- data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
- data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
- data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +348 -0
- data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
- data/spec/spec_tests/data/command_monitoring_unified/writeConcernError.yml +80 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
- data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
- data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
- data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
- data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
- data/spec/spec_tests/data/crud_unified/aggregate-let.yml +138 -0
- data/spec/spec_tests/data/crud_unified/aggregate-merge-errorResponse.yml +42 -0
- data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
- data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
- data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
- data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-errorResponse.yml +50 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
- data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +93 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-errorResponse.yml +46 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +91 -0
- data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +181 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
- data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
- data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
- data/spec/spec_tests/data/crud_unified/find.yml +68 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-errorResponse.yml +69 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
- data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
- data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
- data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
- data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
- data/spec/spec_tests/data/crud_unified/insertOne-errorResponse.yml +46 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-let.yml +107 -0
- data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
- data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateOne-errorResponse.yml +47 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-let.yml +102 -0
- data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +299 -0
- data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
- data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
- data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
- data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
- data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
- data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
- data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
- data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
- data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/legacy/aggregate-serverErrors.yml +157 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-client.watch-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-client.watch.yml +62 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.coll.watch-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.coll.watch.yml +66 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.watch-serverErrors.yml +154 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.watch.yml +62 -0
- data/spec/spec_tests/data/retryable_reads/legacy/count-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/legacy/countDocuments-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/legacy/distinct-serverErrors.yml +156 -0
- data/spec/spec_tests/data/retryable_reads/legacy/estimatedDocumentCount-serverErrors.yml +148 -0
- data/spec/spec_tests/data/retryable_reads/legacy/find-serverErrors.yml +160 -0
- data/spec/spec_tests/data/retryable_reads/legacy/findOne-serverErrors.yml +154 -0
- data/spec/spec_tests/data/retryable_reads/legacy/gridfs-download-serverErrors.yml +173 -0
- data/spec/spec_tests/data/retryable_reads/legacy/gridfs-downloadByName-serverErrors.yml +174 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listCollectionNames-serverErrors.yml +143 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listCollectionObjects-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listCollections-serverErrors.yml +143 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listDatabaseNames-serverErrors.yml +143 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listDatabaseObjects-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listDatabases-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listIndexNames-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listIndexNames.yml +60 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listIndexes-serverErrors.yml +145 -0
- data/spec/spec_tests/data/retryable_reads/legacy/mapReduce.yml +62 -0
- data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1342 -0
- data/spec/spec_tests/data/retryable_writes/legacy/bulkWrite-serverErrors.yml +130 -0
- data/spec/spec_tests/data/retryable_writes/legacy/bulkWrite.yml +402 -0
- data/spec/spec_tests/data/retryable_writes/legacy/deleteOne-serverErrors.yml +73 -0
- data/spec/spec_tests/data/retryable_writes/legacy/findOneAndDelete-serverErrors.yml +74 -0
- data/spec/spec_tests/data/retryable_writes/legacy/findOneAndReplace-serverErrors.yml +80 -0
- data/spec/spec_tests/data/retryable_writes/legacy/findOneAndUpdate-serverErrors.yml +79 -0
- data/spec/spec_tests/data/retryable_writes/legacy/insertMany-serverErrors.yml +84 -0
- data/spec/spec_tests/data/retryable_writes/legacy/insertOne-serverErrors.yml +527 -0
- data/spec/spec_tests/data/retryable_writes/legacy/replaceOne-serverErrors.yml +82 -0
- data/spec/spec_tests/data/retryable_writes/legacy/updateOne-serverErrors.yml +82 -0
- data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
- data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +785 -0
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-noWritesPerformedError.yml +54 -0
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
- data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +6 -4
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +6 -4
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +6 -4
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +6 -4
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
- data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
- data/spec/spec_tests/data/sdam/rs/compatible.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_passives.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
- data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
- data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +3 -1
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +3 -1
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +3 -1
- data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
- data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
- data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
- data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
- data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/null_election_id-pre-6.0.yml +175 -0
- data/spec/spec_tests/data/sdam/rs/null_election_id.yml +28 -22
- data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
- data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
- data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +5 -3
- data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/repeated.yml +9 -5
- data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0-pre-6.0.yml +87 -0
- data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +5 -3
- data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/set_version_can_rollback.yml +101 -0
- data/spec/spec_tests/data/sdam/rs/setversion_equal_max_without_electionid.yml +78 -0
- data/spec/spec_tests/data/sdam/rs/setversion_greaterthan_max_without_electionid.yml +79 -0
- data/spec/spec_tests/data/sdam/rs/setversion_without_electionid-pre-6.0.yml +79 -0
- data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +13 -12
- data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/too_new.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +10 -5
- data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid-pre-6.0.yml +117 -0
- data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +29 -24
- data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
- data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +2 -1
- data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
- data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
- data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
- data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/single/discover_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
- data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
- data/spec/spec_tests/data/sdam/single/standalone_using_legacy_hello.yml +34 -0
- data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
- data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
- data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +4 -2
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +2 -4
- data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +40 -40
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +40 -40
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +4 -3
- data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +3 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +3 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +4 -4
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/sdam_unified/auth-error.yml +130 -0
- data/spec/spec_tests/data/sdam_unified/auth-misc-command-error.yml +132 -0
- data/spec/spec_tests/data/sdam_unified/auth-network-error.yml +132 -0
- data/spec/spec_tests/data/sdam_unified/auth-network-timeout-error.yml +138 -0
- data/spec/spec_tests/data/sdam_unified/auth-shutdown-error.yml +133 -0
- data/spec/spec_tests/data/sdam_unified/cancel-server-check.yml +143 -0
- data/spec/spec_tests/data/sdam_unified/connectTimeoutMS.yml +130 -0
- data/spec/spec_tests/data/sdam_unified/find-network-error.yml +135 -0
- data/spec/spec_tests/data/sdam_unified/find-network-timeout-error.yml +119 -0
- data/spec/spec_tests/data/sdam_unified/find-shutdown-error.yml +163 -0
- data/spec/spec_tests/data/sdam_unified/hello-command-error.yml +233 -0
- data/spec/spec_tests/data/sdam_unified/hello-network-error.yml +228 -0
- data/spec/spec_tests/data/sdam_unified/hello-timeout.yml +318 -0
- data/spec/spec_tests/data/sdam_unified/insert-network-error.yml +137 -0
- data/spec/spec_tests/data/sdam_unified/insert-shutdown-error.yml +162 -0
- data/spec/spec_tests/data/sdam_unified/interruptInUse-pool-clear.yml +340 -0
- data/spec/spec_tests/data/sdam_unified/minPoolSize-error.yml +125 -0
- data/spec/spec_tests/data/sdam_unified/pool-cleared-error.yml +239 -0
- data/spec/spec_tests/data/sdam_unified/rediscover-quickly-after-step-down.yml +144 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +14 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
- data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
- data/spec/spec_tests/data/sessions_unified/implicit-sessions-default-causal-consistency.yml +119 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +75 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
- data/spec/spec_tests/data/transactions/error-labels.yml +4 -1
- data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
- data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +3 -1
- data/spec/spec_tests/data/transactions/pin-mongos.yml +6 -3
- data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -7
- data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -7
- data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
- data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
- data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
- data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
- data/spec/spec_tests/data/unified/valid-fail/entity-findCursor-malformed.yml +31 -0
- data/spec/spec_tests/data/unified/valid-fail/entity-findCursor.yml +31 -0
- data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError-malformed.yml +34 -0
- data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError.yml +35 -0
- data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
- data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
- data/spec/spec_tests/data/unified/valid-pass/assertNumberConnectionsCheckedOut.yml +17 -0
- data/spec/spec_tests/data/unified/valid-pass/collectionData-createOptions.yml +37 -0
- data/spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml +40 -0
- data/spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml +37 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml +39 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml +66 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
- data/spec/spec_tests/data/unified/valid-pass/ignoreResultAndError.yml +34 -0
- data/spec/spec_tests/data/unified/valid-pass/observeSensitiveCommands.yml +255 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +241 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +190 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +171 -0
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
- data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +419 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +413 -0
- data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
- data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
- data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
- data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
- data/spec/spec_tests/gridfs_spec.rb +3 -0
- data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
- data/spec/spec_tests/load_balancers_spec.rb +15 -0
- data/spec/spec_tests/max_staleness_spec.rb +3 -0
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +3 -0
- data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
- data/spec/spec_tests/read_write_concern_operaton_spec.rb +3 -0
- data/spec/spec_tests/retryable_reads_spec.rb +11 -3
- data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
- data/spec/spec_tests/retryable_writes_spec.rb +14 -8
- data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +14 -6
- data/spec/spec_tests/sdam_spec.rb +9 -2
- data/spec/spec_tests/sdam_unified_spec.rb +13 -0
- data/spec/spec_tests/seed_list_discovery_spec.rb +127 -0
- data/spec/spec_tests/server_selection_rtt_spec.rb +3 -0
- data/spec/spec_tests/server_selection_spec.rb +3 -0
- data/spec/spec_tests/sessions_unified_spec.rb +13 -0
- data/spec/spec_tests/transactions_api_spec.rb +3 -0
- data/spec/spec_tests/transactions_spec.rb +3 -0
- data/spec/spec_tests/transactions_unified_spec.rb +13 -0
- data/spec/spec_tests/unified_spec.rb +18 -0
- data/spec/spec_tests/uri_options_spec.rb +50 -33
- data/spec/spec_tests/versioned_api_spec.rb +13 -0
- data/spec/stress/cleanup_spec.rb +3 -0
- data/spec/stress/connection_pool_stress_spec.rb +3 -61
- data/spec/stress/connection_pool_timing_spec.rb +14 -35
- data/spec/stress/fork_reconnect_stress_spec.rb +17 -18
- data/spec/stress/push_monitor_close_spec.rb +44 -0
- data/spec/support/authorization.rb +4 -1
- data/spec/support/aws_utils/base.rb +3 -0
- data/spec/support/aws_utils/inspector.rb +3 -0
- data/spec/support/aws_utils/orchestrator.rb +22 -7
- data/spec/support/aws_utils/provisioner.rb +3 -0
- data/spec/support/aws_utils.rb +6 -2
- data/spec/support/background_thread_registry.rb +7 -14
- data/spec/support/certificates/README.md +3 -2
- data/spec/support/certificates/atlas-ocsp-ca.crt +103 -0
- data/spec/support/certificates/atlas-ocsp.crt +152 -0
- data/spec/support/certificates/retrieve-atlas-cert +40 -0
- data/spec/support/client_registry.rb +17 -6
- data/spec/support/client_registry_macros.rb +17 -5
- data/spec/support/cluster_tools.rb +17 -9
- data/spec/support/common_shortcuts.rb +134 -10
- data/spec/support/constraints.rb +16 -246
- data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
- data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
- data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
- data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
- data/spec/support/crypt/corpus/corpus.json +4999 -37
- data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
- data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
- data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
- data/spec/support/crypt/encrypted_fields/encryptedFields.json +32 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +30 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +21 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +29 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +21 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +30 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +27 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +27 -0
- data/spec/support/crypt/keys/key1-document.json +30 -0
- data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/crypt.rb +271 -13
- data/spec/support/dns.rb +3 -0
- data/spec/support/json_ext_formatter.rb +3 -0
- data/spec/support/keyword_struct.rb +3 -0
- data/spec/support/local_resource_registry.rb +3 -0
- data/spec/support/macros.rb +29 -0
- data/spec/support/matchers.rb +33 -1
- data/spec/support/mongos_macros.rb +24 -0
- data/spec/support/monitoring_ext.rb +3 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/primary_socket.rb +3 -0
- data/spec/support/sdam_formatter_integration.rb +3 -0
- data/spec/support/shared/app_metadata.rb +179 -0
- data/spec/support/shared/auth_context.rb +17 -0
- data/spec/support/shared/protocol.rb +3 -0
- data/spec/support/shared/scram_conversation.rb +5 -1
- data/spec/support/shared/server_selector.rb +6 -3
- data/spec/support/shared/session.rb +20 -11
- data/spec/support/spec_config.rb +248 -24
- data/spec/support/spec_setup.rb +51 -38
- data/spec/support/using_hash.rb +40 -0
- data/spec/support/utils.rb +353 -172
- data.tar.gz.sig +0 -0
- metadata +2052 -1217
- metadata.gz.sig +0 -0
- data/lib/mongo/collection/view/builder/find_command.rb +0 -150
- data/lib/mongo/collection/view/builder/flags.rb +0 -62
- data/lib/mongo/collection/view/builder/modifiers.rb +0 -80
- data/lib/mongo/collection/view/builder/op_query.rb +0 -91
- data/lib/mongo/cursor/builder/get_more_command.rb +0 -77
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -108
- data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -103
- data/lib/mongo/cursor/builder.rb +0 -18
- data/lib/mongo/operation/aggregate/command.rb +0 -44
- data/lib/mongo/operation/collections_info/command.rb +0 -40
- data/lib/mongo/operation/command/command.rb +0 -38
- data/lib/mongo/operation/count/command.rb +0 -38
- data/lib/mongo/operation/create/command.rb +0 -38
- data/lib/mongo/operation/create_index/command.rb +0 -42
- data/lib/mongo/operation/create_user/command.rb +0 -43
- data/lib/mongo/operation/delete/command.rb +0 -46
- data/lib/mongo/operation/delete/legacy.rb +0 -54
- data/lib/mongo/operation/distinct/command.rb +0 -38
- data/lib/mongo/operation/drop/command.rb +0 -38
- data/lib/mongo/operation/drop_database/command.rb +0 -38
- data/lib/mongo/operation/drop_index/command.rb +0 -42
- data/lib/mongo/operation/explain/command.rb +0 -39
- data/lib/mongo/operation/explain/legacy.rb +0 -38
- data/lib/mongo/operation/find/command.rb +0 -39
- data/lib/mongo/operation/find/legacy/result.rb +0 -41
- data/lib/mongo/operation/find/legacy.rb +0 -40
- data/lib/mongo/operation/get_more/command.rb +0 -39
- data/lib/mongo/operation/get_more/legacy.rb +0 -36
- data/lib/mongo/operation/indexes/command.rb +0 -39
- data/lib/mongo/operation/indexes/legacy.rb +0 -45
- data/lib/mongo/operation/insert/command.rb +0 -56
- data/lib/mongo/operation/insert/legacy.rb +0 -65
- data/lib/mongo/operation/kill_cursors/command.rb +0 -37
- data/lib/mongo/operation/kill_cursors/legacy.rb +0 -37
- data/lib/mongo/operation/list_collections/command.rb +0 -43
- data/lib/mongo/operation/map_reduce/command.rb +0 -40
- data/lib/mongo/operation/parallel_scan/command.rb +0 -55
- data/lib/mongo/operation/remove_user/command.rb +0 -43
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
- data/lib/mongo/operation/shared/op_msg_or_command.rb +0 -44
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +0 -47
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
- data/lib/mongo/operation/update/command.rb +0 -47
- data/lib/mongo/operation/update/legacy/result.rb +0 -102
- data/lib/mongo/operation/update/legacy.rb +0 -65
- data/lib/mongo/operation/update_user/command.rb +0 -42
- data/lib/mongo/operation/users_info/command.rb +0 -43
- data/lib/mongo/protocol/delete.rb +0 -169
- data/lib/mongo/protocol/insert.rb +0 -178
- data/lib/mongo/protocol/update.rb +0 -211
- data/lib/mongo/server/context.rb +0 -69
- data/spec/mongo/collection/view/builder/flags_spec.rb +0 -106
- data/spec/mongo/collection/view/builder/modifiers_spec.rb +0 -210
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -61
- data/spec/mongo/dbref_spec.rb +0 -149
- data/spec/mongo/operation/delete/command_spec.rb +0 -112
- data/spec/mongo/operation/find/legacy_spec.rb +0 -125
- data/spec/mongo/operation/get_more_spec.rb +0 -58
- data/spec/mongo/operation/insert/command_spec.rb +0 -115
- data/spec/mongo/operation/kill_cursors_spec.rb +0 -41
- data/spec/mongo/operation/update/command_spec.rb +0 -119
- data/spec/mongo/protocol/delete_spec.rb +0 -182
- data/spec/mongo/protocol/insert_spec.rb +0 -176
- data/spec/mongo/protocol/update_spec.rb +0 -201
- data/spec/mongo/server/app_metadata_shared.rb +0 -136
- data/spec/spec_tests/change_streams_spec.rb +0 -90
- data/spec/spec_tests/command_monitoring_spec.rb +0 -66
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -102
- data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +0 -1173
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -537
- data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
- data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
- data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
- data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
- data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
- data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
- data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
- data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -110
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
- data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -38
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
- data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
- data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
- data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
- data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
- data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
- data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
- data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +0 -157
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +0 -149
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +0 -61
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +0 -149
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +0 -65
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +0 -153
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +0 -61
- data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +0 -150
- data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +0 -150
- data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +0 -156
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors.yml +0 -148
- data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +0 -160
- data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +0 -154
- data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +0 -173
- data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +0 -174
- data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +0 -143
- data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +0 -144
- data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +0 -143
- data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +0 -143
- data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +0 -144
- data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +0 -144
- data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +0 -144
- data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +0 -60
- data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +0 -145
- data/spec/spec_tests/data/retryable_reads/mapReduce.yml +0 -60
- data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +0 -130
- data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +0 -396
- data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +0 -73
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +0 -74
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +0 -80
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +0 -79
- data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +0 -84
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +0 -526
- data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +0 -82
- data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +0 -82
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +0 -51
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +0 -51
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +0 -51
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +0 -64
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +0 -64
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +0 -64
- data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +0 -34
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +0 -96
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +0 -88
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +0 -83
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -116
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -86
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -115
- data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +0 -168
- data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +0 -162
- data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +0 -229
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -87
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -68
- data/spec/spec_tests/sdam_integration_spec.rb +0 -13
- data/spec/support/child_process_helper.rb +0 -78
- data/spec/support/cluster_config.rb +0 -207
- data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
- data/spec/support/event_subscriber.rb +0 -212
- data/spec/support/lite_constraints.rb +0 -141
- data/spec/support/spec_organizer.rb +0 -129
- /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → legacy/estimatedDocumentCount.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
|
@@ -1,19 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
|
|
5
|
+
SINGLE_CLIENT = [ '127.0.0.1:27017' ].freeze
|
|
6
|
+
|
|
7
|
+
# let these existing styles stand, rather than going in for a deep refactoring
|
|
8
|
+
# of these specs.
|
|
9
|
+
#
|
|
10
|
+
# possible future work: re-enable these one at a time and do the hard work of
|
|
11
|
+
# making them right.
|
|
12
|
+
#
|
|
13
|
+
# rubocop:disable RSpec/ExpectInHook, RSpec/MessageSpies, RSpec/ExampleLength
|
|
14
|
+
# rubocop:disable RSpec/ContextWording, RSpec/RepeatedExampleGroupDescription
|
|
15
|
+
# rubocop:disable RSpec/ExampleWording, Style/BlockComments, RSpec/AnyInstance
|
|
16
|
+
# rubocop:disable RSpec/VerifiedDoubles
|
|
3
17
|
describe Mongo::Client do
|
|
4
18
|
clean_slate
|
|
5
19
|
|
|
6
|
-
let(:subscriber) { EventSubscriber.new }
|
|
20
|
+
let(:subscriber) { Mrss::EventSubscriber.new }
|
|
7
21
|
|
|
8
22
|
describe '.new' do
|
|
9
23
|
context 'with scan: false' do
|
|
24
|
+
fails_on_jruby
|
|
25
|
+
|
|
10
26
|
it 'does not perform i/o' do
|
|
11
27
|
allow_any_instance_of(Mongo::Server::Monitor).to receive(:run!)
|
|
12
28
|
expect_any_instance_of(Mongo::Server::Monitor).not_to receive(:scan!)
|
|
13
|
-
|
|
29
|
+
|
|
14
30
|
# return should be instant
|
|
15
31
|
c = Timeout.timeout(1) do
|
|
16
|
-
ClientRegistry.instance.new_local_client(['1.1.1.1'], scan: false)
|
|
32
|
+
ClientRegistry.instance.new_local_client([ '1.1.1.1' ], scan: false)
|
|
17
33
|
end
|
|
18
34
|
expect(c.cluster.servers).to be_empty
|
|
19
35
|
c.close
|
|
@@ -21,41 +37,21 @@ describe Mongo::Client do
|
|
|
21
37
|
end
|
|
22
38
|
|
|
23
39
|
context 'with default scan: true' do
|
|
24
|
-
|
|
25
|
-
# monitoring threads running, as otherwise the scan! expectation
|
|
26
|
-
# can be executed on a thread that belongs to one of the global
|
|
27
|
-
# clients for instance
|
|
28
|
-
it 'performs one round of sdam' do
|
|
29
|
-
# Does not work due to
|
|
30
|
-
# https://github.com/rspec/rspec-mocks/issues/1242.
|
|
31
|
-
#expect_any_instance_of(Mongo::Server::Monitor).to receive(:scan!).
|
|
32
|
-
# exactly(SpecConfig.instance.addresses.length).times.and_call_original
|
|
33
|
-
c = new_local_client(
|
|
34
|
-
SpecConfig.instance.addresses, SpecConfig.instance.test_options)
|
|
35
|
-
expect(c.cluster.servers).not_to be_empty
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# This checks the case of all initial seeds being removed from
|
|
39
|
-
# cluster during SDAM
|
|
40
|
-
context 'me mismatch on the only initial seed' do
|
|
41
|
-
let(:address) do
|
|
42
|
-
ClusterConfig.instance.alternate_address.to_s
|
|
43
|
-
end
|
|
44
|
-
|
|
40
|
+
shared_examples 'does not wait for server selection timeout' do
|
|
45
41
|
let(:logger) do
|
|
46
|
-
Logger.new(
|
|
42
|
+
Logger.new($stdout, level: Logger::DEBUG)
|
|
47
43
|
end
|
|
48
44
|
|
|
49
45
|
let(:subscriber) do
|
|
50
46
|
Mongo::Monitoring::UnifiedSdamLogSubscriber.new(
|
|
51
47
|
logger: logger,
|
|
52
|
-
log_prefix: 'CCS-SDAM'
|
|
48
|
+
log_prefix: 'CCS-SDAM'
|
|
53
49
|
)
|
|
54
50
|
end
|
|
55
51
|
|
|
56
52
|
let(:client) do
|
|
57
53
|
ClientRegistry.instance.new_local_client(
|
|
58
|
-
[address],
|
|
54
|
+
[ address ],
|
|
59
55
|
# Specify server selection timeout here because test suite sets
|
|
60
56
|
# one by default and it's fairly low
|
|
61
57
|
SpecConfig.instance.test_options.merge(
|
|
@@ -64,10 +60,9 @@ describe Mongo::Client do
|
|
|
64
60
|
server_selection_timeout: 8,
|
|
65
61
|
logger: logger,
|
|
66
62
|
log_prefix: 'CCS-CLIENT',
|
|
67
|
-
sdam_proc:
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
))
|
|
63
|
+
sdam_proc: ->(client) { subscriber.subscribe(client) }
|
|
64
|
+
)
|
|
65
|
+
)
|
|
71
66
|
end
|
|
72
67
|
|
|
73
68
|
it 'does not wait for server selection timeout' do
|
|
@@ -88,21 +83,60 @@ describe Mongo::Client do
|
|
|
88
83
|
|
|
89
84
|
actual_class = client.cluster.topology.class
|
|
90
85
|
expect([
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
86
|
+
Mongo::Cluster::Topology::ReplicaSetWithPrimary,
|
|
87
|
+
Mongo::Cluster::Topology::Single,
|
|
88
|
+
Mongo::Cluster::Topology::Sharded,
|
|
89
|
+
Mongo::Cluster::Topology::LoadBalanced,
|
|
90
|
+
]).to include(actual_class)
|
|
95
91
|
expect(time_taken).to be < 5
|
|
96
92
|
|
|
97
93
|
# run a command to ensure the client is a working one
|
|
98
|
-
client.database.command(
|
|
94
|
+
client.database.command(ping: 1)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context 'when cluster is monitored' do
|
|
99
|
+
require_topology :single, :replica_set, :sharded
|
|
100
|
+
|
|
101
|
+
# TODO: this test requires there being no outstanding background
|
|
102
|
+
# monitoring threads running, as otherwise the scan! expectation
|
|
103
|
+
# can be executed on a thread that belongs to one of the global
|
|
104
|
+
# clients for instance
|
|
105
|
+
it 'performs one round of sdam' do
|
|
106
|
+
# Does not work due to
|
|
107
|
+
# https://github.com/rspec/rspec-mocks/issues/1242.
|
|
108
|
+
#
|
|
109
|
+
# expect_any_instance_of(Mongo::Server::Monitor).to receive(:scan!).
|
|
110
|
+
# exactly(SpecConfig.instance.addresses.length).times.and_call_original
|
|
111
|
+
c = new_local_client(SpecConfig.instance.addresses, SpecConfig.instance.test_options)
|
|
112
|
+
expect(c.cluster.servers).not_to be_empty
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# This checks the case of all initial seeds being removed from
|
|
116
|
+
# cluster during SDAM
|
|
117
|
+
context 'me mismatch on the only initial seed' do
|
|
118
|
+
let(:address) do
|
|
119
|
+
ClusterConfig.instance.alternate_address.to_s
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
include_examples 'does not wait for server selection timeout'
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
context 'when cluster is not monitored' do
|
|
127
|
+
require_topology :load_balanced
|
|
128
|
+
|
|
129
|
+
let(:address) do
|
|
130
|
+
ClusterConfig.instance.alternate_address.to_s
|
|
99
131
|
end
|
|
132
|
+
|
|
133
|
+
include_examples 'does not wait for server selection timeout'
|
|
100
134
|
end
|
|
101
135
|
end
|
|
102
136
|
|
|
103
137
|
context 'with monitoring_io: false' do
|
|
104
138
|
let(:client) do
|
|
105
|
-
new_local_client(
|
|
139
|
+
new_local_client(SINGLE_CLIENT, monitoring_io: false)
|
|
106
140
|
end
|
|
107
141
|
|
|
108
142
|
it 'passes monitoring_io: false to cluster' do
|
|
@@ -154,7 +188,7 @@ describe Mongo::Client do
|
|
|
154
188
|
let(:mongocryptd_uri) { 'mongodb://localhost:27021' }
|
|
155
189
|
let(:mongocryptd_bypass_spawn) { true }
|
|
156
190
|
let(:mongocryptd_spawn_path) { '/spawn/path' }
|
|
157
|
-
let(:mongocryptd_spawn_args) { ['--idleShutdownTimeoutSecs=100'] }
|
|
191
|
+
let(:mongocryptd_spawn_args) { [ '--idleShutdownTimeoutSecs=100' ] }
|
|
158
192
|
|
|
159
193
|
shared_examples 'a functioning auto encryption client' do
|
|
160
194
|
let(:encryption_options) { client.encrypter.options }
|
|
@@ -179,7 +213,10 @@ describe Mongo::Client do
|
|
|
179
213
|
let(:key_vault_namespace) { 'not.good.formatting' }
|
|
180
214
|
|
|
181
215
|
it 'raises an exception' do
|
|
182
|
-
expect { client }.to raise_error(
|
|
216
|
+
expect { client }.to raise_error(
|
|
217
|
+
ArgumentError,
|
|
218
|
+
/key_vault_namespace option must be in the format database.collection/
|
|
219
|
+
)
|
|
183
220
|
end
|
|
184
221
|
end
|
|
185
222
|
|
|
@@ -187,7 +224,7 @@ describe Mongo::Client do
|
|
|
187
224
|
let(:kms_providers) { nil }
|
|
188
225
|
|
|
189
226
|
it 'raises an exception' do
|
|
190
|
-
expect { client }.to raise_error(ArgumentError, /
|
|
227
|
+
expect { client }.to raise_error(ArgumentError, /KMS providers options must not be nil/)
|
|
191
228
|
end
|
|
192
229
|
end
|
|
193
230
|
|
|
@@ -195,7 +232,10 @@ describe Mongo::Client do
|
|
|
195
232
|
let(:kms_providers) { { random_key: 'hello' } }
|
|
196
233
|
|
|
197
234
|
it 'raises an exception' do
|
|
198
|
-
expect { client }.to raise_error(
|
|
235
|
+
expect { client }.to raise_error(
|
|
236
|
+
ArgumentError,
|
|
237
|
+
/KMS providers options must have one of the following keys: :aws, :azure, :gcp, :kmip, :local/
|
|
238
|
+
)
|
|
199
239
|
end
|
|
200
240
|
end
|
|
201
241
|
|
|
@@ -203,15 +243,25 @@ describe Mongo::Client do
|
|
|
203
243
|
let(:kms_providers) { { local: { wrong_key: 'hello' } } }
|
|
204
244
|
|
|
205
245
|
it 'raises an exception' do
|
|
206
|
-
expect { client }.to raise_error(
|
|
246
|
+
expect { client }.to raise_error(
|
|
247
|
+
ArgumentError,
|
|
248
|
+
/Local KMS provider options must be in the format: { key: 'MASTER-KEY' }/
|
|
249
|
+
)
|
|
207
250
|
end
|
|
208
251
|
end
|
|
209
252
|
|
|
210
253
|
context 'when aws kms_provider is incorrectly formatted' do
|
|
211
254
|
let(:kms_providers) { { aws: { wrong_key: 'hello' } } }
|
|
212
255
|
|
|
256
|
+
let(:expected_options_format) do
|
|
257
|
+
"{ access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' }"
|
|
258
|
+
end
|
|
259
|
+
|
|
213
260
|
it 'raises an exception' do
|
|
214
|
-
expect { client }.to raise_error(
|
|
261
|
+
expect { client }.to raise_error(
|
|
262
|
+
ArgumentError,
|
|
263
|
+
/ AWS KMS provider options must be in the format: #{expected_options_format}/
|
|
264
|
+
)
|
|
215
265
|
end
|
|
216
266
|
end
|
|
217
267
|
|
|
@@ -241,7 +291,7 @@ describe Mongo::Client do
|
|
|
241
291
|
expect(encryption_options[:key_vault_namespace]).to eq(key_vault_namespace)
|
|
242
292
|
# Don't explicitly expect kms_providers to avoid accidentally exposing
|
|
243
293
|
# sensitive data in evergreen logs
|
|
244
|
-
expect(encryption_options[:kms_providers]).to
|
|
294
|
+
expect(encryption_options[:kms_providers]).to be_a(Hash)
|
|
245
295
|
expect(encryption_options[:schema_map]).to eq(schema_map)
|
|
246
296
|
expect(encryption_options[:bypass_auto_encryption]).to eq(bypass_auto_encryption)
|
|
247
297
|
expect(encryption_options[:extra_options][:mongocryptd_uri]).to eq(mongocryptd_uri)
|
|
@@ -261,9 +311,9 @@ describe Mongo::Client do
|
|
|
261
311
|
}
|
|
262
312
|
end
|
|
263
313
|
|
|
264
|
-
it 'sets key_vault_client
|
|
314
|
+
it 'sets key_vault_client with no encryption options' do
|
|
265
315
|
key_vault_client = client.encrypter.key_vault_client
|
|
266
|
-
expect(key_vault_client).to
|
|
316
|
+
expect(key_vault_client.options['auto_encryption_options']).to be_nil
|
|
267
317
|
end
|
|
268
318
|
|
|
269
319
|
it 'sets bypass_auto_encryption to false' do
|
|
@@ -274,20 +324,22 @@ describe Mongo::Client do
|
|
|
274
324
|
expect(encryption_options[:extra_options][:mongocryptd_uri]).to eq('mongodb://localhost:27020')
|
|
275
325
|
expect(encryption_options[:extra_options][:mongocryptd_bypass_spawn]).to be false
|
|
276
326
|
expect(encryption_options[:extra_options][:mongocryptd_spawn_path]).to eq('mongocryptd')
|
|
277
|
-
expect(encryption_options[:extra_options][:mongocryptd_spawn_args])
|
|
327
|
+
expect(encryption_options[:extra_options][:mongocryptd_spawn_args])
|
|
328
|
+
.to eq([ '--idleShutdownTimeoutSecs=60' ])
|
|
278
329
|
end
|
|
279
330
|
end
|
|
280
331
|
|
|
281
332
|
context 'with mongocryptd_spawn_args that don\'t include idleShutdownTimeoutSecs' do
|
|
282
|
-
let(:mongocryptd_spawn_args) { ['--otherArgument=true'] }
|
|
333
|
+
let(:mongocryptd_spawn_args) { [ '--otherArgument=true' ] }
|
|
283
334
|
|
|
284
335
|
it 'adds a default value to mongocryptd_spawn_args' do
|
|
285
|
-
expect(encryption_options[:extra_options][:mongocryptd_spawn_args])
|
|
336
|
+
expect(encryption_options[:extra_options][:mongocryptd_spawn_args])
|
|
337
|
+
.to eq(mongocryptd_spawn_args + [ '--idleShutdownTimeoutSecs=60' ])
|
|
286
338
|
end
|
|
287
339
|
end
|
|
288
340
|
|
|
289
341
|
context 'with mongocryptd_spawn_args that has idleShutdownTimeoutSecs as two arguments' do
|
|
290
|
-
let(:mongocryptd_spawn_args) { ['--idleShutdownTimeoutSecs', 100] }
|
|
342
|
+
let(:mongocryptd_spawn_args) { [ '--idleShutdownTimeoutSecs', 100 ] }
|
|
291
343
|
|
|
292
344
|
it 'does not modify mongocryptd_spawn_args' do
|
|
293
345
|
expect(encryption_options[:extra_options][:mongocryptd_spawn_args]).to eq(mongocryptd_spawn_args)
|
|
@@ -300,7 +352,7 @@ describe Mongo::Client do
|
|
|
300
352
|
it 'creates a key_vault_client' do
|
|
301
353
|
key_vault_client = encryption_options[:key_vault_client]
|
|
302
354
|
|
|
303
|
-
expect(key_vault_client).to
|
|
355
|
+
expect(key_vault_client).to be_a(described_class)
|
|
304
356
|
end
|
|
305
357
|
end
|
|
306
358
|
end
|
|
@@ -321,54 +373,47 @@ describe Mongo::Client do
|
|
|
321
373
|
|
|
322
374
|
context 'timeout options' do
|
|
323
375
|
let(:client) do
|
|
324
|
-
new_local_client(
|
|
325
|
-
SpecConfig.instance.
|
|
376
|
+
new_local_client(
|
|
377
|
+
SpecConfig.instance.addresses,
|
|
378
|
+
SpecConfig.instance.authorized_test_options.merge(options)
|
|
379
|
+
)
|
|
326
380
|
end
|
|
327
381
|
|
|
328
382
|
context 'when network timeouts are zero' do
|
|
329
|
-
let(:options)
|
|
330
|
-
{ socket_timeout: 0, connect_timeout: 0 }
|
|
331
|
-
end
|
|
383
|
+
let(:options) { { socket_timeout: 0, connect_timeout: 0 } }
|
|
332
384
|
|
|
333
385
|
it 'sets options to zeros' do
|
|
334
|
-
client.options[:socket_timeout].
|
|
335
|
-
client.options[:connect_timeout].
|
|
386
|
+
expect(client.options[:socket_timeout]).to be == 0
|
|
387
|
+
expect(client.options[:connect_timeout]).to be == 0
|
|
336
388
|
end
|
|
337
389
|
|
|
338
390
|
it 'connects and performs operations successfully' do
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
end.should_not raise_error
|
|
391
|
+
expect { client.database.command(ping: 1) }
|
|
392
|
+
.not_to raise_error
|
|
342
393
|
end
|
|
343
394
|
end
|
|
344
395
|
|
|
345
|
-
%i
|
|
396
|
+
%i[ socket_timeout connect_timeout ].each do |option|
|
|
346
397
|
context "when #{option} is negative" do
|
|
347
|
-
let(:options)
|
|
348
|
-
{ option => -1 }
|
|
349
|
-
end
|
|
398
|
+
let(:options) { { option => -1 } }
|
|
350
399
|
|
|
351
400
|
it 'fails client creation' do
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
end.should raise_error(ArgumentError, /#{option} must be a non-negative number/)
|
|
401
|
+
expect { client }
|
|
402
|
+
.to raise_error(ArgumentError, /#{option} must be a non-negative number/)
|
|
355
403
|
end
|
|
356
404
|
end
|
|
357
405
|
|
|
358
406
|
context "when #{option} is of the wrong type" do
|
|
359
|
-
let(:options)
|
|
360
|
-
{ option => '42' }
|
|
361
|
-
end
|
|
407
|
+
let(:options) { { option => '42' } }
|
|
362
408
|
|
|
363
409
|
it 'fails client creation' do
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
end.should raise_error(ArgumentError, /#{option} must be a non-negative number/)
|
|
410
|
+
expect { client }
|
|
411
|
+
.to raise_error(ArgumentError, /#{option} must be a non-negative number/)
|
|
367
412
|
end
|
|
368
413
|
end
|
|
369
414
|
end
|
|
370
415
|
|
|
371
|
-
context
|
|
416
|
+
context 'when :connect_timeout is very small' do
|
|
372
417
|
# The driver reads first and checks the deadline second.
|
|
373
418
|
# This means the read (in a monitor) can technically take more than
|
|
374
419
|
# the connect timeout. Restrict to TLS configurations to make
|
|
@@ -380,19 +425,29 @@ describe Mongo::Client do
|
|
|
380
425
|
end
|
|
381
426
|
|
|
382
427
|
it 'allows client creation' do
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
428
|
+
expect { client }.not_to raise_error
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
context 'non-lb' do
|
|
432
|
+
require_topology :single, :replica_set, :sharded
|
|
433
|
+
|
|
434
|
+
it 'fails server selection due to very small timeout' do
|
|
435
|
+
expect { client.database.command(ping: 1) }
|
|
436
|
+
.to raise_error(Mongo::Error::NoServerAvailable)
|
|
437
|
+
end
|
|
386
438
|
end
|
|
387
439
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
440
|
+
context 'lb' do
|
|
441
|
+
require_topology :load_balanced
|
|
442
|
+
|
|
443
|
+
it 'fails the operation after successful server selection' do
|
|
444
|
+
expect { client.database.command(ping: 1) }
|
|
445
|
+
.to raise_error(Mongo::Error::SocketTimeoutError, /socket took over.*to connect/)
|
|
446
|
+
end
|
|
392
447
|
end
|
|
393
448
|
end
|
|
394
449
|
|
|
395
|
-
context
|
|
450
|
+
context 'when :socket_timeout is very small' do
|
|
396
451
|
# The driver reads first and checks the deadline second.
|
|
397
452
|
# This means the read (in a monitor) can technically take more than
|
|
398
453
|
# the connect timeout. Restrict to TLS configurations to make
|
|
@@ -404,15 +459,13 @@ describe Mongo::Client do
|
|
|
404
459
|
end
|
|
405
460
|
|
|
406
461
|
it 'allows client creation' do
|
|
407
|
-
|
|
408
|
-
client
|
|
409
|
-
end.should_not raise_error
|
|
462
|
+
expect { client }.not_to raise_error
|
|
410
463
|
end
|
|
411
464
|
|
|
465
|
+
retry_test
|
|
412
466
|
it 'fails operations due to very small timeout' do
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
end.should raise_error(Mongo::Error::SocketTimeoutError)
|
|
467
|
+
expect { client.database.command(ping: 1) }
|
|
468
|
+
.to raise_error(Mongo::Error::SocketTimeoutError)
|
|
416
469
|
end
|
|
417
470
|
end
|
|
418
471
|
end
|
|
@@ -423,7 +476,6 @@ describe Mongo::Client do
|
|
|
423
476
|
end
|
|
424
477
|
|
|
425
478
|
context 'when retry_writes is true' do
|
|
426
|
-
|
|
427
479
|
let(:options) do
|
|
428
480
|
{ retry_writes: true }
|
|
429
481
|
end
|
|
@@ -434,7 +486,6 @@ describe Mongo::Client do
|
|
|
434
486
|
end
|
|
435
487
|
|
|
436
488
|
context 'when retry_writes is false' do
|
|
437
|
-
|
|
438
489
|
let(:options) do
|
|
439
490
|
{ retry_writes: false }
|
|
440
491
|
end
|
|
@@ -445,10 +496,7 @@ describe Mongo::Client do
|
|
|
445
496
|
end
|
|
446
497
|
|
|
447
498
|
context 'when retry_writes is not given' do
|
|
448
|
-
|
|
449
|
-
let(:options) do
|
|
450
|
-
{ }
|
|
451
|
-
end
|
|
499
|
+
let(:options) { {} }
|
|
452
500
|
|
|
453
501
|
it 'sets retry_writes to true' do
|
|
454
502
|
expect(client.options['retry_writes']).to be true
|
|
@@ -457,16 +505,66 @@ describe Mongo::Client do
|
|
|
457
505
|
end
|
|
458
506
|
|
|
459
507
|
context 'when compressors are provided' do
|
|
460
|
-
|
|
461
508
|
let(:client) do
|
|
462
|
-
new_local_client(
|
|
463
|
-
SpecConfig.instance.
|
|
509
|
+
new_local_client(
|
|
510
|
+
SpecConfig.instance.addresses,
|
|
511
|
+
SpecConfig.instance.all_test_options.merge(options)
|
|
512
|
+
)
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
context 'when the compressor is not supported by the driver' do
|
|
516
|
+
require_warning_clean
|
|
517
|
+
|
|
518
|
+
let(:options) do
|
|
519
|
+
{ compressors: %w[ snoopy ] }
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
it 'does not set the compressor and warns' do
|
|
523
|
+
expect(Mongo::Logger.logger).to receive(:warn).with(/Unsupported compressor/)
|
|
524
|
+
expect(client.options['compressors']).to be_nil
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
it 'sets the compression key of the handshake document to an empty array' do
|
|
528
|
+
expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
context 'when one supported compressor and one unsupported compressor are provided' do
|
|
532
|
+
require_compression
|
|
533
|
+
min_server_fcv '3.6'
|
|
534
|
+
|
|
535
|
+
let(:options) do
|
|
536
|
+
{ compressors: %w[ zlib snoopy ] }
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
it 'does not set the unsupported compressor and warns' do
|
|
540
|
+
expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
|
|
541
|
+
expect(client.options['compressors']).to eq(%w[ zlib ])
|
|
542
|
+
end
|
|
543
|
+
|
|
544
|
+
it 'sets the compression key of the handshake document to the list of supported compressors' do
|
|
545
|
+
expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(%w[ zlib ])
|
|
546
|
+
end
|
|
547
|
+
end
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
context 'when the compressor is not supported by the server' do
|
|
551
|
+
max_server_version '3.4'
|
|
552
|
+
|
|
553
|
+
let(:options) do
|
|
554
|
+
{ compressors: %w[ zlib ] }
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
it 'does not set the compressor and warns' do
|
|
558
|
+
expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
|
|
559
|
+
expect(client.cluster.next_primary.monitor.compressor).to be_nil
|
|
560
|
+
end
|
|
464
561
|
end
|
|
465
562
|
|
|
466
|
-
context 'when
|
|
563
|
+
context 'when zlib compression is requested' do
|
|
564
|
+
require_zlib_compression
|
|
467
565
|
|
|
468
566
|
let(:options) do
|
|
469
|
-
{ compressors: [
|
|
567
|
+
{ compressors: %w[ zlib ] }
|
|
470
568
|
end
|
|
471
569
|
|
|
472
570
|
it 'sets the compressor' do
|
|
@@ -478,7 +576,6 @@ describe Mongo::Client do
|
|
|
478
576
|
end
|
|
479
577
|
|
|
480
578
|
context 'when server supports compression' do
|
|
481
|
-
require_compression
|
|
482
579
|
min_server_fcv '3.6'
|
|
483
580
|
|
|
484
581
|
it 'uses compression for messages' do
|
|
@@ -489,56 +586,59 @@ describe Mongo::Client do
|
|
|
489
586
|
|
|
490
587
|
it 'does not use compression for authentication messages' do
|
|
491
588
|
expect(Mongo::Protocol::Compressed).not_to receive(:new)
|
|
492
|
-
client.cluster.next_primary.send(:with_connection)
|
|
493
|
-
conn.connect!
|
|
494
|
-
end
|
|
589
|
+
client.cluster.next_primary.send(:with_connection, &:connect!)
|
|
495
590
|
end
|
|
496
591
|
end
|
|
497
592
|
|
|
498
|
-
context 'when
|
|
593
|
+
context 'when snappy compression is requested and supported by the server' do
|
|
594
|
+
min_server_version '3.6'
|
|
499
595
|
|
|
500
596
|
let(:options) do
|
|
501
|
-
{ compressors: [
|
|
597
|
+
{ compressors: %w[ snappy ] }
|
|
502
598
|
end
|
|
503
599
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
expect(client.options['compressors']).to be_nil
|
|
507
|
-
end
|
|
508
|
-
|
|
509
|
-
it 'sets the compression key of the handshake document to an empty array' do
|
|
510
|
-
expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
|
|
511
|
-
end
|
|
512
|
-
|
|
513
|
-
context 'when one supported compressor and one unsupported compressor are provided' do
|
|
514
|
-
require_compression
|
|
515
|
-
min_server_fcv '3.6'
|
|
600
|
+
context 'when snappy gem is installed' do
|
|
601
|
+
require_snappy_compression
|
|
516
602
|
|
|
517
|
-
|
|
518
|
-
|
|
603
|
+
it 'creates the client' do
|
|
604
|
+
expect(client.options['compressors']).to eq(%w[ snappy ])
|
|
519
605
|
end
|
|
606
|
+
end
|
|
520
607
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
expect(client.options['compressors']).to eq(['zlib'])
|
|
524
|
-
end
|
|
608
|
+
context 'when snappy gem is not installed' do
|
|
609
|
+
require_no_snappy_compression
|
|
525
610
|
|
|
526
|
-
it '
|
|
527
|
-
expect
|
|
611
|
+
it 'raises an exception' do
|
|
612
|
+
expect do
|
|
613
|
+
client
|
|
614
|
+
end.to raise_error(Mongo::Error::UnmetDependency, /Cannot enable snappy compression/)
|
|
528
615
|
end
|
|
529
616
|
end
|
|
530
617
|
end
|
|
531
618
|
|
|
532
|
-
context 'when
|
|
533
|
-
|
|
619
|
+
context 'when zstd compression is requested and supported by the server' do
|
|
620
|
+
min_server_version '4.2'
|
|
534
621
|
|
|
535
622
|
let(:options) do
|
|
536
|
-
{ compressors: [
|
|
623
|
+
{ compressors: %w[ zstd ] }
|
|
537
624
|
end
|
|
538
625
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
626
|
+
context 'when zstd gem is installed' do
|
|
627
|
+
require_zstd_compression
|
|
628
|
+
|
|
629
|
+
it 'creates the client' do
|
|
630
|
+
expect(client.options['compressors']).to eq(%w[ zstd ])
|
|
631
|
+
end
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
context 'when zstd gem is not installed' do
|
|
635
|
+
require_no_zstd_compression
|
|
636
|
+
|
|
637
|
+
it 'raises an exception' do
|
|
638
|
+
expect do
|
|
639
|
+
client
|
|
640
|
+
end.to raise_error(Mongo::Error::UnmetDependency, /Cannot enable zstd compression/)
|
|
641
|
+
end
|
|
542
642
|
end
|
|
543
643
|
end
|
|
544
644
|
end
|
|
@@ -569,7 +669,10 @@ describe Mongo::Client do
|
|
|
569
669
|
min_server_fcv '3.6'
|
|
570
670
|
|
|
571
671
|
let(:client) do
|
|
572
|
-
new_local_client_nmio(
|
|
672
|
+
new_local_client_nmio(
|
|
673
|
+
SpecConfig.instance.addresses,
|
|
674
|
+
SpecConfig.instance.test_options.merge(zlib_compression_level: 1)
|
|
675
|
+
)
|
|
573
676
|
end
|
|
574
677
|
|
|
575
678
|
it 'sets the option on the client' do
|
|
@@ -578,26 +681,25 @@ describe Mongo::Client do
|
|
|
578
681
|
end
|
|
579
682
|
|
|
580
683
|
context 'when ssl options are provided' do
|
|
581
|
-
|
|
582
684
|
let(:options) do
|
|
583
685
|
{
|
|
584
|
-
:
|
|
585
|
-
:
|
|
586
|
-
:
|
|
587
|
-
:
|
|
588
|
-
:
|
|
589
|
-
:
|
|
590
|
-
:
|
|
591
|
-
:
|
|
592
|
-
:
|
|
593
|
-
:
|
|
594
|
-
:
|
|
595
|
-
:
|
|
686
|
+
ssl: true,
|
|
687
|
+
ssl_ca_cert: SpecConfig.instance.ca_cert_path,
|
|
688
|
+
ssl_ca_cert_string: 'ca cert string',
|
|
689
|
+
ssl_ca_cert_object: 'ca cert object',
|
|
690
|
+
ssl_cert: SpecConfig.instance.client_cert_path,
|
|
691
|
+
ssl_cert_string: 'cert string',
|
|
692
|
+
ssl_cert_object: 'cert object',
|
|
693
|
+
ssl_key: SpecConfig.instance.client_key_path,
|
|
694
|
+
ssl_key_string: 'key string',
|
|
695
|
+
ssl_key_object: 'key object',
|
|
696
|
+
ssl_key_pass_phrase: 'passphrase',
|
|
697
|
+
ssl_verify: true,
|
|
596
698
|
}
|
|
597
699
|
end
|
|
598
700
|
|
|
599
701
|
let(:client) do
|
|
600
|
-
new_local_client_nmio(
|
|
702
|
+
new_local_client_nmio(SINGLE_CLIENT, options)
|
|
601
703
|
end
|
|
602
704
|
|
|
603
705
|
it 'sets the ssl option' do
|
|
@@ -650,9 +752,8 @@ describe Mongo::Client do
|
|
|
650
752
|
end
|
|
651
753
|
|
|
652
754
|
context 'when no database is provided' do
|
|
653
|
-
|
|
654
755
|
let(:client) do
|
|
655
|
-
new_local_client_nmio(
|
|
756
|
+
new_local_client_nmio(SINGLE_CLIENT, read: { mode: :secondary })
|
|
656
757
|
end
|
|
657
758
|
|
|
658
759
|
it 'defaults the database to admin' do
|
|
@@ -661,9 +762,8 @@ describe Mongo::Client do
|
|
|
661
762
|
end
|
|
662
763
|
|
|
663
764
|
context 'when a database is provided' do
|
|
664
|
-
|
|
665
765
|
let(:client) do
|
|
666
|
-
new_local_client_nmio(
|
|
766
|
+
new_local_client_nmio(SINGLE_CLIENT, database: :testdb)
|
|
667
767
|
end
|
|
668
768
|
|
|
669
769
|
it 'sets the current database' do
|
|
@@ -672,7 +772,6 @@ describe Mongo::Client do
|
|
|
672
772
|
end
|
|
673
773
|
|
|
674
774
|
context 'when providing a custom logger' do
|
|
675
|
-
|
|
676
775
|
let(:logger) do
|
|
677
776
|
Logger.new($stdout).tap do |l|
|
|
678
777
|
l.level = Logger::FATAL
|
|
@@ -684,14 +783,13 @@ describe Mongo::Client do
|
|
|
684
783
|
end
|
|
685
784
|
|
|
686
785
|
it 'does not use the global logger' do
|
|
687
|
-
expect(client.cluster.logger).
|
|
786
|
+
expect(client.cluster.logger).not_to eq(Mongo::Logger.logger)
|
|
688
787
|
end
|
|
689
788
|
end
|
|
690
789
|
|
|
691
790
|
context 'when providing a heartbeat_frequency' do
|
|
692
|
-
|
|
693
791
|
let(:client) do
|
|
694
|
-
new_local_client_nmio(
|
|
792
|
+
new_local_client_nmio(SINGLE_CLIENT, heartbeat_frequency: 2)
|
|
695
793
|
end
|
|
696
794
|
|
|
697
795
|
it 'sets the heartbeat frequency' do
|
|
@@ -699,38 +797,47 @@ describe Mongo::Client do
|
|
|
699
797
|
end
|
|
700
798
|
end
|
|
701
799
|
|
|
702
|
-
context 'when
|
|
703
|
-
|
|
800
|
+
context 'when max_connecting is provided' do
|
|
704
801
|
let(:client) do
|
|
705
|
-
new_local_client_nmio(
|
|
802
|
+
new_local_client_nmio(SINGLE_CLIENT, options)
|
|
706
803
|
end
|
|
707
804
|
|
|
708
|
-
context 'when
|
|
805
|
+
context 'when max_connecting is a positive integer' do
|
|
806
|
+
let(:options) do
|
|
807
|
+
{ max_connecting: 5 }
|
|
808
|
+
end
|
|
709
809
|
|
|
710
|
-
|
|
810
|
+
it 'sets the max connecting' do
|
|
811
|
+
expect(client.options[:max_connecting]).to eq(options[:max_connecting])
|
|
812
|
+
end
|
|
813
|
+
end
|
|
711
814
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
815
|
+
context 'when max_connecting is a negative integer' do
|
|
816
|
+
let(:options) do
|
|
817
|
+
{ max_connecting: -5 }
|
|
818
|
+
end
|
|
819
|
+
|
|
820
|
+
it 'raises an exception' do
|
|
821
|
+
expect { client }.to raise_error(Mongo::Error::InvalidMaxConnecting)
|
|
822
|
+
end
|
|
823
|
+
end
|
|
824
|
+
end
|
|
825
|
+
|
|
826
|
+
context 'when min_pool_size is provided' do
|
|
827
|
+
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
|
828
|
+
|
|
829
|
+
context 'when max_pool_size is provided' do
|
|
830
|
+
context 'when the min_pool_size is greater than the max_pool_size' do
|
|
831
|
+
let(:options) { { min_pool_size: 20, max_pool_size: 10 } }
|
|
718
832
|
|
|
719
833
|
it 'raises an Exception' do
|
|
720
|
-
expect {
|
|
721
|
-
|
|
722
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
834
|
+
expect { client }
|
|
835
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
723
836
|
end
|
|
724
837
|
end
|
|
725
838
|
|
|
726
839
|
context 'when the min_pool_size is less than the max_pool_size' do
|
|
727
|
-
|
|
728
|
-
let(:options) do
|
|
729
|
-
{
|
|
730
|
-
:min_pool_size => 10,
|
|
731
|
-
:max_pool_size => 20
|
|
732
|
-
}
|
|
733
|
-
end
|
|
840
|
+
let(:options) { { min_pool_size: 10, max_pool_size: 20 } }
|
|
734
841
|
|
|
735
842
|
it 'sets the option' do
|
|
736
843
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -739,13 +846,16 @@ describe Mongo::Client do
|
|
|
739
846
|
end
|
|
740
847
|
|
|
741
848
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
849
|
+
let(:options) { { min_pool_size: 10, max_pool_size: 10 } }
|
|
742
850
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
:max_pool_size => 10
|
|
747
|
-
}
|
|
851
|
+
it 'sets the option' do
|
|
852
|
+
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
853
|
+
expect(client.options[:max_pool_size]).to eq(options[:max_pool_size])
|
|
748
854
|
end
|
|
855
|
+
end
|
|
856
|
+
|
|
857
|
+
context 'when max_pool_size is zero (unlimited)' do
|
|
858
|
+
let(:options) { { min_pool_size: 10, max_pool_size: 0 } }
|
|
749
859
|
|
|
750
860
|
it 'sets the option' do
|
|
751
861
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -755,29 +865,17 @@ describe Mongo::Client do
|
|
|
755
865
|
end
|
|
756
866
|
|
|
757
867
|
context 'when max_pool_size is not provided' do
|
|
758
|
-
|
|
759
868
|
context 'when the min_pool_size is greater than the default max_pool_size' do
|
|
760
|
-
|
|
761
|
-
let(:options) do
|
|
762
|
-
{
|
|
763
|
-
:min_pool_size => 10
|
|
764
|
-
}
|
|
765
|
-
end
|
|
869
|
+
let(:options) { { min_pool_size: 30 } }
|
|
766
870
|
|
|
767
871
|
it 'raises an Exception' do
|
|
768
|
-
expect {
|
|
769
|
-
|
|
770
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
872
|
+
expect { client }
|
|
873
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
771
874
|
end
|
|
772
875
|
end
|
|
773
876
|
|
|
774
877
|
context 'when the min_pool_size is less than the default max_pool_size' do
|
|
775
|
-
|
|
776
|
-
let(:options) do
|
|
777
|
-
{
|
|
778
|
-
:min_pool_size => 3
|
|
779
|
-
}
|
|
780
|
-
end
|
|
878
|
+
let(:options) { { min_pool_size: 3 } }
|
|
781
879
|
|
|
782
880
|
it 'sets the option' do
|
|
783
881
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -785,10 +883,9 @@ describe Mongo::Client do
|
|
|
785
883
|
end
|
|
786
884
|
|
|
787
885
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
788
|
-
|
|
789
886
|
let(:options) do
|
|
790
887
|
{
|
|
791
|
-
:
|
|
888
|
+
min_pool_size: Mongo::Server::ConnectionPool::DEFAULT_MAX_SIZE
|
|
792
889
|
}
|
|
793
890
|
end
|
|
794
891
|
|
|
@@ -799,18 +896,18 @@ describe Mongo::Client do
|
|
|
799
896
|
end
|
|
800
897
|
end
|
|
801
898
|
|
|
802
|
-
context 'when max_pool_size
|
|
899
|
+
context 'when max_pool_size is 0 (unlimited)' do
|
|
900
|
+
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
|
901
|
+
let(:options) { { max_pool_size: 0 } }
|
|
803
902
|
|
|
804
|
-
|
|
805
|
-
|
|
903
|
+
it 'sets the option' do
|
|
904
|
+
expect(client.options[:max_pool_size]).to eq(options[:max_pool_size])
|
|
806
905
|
end
|
|
906
|
+
end
|
|
807
907
|
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
:max_pool_size => nil
|
|
812
|
-
}
|
|
813
|
-
end
|
|
908
|
+
context 'when max_pool_size and min_pool_size are both nil' do
|
|
909
|
+
let(:options) { { min_pool_size: nil, max_pool_size: nil } }
|
|
910
|
+
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
|
814
911
|
|
|
815
912
|
it 'does not set either option' do
|
|
816
913
|
expect(client.options[:max_pool_size]).to be_nil
|
|
@@ -819,43 +916,42 @@ describe Mongo::Client do
|
|
|
819
916
|
end
|
|
820
917
|
|
|
821
918
|
context 'when platform details are specified' do
|
|
822
|
-
|
|
823
919
|
let(:app_metadata) do
|
|
824
920
|
client.cluster.app_metadata
|
|
825
921
|
end
|
|
826
922
|
|
|
827
923
|
let(:client) do
|
|
828
|
-
new_local_client_nmio(
|
|
924
|
+
new_local_client_nmio(SINGLE_CLIENT, platform: 'mongoid-6.0.2')
|
|
829
925
|
end
|
|
830
926
|
|
|
831
927
|
it 'includes the platform info in the app metadata' do
|
|
832
|
-
expect(app_metadata.
|
|
928
|
+
expect(app_metadata.client_document[:platform]).to match(/mongoid-6\.0\.2/)
|
|
833
929
|
end
|
|
834
930
|
end
|
|
835
931
|
|
|
836
932
|
context 'when platform details are not specified' do
|
|
837
|
-
|
|
838
933
|
let(:app_metadata) do
|
|
839
934
|
client.cluster.app_metadata
|
|
840
935
|
end
|
|
841
936
|
|
|
842
937
|
let(:client) do
|
|
843
|
-
new_local_client_nmio(
|
|
938
|
+
new_local_client_nmio(SINGLE_CLIENT)
|
|
844
939
|
end
|
|
845
940
|
|
|
846
941
|
context 'mri' do
|
|
847
|
-
|
|
942
|
+
require_mri
|
|
848
943
|
|
|
849
944
|
let(:platform_string) do
|
|
850
945
|
[
|
|
851
946
|
"Ruby #{RUBY_VERSION}",
|
|
852
947
|
RUBY_PLATFORM,
|
|
853
|
-
RbConfig::CONFIG['build']
|
|
948
|
+
RbConfig::CONFIG['build'],
|
|
949
|
+
'A',
|
|
854
950
|
].join(', ')
|
|
855
951
|
end
|
|
856
952
|
|
|
857
953
|
it 'does not include the platform info in the app metadata' do
|
|
858
|
-
expect(app_metadata.
|
|
954
|
+
expect(app_metadata.client_document[:platform]).to eq(platform_string)
|
|
859
955
|
end
|
|
860
956
|
end
|
|
861
957
|
|
|
@@ -868,29 +964,24 @@ describe Mongo::Client do
|
|
|
868
964
|
"like Ruby #{RUBY_VERSION}",
|
|
869
965
|
RUBY_PLATFORM,
|
|
870
966
|
"JVM #{java.lang.System.get_property('java.version')}",
|
|
871
|
-
RbConfig::CONFIG['build']
|
|
967
|
+
RbConfig::CONFIG['build'],
|
|
968
|
+
'A',
|
|
872
969
|
].join(', ')
|
|
873
970
|
end
|
|
874
971
|
|
|
875
972
|
it 'does not include the platform info in the app metadata' do
|
|
876
|
-
expect(app_metadata.
|
|
973
|
+
expect(app_metadata.client_document[:platform]).to eq(platform_string)
|
|
877
974
|
end
|
|
878
975
|
end
|
|
879
976
|
end
|
|
880
977
|
end
|
|
881
978
|
|
|
882
979
|
context 'when providing a connection string' do
|
|
883
|
-
|
|
884
980
|
context 'when the string uses the SRV Protocol' do
|
|
885
981
|
require_external_connectivity
|
|
886
982
|
|
|
887
|
-
let
|
|
888
|
-
|
|
889
|
-
end
|
|
890
|
-
|
|
891
|
-
let(:client) do
|
|
892
|
-
new_local_client_nmio(uri)
|
|
893
|
-
end
|
|
983
|
+
let(:uri) { 'mongodb+srv://test5.test.build.10gen.cc/testdb' }
|
|
984
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
894
985
|
|
|
895
986
|
it 'sets the database' do
|
|
896
987
|
expect(client.options[:database]).to eq('testdb')
|
|
@@ -898,29 +989,17 @@ describe Mongo::Client do
|
|
|
898
989
|
end
|
|
899
990
|
|
|
900
991
|
context 'when a database is provided' do
|
|
901
|
-
|
|
902
|
-
let
|
|
903
|
-
'mongodb://127.0.0.1:27017/testdb'
|
|
904
|
-
end
|
|
905
|
-
|
|
906
|
-
let(:client) do
|
|
907
|
-
new_local_client_nmio(uri)
|
|
908
|
-
end
|
|
992
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb' }
|
|
993
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
909
994
|
|
|
910
995
|
it 'sets the database' do
|
|
911
|
-
expect { client[:users] }.
|
|
996
|
+
expect { client[:users] }.not_to raise_error
|
|
912
997
|
end
|
|
913
998
|
end
|
|
914
999
|
|
|
915
1000
|
context 'when a database is not provided' do
|
|
916
|
-
|
|
917
|
-
let
|
|
918
|
-
'mongodb://127.0.0.1:27017'
|
|
919
|
-
end
|
|
920
|
-
|
|
921
|
-
let(:client) do
|
|
922
|
-
new_local_client_nmio(uri)
|
|
923
|
-
end
|
|
1001
|
+
let(:uri) { 'mongodb://127.0.0.1:27017' }
|
|
1002
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
924
1003
|
|
|
925
1004
|
it 'defaults the database to admin' do
|
|
926
1005
|
expect(client.database.name).to eq('admin')
|
|
@@ -928,44 +1007,59 @@ describe Mongo::Client do
|
|
|
928
1007
|
end
|
|
929
1008
|
|
|
930
1009
|
context 'when URI options are provided' do
|
|
931
|
-
|
|
932
|
-
let
|
|
933
|
-
'mongodb://127.0.0.1:27017/testdb?w=3'
|
|
934
|
-
end
|
|
935
|
-
|
|
936
|
-
let(:client) do
|
|
937
|
-
new_local_client_nmio(uri)
|
|
938
|
-
end
|
|
1010
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?w=3' }
|
|
1011
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
939
1012
|
|
|
940
1013
|
let(:expected_options) do
|
|
941
|
-
Mongo::Options::Redacted.new(
|
|
942
|
-
|
|
943
|
-
|
|
1014
|
+
Mongo::Options::Redacted.new(
|
|
1015
|
+
write_concern: { w: 3 },
|
|
1016
|
+
monitoring_io: false,
|
|
1017
|
+
database: 'testdb',
|
|
1018
|
+
retry_writes: true,
|
|
1019
|
+
retry_reads: true
|
|
1020
|
+
)
|
|
944
1021
|
end
|
|
945
1022
|
|
|
946
1023
|
it 'sets the options' do
|
|
947
1024
|
expect(client.options).to eq(expected_options)
|
|
948
1025
|
end
|
|
949
1026
|
|
|
950
|
-
context 'when
|
|
1027
|
+
context 'when max_connecting is provided' do
|
|
1028
|
+
context 'when max_connecting is a positive integer' do
|
|
1029
|
+
let(:uri) do
|
|
1030
|
+
'mongodb://127.0.0.1:27017/?maxConnecting=10'
|
|
1031
|
+
end
|
|
951
1032
|
|
|
952
|
-
|
|
1033
|
+
it 'sets the max connecting' do
|
|
1034
|
+
expect(client.options[:max_connecting]).to eq(10)
|
|
1035
|
+
end
|
|
1036
|
+
end
|
|
953
1037
|
|
|
954
|
-
|
|
1038
|
+
context 'when max_connecting is a negative integer' do
|
|
1039
|
+
let(:uri) do
|
|
1040
|
+
'mongodb://127.0.0.1:27017/?maxConnecting=0'
|
|
1041
|
+
end
|
|
1042
|
+
|
|
1043
|
+
it 'raises an exception' do
|
|
1044
|
+
expect { client }.to raise_error(Mongo::Error::InvalidMaxConnecting)
|
|
1045
|
+
end
|
|
1046
|
+
end
|
|
1047
|
+
end
|
|
955
1048
|
|
|
1049
|
+
context 'when min_pool_size is provided' do
|
|
1050
|
+
context 'when max_pool_size is provided' do
|
|
1051
|
+
context 'when the min_pool_size is greater than the max_pool_size' do
|
|
956
1052
|
let(:uri) do
|
|
957
1053
|
'mongodb://127.0.0.1:27017/?minPoolSize=20&maxPoolSize=10'
|
|
958
1054
|
end
|
|
959
1055
|
|
|
960
1056
|
it 'raises an Exception' do
|
|
961
|
-
expect {
|
|
962
|
-
|
|
963
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1057
|
+
expect { client }
|
|
1058
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
964
1059
|
end
|
|
965
1060
|
end
|
|
966
1061
|
|
|
967
1062
|
context 'when the min_pool_size is less than the max_pool_size' do
|
|
968
|
-
|
|
969
1063
|
let(:uri) do
|
|
970
1064
|
'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=20'
|
|
971
1065
|
end
|
|
@@ -977,7 +1071,6 @@ describe Mongo::Client do
|
|
|
977
1071
|
end
|
|
978
1072
|
|
|
979
1073
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
980
|
-
|
|
981
1074
|
let(:uri) do
|
|
982
1075
|
'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=10'
|
|
983
1076
|
end
|
|
@@ -987,28 +1080,31 @@ describe Mongo::Client do
|
|
|
987
1080
|
expect(client.options[:max_pool_size]).to eq(10)
|
|
988
1081
|
end
|
|
989
1082
|
end
|
|
1083
|
+
|
|
1084
|
+
context 'when max_pool_size is 0 (unlimited)' do
|
|
1085
|
+
let(:uri) do
|
|
1086
|
+
'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=0'
|
|
1087
|
+
end
|
|
1088
|
+
|
|
1089
|
+
it 'sets the option' do
|
|
1090
|
+
expect(client.options[:min_pool_size]).to eq(10)
|
|
1091
|
+
expect(client.options[:max_pool_size]).to eq(0)
|
|
1092
|
+
end
|
|
1093
|
+
end
|
|
990
1094
|
end
|
|
991
1095
|
|
|
992
1096
|
context 'when max_pool_size is not provided' do
|
|
993
|
-
|
|
994
1097
|
context 'when the min_pool_size is greater than the default max_pool_size' do
|
|
995
|
-
|
|
996
|
-
let(:uri) do
|
|
997
|
-
'mongodb://127.0.0.1:27017/?minPoolSize=10'
|
|
998
|
-
end
|
|
1098
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=30' }
|
|
999
1099
|
|
|
1000
1100
|
it 'raises an Exception' do
|
|
1001
|
-
expect {
|
|
1002
|
-
|
|
1003
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1101
|
+
expect { client }
|
|
1102
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1004
1103
|
end
|
|
1005
1104
|
end
|
|
1006
1105
|
|
|
1007
1106
|
context 'when the min_pool_size is less than the default max_pool_size' do
|
|
1008
|
-
|
|
1009
|
-
let(:uri) do
|
|
1010
|
-
'mongodb://127.0.0.1:27017/?minPoolSize=3'
|
|
1011
|
-
end
|
|
1107
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=3' }
|
|
1012
1108
|
|
|
1013
1109
|
it 'sets the option' do
|
|
1014
1110
|
expect(client.options[:min_pool_size]).to eq(3)
|
|
@@ -1016,10 +1112,7 @@ describe Mongo::Client do
|
|
|
1016
1112
|
end
|
|
1017
1113
|
|
|
1018
1114
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
1019
|
-
|
|
1020
|
-
let(:uri) do
|
|
1021
|
-
'mongodb://127.0.0.1:27017/?minPoolSize=5'
|
|
1022
|
-
end
|
|
1115
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=5' }
|
|
1023
1116
|
|
|
1024
1117
|
it 'sets the option' do
|
|
1025
1118
|
expect(client.options[:min_pool_size]).to eq(5)
|
|
@@ -1029,11 +1122,8 @@ describe Mongo::Client do
|
|
|
1029
1122
|
end
|
|
1030
1123
|
|
|
1031
1124
|
context 'when retryReads URI option is given' do
|
|
1032
|
-
|
|
1033
1125
|
context 'it is false' do
|
|
1034
|
-
let
|
|
1035
|
-
'mongodb://127.0.0.1:27017/testdb?retryReads=false'
|
|
1036
|
-
end
|
|
1126
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryReads=false' }
|
|
1037
1127
|
|
|
1038
1128
|
it 'sets the option on the client' do
|
|
1039
1129
|
expect(client.options[:retry_reads]).to be false
|
|
@@ -1041,9 +1131,7 @@ describe Mongo::Client do
|
|
|
1041
1131
|
end
|
|
1042
1132
|
|
|
1043
1133
|
context 'it is true' do
|
|
1044
|
-
let
|
|
1045
|
-
'mongodb://127.0.0.1:27017/testdb?retryReads=true'
|
|
1046
|
-
end
|
|
1134
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryReads=true' }
|
|
1047
1135
|
|
|
1048
1136
|
it 'sets the option on the client' do
|
|
1049
1137
|
expect(client.options[:retry_reads]).to be true
|
|
@@ -1052,11 +1140,8 @@ describe Mongo::Client do
|
|
|
1052
1140
|
end
|
|
1053
1141
|
|
|
1054
1142
|
context 'when retryWrites URI option is given' do
|
|
1055
|
-
|
|
1056
1143
|
context 'it is false' do
|
|
1057
|
-
let
|
|
1058
|
-
'mongodb://127.0.0.1:27017/testdb?retryWrites=false'
|
|
1059
|
-
end
|
|
1144
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryWrites=false' }
|
|
1060
1145
|
|
|
1061
1146
|
it 'sets the option on the client' do
|
|
1062
1147
|
expect(client.options[:retry_writes]).to be false
|
|
@@ -1064,9 +1149,7 @@ describe Mongo::Client do
|
|
|
1064
1149
|
end
|
|
1065
1150
|
|
|
1066
1151
|
context 'it is true' do
|
|
1067
|
-
let
|
|
1068
|
-
'mongodb://127.0.0.1:27017/testdb?retryWrites=true'
|
|
1069
|
-
end
|
|
1152
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryWrites=true' }
|
|
1070
1153
|
|
|
1071
1154
|
it 'sets the option on the client' do
|
|
1072
1155
|
expect(client.options[:retry_writes]).to be true
|
|
@@ -1076,19 +1159,20 @@ describe Mongo::Client do
|
|
|
1076
1159
|
end
|
|
1077
1160
|
|
|
1078
1161
|
context 'when options are provided not in the string' do
|
|
1079
|
-
|
|
1080
|
-
let!(:uri) do
|
|
1081
|
-
'mongodb://127.0.0.1:27017/testdb'
|
|
1082
|
-
end
|
|
1162
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb' }
|
|
1083
1163
|
|
|
1084
1164
|
let(:client) do
|
|
1085
|
-
new_local_client_nmio(uri, :
|
|
1165
|
+
new_local_client_nmio(uri, write: { w: 3 })
|
|
1086
1166
|
end
|
|
1087
1167
|
|
|
1088
1168
|
let(:expected_options) do
|
|
1089
|
-
Mongo::Options::Redacted.new(
|
|
1090
|
-
|
|
1091
|
-
|
|
1169
|
+
Mongo::Options::Redacted.new(
|
|
1170
|
+
write: { w: 3 },
|
|
1171
|
+
monitoring_io: false,
|
|
1172
|
+
database: 'testdb',
|
|
1173
|
+
retry_writes: true,
|
|
1174
|
+
retry_reads: true
|
|
1175
|
+
)
|
|
1092
1176
|
end
|
|
1093
1177
|
|
|
1094
1178
|
it 'sets the options' do
|
|
@@ -1097,19 +1181,20 @@ describe Mongo::Client do
|
|
|
1097
1181
|
end
|
|
1098
1182
|
|
|
1099
1183
|
context 'when options are provided in the URI and as Ruby options' do
|
|
1100
|
-
|
|
1101
|
-
let!(:uri) do
|
|
1102
|
-
'mongodb://127.0.0.1:27017/testdb?w=3'
|
|
1103
|
-
end
|
|
1184
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?w=3' }
|
|
1104
1185
|
|
|
1105
1186
|
let(:client) do
|
|
1106
|
-
new_local_client_nmio(uri, option_name => { :
|
|
1187
|
+
new_local_client_nmio(uri, option_name => { w: 4 })
|
|
1107
1188
|
end
|
|
1108
1189
|
|
|
1109
1190
|
let(:expected_options) do
|
|
1110
|
-
Mongo::Options::Redacted.new(
|
|
1111
|
-
|
|
1112
|
-
|
|
1191
|
+
Mongo::Options::Redacted.new(
|
|
1192
|
+
option_name => { w: 4 },
|
|
1193
|
+
monitoring_io: false,
|
|
1194
|
+
database: 'testdb',
|
|
1195
|
+
retry_writes: true,
|
|
1196
|
+
retry_reads: true
|
|
1197
|
+
)
|
|
1113
1198
|
end
|
|
1114
1199
|
|
|
1115
1200
|
shared_examples_for 'allows explicit options to take preference' do
|
|
@@ -1132,14 +1217,8 @@ describe Mongo::Client do
|
|
|
1132
1217
|
end
|
|
1133
1218
|
|
|
1134
1219
|
context 'when a replica set name is provided' do
|
|
1135
|
-
|
|
1136
|
-
let
|
|
1137
|
-
'mongodb://127.0.0.1:27017/testdb?replicaSet=testing'
|
|
1138
|
-
end
|
|
1139
|
-
|
|
1140
|
-
let(:client) do
|
|
1141
|
-
new_local_client_nmio(uri)
|
|
1142
|
-
end
|
|
1220
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?replicaSet=testing' }
|
|
1221
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1143
1222
|
|
|
1144
1223
|
it 'sets the correct cluster topology' do
|
|
1145
1224
|
expect(client.cluster.topology).to be_a(Mongo::Cluster::Topology::ReplicaSetNoPrimary)
|
|
@@ -1149,129 +1228,404 @@ describe Mongo::Client do
|
|
|
1149
1228
|
|
|
1150
1229
|
context 'when Ruby options are provided' do
|
|
1151
1230
|
let(:client) do
|
|
1152
|
-
new_local_client_nmio(
|
|
1231
|
+
new_local_client_nmio(SINGLE_CLIENT, options)
|
|
1153
1232
|
end
|
|
1154
1233
|
|
|
1155
1234
|
describe 'connection option conflicts' do
|
|
1156
1235
|
context 'direct_connection: true and multiple seeds' do
|
|
1157
1236
|
let(:client) do
|
|
1158
|
-
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
|
|
1159
|
-
direct_connection: true)
|
|
1237
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], direct_connection: true)
|
|
1160
1238
|
end
|
|
1161
1239
|
|
|
1162
1240
|
it 'is rejected' do
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with multiple seeds/)
|
|
1241
|
+
expect { client }
|
|
1242
|
+
.to raise_error(ArgumentError, /direct_connection=true cannot be used with multiple seeds/)
|
|
1166
1243
|
end
|
|
1167
1244
|
end
|
|
1168
1245
|
|
|
1169
1246
|
context 'direct_connection: true and connect: :direct' do
|
|
1170
1247
|
let(:options) do
|
|
1171
|
-
{direct_connection: true, connect: :direct}
|
|
1248
|
+
{ direct_connection: true, connect: :direct }
|
|
1172
1249
|
end
|
|
1173
1250
|
|
|
1174
1251
|
it 'is accepted' do
|
|
1175
|
-
client.options[:direct_connection].
|
|
1176
|
-
client.options[:connect].
|
|
1252
|
+
expect(client.options[:direct_connection]).to be true
|
|
1253
|
+
expect(client.options[:connect]).to be :direct
|
|
1177
1254
|
end
|
|
1178
1255
|
end
|
|
1179
1256
|
|
|
1180
1257
|
context 'direct_connection: true and connect: :replica_set' do
|
|
1181
1258
|
let(:options) do
|
|
1182
|
-
{direct_connection: true, connect: :replica_set}
|
|
1259
|
+
{ direct_connection: true, connect: :replica_set }
|
|
1183
1260
|
end
|
|
1184
1261
|
|
|
1185
1262
|
it 'is rejected' do
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1263
|
+
expect { client }
|
|
1264
|
+
.to raise_error(
|
|
1265
|
+
ArgumentError,
|
|
1266
|
+
/Conflicting client options: direct_connection=true and connect=replica_set/
|
|
1267
|
+
)
|
|
1189
1268
|
end
|
|
1190
1269
|
end
|
|
1191
1270
|
|
|
1192
1271
|
context 'direct_connection: true and connect: :sharded' do
|
|
1193
1272
|
let(:options) do
|
|
1194
|
-
{direct_connection: true, connect: :sharded}
|
|
1273
|
+
{ direct_connection: true, connect: :sharded }
|
|
1195
1274
|
end
|
|
1196
1275
|
|
|
1197
1276
|
it 'is rejected' do
|
|
1198
|
-
|
|
1199
|
-
client
|
|
1200
|
-
end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=sharded/)
|
|
1277
|
+
expect { client }
|
|
1278
|
+
.to raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=sharded/)
|
|
1201
1279
|
end
|
|
1202
1280
|
end
|
|
1203
1281
|
|
|
1204
1282
|
context 'direct_connection: false and connect: :direct' do
|
|
1205
1283
|
let(:options) do
|
|
1206
|
-
{direct_connection: false, connect: :direct}
|
|
1284
|
+
{ direct_connection: false, connect: :direct }
|
|
1207
1285
|
end
|
|
1208
1286
|
|
|
1209
1287
|
it 'is rejected' do
|
|
1210
|
-
|
|
1211
|
-
client
|
|
1212
|
-
end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=false and connect=direct/)
|
|
1288
|
+
expect { client }
|
|
1289
|
+
.to raise_error(ArgumentError, /Conflicting client options: direct_connection=false and connect=direct/)
|
|
1213
1290
|
end
|
|
1214
1291
|
end
|
|
1215
1292
|
|
|
1216
1293
|
context 'direct_connection: false and connect: :replica_set' do
|
|
1217
1294
|
let(:options) do
|
|
1218
|
-
{direct_connection: false, connect: :replica_set, replica_set: 'foo'}
|
|
1295
|
+
{ direct_connection: false, connect: :replica_set, replica_set: 'foo' }
|
|
1219
1296
|
end
|
|
1220
1297
|
|
|
1221
1298
|
it 'is accepted' do
|
|
1222
|
-
client.options[:direct_connection].
|
|
1223
|
-
client.options[:connect].
|
|
1299
|
+
expect(client.options[:direct_connection]).to be false
|
|
1300
|
+
expect(client.options[:connect]).to be :replica_set
|
|
1224
1301
|
end
|
|
1225
1302
|
end
|
|
1226
1303
|
|
|
1227
1304
|
context 'direct_connection: false and connect: :sharded' do
|
|
1228
1305
|
let(:options) do
|
|
1229
|
-
{direct_connection: false, connect: :sharded}
|
|
1306
|
+
{ direct_connection: false, connect: :sharded }
|
|
1307
|
+
end
|
|
1308
|
+
|
|
1309
|
+
it 'is accepted' do
|
|
1310
|
+
expect(client.options[:direct_connection]).to be false
|
|
1311
|
+
expect(client.options[:connect]).to be :sharded
|
|
1312
|
+
end
|
|
1313
|
+
end
|
|
1314
|
+
|
|
1315
|
+
context 'load_balanced: true and multiple seeds' do
|
|
1316
|
+
let(:client) do
|
|
1317
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], load_balanced: true)
|
|
1318
|
+
end
|
|
1319
|
+
|
|
1320
|
+
it 'is rejected' do
|
|
1321
|
+
expect { client }
|
|
1322
|
+
.to raise_error(ArgumentError, /load_balanced=true cannot be used with multiple seeds/)
|
|
1323
|
+
end
|
|
1324
|
+
end
|
|
1325
|
+
|
|
1326
|
+
context 'load_balanced: false and multiple seeds' do
|
|
1327
|
+
let(:client) do
|
|
1328
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], load_balanced: false)
|
|
1329
|
+
end
|
|
1330
|
+
|
|
1331
|
+
it 'is accepted' do
|
|
1332
|
+
expect { client }.not_to raise_error
|
|
1333
|
+
expect(client.options[:load_balanced]).to be false
|
|
1334
|
+
end
|
|
1335
|
+
end
|
|
1336
|
+
|
|
1337
|
+
context 'load_balanced: true and direct_connection: true' do
|
|
1338
|
+
let(:client) do
|
|
1339
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, direct_connection: true)
|
|
1340
|
+
end
|
|
1341
|
+
|
|
1342
|
+
it 'is rejected' do
|
|
1343
|
+
expect { client }
|
|
1344
|
+
.to raise_error(ArgumentError, /direct_connection=true cannot be used with load_balanced=true/)
|
|
1345
|
+
end
|
|
1346
|
+
end
|
|
1347
|
+
|
|
1348
|
+
context 'load_balanced: true and direct_connection: false' do
|
|
1349
|
+
let(:client) do
|
|
1350
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, direct_connection: false)
|
|
1230
1351
|
end
|
|
1231
1352
|
|
|
1232
1353
|
it 'is accepted' do
|
|
1233
|
-
client.
|
|
1234
|
-
client.options[:
|
|
1354
|
+
expect { client }.not_to raise_error
|
|
1355
|
+
expect(client.options[:load_balanced]).to be true
|
|
1356
|
+
expect(client.options[:direct_connection]).to be false
|
|
1357
|
+
end
|
|
1358
|
+
end
|
|
1359
|
+
|
|
1360
|
+
context 'load_balanced: false and direct_connection: true' do
|
|
1361
|
+
let(:client) do
|
|
1362
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: false, direct_connection: true)
|
|
1363
|
+
end
|
|
1364
|
+
|
|
1365
|
+
it 'is accepted' do
|
|
1366
|
+
expect { client }.not_to raise_error
|
|
1367
|
+
expect(client.options[:load_balanced]).to be false
|
|
1368
|
+
expect(client.options[:direct_connection]).to be true
|
|
1369
|
+
end
|
|
1370
|
+
end
|
|
1371
|
+
|
|
1372
|
+
[ :direct, 'direct', :sharded, 'sharded' ].each do |v|
|
|
1373
|
+
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1374
|
+
let(:client) do
|
|
1375
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
|
|
1376
|
+
end
|
|
1377
|
+
|
|
1378
|
+
it 'is rejected' do
|
|
1379
|
+
expect { client }
|
|
1380
|
+
.to raise_error(ArgumentError, /connect=#{v} cannot be used with load_balanced=true/)
|
|
1381
|
+
end
|
|
1382
|
+
end
|
|
1383
|
+
end
|
|
1384
|
+
|
|
1385
|
+
[ nil ].each do |v|
|
|
1386
|
+
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1387
|
+
let(:client) do
|
|
1388
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
|
|
1389
|
+
end
|
|
1390
|
+
|
|
1391
|
+
it 'is accepted' do
|
|
1392
|
+
expect { client }.not_to raise_error
|
|
1393
|
+
expect(client.options[:load_balanced]).to be true
|
|
1394
|
+
expect(client.options[:connect]).to eq v
|
|
1395
|
+
end
|
|
1396
|
+
end
|
|
1397
|
+
end
|
|
1398
|
+
|
|
1399
|
+
[ :load_balanced, 'load_balanced' ].each do |v|
|
|
1400
|
+
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1401
|
+
let(:client) do
|
|
1402
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
|
|
1403
|
+
end
|
|
1404
|
+
|
|
1405
|
+
it 'is accepted' do
|
|
1406
|
+
expect { client }.not_to raise_error
|
|
1407
|
+
expect(client.options[:load_balanced]).to be true
|
|
1408
|
+
expect(client.options[:connect]).to eq v
|
|
1409
|
+
end
|
|
1410
|
+
end
|
|
1411
|
+
|
|
1412
|
+
context "replica_set and connect: #{v.inspect}" do
|
|
1413
|
+
let(:client) do
|
|
1414
|
+
new_local_client_nmio(SINGLE_CLIENT, replica_set: 'foo', connect: v)
|
|
1415
|
+
end
|
|
1416
|
+
|
|
1417
|
+
it 'is rejected' do
|
|
1418
|
+
expect { client }
|
|
1419
|
+
.to raise_error(ArgumentError, /connect=load_balanced cannot be used with replica_set option/)
|
|
1420
|
+
end
|
|
1421
|
+
end
|
|
1422
|
+
|
|
1423
|
+
context "direct_connection=true and connect: #{v.inspect}" do
|
|
1424
|
+
let(:client) do
|
|
1425
|
+
new_local_client_nmio(SINGLE_CLIENT, direct_connection: true, connect: v)
|
|
1426
|
+
end
|
|
1427
|
+
|
|
1428
|
+
it 'is rejected' do
|
|
1429
|
+
expect { client }
|
|
1430
|
+
.to raise_error(
|
|
1431
|
+
ArgumentError,
|
|
1432
|
+
/Conflicting client options: direct_connection=true and connect=load_balanced/
|
|
1433
|
+
)
|
|
1434
|
+
end
|
|
1435
|
+
end
|
|
1436
|
+
|
|
1437
|
+
context "multiple seed addresses and connect: #{v.inspect}" do
|
|
1438
|
+
let(:client) do
|
|
1439
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.1:1234' ], connect: v)
|
|
1440
|
+
end
|
|
1441
|
+
|
|
1442
|
+
it 'is rejected' do
|
|
1443
|
+
expect { client }
|
|
1444
|
+
.to raise_error(ArgumentError, /connect=load_balanced cannot be used with multiple seeds/)
|
|
1445
|
+
end
|
|
1446
|
+
end
|
|
1447
|
+
end
|
|
1448
|
+
|
|
1449
|
+
[ :replica_set, 'replica_set' ].each do |v|
|
|
1450
|
+
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1451
|
+
let(:client) do
|
|
1452
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v, replica_set: 'x')
|
|
1453
|
+
end
|
|
1454
|
+
|
|
1455
|
+
it 'is rejected' do
|
|
1456
|
+
expect { client }
|
|
1457
|
+
.to raise_error(ArgumentError, /connect=replica_set cannot be used with load_balanced=true/)
|
|
1458
|
+
end
|
|
1459
|
+
end
|
|
1460
|
+
|
|
1461
|
+
context "load_balanced: true and #{v.inspect} option" do
|
|
1462
|
+
let(:client) do
|
|
1463
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, v => 'rs')
|
|
1464
|
+
end
|
|
1465
|
+
|
|
1466
|
+
it 'is rejected' do
|
|
1467
|
+
expect { client }
|
|
1468
|
+
.to raise_error(ArgumentError, /load_balanced=true cannot be used with replica_set option/)
|
|
1469
|
+
end
|
|
1470
|
+
end
|
|
1471
|
+
end
|
|
1472
|
+
|
|
1473
|
+
context 'srv_max_hosts > 0 and load_balanced: true' do
|
|
1474
|
+
let(:client) do
|
|
1475
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1, load_balanced: true)
|
|
1476
|
+
end
|
|
1477
|
+
|
|
1478
|
+
it 'it is rejected' do
|
|
1479
|
+
expect { client }
|
|
1480
|
+
.to raise_error(ArgumentError, /:srv_max_hosts > 0 cannot be used with :load_balanced=true/)
|
|
1481
|
+
end
|
|
1482
|
+
end
|
|
1483
|
+
|
|
1484
|
+
context 'srv_max_hosts > 0 and replica_set' do
|
|
1485
|
+
let(:client) do
|
|
1486
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1, replica_set: 'rs')
|
|
1487
|
+
end
|
|
1488
|
+
|
|
1489
|
+
it 'it is rejected' do
|
|
1490
|
+
expect do
|
|
1491
|
+
client
|
|
1492
|
+
end.to raise_error(ArgumentError, /:srv_max_hosts > 0 cannot be used with :replica_set option/)
|
|
1493
|
+
end
|
|
1494
|
+
end
|
|
1495
|
+
|
|
1496
|
+
context 'srv_max_hosts < 0' do
|
|
1497
|
+
let(:client) do
|
|
1498
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: -1)
|
|
1499
|
+
end
|
|
1500
|
+
|
|
1501
|
+
it 'is accepted and does not add the srv_max_hosts to uri_options' do
|
|
1502
|
+
expect { client }.not_to raise_error
|
|
1503
|
+
expect(client.options).not_to have_key(:srv_max_hosts)
|
|
1504
|
+
end
|
|
1505
|
+
end
|
|
1506
|
+
|
|
1507
|
+
context 'srv_max_hosts invalid type' do
|
|
1508
|
+
let(:client) do
|
|
1509
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 'foo')
|
|
1510
|
+
end
|
|
1511
|
+
|
|
1512
|
+
it 'is accepted and does not add the srv_max_hosts to uri_options' do
|
|
1513
|
+
expect { client }.not_to raise_error
|
|
1514
|
+
expect(client.options).not_to have_key(:srv_max_hosts)
|
|
1515
|
+
end
|
|
1516
|
+
end
|
|
1517
|
+
|
|
1518
|
+
context 'srv_max_hosts with non-SRV URI' do
|
|
1519
|
+
let(:client) do
|
|
1520
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1)
|
|
1521
|
+
end
|
|
1522
|
+
|
|
1523
|
+
it 'is rejected' do
|
|
1524
|
+
expect { client }
|
|
1525
|
+
.to raise_error(ArgumentError, /:srv_max_hosts cannot be used on non-SRV URI/)
|
|
1526
|
+
end
|
|
1527
|
+
end
|
|
1528
|
+
|
|
1529
|
+
context 'srv_service_name with non-SRV URI' do
|
|
1530
|
+
let(:client) do
|
|
1531
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_service_name: 'customname')
|
|
1532
|
+
end
|
|
1533
|
+
|
|
1534
|
+
it 'is rejected' do
|
|
1535
|
+
expect { client }
|
|
1536
|
+
.to raise_error(ArgumentError, /:srv_service_name cannot be used on non-SRV URI/)
|
|
1537
|
+
end
|
|
1538
|
+
end
|
|
1539
|
+
end
|
|
1540
|
+
|
|
1541
|
+
context 'with SRV lookups mocked at Resolver' do
|
|
1542
|
+
let(:srv_result) do
|
|
1543
|
+
double('srv result').tap do |result|
|
|
1544
|
+
allow(result).to receive(:empty?).and_return(false)
|
|
1545
|
+
allow(result).to receive(:address_strs).and_return(
|
|
1546
|
+
[ ClusterConfig.instance.primary_address_str ]
|
|
1547
|
+
)
|
|
1548
|
+
end
|
|
1549
|
+
end
|
|
1550
|
+
|
|
1551
|
+
let(:client) do
|
|
1552
|
+
allow_any_instance_of(Mongo::Srv::Resolver).to receive(:get_records).and_return(srv_result)
|
|
1553
|
+
allow_any_instance_of(Mongo::Srv::Resolver).to receive(:get_txt_options_string)
|
|
1554
|
+
|
|
1555
|
+
new_local_client_nmio('mongodb+srv://foo.a.b', options)
|
|
1556
|
+
end
|
|
1557
|
+
|
|
1558
|
+
context 'when setting srv_max_hosts' do
|
|
1559
|
+
let(:srv_max_hosts) { 1 }
|
|
1560
|
+
let(:options) { { srv_max_hosts: srv_max_hosts } }
|
|
1561
|
+
|
|
1562
|
+
it 'is accepted and sets srv_max_hosts' do
|
|
1563
|
+
expect { client }.not_to raise_error
|
|
1564
|
+
expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
|
|
1565
|
+
end
|
|
1566
|
+
end
|
|
1567
|
+
|
|
1568
|
+
context 'when setting srv_max_hosts to 0' do
|
|
1569
|
+
let(:srv_max_hosts) { 0 }
|
|
1570
|
+
let(:options) { { srv_max_hosts: srv_max_hosts } }
|
|
1571
|
+
|
|
1572
|
+
it 'is accepted sets srv_max_hosts' do
|
|
1573
|
+
expect { client }.not_to raise_error
|
|
1574
|
+
expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
|
|
1575
|
+
end
|
|
1576
|
+
end
|
|
1577
|
+
|
|
1578
|
+
context 'when setting srv_service_name' do
|
|
1579
|
+
let(:srv_service_name) { 'customname' }
|
|
1580
|
+
let(:options) { { srv_service_name: srv_service_name } }
|
|
1581
|
+
|
|
1582
|
+
it 'is accepted and sets srv_service_name' do
|
|
1583
|
+
expect { client }.not_to raise_error
|
|
1584
|
+
expect(client.options[:srv_service_name]).to eq(srv_service_name)
|
|
1235
1585
|
end
|
|
1236
1586
|
end
|
|
1237
1587
|
end
|
|
1238
1588
|
|
|
1239
1589
|
context ':bg_error_backtrace option' do
|
|
1240
|
-
[true, false, nil, 42].each do |valid_value|
|
|
1590
|
+
[ true, false, nil, 42 ].each do |valid_value|
|
|
1241
1591
|
context "valid value: #{valid_value.inspect}" do
|
|
1242
1592
|
let(:options) do
|
|
1243
|
-
{bg_error_backtrace: valid_value}
|
|
1593
|
+
{ bg_error_backtrace: valid_value }
|
|
1244
1594
|
end
|
|
1245
1595
|
|
|
1246
1596
|
it 'is accepted' do
|
|
1247
|
-
client.options[:bg_error_backtrace].
|
|
1597
|
+
expect(client.options[:bg_error_backtrace]).to be == valid_value
|
|
1248
1598
|
end
|
|
1249
1599
|
end
|
|
1250
1600
|
end
|
|
1251
1601
|
|
|
1252
1602
|
context 'invalid value type' do
|
|
1253
1603
|
let(:options) do
|
|
1254
|
-
{bg_error_backtrace: 'yes'}
|
|
1604
|
+
{ bg_error_backtrace: 'yes' }
|
|
1255
1605
|
end
|
|
1256
1606
|
|
|
1257
1607
|
it 'is rejected' do
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1608
|
+
expect { client }
|
|
1609
|
+
.to raise_error(
|
|
1610
|
+
ArgumentError,
|
|
1611
|
+
/:bg_error_backtrace option value must be true, false, nil or a positive integer/
|
|
1612
|
+
)
|
|
1261
1613
|
end
|
|
1262
1614
|
end
|
|
1263
1615
|
|
|
1264
1616
|
context 'invalid value' do
|
|
1265
|
-
[0, -1, 42.0].each do |invalid_value|
|
|
1617
|
+
[ 0, -1, 42.0 ].each do |invalid_value|
|
|
1266
1618
|
context "invalid value: #{invalid_value.inspect}" do
|
|
1267
1619
|
let(:options) do
|
|
1268
|
-
{bg_error_backtrace: invalid_value}
|
|
1620
|
+
{ bg_error_backtrace: invalid_value }
|
|
1269
1621
|
end
|
|
1270
1622
|
|
|
1271
1623
|
it 'is rejected' do
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1624
|
+
expect { client }
|
|
1625
|
+
.to raise_error(
|
|
1626
|
+
ArgumentError,
|
|
1627
|
+
/:bg_error_backtrace option value must be true, false, nil or a positive integer/
|
|
1628
|
+
)
|
|
1275
1629
|
end
|
|
1276
1630
|
end
|
|
1277
1631
|
end
|
|
@@ -1279,74 +1633,125 @@ describe Mongo::Client do
|
|
|
1279
1633
|
end
|
|
1280
1634
|
|
|
1281
1635
|
describe ':read option' do
|
|
1282
|
-
[
|
|
1283
|
-
|
|
1284
|
-
].each do |sym|
|
|
1285
|
-
describe "#{sym}" do
|
|
1636
|
+
%i[ primary primary_preferred secondary secondary_preferred nearest ].each do |sym|
|
|
1637
|
+
describe sym.to_s do
|
|
1286
1638
|
context 'when given as symbol' do
|
|
1287
1639
|
let(:options) do
|
|
1288
|
-
{read: {mode: sym}}
|
|
1640
|
+
{ read: { mode: sym } }
|
|
1289
1641
|
end
|
|
1290
1642
|
|
|
1291
|
-
it
|
|
1643
|
+
it 'is accepted' do
|
|
1292
1644
|
# the key got converted to a string here
|
|
1293
|
-
expect(client.read_preference).to eq({'mode' => sym})
|
|
1645
|
+
expect(client.read_preference).to eq({ 'mode' => sym })
|
|
1294
1646
|
end
|
|
1295
1647
|
end
|
|
1296
1648
|
|
|
1297
1649
|
context 'when given as string' do
|
|
1298
1650
|
let(:options) do
|
|
1299
|
-
{read: {mode: sym.to_s}}
|
|
1651
|
+
{ read: { mode: sym.to_s } }
|
|
1300
1652
|
end
|
|
1301
1653
|
|
|
1302
1654
|
# string keys are not documented as being allowed
|
|
1303
1655
|
# but the code accepts them
|
|
1304
|
-
it
|
|
1656
|
+
it 'is accepted' do
|
|
1305
1657
|
# the key got converted to a string here
|
|
1306
1658
|
# the value remains a string
|
|
1307
|
-
expect(client.read_preference).to eq({'mode' => sym.to_s})
|
|
1659
|
+
expect(client.read_preference).to eq({ 'mode' => sym.to_s })
|
|
1308
1660
|
end
|
|
1309
1661
|
end
|
|
1310
1662
|
end
|
|
1311
1663
|
end
|
|
1312
1664
|
|
|
1313
1665
|
context 'when not linting' do
|
|
1314
|
-
|
|
1666
|
+
require_no_linting
|
|
1315
1667
|
|
|
1316
1668
|
it 'rejects bogus read preference as symbol' do
|
|
1317
1669
|
expect do
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1670
|
+
new_local_client_nmio(SINGLE_CLIENT, read: { mode: :bogus })
|
|
1671
|
+
end.to raise_error(
|
|
1672
|
+
Mongo::Error::InvalidReadOption,
|
|
1673
|
+
'Invalid read preference value: {"mode"=>:bogus}: ' \
|
|
1674
|
+
'mode bogus is not one of recognized modes'
|
|
1675
|
+
)
|
|
1321
1676
|
end
|
|
1322
1677
|
|
|
1323
1678
|
it 'rejects bogus read preference as string' do
|
|
1324
1679
|
expect do
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1680
|
+
new_local_client_nmio(SINGLE_CLIENT, read: { mode: 'bogus' })
|
|
1681
|
+
end.to raise_error(
|
|
1682
|
+
Mongo::Error::InvalidReadOption,
|
|
1683
|
+
'Invalid read preference value: {"mode"=>"bogus"}: mode bogus is not one of recognized modes'
|
|
1684
|
+
)
|
|
1328
1685
|
end
|
|
1329
1686
|
|
|
1330
1687
|
it 'rejects read option specified as a string' do
|
|
1331
1688
|
expect do
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1689
|
+
new_local_client_nmio(SINGLE_CLIENT, read: 'primary')
|
|
1690
|
+
end.to raise_error(
|
|
1691
|
+
Mongo::Error::InvalidReadOption,
|
|
1692
|
+
'Invalid read preference value: "primary": ' \
|
|
1693
|
+
'the read preference must be specified as a hash: { mode: "primary" }'
|
|
1694
|
+
)
|
|
1335
1695
|
end
|
|
1336
1696
|
|
|
1337
1697
|
it 'rejects read option specified as a symbol' do
|
|
1338
1698
|
expect do
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1699
|
+
new_local_client_nmio(SINGLE_CLIENT, read: :primary)
|
|
1700
|
+
end.to raise_error(
|
|
1701
|
+
Mongo::Error::InvalidReadOption,
|
|
1702
|
+
'Invalid read preference value: :primary: ' \
|
|
1703
|
+
'the read preference must be specified as a hash: { mode: :primary }'
|
|
1704
|
+
)
|
|
1342
1705
|
end
|
|
1343
1706
|
end
|
|
1344
1707
|
end
|
|
1345
1708
|
|
|
1346
|
-
context 'when
|
|
1709
|
+
context 'when setting read concern options' do
|
|
1710
|
+
min_server_fcv '3.2'
|
|
1711
|
+
|
|
1712
|
+
context 'when read concern is valid' do
|
|
1713
|
+
let(:options) do
|
|
1714
|
+
{ read_concern: { level: :local } }
|
|
1715
|
+
end
|
|
1716
|
+
|
|
1717
|
+
it 'does not warn' do
|
|
1718
|
+
expect(Mongo::Logger.logger).not_to receive(:warn)
|
|
1719
|
+
new_local_client_nmio(SpecConfig.instance.addresses, options)
|
|
1720
|
+
end
|
|
1721
|
+
end
|
|
1722
|
+
|
|
1723
|
+
context 'when read concern has an invalid key' do
|
|
1724
|
+
require_no_linting
|
|
1347
1725
|
|
|
1726
|
+
let(:options) do
|
|
1727
|
+
{ read_concern: { hello: :local } }
|
|
1728
|
+
end
|
|
1729
|
+
|
|
1730
|
+
it 'logs a warning' do
|
|
1731
|
+
expect(Mongo::Logger.logger).to receive(:warn).with(/Read concern has invalid keys: hello/)
|
|
1732
|
+
new_local_client_nmio(SpecConfig.instance.addresses, options)
|
|
1733
|
+
end
|
|
1734
|
+
end
|
|
1735
|
+
|
|
1736
|
+
context 'when read concern has a non-user-settable key' do
|
|
1737
|
+
let(:options) do
|
|
1738
|
+
{ read_concern: { after_cluster_time: 100 } }
|
|
1739
|
+
end
|
|
1740
|
+
|
|
1741
|
+
it 'raises an exception' do
|
|
1742
|
+
expect do
|
|
1743
|
+
new_local_client_nmio(SpecConfig.instance.addresses, options)
|
|
1744
|
+
end.to raise_error(
|
|
1745
|
+
Mongo::Error::InvalidReadConcern,
|
|
1746
|
+
'The after_cluster_time read_concern option cannot be specified by the user'
|
|
1747
|
+
)
|
|
1748
|
+
end
|
|
1749
|
+
end
|
|
1750
|
+
end
|
|
1751
|
+
|
|
1752
|
+
context 'when an invalid option is provided' do
|
|
1348
1753
|
let(:options) do
|
|
1349
|
-
{ssl: false, invalid: :test}
|
|
1754
|
+
{ ssl: false, invalid: :test }
|
|
1350
1755
|
end
|
|
1351
1756
|
|
|
1352
1757
|
it 'does not set the option' do
|
|
@@ -1365,9 +1770,8 @@ describe Mongo::Client do
|
|
|
1365
1770
|
|
|
1366
1771
|
=begin WriteConcern object support
|
|
1367
1772
|
context 'when write concern is provided via a WriteConcern object' do
|
|
1368
|
-
|
|
1369
1773
|
let(:options) do
|
|
1370
|
-
{write_concern: wc}
|
|
1774
|
+
{ write_concern: wc }
|
|
1371
1775
|
end
|
|
1372
1776
|
|
|
1373
1777
|
let(:wc) { Mongo::WriteConcern.get(w: 2) }
|
|
@@ -1385,52 +1789,52 @@ describe Mongo::Client do
|
|
|
1385
1789
|
|
|
1386
1790
|
context ':wrapping_libraries option' do
|
|
1387
1791
|
let(:options) do
|
|
1388
|
-
{wrapping_libraries: wrapping_libraries}
|
|
1792
|
+
{ wrapping_libraries: wrapping_libraries }
|
|
1389
1793
|
end
|
|
1390
1794
|
|
|
1391
1795
|
context 'valid input' do
|
|
1392
1796
|
context 'symbol keys' do
|
|
1393
1797
|
let(:wrapping_libraries) do
|
|
1394
|
-
[name: 'Mongoid', version: '7.1.2'].freeze
|
|
1798
|
+
[ { name: 'Mongoid', version: '7.1.2' } ].freeze
|
|
1395
1799
|
end
|
|
1396
1800
|
|
|
1397
1801
|
it 'works' do
|
|
1398
|
-
client.options[:wrapping_libraries].
|
|
1802
|
+
expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
|
|
1399
1803
|
end
|
|
1400
1804
|
end
|
|
1401
1805
|
|
|
1402
1806
|
context 'string keys' do
|
|
1403
1807
|
let(:wrapping_libraries) do
|
|
1404
|
-
['name' => 'Mongoid', 'version' => '7.1.2'].freeze
|
|
1808
|
+
[ { 'name' => 'Mongoid', 'version' => '7.1.2' } ].freeze
|
|
1405
1809
|
end
|
|
1406
1810
|
|
|
1407
1811
|
it 'works' do
|
|
1408
|
-
client.options[:wrapping_libraries].
|
|
1812
|
+
expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
|
|
1409
1813
|
end
|
|
1410
1814
|
end
|
|
1411
1815
|
|
|
1412
1816
|
context 'Redacted keys' do
|
|
1413
1817
|
let(:wrapping_libraries) do
|
|
1414
|
-
[Mongo::Options::Redacted.new(name: 'Mongoid', version: '7.1.2')].freeze
|
|
1818
|
+
[ Mongo::Options::Redacted.new(name: 'Mongoid', version: '7.1.2') ].freeze
|
|
1415
1819
|
end
|
|
1416
1820
|
|
|
1417
1821
|
it 'works' do
|
|
1418
|
-
client.options[:wrapping_libraries].
|
|
1822
|
+
expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
|
|
1419
1823
|
end
|
|
1420
1824
|
end
|
|
1421
1825
|
|
|
1422
1826
|
context 'two libraries' do
|
|
1423
1827
|
let(:wrapping_libraries) do
|
|
1424
1828
|
[
|
|
1425
|
-
{name: 'Mongoid', version: '7.1.2'},
|
|
1426
|
-
{name: 'Rails', version: '4.0', platform: 'Foobar'},
|
|
1829
|
+
{ name: 'Mongoid', version: '7.1.2' },
|
|
1830
|
+
{ name: 'Rails', version: '4.0', platform: 'Foobar' },
|
|
1427
1831
|
].freeze
|
|
1428
1832
|
end
|
|
1429
1833
|
|
|
1430
1834
|
it 'works' do
|
|
1431
|
-
client.options[:wrapping_libraries].
|
|
1432
|
-
{'name' => 'Mongoid', 'version' => '7.1.2'},
|
|
1433
|
-
{'name' => 'Rails', 'version' => '4.0', 'platform' => 'Foobar'},
|
|
1835
|
+
expect(client.options[:wrapping_libraries]).to be == [
|
|
1836
|
+
{ 'name' => 'Mongoid', 'version' => '7.1.2' },
|
|
1837
|
+
{ 'name' => 'Rails', 'version' => '4.0', 'platform' => 'Foobar' },
|
|
1434
1838
|
]
|
|
1435
1839
|
end
|
|
1436
1840
|
end
|
|
@@ -1441,7 +1845,7 @@ describe Mongo::Client do
|
|
|
1441
1845
|
end
|
|
1442
1846
|
|
|
1443
1847
|
it 'works' do
|
|
1444
|
-
client.options[:wrapping_libraries].
|
|
1848
|
+
expect(client.options[:wrapping_libraries]).to be == []
|
|
1445
1849
|
end
|
|
1446
1850
|
end
|
|
1447
1851
|
|
|
@@ -1451,7 +1855,7 @@ describe Mongo::Client do
|
|
|
1451
1855
|
end
|
|
1452
1856
|
|
|
1453
1857
|
it 'works' do
|
|
1454
|
-
client.options[:wrapping_libraries].
|
|
1858
|
+
expect(client.options[:wrapping_libraries]).to be_nil
|
|
1455
1859
|
end
|
|
1456
1860
|
end
|
|
1457
1861
|
end
|
|
@@ -1459,39 +1863,133 @@ describe Mongo::Client do
|
|
|
1459
1863
|
context 'valid input' do
|
|
1460
1864
|
context 'hash given instead of an array' do
|
|
1461
1865
|
let(:wrapping_libraries) do
|
|
1462
|
-
{name: 'Mongoid', version: '7.1.2'}.freeze
|
|
1866
|
+
{ name: 'Mongoid', version: '7.1.2' }.freeze
|
|
1463
1867
|
end
|
|
1464
1868
|
|
|
1465
1869
|
it 'is rejected' do
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
end.should raise_error(ArgumentError, /:wrapping_libraries must be an array of hashes/)
|
|
1870
|
+
expect { client }
|
|
1871
|
+
.to raise_error(ArgumentError, /:wrapping_libraries must be an array of hashes/)
|
|
1469
1872
|
end
|
|
1470
1873
|
end
|
|
1471
1874
|
|
|
1472
1875
|
context 'invalid keys' do
|
|
1473
1876
|
let(:wrapping_libraries) do
|
|
1474
|
-
[name: 'Mongoid', invalid: '7.1.2'].freeze
|
|
1877
|
+
[ { name: 'Mongoid', invalid: '7.1.2' } ].freeze
|
|
1475
1878
|
end
|
|
1476
1879
|
|
|
1477
1880
|
it 'is rejected' do
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
end.should raise_error(ArgumentError, /:wrapping_libraries element has invalid keys/)
|
|
1881
|
+
expect { client }
|
|
1882
|
+
.to raise_error(ArgumentError, /:wrapping_libraries element has invalid keys/)
|
|
1481
1883
|
end
|
|
1482
1884
|
end
|
|
1483
1885
|
|
|
1484
1886
|
context 'value includes |' do
|
|
1485
1887
|
let(:wrapping_libraries) do
|
|
1486
|
-
[name: 'Mongoid|on|Rails', version: '7.1.2'].freeze
|
|
1888
|
+
[ { name: 'Mongoid|on|Rails', version: '7.1.2' } ].freeze
|
|
1487
1889
|
end
|
|
1488
1890
|
|
|
1489
1891
|
it 'is rejected' do
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1892
|
+
expect { client }
|
|
1893
|
+
.to raise_error(ArgumentError, /:wrapping_libraries element value cannot include '|'/)
|
|
1894
|
+
end
|
|
1895
|
+
end
|
|
1896
|
+
end
|
|
1897
|
+
end
|
|
1898
|
+
|
|
1899
|
+
context ':auth_mech_properties option' do
|
|
1900
|
+
context 'is nil' do
|
|
1901
|
+
let(:options) { { auth_mech_properties: nil } }
|
|
1902
|
+
|
|
1903
|
+
it 'creates the client without the option' do
|
|
1904
|
+
expect(client.options).not_to have_key(:auth_mech_properties)
|
|
1905
|
+
end
|
|
1906
|
+
end
|
|
1907
|
+
end
|
|
1908
|
+
|
|
1909
|
+
context ':server_api parameter' do
|
|
1910
|
+
context 'is a hash with symbol keys' do
|
|
1911
|
+
context 'using known keys' do
|
|
1912
|
+
let(:options) do
|
|
1913
|
+
{
|
|
1914
|
+
server_api: {
|
|
1915
|
+
version: '1',
|
|
1916
|
+
strict: true,
|
|
1917
|
+
deprecation_errors: false,
|
|
1918
|
+
}
|
|
1919
|
+
}
|
|
1920
|
+
end
|
|
1921
|
+
|
|
1922
|
+
it 'is accepted' do
|
|
1923
|
+
expect(client.options[:server_api]).to be == {
|
|
1924
|
+
'version' => '1',
|
|
1925
|
+
'strict' => true,
|
|
1926
|
+
'deprecation_errors' => false,
|
|
1927
|
+
}
|
|
1928
|
+
end
|
|
1929
|
+
end
|
|
1930
|
+
|
|
1931
|
+
context 'using an unknown version' do
|
|
1932
|
+
let(:options) do
|
|
1933
|
+
{ server_api: { version: '42' } }
|
|
1934
|
+
end
|
|
1935
|
+
|
|
1936
|
+
it 'is rejected' do
|
|
1937
|
+
expect { client }
|
|
1938
|
+
.to raise_error(ArgumentError, 'Unknown server API version: 42')
|
|
1939
|
+
end
|
|
1940
|
+
end
|
|
1941
|
+
|
|
1942
|
+
context 'using an unknown option' do
|
|
1943
|
+
let(:options) do
|
|
1944
|
+
{ server_api: { vversion: '1' } }
|
|
1945
|
+
end
|
|
1946
|
+
|
|
1947
|
+
it 'is rejected' do
|
|
1948
|
+
expect { client }
|
|
1949
|
+
.to raise_error(ArgumentError, 'Unknown keys under :server_api: "vversion"')
|
|
1950
|
+
end
|
|
1951
|
+
end
|
|
1952
|
+
|
|
1953
|
+
context 'using a value which is not a hash' do
|
|
1954
|
+
let(:options) do
|
|
1955
|
+
{ server_api: 42 }
|
|
1956
|
+
end
|
|
1957
|
+
|
|
1958
|
+
it 'is rejected' do
|
|
1959
|
+
expect { client }
|
|
1960
|
+
.to raise_error(ArgumentError, ':server_api value must be a hash: 42')
|
|
1961
|
+
end
|
|
1962
|
+
end
|
|
1963
|
+
end
|
|
1964
|
+
|
|
1965
|
+
context 'when connected to a pre-OP_MSG server' do
|
|
1966
|
+
max_server_version '3.4'
|
|
1967
|
+
|
|
1968
|
+
let(:options) do
|
|
1969
|
+
{ server_api: { version: 1 } }
|
|
1970
|
+
end
|
|
1971
|
+
|
|
1972
|
+
let(:client) do
|
|
1973
|
+
new_local_client(
|
|
1974
|
+
SpecConfig.instance.addresses,
|
|
1975
|
+
SpecConfig.instance.all_test_options.merge(options)
|
|
1976
|
+
)
|
|
1977
|
+
end
|
|
1978
|
+
|
|
1979
|
+
it 'constructs the client' do
|
|
1980
|
+
expect(client).to be_a(described_class)
|
|
1981
|
+
end
|
|
1982
|
+
|
|
1983
|
+
it 'does not discover servers' do
|
|
1984
|
+
client.cluster.servers_list.each do |s|
|
|
1985
|
+
expect(s.status).to eq('UNKNOWN')
|
|
1493
1986
|
end
|
|
1494
1987
|
end
|
|
1988
|
+
|
|
1989
|
+
it 'fails operations' do
|
|
1990
|
+
expect { client.command(ping: 1) }
|
|
1991
|
+
.to raise_error(Mongo::Error::NoServerAvailable)
|
|
1992
|
+
end
|
|
1495
1993
|
end
|
|
1496
1994
|
end
|
|
1497
1995
|
end
|
|
@@ -1500,9 +1998,9 @@ describe Mongo::Client do
|
|
|
1500
1998
|
context 'when the block doesn\'t raise an error' do
|
|
1501
1999
|
let(:block_client) do
|
|
1502
2000
|
c = nil
|
|
1503
|
-
|
|
2001
|
+
described_class.new(
|
|
1504
2002
|
SpecConfig.instance.addresses,
|
|
1505
|
-
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
2003
|
+
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
1506
2004
|
) do |client|
|
|
1507
2005
|
c = client
|
|
1508
2006
|
end
|
|
@@ -1510,55 +2008,112 @@ describe Mongo::Client do
|
|
|
1510
2008
|
end
|
|
1511
2009
|
|
|
1512
2010
|
it 'is closed after block' do
|
|
1513
|
-
expect(block_client.cluster.connected?).to
|
|
2011
|
+
expect(block_client.cluster.connected?).to be false
|
|
2012
|
+
end
|
|
2013
|
+
|
|
2014
|
+
context 'with auto encryption options' do
|
|
2015
|
+
require_libmongocrypt
|
|
2016
|
+
min_server_fcv '4.2'
|
|
2017
|
+
require_enterprise
|
|
2018
|
+
clean_slate
|
|
2019
|
+
|
|
2020
|
+
include_context 'define shared FLE helpers'
|
|
2021
|
+
include_context 'with local kms_providers'
|
|
2022
|
+
|
|
2023
|
+
let(:auto_encryption_options) do
|
|
2024
|
+
{
|
|
2025
|
+
key_vault_client: key_vault_client,
|
|
2026
|
+
key_vault_namespace: key_vault_namespace,
|
|
2027
|
+
kms_providers: kms_providers,
|
|
2028
|
+
schema_map: schema_map,
|
|
2029
|
+
extra_options: extra_options,
|
|
2030
|
+
}
|
|
2031
|
+
end
|
|
2032
|
+
|
|
2033
|
+
let(:key_vault_client) { new_local_client_nmio(SpecConfig.instance.addresses) }
|
|
2034
|
+
|
|
2035
|
+
let(:block_client) do
|
|
2036
|
+
c = nil
|
|
2037
|
+
described_class.new(
|
|
2038
|
+
SpecConfig.instance.addresses,
|
|
2039
|
+
SpecConfig.instance.test_options.merge(
|
|
2040
|
+
auto_encryption_options: auto_encryption_options,
|
|
2041
|
+
database: SpecConfig.instance.test_db
|
|
2042
|
+
)
|
|
2043
|
+
) do |client|
|
|
2044
|
+
c = client
|
|
2045
|
+
end
|
|
2046
|
+
c
|
|
2047
|
+
end
|
|
2048
|
+
|
|
2049
|
+
it 'closes all clients after block' do
|
|
2050
|
+
expect(block_client.cluster.connected?).to be false
|
|
2051
|
+
[
|
|
2052
|
+
block_client.encrypter.mongocryptd_client,
|
|
2053
|
+
block_client.encrypter.key_vault_client,
|
|
2054
|
+
block_client.encrypter.metadata_client
|
|
2055
|
+
].each do |crypt_client|
|
|
2056
|
+
expect(crypt_client.cluster.connected?).to be false
|
|
2057
|
+
end
|
|
2058
|
+
end
|
|
1514
2059
|
end
|
|
1515
2060
|
end
|
|
1516
2061
|
|
|
1517
2062
|
context 'when the block raises an error' do
|
|
1518
|
-
it '
|
|
2063
|
+
it 'is closed after the block' do
|
|
1519
2064
|
block_client_raise = nil
|
|
1520
2065
|
expect do
|
|
1521
|
-
|
|
2066
|
+
described_class.new(
|
|
1522
2067
|
SpecConfig.instance.addresses,
|
|
1523
|
-
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
2068
|
+
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
1524
2069
|
) do |client|
|
|
1525
2070
|
block_client_raise = client
|
|
1526
|
-
raise
|
|
2071
|
+
raise 'This is an error!'
|
|
1527
2072
|
end
|
|
1528
|
-
end.to raise_error(StandardError,
|
|
1529
|
-
expect(block_client_raise.cluster.connected?).to
|
|
2073
|
+
end.to raise_error(StandardError, 'This is an error!')
|
|
2074
|
+
expect(block_client_raise.cluster.connected?).to be false
|
|
1530
2075
|
end
|
|
1531
2076
|
end
|
|
1532
2077
|
|
|
1533
2078
|
context 'when the hosts given include the protocol' do
|
|
1534
2079
|
it 'raises an error on mongodb://' do
|
|
1535
2080
|
expect do
|
|
1536
|
-
|
|
1537
|
-
end.to raise_error(ArgumentError,
|
|
2081
|
+
described_class.new([ 'mongodb://127.0.0.1:27017/test' ])
|
|
2082
|
+
end.to raise_error(ArgumentError,
|
|
2083
|
+
"Host 'mongodb://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2084
|
+
'Did you mean to not use an array?')
|
|
1538
2085
|
end
|
|
1539
2086
|
|
|
1540
2087
|
it 'raises an error on mongodb+srv://' do
|
|
1541
2088
|
expect do
|
|
1542
|
-
|
|
1543
|
-
end.to raise_error(ArgumentError,
|
|
2089
|
+
described_class.new([ 'mongodb+srv://127.0.0.1:27017/test' ])
|
|
2090
|
+
end.to raise_error(ArgumentError,
|
|
2091
|
+
"Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2092
|
+
'Did you mean to not use an array?')
|
|
1544
2093
|
end
|
|
1545
2094
|
|
|
1546
2095
|
it 'raises an error on multiple items' do
|
|
1547
2096
|
expect do
|
|
1548
|
-
|
|
1549
|
-
end.to raise_error(ArgumentError,
|
|
2097
|
+
described_class.new([ '127.0.0.1:27017', 'mongodb+srv://127.0.0.1:27017/test' ])
|
|
2098
|
+
end.to raise_error(ArgumentError,
|
|
2099
|
+
"Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2100
|
+
'Did you mean to not use an array?')
|
|
1550
2101
|
end
|
|
1551
2102
|
|
|
1552
2103
|
it 'raises an error only at beginning of string' do
|
|
1553
2104
|
expect do
|
|
1554
|
-
|
|
1555
|
-
|
|
2105
|
+
described_class
|
|
2106
|
+
.new([ 'somethingmongodb://127.0.0.1:27017/test', 'mongodb+srv://127.0.0.1:27017/test' ])
|
|
2107
|
+
end.to raise_error(ArgumentError,
|
|
2108
|
+
"Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2109
|
+
'Did you mean to not use an array?')
|
|
1556
2110
|
end
|
|
1557
2111
|
|
|
1558
2112
|
it 'raises an error with different case' do
|
|
1559
|
-
expect
|
|
1560
|
-
|
|
1561
|
-
|
|
2113
|
+
expect { described_class.new([ 'MongOdB://127.0.0.1:27017/test' ]) }
|
|
2114
|
+
.to raise_error(ArgumentError,
|
|
2115
|
+
"Host 'MongOdB://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2116
|
+
'Did you mean to not use an array?')
|
|
1562
2117
|
end
|
|
1563
2118
|
end
|
|
1564
2119
|
end
|
|
@@ -1648,13 +2203,11 @@ describe Mongo::Client do
|
|
|
1648
2203
|
end
|
|
1649
2204
|
|
|
1650
2205
|
describe '#use' do
|
|
1651
|
-
|
|
1652
2206
|
let(:client) do
|
|
1653
|
-
new_local_client_nmio(
|
|
2207
|
+
new_local_client_nmio(SINGLE_CLIENT, database: SpecConfig.instance.test_db)
|
|
1654
2208
|
end
|
|
1655
2209
|
|
|
1656
2210
|
shared_examples_for 'a database switching object' do
|
|
1657
|
-
|
|
1658
2211
|
it 'returns the new client' do
|
|
1659
2212
|
expect(client.send(:database).name).to eq('ruby-driver')
|
|
1660
2213
|
end
|
|
@@ -1665,7 +2218,6 @@ describe Mongo::Client do
|
|
|
1665
2218
|
end
|
|
1666
2219
|
|
|
1667
2220
|
context 'when provided a string' do
|
|
1668
|
-
|
|
1669
2221
|
let(:database) do
|
|
1670
2222
|
client.use('testdb')
|
|
1671
2223
|
end
|
|
@@ -1674,7 +2226,6 @@ describe Mongo::Client do
|
|
|
1674
2226
|
end
|
|
1675
2227
|
|
|
1676
2228
|
context 'when provided a symbol' do
|
|
1677
|
-
|
|
1678
2229
|
let(:database) do
|
|
1679
2230
|
client.use(:testdb)
|
|
1680
2231
|
end
|
|
@@ -1683,45 +2234,29 @@ describe Mongo::Client do
|
|
|
1683
2234
|
end
|
|
1684
2235
|
|
|
1685
2236
|
context 'when providing nil' do
|
|
1686
|
-
|
|
1687
2237
|
it 'raises an exception' do
|
|
1688
|
-
expect {
|
|
1689
|
-
|
|
1690
|
-
}.to raise_error(Mongo::Error::InvalidDatabaseName)
|
|
2238
|
+
expect { client.use(nil) }
|
|
2239
|
+
.to raise_error(Mongo::Error::InvalidDatabaseName)
|
|
1691
2240
|
end
|
|
1692
2241
|
end
|
|
1693
2242
|
end
|
|
1694
2243
|
|
|
1695
2244
|
describe '#with' do
|
|
1696
|
-
|
|
1697
2245
|
let(:client) do
|
|
1698
|
-
new_local_client_nmio(
|
|
2246
|
+
new_local_client_nmio(SINGLE_CLIENT, database: SpecConfig.instance.test_db)
|
|
1699
2247
|
end
|
|
1700
2248
|
|
|
1701
2249
|
context 'when providing nil' do
|
|
1702
|
-
|
|
1703
2250
|
it 'returns the cloned client' do
|
|
1704
2251
|
expect(client.with(nil)).to eq(client)
|
|
1705
2252
|
end
|
|
1706
2253
|
end
|
|
1707
2254
|
|
|
1708
2255
|
context 'when the app_name is changed' do
|
|
1709
|
-
|
|
1710
|
-
let(:
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
let!(:original_options) do
|
|
1715
|
-
client.options
|
|
1716
|
-
end
|
|
1717
|
-
|
|
1718
|
-
let(:new_options) do
|
|
1719
|
-
{ app_name: 'client_test' }
|
|
1720
|
-
end
|
|
1721
|
-
|
|
1722
|
-
let!(:new_client) do
|
|
1723
|
-
authorized_client.with(new_options)
|
|
1724
|
-
end
|
|
2256
|
+
let(:client) { authorized_client }
|
|
2257
|
+
let(:original_options) { client.options }
|
|
2258
|
+
let(:new_options) { { app_name: 'client_test' } }
|
|
2259
|
+
let(:new_client) { authorized_client.with(new_options) }
|
|
1725
2260
|
|
|
1726
2261
|
it 'returns a new client' do
|
|
1727
2262
|
expect(new_client).not_to equal(client)
|
|
@@ -1747,27 +2282,25 @@ describe Mongo::Client do
|
|
|
1747
2282
|
new_local_client(SpecConfig.instance.addresses, options)
|
|
1748
2283
|
end
|
|
1749
2284
|
|
|
1750
|
-
before do
|
|
1751
|
-
client.options[:direct_connection].should be nil
|
|
1752
|
-
end
|
|
1753
|
-
|
|
1754
2285
|
let(:new_client) do
|
|
1755
2286
|
client.with(new_options)
|
|
1756
2287
|
end
|
|
1757
2288
|
|
|
1758
|
-
|
|
2289
|
+
before do
|
|
2290
|
+
expect(client.options[:direct_connection]).to be_nil
|
|
2291
|
+
end
|
|
1759
2292
|
|
|
2293
|
+
context 'direct_connection set to false' do
|
|
1760
2294
|
let(:new_options) do
|
|
1761
2295
|
{ direct_connection: false }
|
|
1762
2296
|
end
|
|
1763
2297
|
|
|
1764
2298
|
it 'is accepted' do
|
|
1765
|
-
new_client.options[:direct_connection].
|
|
2299
|
+
expect(new_client.options[:direct_connection]).to be false
|
|
1766
2300
|
end
|
|
1767
2301
|
end
|
|
1768
2302
|
|
|
1769
2303
|
context 'direct_connection set to true' do
|
|
1770
|
-
|
|
1771
2304
|
let(:new_options) do
|
|
1772
2305
|
{ direct_connection: true }
|
|
1773
2306
|
end
|
|
@@ -1775,10 +2308,9 @@ describe Mongo::Client do
|
|
|
1775
2308
|
context 'in single topology' do
|
|
1776
2309
|
require_topology :single
|
|
1777
2310
|
|
|
1778
|
-
|
|
1779
2311
|
it 'is accepted' do
|
|
1780
|
-
new_client.options[:direct_connection].
|
|
1781
|
-
new_client.cluster.topology.
|
|
2312
|
+
expect(new_client.options[:direct_connection]).to be true
|
|
2313
|
+
expect(new_client.cluster.topology).to be_a(Mongo::Cluster::Topology::Single)
|
|
1782
2314
|
end
|
|
1783
2315
|
end
|
|
1784
2316
|
|
|
@@ -1786,21 +2318,19 @@ describe Mongo::Client do
|
|
|
1786
2318
|
require_topology :replica_set, :sharded
|
|
1787
2319
|
|
|
1788
2320
|
it 'is rejected' do
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
|
|
2321
|
+
expect { new_client }
|
|
2322
|
+
.to raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
|
|
1792
2323
|
end
|
|
1793
2324
|
|
|
1794
2325
|
context 'when a new cluster is created' do
|
|
1795
|
-
|
|
1796
2326
|
let(:new_options) do
|
|
1797
2327
|
{ direct_connection: true, app_name: 'new-client' }
|
|
1798
2328
|
end
|
|
1799
2329
|
|
|
1800
2330
|
it 'is rejected' do
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
2331
|
+
expect { new_client }
|
|
2332
|
+
.to raise_error(ArgumentError,
|
|
2333
|
+
/direct_connection=true cannot be used with topologies other than Single/)
|
|
1804
2334
|
end
|
|
1805
2335
|
end
|
|
1806
2336
|
end
|
|
@@ -1808,28 +2338,37 @@ describe Mongo::Client do
|
|
|
1808
2338
|
end
|
|
1809
2339
|
|
|
1810
2340
|
context 'when the write concern is not changed' do
|
|
1811
|
-
|
|
1812
2341
|
let(:client) do
|
|
1813
2342
|
new_local_client_nmio(
|
|
1814
|
-
|
|
1815
|
-
:
|
|
2343
|
+
SINGLE_CLIENT,
|
|
2344
|
+
read: { mode: :secondary },
|
|
2345
|
+
write: { w: 1 },
|
|
2346
|
+
database: SpecConfig.instance.test_db
|
|
1816
2347
|
)
|
|
1817
2348
|
end
|
|
1818
2349
|
|
|
1819
|
-
let
|
|
1820
|
-
client.with(:read => { :mode => :primary })
|
|
1821
|
-
end
|
|
2350
|
+
let(:new_client) { client.with(read: { mode: :primary }) }
|
|
1822
2351
|
|
|
1823
2352
|
let(:new_options) do
|
|
1824
|
-
Mongo::Options::Redacted.new(
|
|
1825
|
-
:
|
|
1826
|
-
:
|
|
2353
|
+
Mongo::Options::Redacted.new(
|
|
2354
|
+
read: { mode: :primary },
|
|
2355
|
+
write: { w: 1 },
|
|
2356
|
+
monitoring_io: false,
|
|
2357
|
+
database: SpecConfig.instance.test_db,
|
|
2358
|
+
retry_writes: true,
|
|
2359
|
+
retry_reads: true
|
|
2360
|
+
)
|
|
1827
2361
|
end
|
|
1828
2362
|
|
|
1829
2363
|
let(:original_options) do
|
|
1830
|
-
Mongo::Options::Redacted.new(
|
|
1831
|
-
:
|
|
1832
|
-
:
|
|
2364
|
+
Mongo::Options::Redacted.new(
|
|
2365
|
+
read: { mode: :secondary },
|
|
2366
|
+
write: { w: 1 },
|
|
2367
|
+
monitoring_io: false,
|
|
2368
|
+
database: SpecConfig.instance.test_db,
|
|
2369
|
+
retry_writes: true,
|
|
2370
|
+
retry_reads: true
|
|
2371
|
+
)
|
|
1833
2372
|
end
|
|
1834
2373
|
|
|
1835
2374
|
it 'returns a new client' do
|
|
@@ -1850,21 +2389,19 @@ describe Mongo::Client do
|
|
|
1850
2389
|
end
|
|
1851
2390
|
|
|
1852
2391
|
context 'when the write concern is changed' do
|
|
1853
|
-
|
|
1854
2392
|
let(:client) do
|
|
1855
|
-
new_local_client(
|
|
1856
|
-
|
|
2393
|
+
new_local_client(
|
|
2394
|
+
SINGLE_CLIENT,
|
|
2395
|
+
{ monitoring_io: false }.merge(client_options)
|
|
2396
|
+
)
|
|
1857
2397
|
end
|
|
1858
2398
|
|
|
1859
2399
|
let(:client_options) do
|
|
1860
|
-
{ :
|
|
2400
|
+
{ write: { w: 1 } }
|
|
1861
2401
|
end
|
|
1862
2402
|
|
|
1863
2403
|
context 'when the write concern has not been accessed' do
|
|
1864
|
-
|
|
1865
|
-
let!(:new_client) do
|
|
1866
|
-
client.with(:write => { :w => 0 })
|
|
1867
|
-
end
|
|
2404
|
+
let(:new_client) { client.with(write: { w: 0 }) }
|
|
1868
2405
|
|
|
1869
2406
|
let(:get_last_error) do
|
|
1870
2407
|
new_client.write_concern.get_last_error
|
|
@@ -1876,10 +2413,9 @@ describe Mongo::Client do
|
|
|
1876
2413
|
end
|
|
1877
2414
|
|
|
1878
2415
|
context 'when the write concern has been accessed' do
|
|
1879
|
-
|
|
1880
|
-
let!(:new_client) do
|
|
2416
|
+
let(:new_client) do
|
|
1881
2417
|
client.write_concern
|
|
1882
|
-
client.with(:
|
|
2418
|
+
client.with(write: { w: 0 })
|
|
1883
2419
|
end
|
|
1884
2420
|
|
|
1885
2421
|
let(:get_last_error) do
|
|
@@ -1892,9 +2428,8 @@ describe Mongo::Client do
|
|
|
1892
2428
|
end
|
|
1893
2429
|
|
|
1894
2430
|
context 'when write concern is given as :write' do
|
|
1895
|
-
|
|
1896
2431
|
let(:client_options) do
|
|
1897
|
-
{ :
|
|
2432
|
+
{ write: { w: 1 } }
|
|
1898
2433
|
end
|
|
1899
2434
|
|
|
1900
2435
|
it 'sets :write option' do
|
|
@@ -1902,7 +2437,7 @@ describe Mongo::Client do
|
|
|
1902
2437
|
end
|
|
1903
2438
|
|
|
1904
2439
|
it 'does not set :write_concern option' do
|
|
1905
|
-
expect(client.options[:write_concern]).to
|
|
2440
|
+
expect(client.options[:write_concern]).to be_nil
|
|
1906
2441
|
end
|
|
1907
2442
|
|
|
1908
2443
|
it 'returns correct write concern' do
|
|
@@ -1912,9 +2447,8 @@ describe Mongo::Client do
|
|
|
1912
2447
|
end
|
|
1913
2448
|
|
|
1914
2449
|
context 'when write concern is given as :write_concern' do
|
|
1915
|
-
|
|
1916
2450
|
let(:client_options) do
|
|
1917
|
-
{ :
|
|
2451
|
+
{ write_concern: { w: 1 } }
|
|
1918
2452
|
end
|
|
1919
2453
|
|
|
1920
2454
|
it 'sets :write_concern option' do
|
|
@@ -1922,20 +2456,19 @@ describe Mongo::Client do
|
|
|
1922
2456
|
end
|
|
1923
2457
|
|
|
1924
2458
|
it 'does not set :write option' do
|
|
1925
|
-
expect(client.options[:write]).to
|
|
2459
|
+
expect(client.options[:write]).to be_nil
|
|
1926
2460
|
end
|
|
1927
2461
|
|
|
1928
2462
|
it 'returns correct write concern' do
|
|
1929
|
-
|
|
1930
|
-
|
|
2463
|
+
expect(client.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
|
|
2464
|
+
expect(client.write_concern.options).to eq(w: 1)
|
|
1931
2465
|
end
|
|
1932
2466
|
end
|
|
1933
2467
|
|
|
1934
2468
|
context 'when write concern is given as both :write and :write_concern' do
|
|
1935
2469
|
context 'with identical values' do
|
|
1936
|
-
|
|
1937
2470
|
let(:client_options) do
|
|
1938
|
-
{ write: {w: 1}, write_concern: { w: 1 } }
|
|
2471
|
+
{ write: { w: 1 }, write_concern: { w: 1 } }
|
|
1939
2472
|
end
|
|
1940
2473
|
|
|
1941
2474
|
it 'sets :write_concern option' do
|
|
@@ -1953,9 +2486,8 @@ describe Mongo::Client do
|
|
|
1953
2486
|
end
|
|
1954
2487
|
|
|
1955
2488
|
context 'with different values' do
|
|
1956
|
-
|
|
1957
2489
|
let(:client_options) do
|
|
1958
|
-
{ write: {w: 1}, write_concern: { w: 2 } }
|
|
2490
|
+
{ write: { w: 1 }, write_concern: { w: 2 } }
|
|
1959
2491
|
end
|
|
1960
2492
|
|
|
1961
2493
|
it 'raises an exception' do
|
|
@@ -1967,43 +2499,35 @@ describe Mongo::Client do
|
|
|
1967
2499
|
end
|
|
1968
2500
|
|
|
1969
2501
|
context 'when #with uses a different write concern option name' do
|
|
1970
|
-
|
|
1971
2502
|
context 'from :write_concern to :write' do
|
|
1972
|
-
|
|
1973
2503
|
let(:client_options) do
|
|
1974
|
-
{ :
|
|
2504
|
+
{ write_concern: { w: 1 } }
|
|
1975
2505
|
end
|
|
1976
2506
|
|
|
1977
|
-
let
|
|
1978
|
-
client.with(:write => { :w => 2 })
|
|
1979
|
-
end
|
|
2507
|
+
let(:new_client) { client.with(write: { w: 2 }) }
|
|
1980
2508
|
|
|
1981
2509
|
it 'uses the new option' do
|
|
1982
2510
|
expect(new_client.options[:write]).to eq(Mongo::Options::Redacted.new(w: 2))
|
|
1983
|
-
expect(new_client.options[:write_concern]).to
|
|
2511
|
+
expect(new_client.options[:write_concern]).to be_nil
|
|
1984
2512
|
end
|
|
1985
2513
|
end
|
|
1986
2514
|
|
|
1987
2515
|
context 'from :write to :write_concern' do
|
|
1988
|
-
|
|
1989
2516
|
let(:client_options) do
|
|
1990
|
-
{ :
|
|
2517
|
+
{ write: { w: 1 } }
|
|
1991
2518
|
end
|
|
1992
2519
|
|
|
1993
|
-
let
|
|
1994
|
-
client.with(:write_concern => { :w => 2 })
|
|
1995
|
-
end
|
|
2520
|
+
let(:new_client) { client.with(write_concern: { w: 2 }) }
|
|
1996
2521
|
|
|
1997
2522
|
it 'uses the new option' do
|
|
1998
2523
|
expect(new_client.options[:write_concern]).to eq(Mongo::Options::Redacted.new(w: 2))
|
|
1999
|
-
expect(new_client.options[:write]).to
|
|
2524
|
+
expect(new_client.options[:write]).to be_nil
|
|
2000
2525
|
end
|
|
2001
2526
|
end
|
|
2002
2527
|
end
|
|
2003
2528
|
end
|
|
2004
2529
|
|
|
2005
2530
|
context 'when an invalid option is provided' do
|
|
2006
|
-
|
|
2007
2531
|
let(:new_client) do
|
|
2008
2532
|
client.with(invalid: :option, ssl: false)
|
|
2009
2533
|
end
|
|
@@ -2024,24 +2548,18 @@ describe Mongo::Client do
|
|
|
2024
2548
|
|
|
2025
2549
|
context 'when client is created with ipv6 address' do
|
|
2026
2550
|
let(:client) do
|
|
2027
|
-
new_local_client_nmio(['[::1]:27017'], :
|
|
2551
|
+
new_local_client_nmio([ '[::1]:27017' ], database: SpecConfig.instance.test_db)
|
|
2028
2552
|
end
|
|
2029
2553
|
|
|
2030
2554
|
context 'when providing nil' do
|
|
2031
|
-
|
|
2032
2555
|
it 'returns the cloned client' do
|
|
2033
2556
|
expect(client.with(nil)).to eq(client)
|
|
2034
2557
|
end
|
|
2035
2558
|
end
|
|
2036
2559
|
|
|
2037
2560
|
context 'when changing options' do
|
|
2038
|
-
let(:new_options)
|
|
2039
|
-
|
|
2040
|
-
end
|
|
2041
|
-
|
|
2042
|
-
let!(:new_client) do
|
|
2043
|
-
client.with(new_options)
|
|
2044
|
-
end
|
|
2561
|
+
let(:new_options) { { app_name: 'client_test' } }
|
|
2562
|
+
let(:new_client) { client.with(new_options) }
|
|
2045
2563
|
|
|
2046
2564
|
it 'returns a new client' do
|
|
2047
2565
|
expect(new_client).not_to equal(client)
|
|
@@ -2051,11 +2569,14 @@ describe Mongo::Client do
|
|
|
2051
2569
|
|
|
2052
2570
|
context 'when new client has a new cluster' do
|
|
2053
2571
|
let(:client) do
|
|
2054
|
-
new_local_client(
|
|
2572
|
+
new_local_client(
|
|
2573
|
+
SINGLE_CLIENT,
|
|
2055
2574
|
database: SpecConfig.instance.test_db,
|
|
2056
2575
|
server_selection_timeout: 0.5,
|
|
2057
|
-
socket_timeout: 0.1, connect_timeout: 0.1
|
|
2576
|
+
socket_timeout: 0.1, connect_timeout: 0.1, populator_io: false
|
|
2577
|
+
)
|
|
2058
2578
|
end
|
|
2579
|
+
|
|
2059
2580
|
let(:new_client) do
|
|
2060
2581
|
client.with(app_name: 'client_construction_spec').tap do |new_client|
|
|
2061
2582
|
expect(new_client.cluster).not_to eql(client.cluster)
|
|
@@ -2079,37 +2600,44 @@ describe Mongo::Client do
|
|
|
2079
2600
|
# in #with, the consistent behavior is to never transfer sdam_proc to
|
|
2080
2601
|
# the new client.
|
|
2081
2602
|
context 'when sdam_proc is given on original client' do
|
|
2082
|
-
|
|
2083
2603
|
let(:sdam_proc) do
|
|
2084
|
-
|
|
2604
|
+
proc do |client|
|
|
2085
2605
|
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
|
2086
2606
|
end
|
|
2087
2607
|
end
|
|
2088
2608
|
|
|
2089
2609
|
let(:client) do
|
|
2090
|
-
new_local_client(
|
|
2610
|
+
new_local_client(
|
|
2611
|
+
SpecConfig.instance.addresses,
|
|
2091
2612
|
SpecConfig.instance.test_options.merge(
|
|
2092
2613
|
sdam_proc: sdam_proc,
|
|
2093
2614
|
connect_timeout: 3.08, socket_timeout: 3.09,
|
|
2094
2615
|
server_selection_timeout: 2.92,
|
|
2095
2616
|
heartbeat_frequency: 100,
|
|
2096
|
-
database: SpecConfig.instance.test_db
|
|
2617
|
+
database: SpecConfig.instance.test_db
|
|
2618
|
+
)
|
|
2619
|
+
)
|
|
2097
2620
|
end
|
|
2098
2621
|
|
|
2099
2622
|
let(:new_client) do
|
|
2100
2623
|
client.with(app_name: 'foo').tap do |new_client|
|
|
2101
|
-
new_client.cluster.
|
|
2624
|
+
expect(new_client.cluster).not_to be == client.cluster
|
|
2102
2625
|
end
|
|
2103
2626
|
end
|
|
2104
2627
|
|
|
2105
2628
|
before do
|
|
2106
2629
|
client.cluster.next_primary
|
|
2107
2630
|
events = subscriber.select_started_events(Mongo::Monitoring::Event::ServerHeartbeatStarted)
|
|
2108
|
-
|
|
2631
|
+
if ClusterConfig.instance.topology == :load_balanced
|
|
2632
|
+
# No server monitoring in LB topology
|
|
2633
|
+
expect(events.length).to be == 0
|
|
2634
|
+
else
|
|
2635
|
+
expect(events.length).to be > 0
|
|
2636
|
+
end
|
|
2109
2637
|
end
|
|
2110
2638
|
|
|
2111
2639
|
it 'does not copy sdam_proc option to new client' do
|
|
2112
|
-
expect(new_client.options[:sdam_proc]).to
|
|
2640
|
+
expect(new_client.options[:sdam_proc]).to be_nil
|
|
2113
2641
|
end
|
|
2114
2642
|
|
|
2115
2643
|
it 'does not notify subscribers set up by sdam_proc' do
|
|
@@ -2117,7 +2645,12 @@ describe Mongo::Client do
|
|
|
2117
2645
|
# Give those some time to be processed.
|
|
2118
2646
|
sleep 2
|
|
2119
2647
|
|
|
2120
|
-
|
|
2648
|
+
if ClusterConfig.instance.topology == :load_balanced
|
|
2649
|
+
# No server monitoring in LB topology
|
|
2650
|
+
expect(subscriber.started_events.length).to eq 0
|
|
2651
|
+
else
|
|
2652
|
+
expect(subscriber.started_events.length).to be > 0
|
|
2653
|
+
end
|
|
2121
2654
|
subscriber.started_events.clear
|
|
2122
2655
|
|
|
2123
2656
|
# If this test takes longer than heartbeat interval,
|
|
@@ -2126,23 +2659,52 @@ describe Mongo::Client do
|
|
|
2126
2659
|
new_client.cluster.next_primary
|
|
2127
2660
|
|
|
2128
2661
|
# Diagnostics
|
|
2662
|
+
# rubocop:disable Style/IfUnlessModifier, Lint/Debugger
|
|
2129
2663
|
unless subscriber.started_events.empty?
|
|
2130
2664
|
p subscriber.started_events
|
|
2131
2665
|
end
|
|
2666
|
+
# rubocop:enable Style/IfUnlessModifier, Lint/Debugger
|
|
2132
2667
|
|
|
2133
2668
|
expect(subscriber.started_events.length).to eq 0
|
|
2134
|
-
new_client.cluster.topology.class.
|
|
2669
|
+
expect(new_client.cluster.topology.class).not_to be Mongo::Cluster::Topology::Unknown
|
|
2670
|
+
end
|
|
2671
|
+
end
|
|
2672
|
+
|
|
2673
|
+
context 'when :server_api is changed' do
|
|
2674
|
+
let(:client) do
|
|
2675
|
+
new_local_client_nmio(SINGLE_CLIENT)
|
|
2676
|
+
end
|
|
2677
|
+
|
|
2678
|
+
let(:new_client) do
|
|
2679
|
+
client.with(server_api: { version: '1' })
|
|
2680
|
+
end
|
|
2681
|
+
|
|
2682
|
+
it 'changes :server_api' do
|
|
2683
|
+
expect(new_client.options[:server_api]).to be == { 'version' => '1' }
|
|
2684
|
+
end
|
|
2685
|
+
end
|
|
2686
|
+
|
|
2687
|
+
context 'when :server_api is cleared' do
|
|
2688
|
+
let(:client) do
|
|
2689
|
+
new_local_client_nmio(SINGLE_CLIENT, server_api: { version: '1' })
|
|
2690
|
+
end
|
|
2691
|
+
|
|
2692
|
+
let(:new_client) do
|
|
2693
|
+
client.with(server_api: nil)
|
|
2694
|
+
end
|
|
2695
|
+
|
|
2696
|
+
it 'clears :server_api' do
|
|
2697
|
+
expect(new_client.options[:server_api]).to be_nil
|
|
2135
2698
|
end
|
|
2136
2699
|
end
|
|
2137
2700
|
end
|
|
2138
2701
|
|
|
2139
2702
|
describe '#dup' do
|
|
2140
|
-
|
|
2141
2703
|
let(:client) do
|
|
2142
2704
|
new_local_client_nmio(
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2705
|
+
SINGLE_CLIENT,
|
|
2706
|
+
read: { mode: :primary },
|
|
2707
|
+
database: SpecConfig.instance.test_db
|
|
2146
2708
|
)
|
|
2147
2709
|
end
|
|
2148
2710
|
|
|
@@ -2155,3 +2717,7 @@ describe Mongo::Client do
|
|
|
2155
2717
|
it_behaves_like 'duplicated client with reused monitoring'
|
|
2156
2718
|
end
|
|
2157
2719
|
end
|
|
2720
|
+
# rubocop:enable RSpec/ExpectInHook, RSpec/MessageSpies, RSpec/ExampleLength
|
|
2721
|
+
# rubocop:enable RSpec/ContextWording, RSpec/RepeatedExampleGroupDescription
|
|
2722
|
+
# rubocop:enable RSpec/ExampleWording, Style/BlockComments, RSpec/AnyInstance
|
|
2723
|
+
# rubocop:enable RSpec/VerifiedDoubles
|