mongo 2.18.2 → 2.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +12 -2
- data/Rakefile +4 -3
- data/bin/mongo_console +2 -0
- data/lib/mongo/active_support.rb +1 -1
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/address/unix.rb +1 -1
- data/lib/mongo/address/validator.rb +1 -1
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/auth/aws/conversation.rb +1 -5
- 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 +172 -37
- data/lib/mongo/auth/aws/request.rb +1 -2
- data/lib/mongo/auth/aws.rb +6 -6
- data/lib/mongo/auth/base.rb +1 -1
- data/lib/mongo/auth/conversation_base.rb +1 -1
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/cr.rb +1 -1
- data/lib/mongo/auth/credential_cache.rb +1 -1
- data/lib/mongo/auth/gssapi/conversation.rb +1 -1
- data/lib/mongo/auth/gssapi.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/ldap.rb +1 -1
- data/lib/mongo/auth/roles.rb +17 -17
- data/lib/mongo/auth/sasl_conversation_base.rb +1 -1
- data/lib/mongo/auth/scram/conversation.rb +1 -1
- data/lib/mongo/auth/scram.rb +1 -1
- data/lib/mongo/auth/scram256/conversation.rb +1 -1
- data/lib/mongo/auth/scram256.rb +1 -1
- data/lib/mongo/auth/scram_conversation_base.rb +1 -1
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +1 -1
- data/lib/mongo/auth/stringprep/tables.rb +1 -1
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -1
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
- data/lib/mongo/auth/stringprep.rb +1 -1
- data/lib/mongo/auth/user/view.rb +1 -1
- data/lib/mongo/auth/user.rb +1 -1
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/auth/x509.rb +1 -1
- data/lib/mongo/auth.rb +1 -1
- data/lib/mongo/background_thread.rb +1 -1
- data/lib/mongo/bson.rb +1 -1
- data/lib/mongo/bulk_write/combineable.rb +1 -1
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/result.rb +1 -1
- data/lib/mongo/bulk_write/result_combiner.rb +1 -1
- data/lib/mongo/bulk_write/transformable.rb +1 -1
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/validatable.rb +1 -1
- data/lib/mongo/bulk_write.rb +1 -1
- data/lib/mongo/caching_cursor.rb +1 -1
- data/lib/mongo/client.rb +27 -4
- data/lib/mongo/client_encryption.rb +102 -1
- data/lib/mongo/cluster/periodic_executor.rb +1 -1
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +2 -6
- data/lib/mongo/cluster/reapers/socket_reaper.rb +2 -2
- data/lib/mongo/cluster/sdam_flow.rb +42 -15
- data/lib/mongo/cluster/topology/base.rb +1 -1
- data/lib/mongo/cluster/topology/load_balanced.rb +1 -1
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/cluster/topology.rb +1 -1
- data/lib/mongo/cluster.rb +29 -12
- data/lib/mongo/cluster_time.rb +1 -1
- data/lib/mongo/collection/helpers.rb +1 -1
- data/lib/mongo/collection/queryable_encryption.rb +83 -43
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
- data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/builder.rb +1 -1
- data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +3 -3
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/immutable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +1 -1
- data/lib/mongo/collection/view/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/readable.rb +11 -12
- data/lib/mongo/collection/view/writable.rb +1 -1
- data/lib/mongo/collection/view.rb +1 -1
- data/lib/mongo/collection.rb +26 -11
- data/lib/mongo/condition_variable.rb +58 -0
- data/lib/mongo/config/options.rb +1 -0
- data/lib/mongo/config/validators/option.rb +1 -0
- data/lib/mongo/config.rb +1 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
- data/lib/mongo/crypt/auto_encrypter.rb +5 -3
- data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
- data/lib/mongo/crypt/binary.rb +1 -1
- data/lib/mongo/crypt/binding.rb +224 -30
- data/lib/mongo/crypt/context.rb +67 -4
- data/lib/mongo/crypt/data_key_context.rb +1 -1
- data/lib/mongo/crypt/encryption_io.rb +2 -2
- data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
- data/lib/mongo/crypt/explicit_encrypter.rb +120 -34
- data/lib/mongo/crypt/explicit_encryption_context.rb +58 -27
- data/lib/mongo/crypt/explicit_encryption_expression_context.rb +30 -0
- data/lib/mongo/crypt/handle.rb +10 -2
- data/lib/mongo/crypt/hooks.rb +1 -1
- 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 +3 -119
- 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 +5 -128
- data/lib/mongo/crypt/kms/credentials.rb +17 -2
- 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 +4 -172
- 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 +3 -100
- 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 +3 -66
- data/lib/mongo/crypt/kms/master_key_document.rb +1 -1
- data/lib/mongo/crypt/kms.rb +7 -1
- data/lib/mongo/crypt/kms_context.rb +1 -1
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +1 -1
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +1 -1
- data/lib/mongo/crypt/status.rb +1 -1
- data/lib/mongo/crypt.rb +13 -1
- data/lib/mongo/cursor/kill_spec.rb +1 -1
- data/lib/mongo/cursor.rb +40 -6
- data/lib/mongo/database/view.rb +41 -4
- data/lib/mongo/database.rb +2 -2
- data/lib/mongo/dbref.rb +1 -1
- data/lib/mongo/distinguishing_semaphore.rb +2 -2
- data/lib/mongo/error/auth_error.rb +1 -1
- data/lib/mongo/error/bad_load_balancer_target.rb +1 -1
- data/lib/mongo/error/bulk_write_error.rb +1 -1
- data/lib/mongo/error/change_stream_resumable.rb +1 -1
- data/lib/mongo/error/client_closed.rb +24 -0
- data/lib/mongo/error/closed_stream.rb +1 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
- data/lib/mongo/error/connection_perished.rb +3 -1
- data/lib/mongo/error/connection_unavailable.rb +27 -0
- data/lib/mongo/error/credential_check_error.rb +1 -1
- data/lib/mongo/error/crypt_error.rb +1 -1
- data/lib/mongo/error/extra_file_chunk.rb +1 -1
- data/lib/mongo/error/failed_string_prep_validation.rb +1 -1
- data/lib/mongo/error/file_not_found.rb +1 -1
- data/lib/mongo/error/handshake_error.rb +1 -1
- data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
- data/lib/mongo/error/internal_driver_error.rb +1 -1
- data/lib/mongo/error/invalid_address.rb +1 -1
- data/lib/mongo/error/invalid_application_name.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
- data/lib/mongo/error/invalid_collection_name.rb +1 -1
- data/lib/mongo/error/invalid_config_option.rb +1 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
- data/lib/mongo/error/invalid_database_name.rb +1 -1
- data/lib/mongo/error/invalid_document.rb +1 -1
- data/lib/mongo/error/invalid_file.rb +1 -1
- data/lib/mongo/error/invalid_file_revision.rb +1 -1
- data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
- data/lib/mongo/error/invalid_nonce.rb +1 -1
- data/lib/mongo/error/invalid_read_concern.rb +1 -1
- data/lib/mongo/error/invalid_read_option.rb +1 -1
- data/lib/mongo/error/invalid_replacement_document.rb +1 -1
- data/lib/mongo/error/invalid_server_auth_host.rb +1 -1
- data/lib/mongo/error/invalid_server_auth_response.rb +1 -1
- data/lib/mongo/error/invalid_server_preference.rb +1 -1
- data/lib/mongo/error/invalid_session.rb +1 -1
- data/lib/mongo/error/invalid_signature.rb +1 -1
- data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
- data/lib/mongo/error/invalid_txt_record.rb +1 -1
- data/lib/mongo/error/invalid_update_document.rb +1 -1
- data/lib/mongo/error/invalid_uri.rb +1 -1
- data/lib/mongo/error/invalid_write_concern.rb +1 -1
- data/lib/mongo/error/kms_error.rb +1 -1
- data/lib/mongo/error/labelable.rb +1 -1
- data/lib/mongo/error/lint_error.rb +1 -1
- data/lib/mongo/error/max_bson_size.rb +1 -1
- data/lib/mongo/error/max_message_size.rb +1 -1
- data/lib/mongo/error/mismatched_domain.rb +1 -1
- data/lib/mongo/error/missing_connection.rb +4 -2
- data/lib/mongo/error/missing_file_chunk.rb +1 -1
- data/lib/mongo/error/missing_password.rb +1 -1
- data/lib/mongo/error/missing_resume_token.rb +1 -1
- data/lib/mongo/error/missing_scram_server_signature.rb +1 -1
- data/lib/mongo/error/missing_service_id.rb +1 -1
- data/lib/mongo/error/mongocryptd_spawn_error.rb +1 -1
- data/lib/mongo/error/multi_index_drop.rb +1 -1
- data/lib/mongo/error/need_primary_server.rb +1 -1
- data/lib/mongo/error/no_server_available.rb +1 -1
- data/lib/mongo/error/no_service_connection_available.rb +1 -1
- data/lib/mongo/error/no_srv_records.rb +1 -1
- data/lib/mongo/error/notable.rb +8 -1
- data/lib/mongo/error/operation_failure.rb +1 -1
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/error/pool_cleared_error.rb +40 -0
- data/lib/mongo/error/pool_closed_error.rb +4 -17
- 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 +1 -1
- data/lib/mongo/error/read_write_retryable.rb +1 -1
- data/lib/mongo/error/sdam_error_detection.rb +1 -1
- data/lib/mongo/error/server_api_conflict.rb +1 -1
- data/lib/mongo/error/server_api_not_supported.rb +1 -1
- data/lib/mongo/error/server_certificate_revoked.rb +1 -1
- data/lib/mongo/error/server_not_usable.rb +36 -0
- data/lib/mongo/error/session_ended.rb +1 -1
- data/lib/mongo/error/session_not_materialized.rb +1 -1
- data/lib/mongo/error/sessions_not_supported.rb +1 -1
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -1
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -1
- data/lib/mongo/error/socket_error.rb +1 -1
- data/lib/mongo/error/socket_timeout_error.rb +1 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
- data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
- data/lib/mongo/error/unexpected_response.rb +1 -1
- data/lib/mongo/error/unknown_payload_type.rb +1 -1
- data/lib/mongo/error/unmet_dependency.rb +1 -1
- data/lib/mongo/error/unsupported_array_filters.rb +1 -1
- data/lib/mongo/error/unsupported_collation.rb +1 -1
- data/lib/mongo/error/unsupported_features.rb +1 -1
- data/lib/mongo/error/unsupported_message_type.rb +1 -1
- data/lib/mongo/error/unsupported_option.rb +1 -1
- data/lib/mongo/error/write_retryable.rb +1 -1
- data/lib/mongo/error.rb +7 -1
- data/lib/mongo/event/base.rb +1 -1
- data/lib/mongo/event/listeners.rb +1 -1
- data/lib/mongo/event/publisher.rb +1 -1
- data/lib/mongo/event/subscriber.rb +1 -1
- data/lib/mongo/event.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +3 -2
- data/lib/mongo/grid/file/info.rb +3 -2
- data/lib/mongo/grid/file.rb +1 -1
- data/lib/mongo/grid/fs_bucket.rb +1 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/grid/stream/write.rb +1 -1
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid.rb +1 -1
- data/lib/mongo/id.rb +1 -1
- data/lib/mongo/index/view.rb +1 -1
- data/lib/mongo/index.rb +1 -1
- data/lib/mongo/lint.rb +1 -1
- data/lib/mongo/loggable.rb +3 -3
- data/lib/mongo/logger.rb +1 -1
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/command_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +9 -2
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
- data/lib/mongo/monitoring/event/cmap.rb +2 -1
- data/lib/mongo/monitoring/event/command_failed.rb +1 -1
- data/lib/mongo/monitoring/event/command_started.rb +1 -1
- data/lib/mongo/monitoring/event/command_succeeded.rb +1 -1
- data/lib/mongo/monitoring/event/secure.rb +1 -1
- data/lib/mongo/monitoring/event/server_closed.rb +1 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
- data/lib/mongo/monitoring/event/server_opening.rb +1 -1
- data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
- data/lib/mongo/monitoring/event.rb +1 -1
- data/lib/mongo/monitoring/publishable.rb +1 -1
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring.rb +1 -1
- data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
- data/lib/mongo/operation/aggregate/result.rb +1 -1
- data/lib/mongo/operation/aggregate.rb +1 -1
- data/lib/mongo/operation/collections_info/result.rb +1 -1
- data/lib/mongo/operation/collections_info.rb +1 -1
- data/lib/mongo/operation/command/op_msg.rb +1 -1
- data/lib/mongo/operation/command.rb +1 -1
- data/lib/mongo/operation/context.rb +1 -1
- data/lib/mongo/operation/count/op_msg.rb +1 -1
- data/lib/mongo/operation/count.rb +1 -1
- data/lib/mongo/operation/create/op_msg.rb +1 -1
- data/lib/mongo/operation/create.rb +1 -1
- data/lib/mongo/operation/create_index/op_msg.rb +1 -1
- data/lib/mongo/operation/create_index.rb +1 -1
- data/lib/mongo/operation/create_user/op_msg.rb +1 -1
- data/lib/mongo/operation/create_user.rb +1 -1
- data/lib/mongo/operation/delete/bulk_result.rb +1 -1
- data/lib/mongo/operation/delete/op_msg.rb +1 -1
- data/lib/mongo/operation/delete/result.rb +1 -1
- data/lib/mongo/operation/delete.rb +1 -1
- data/lib/mongo/operation/distinct/op_msg.rb +1 -1
- data/lib/mongo/operation/distinct.rb +1 -1
- data/lib/mongo/operation/drop/op_msg.rb +1 -1
- data/lib/mongo/operation/drop.rb +1 -1
- data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
- data/lib/mongo/operation/drop_database.rb +1 -1
- data/lib/mongo/operation/drop_index/op_msg.rb +1 -1
- data/lib/mongo/operation/drop_index.rb +1 -1
- data/lib/mongo/operation/explain/op_msg.rb +1 -1
- data/lib/mongo/operation/explain/result.rb +1 -1
- data/lib/mongo/operation/explain.rb +1 -1
- data/lib/mongo/operation/find/builder/command.rb +1 -1
- data/lib/mongo/operation/find/builder/flags.rb +1 -1
- data/lib/mongo/operation/find/builder/modifiers.rb +1 -1
- data/lib/mongo/operation/find/builder.rb +1 -1
- data/lib/mongo/operation/find/op_msg.rb +1 -1
- data/lib/mongo/operation/find/result.rb +1 -1
- data/lib/mongo/operation/find.rb +1 -1
- data/lib/mongo/operation/get_more/command_builder.rb +1 -1
- data/lib/mongo/operation/get_more/op_msg.rb +1 -1
- data/lib/mongo/operation/get_more/result.rb +1 -1
- data/lib/mongo/operation/get_more.rb +1 -1
- data/lib/mongo/operation/indexes/op_msg.rb +1 -1
- data/lib/mongo/operation/indexes/result.rb +1 -1
- data/lib/mongo/operation/indexes.rb +1 -1
- data/lib/mongo/operation/insert/bulk_result.rb +1 -1
- data/lib/mongo/operation/insert/op_msg.rb +1 -1
- data/lib/mongo/operation/insert/result.rb +1 -1
- data/lib/mongo/operation/insert.rb +1 -1
- data/lib/mongo/operation/kill_cursors/command_builder.rb +1 -1
- data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
- data/lib/mongo/operation/kill_cursors.rb +1 -1
- data/lib/mongo/operation/list_collections/op_msg.rb +1 -1
- data/lib/mongo/operation/list_collections/result.rb +1 -1
- data/lib/mongo/operation/list_collections.rb +1 -1
- data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
- data/lib/mongo/operation/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/map_reduce.rb +1 -1
- data/lib/mongo/operation/op_msg_base.rb +1 -1
- data/lib/mongo/operation/parallel_scan/op_msg.rb +1 -1
- data/lib/mongo/operation/parallel_scan/result.rb +1 -1
- data/lib/mongo/operation/parallel_scan.rb +1 -1
- data/lib/mongo/operation/remove_user/op_msg.rb +1 -1
- data/lib/mongo/operation/remove_user.rb +1 -1
- data/lib/mongo/operation/result.rb +1 -1
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -1
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -1
- data/lib/mongo/operation/shared/executable.rb +1 -1
- data/lib/mongo/operation/shared/executable_no_validate.rb +1 -1
- data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
- data/lib/mongo/operation/shared/idable.rb +1 -1
- data/lib/mongo/operation/shared/limited.rb +1 -1
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
- data/lib/mongo/operation/shared/op_msg_executable.rb +1 -1
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
- data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
- data/lib/mongo/operation/shared/read_preference_supported.rb +1 -1
- data/lib/mongo/operation/shared/response_handling.rb +1 -1
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
- data/lib/mongo/operation/shared/specifiable.rb +1 -1
- data/lib/mongo/operation/shared/validatable.rb +1 -1
- data/lib/mongo/operation/shared/write.rb +1 -1
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
- data/lib/mongo/operation/update/bulk_result.rb +1 -1
- data/lib/mongo/operation/update/op_msg.rb +1 -1
- data/lib/mongo/operation/update/result.rb +1 -1
- data/lib/mongo/operation/update.rb +1 -1
- data/lib/mongo/operation/update_user/op_msg.rb +1 -1
- data/lib/mongo/operation/update_user.rb +1 -1
- data/lib/mongo/operation/users_info/op_msg.rb +1 -1
- data/lib/mongo/operation/users_info/result.rb +1 -1
- data/lib/mongo/operation/users_info.rb +1 -1
- data/lib/mongo/operation/write_command/op_msg.rb +1 -1
- data/lib/mongo/operation/write_command.rb +1 -1
- data/lib/mongo/operation.rb +1 -1
- data/lib/mongo/options/mapper.rb +1 -1
- data/lib/mongo/options/redacted.rb +1 -1
- data/lib/mongo/options.rb +1 -1
- data/lib/mongo/protocol/bit_vector.rb +4 -2
- data/lib/mongo/protocol/caching_hash.rb +4 -21
- data/lib/mongo/protocol/compressed.rb +1 -1
- data/lib/mongo/protocol/get_more.rb +1 -1
- data/lib/mongo/protocol/kill_cursors.rb +1 -1
- data/lib/mongo/protocol/message.rb +5 -9
- data/lib/mongo/protocol/msg.rb +2 -1
- data/lib/mongo/protocol/query.rb +1 -1
- data/lib/mongo/protocol/registry.rb +1 -1
- data/lib/mongo/protocol/reply.rb +1 -1
- data/lib/mongo/protocol/serializers.rb +25 -18
- data/lib/mongo/protocol.rb +1 -1
- data/lib/mongo/query_cache.rb +1 -1
- 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 +31 -502
- data/lib/mongo/semaphore.rb +2 -2
- 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 +75 -108
- data/lib/mongo/server/connection.rb +61 -20
- data/lib/mongo/server/connection_base.rb +1 -1
- data/lib/mongo/server/connection_common.rb +1 -1
- data/lib/mongo/server/connection_pool/generation_manager.rb +56 -12
- data/lib/mongo/server/connection_pool/populator.rb +33 -31
- data/lib/mongo/server/connection_pool.rb +670 -263
- data/lib/mongo/server/description/features.rb +2 -2
- data/lib/mongo/server/description/load_balancer.rb +1 -1
- data/lib/mongo/server/description.rb +7 -6
- data/lib/mongo/server/monitor/app_metadata.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +1 -1
- data/lib/mongo/server/monitor.rb +11 -7
- data/lib/mongo/server/pending_connection.rb +1 -1
- data/lib/mongo/server/push_monitor/connection.rb +1 -1
- data/lib/mongo/server/push_monitor.rb +1 -1
- data/lib/mongo/server/round_trip_time_averager.rb +1 -1
- data/lib/mongo/server.rb +96 -30
- data/lib/mongo/server_selector/base.rb +24 -3
- data/lib/mongo/server_selector/nearest.rb +1 -1
- data/lib/mongo/server_selector/primary.rb +1 -1
- data/lib/mongo/server_selector/primary_preferred.rb +1 -1
- data/lib/mongo/server_selector/secondary.rb +1 -1
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
- data/lib/mongo/server_selector.rb +1 -1
- data/lib/mongo/session/server_session.rb +1 -1
- data/lib/mongo/session/session_pool.rb +1 -1
- data/lib/mongo/session.rb +1 -1
- data/lib/mongo/socket/ocsp_cache.rb +1 -1
- data/lib/mongo/socket/ocsp_verifier.rb +1 -1
- data/lib/mongo/socket/ssl.rb +1 -1
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/socket/unix.rb +1 -1
- data/lib/mongo/socket.rb +29 -2
- data/lib/mongo/srv/monitor.rb +1 -3
- data/lib/mongo/srv/resolver.rb +1 -1
- data/lib/mongo/srv/result.rb +1 -1
- data/lib/mongo/srv.rb +1 -1
- data/lib/mongo/timeout.rb +2 -2
- data/lib/mongo/topology_version.rb +1 -1
- data/lib/mongo/uri/options_mapper.rb +321 -81
- data/lib/mongo/uri/srv_protocol.rb +1 -1
- data/lib/mongo/uri.rb +41 -13
- data/lib/mongo/utils.rb +1 -1
- data/lib/mongo/version.rb +2 -2
- data/lib/mongo/write_concern/acknowledged.rb +1 -1
- data/lib/mongo/write_concern/base.rb +1 -1
- data/lib/mongo/write_concern/unacknowledged.rb +1 -1
- data/lib/mongo/write_concern.rb +1 -1
- data/lib/mongo.rb +2 -1
- data/mongo.gemspec +5 -2
- data/spec/atlas/atlas_connectivity_spec.rb +1 -1
- data/spec/atlas/operations_spec.rb +3 -8
- data/spec/integration/auth_spec.rb +1 -1
- data/spec/integration/awaited_ismaster_spec.rb +1 -1
- data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
- data/spec/integration/aws_auth_request_spec.rb +2 -2
- data/spec/integration/aws_credentials_retriever_spec.rb +32 -2
- data/spec/integration/aws_lambda_examples_spec.rb +1 -1
- data/spec/integration/bson_symbol_spec.rb +1 -1
- data/spec/integration/bulk_insert_spec.rb +1 -1
- data/spec/integration/bulk_write_error_message_spec.rb +1 -0
- data/spec/integration/bulk_write_spec.rb +1 -1
- data/spec/integration/change_stream_examples_spec.rb +1 -1
- data/spec/integration/change_stream_spec.rb +6 -1
- data/spec/integration/check_clean_slate_spec.rb +1 -1
- data/spec/integration/client_authentication_options_spec.rb +1 -1
- data/spec/integration/client_connectivity_spec.rb +1 -1
- data/spec/integration/client_construction_aws_auth_spec.rb +12 -3
- data/spec/integration/client_construction_spec.rb +23 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +1 -1
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +1 -1
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +10 -5
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +38 -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 +1 -1
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +1 -1
- data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
- data/spec/integration/client_side_encryption/corpus_spec.rb +1 -1
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +3 -3
- data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
- data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +59 -58
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +1 -1
- data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +36 -33
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +1 -1
- data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +3 -3
- data/spec/integration/client_side_encryption/kms_tls_spec.rb +1 -1
- 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 +14 -11
- 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 +20 -16
- data/spec/integration/client_side_encryption/views_spec.rb +1 -1
- data/spec/integration/client_spec.rb +8 -3
- data/spec/integration/client_update_spec.rb +7 -3
- data/spec/integration/collection_indexes_prose_spec.rb +1 -1
- data/spec/integration/command_monitoring_spec.rb +1 -1
- data/spec/integration/command_spec.rb +1 -1
- data/spec/integration/connect_single_rs_name_spec.rb +1 -1
- data/spec/integration/connection/faas_env_spec.rb +62 -0
- data/spec/integration/connection_pool_populator_spec.rb +27 -7
- data/spec/integration/connection_spec.rb +1 -1
- data/spec/integration/crud_spec.rb +1 -1
- data/spec/integration/cursor_pinning_spec.rb +6 -2
- data/spec/integration/cursor_reaping_spec.rb +1 -1
- data/spec/integration/docs_examples_spec.rb +1 -1
- data/spec/integration/error_detection_spec.rb +1 -1
- data/spec/integration/fork_reconnect_spec.rb +2 -2
- data/spec/integration/get_more_spec.rb +1 -1
- data/spec/integration/grid_fs_bucket_spec.rb +1 -1
- data/spec/integration/heartbeat_events_spec.rb +1 -1
- data/spec/integration/map_reduce_spec.rb +5 -1
- data/spec/integration/mmapv1_spec.rb +1 -1
- data/spec/integration/mongos_pinning_spec.rb +1 -1
- data/spec/integration/ocsp_connectivity_spec.rb +1 -1
- data/spec/integration/ocsp_verifier_cache_spec.rb +1 -1
- data/spec/integration/ocsp_verifier_spec.rb +2 -2
- data/spec/integration/operation_failure_code_spec.rb +1 -1
- data/spec/integration/operation_failure_message_spec.rb +1 -0
- data/spec/integration/query_cache_spec.rb +90 -3
- data/spec/integration/query_cache_transactions_spec.rb +1 -1
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/read_preference_spec.rb +1 -1
- data/spec/integration/reconnect_spec.rb +4 -1
- data/spec/integration/retryable_errors_spec.rb +1 -1
- data/spec/integration/retryable_reads_errors_spec.rb +110 -0
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
- data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +1 -1
- data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/supports_retries.rb +1 -1
- data/spec/integration/retryable_writes_errors_spec.rb +160 -2
- data/spec/integration/sdam_error_handling_spec.rb +65 -4
- data/spec/integration/sdam_events_spec.rb +1 -1
- data/spec/integration/sdam_prose_spec.rb +3 -3
- data/spec/integration/secondary_reads_spec.rb +1 -0
- data/spec/integration/server_description_spec.rb +1 -1
- data/spec/integration/server_monitor_spec.rb +1 -1
- data/spec/integration/server_selection_spec.rb +1 -1
- data/spec/integration/server_selector_spec.rb +5 -3
- data/spec/integration/server_spec.rb +23 -26
- data/spec/integration/shell_examples_spec.rb +1 -1
- data/spec/integration/size_limit_spec.rb +1 -1
- data/spec/integration/snappy_compression_spec.rb +1 -1
- data/spec/integration/snapshot_query_examples_spec.rb +9 -7
- data/spec/integration/srv_monitoring_spec.rb +2 -1
- data/spec/integration/srv_spec.rb +3 -3
- data/spec/integration/ssl_uri_options_spec.rb +1 -1
- data/spec/integration/step_down_spec.rb +5 -3
- data/spec/integration/time_zone_querying_spec.rb +1 -1
- data/spec/integration/transaction_pinning_spec.rb +18 -4
- data/spec/integration/transactions_api_examples_spec.rb +1 -1
- data/spec/integration/transactions_examples_spec.rb +1 -1
- data/spec/integration/truncated_utf8_spec.rb +1 -1
- data/spec/integration/versioned_api_examples_spec.rb +2 -2
- data/spec/integration/x509_auth_spec.rb +1 -1
- data/spec/integration/zlib_compression_spec.rb +1 -1
- data/spec/integration/zstd_compression_spec.rb +1 -1
- data/spec/kerberos/kerberos_spec.rb +1 -1
- data/spec/lite_spec_helper.rb +10 -1
- data/spec/mongo/address/ipv4_spec.rb +1 -1
- data/spec/mongo/address/ipv6_spec.rb +1 -1
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address/validator_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +8 -2
- 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 +1 -1
- data/spec/mongo/auth/aws/request_spec.rb +1 -1
- data/spec/mongo/auth/cr_spec.rb +2 -22
- data/spec/mongo/auth/gssapi/conversation_spec.rb +1 -1
- data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
- data/spec/mongo/auth/ldap_spec.rb +1 -1
- data/spec/mongo/auth/scram/conversation_spec.rb +1 -1
- data/spec/mongo/auth/scram256/conversation_spec.rb +1 -1
- data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +1 -1
- data/spec/mongo/auth/stringprep_spec.rb +1 -1
- data/spec/mongo/auth/user/view_spec.rb +96 -1
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
- data/spec/mongo/auth/x509_spec.rb +1 -1
- data/spec/mongo/auth_spec.rb +1 -1
- data/spec/mongo/bson_spec.rb +1 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +1 -1
- data/spec/mongo/bulk_write/result_spec.rb +1 -1
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +1 -1
- data/spec/mongo/bulk_write_spec.rb +1 -1
- data/spec/mongo/caching_cursor_spec.rb +1 -1
- data/spec/mongo/client_construction_spec.rb +572 -694
- data/spec/mongo/client_encryption_spec.rb +1 -1
- data/spec/mongo/client_spec.rb +172 -231
- data/spec/mongo/cluster/cursor_reaper_spec.rb +1 -1
- data/spec/mongo/cluster/periodic_executor_spec.rb +1 -1
- data/spec/mongo/cluster/socket_reaper_spec.rb +1 -1
- data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
- data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
- data/spec/mongo/cluster/topology/single_spec.rb +1 -1
- data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -1
- data/spec/mongo/cluster_spec.rb +156 -154
- data/spec/mongo/cluster_time_spec.rb +1 -1
- data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
- data/spec/mongo/collection/view/builder/find_command_spec.rb +1 -1
- data/spec/mongo/collection/view/builder/op_query_spec.rb +1 -1
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
- data/spec/mongo/collection/view/change_stream_spec.rb +1 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/immutable_spec.rb +1 -1
- data/spec/mongo/collection/view/iterable_spec.rb +1 -1
- data/spec/mongo/collection/view/map_reduce_spec.rb +11 -1
- data/spec/mongo/collection/view/readable_spec.rb +139 -1
- data/spec/mongo/collection/view/writable_spec.rb +1 -1
- data/spec/mongo/collection/view_spec.rb +1 -1
- data/spec/mongo/collection_crud_spec.rb +1 -1
- data/spec/mongo/collection_ddl_spec.rb +112 -66
- data/spec/mongo/collection_spec.rb +3 -3
- data/spec/mongo/condition_variable_spec.rb +104 -0
- data/spec/mongo/config/options_spec.rb +1 -0
- data/spec/mongo/config_spec.rb +2 -1
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/auto_encrypter_spec.rb +8 -1
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/binary_spec.rb +1 -1
- data/spec/mongo/crypt/binding/binary_spec.rb +1 -1
- data/spec/mongo/crypt/binding/context_spec.rb +1 -1
- data/spec/mongo/crypt/binding/helpers_spec.rb +1 -1
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +1 -1
- data/spec/mongo/crypt/binding/status_spec.rb +1 -1
- data/spec/mongo/crypt/binding/version_spec.rb +19 -5
- data/spec/mongo/crypt/binding_unloaded_spec.rb +1 -1
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/encryption_io_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +3 -3
- data/spec/mongo/crypt/handle_spec.rb +19 -4
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +1 -1
- data/spec/mongo/crypt/hooks_spec.rb +2 -2
- data/spec/mongo/crypt/kms/azure/credentials_retriever_spec.rb +86 -0
- data/spec/mongo/crypt/kms/credentials_spec.rb +17 -1
- data/spec/mongo/crypt/kms_spec.rb +1 -1
- data/spec/mongo/crypt/status_spec.rb +1 -1
- data/spec/mongo/crypt_spec.rb +21 -0
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +1 -1
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +1 -1
- data/spec/mongo/cursor_spec.rb +58 -11
- data/spec/mongo/database_spec.rb +1 -1
- data/spec/mongo/distinguishing_semaphore_spec.rb +7 -7
- data/spec/mongo/error/bulk_write_error_spec.rb +1 -1
- data/spec/mongo/error/crypt_error_spec.rb +1 -1
- data/spec/mongo/error/max_bson_size_spec.rb +1 -1
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/error/notable_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_spec.rb +1 -1
- data/spec/mongo/error/parser_spec.rb +1 -1
- data/spec/mongo/error/unsupported_option_spec.rb +1 -1
- data/spec/mongo/event/publisher_spec.rb +1 -1
- data/spec/mongo/event/subscriber_spec.rb +1 -1
- data/spec/mongo/grid/file/chunk_spec.rb +1 -1
- data/spec/mongo/grid/file/info_spec.rb +1 -1
- data/spec/mongo/grid/file_spec.rb +1 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
- data/spec/mongo/grid/stream/read_spec.rb +1 -1
- data/spec/mongo/grid/stream/write_spec.rb +1 -1
- data/spec/mongo/grid/stream_spec.rb +1 -1
- data/spec/mongo/id_spec.rb +2 -2
- data/spec/mongo/index/view_spec.rb +4 -4
- data/spec/mongo/lint_spec.rb +2 -2
- data/spec/mongo/logger_spec.rb +1 -1
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +1 -1
- data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +2 -2
- data/spec/mongo/monitoring/event/command_failed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/command_started_spec.rb +1 -1
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +1 -1
- data/spec/mongo/monitoring/event/secure_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
- data/spec/mongo/monitoring_spec.rb +1 -1
- data/spec/mongo/operation/aggregate/result_spec.rb +1 -1
- data/spec/mongo/operation/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/command_spec.rb +1 -1
- data/spec/mongo/operation/create/op_msg_spec.rb +1 -1
- data/spec/mongo/operation/create_index_spec.rb +1 -1
- data/spec/mongo/operation/create_user_spec.rb +1 -1
- data/spec/mongo/operation/delete/bulk_spec.rb +1 -1
- data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
- data/spec/mongo/operation/delete_spec.rb +1 -1
- data/spec/mongo/operation/drop_index_spec.rb +1 -1
- data/spec/mongo/operation/find/builder/flags_spec.rb +1 -1
- data/spec/mongo/operation/find/builder/modifiers_spec.rb +1 -1
- data/spec/mongo/operation/indexes_spec.rb +1 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
- data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
- data/spec/mongo/operation/insert_spec.rb +1 -1
- data/spec/mongo/operation/limited_spec.rb +1 -1
- data/spec/mongo/operation/map_reduce_spec.rb +1 -1
- data/spec/mongo/operation/read_preference_legacy_spec.rb +1 -1
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/remove_user_spec.rb +1 -1
- data/spec/mongo/operation/result_spec.rb +1 -1
- data/spec/mongo/operation/specifiable_spec.rb +1 -1
- data/spec/mongo/operation/update/bulk_spec.rb +1 -1
- data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
- data/spec/mongo/operation/update_spec.rb +1 -1
- data/spec/mongo/operation/update_user_spec.rb +1 -1
- data/spec/mongo/options/redacted_spec.rb +2 -2
- data/spec/mongo/protocol/caching_hash_spec.rb +1 -46
- data/spec/mongo/protocol/compressed_spec.rb +1 -1
- data/spec/mongo/protocol/get_more_spec.rb +1 -1
- data/spec/mongo/protocol/kill_cursors_spec.rb +1 -1
- data/spec/mongo/protocol/msg_spec.rb +4 -5
- data/spec/mongo/protocol/query_spec.rb +1 -1
- data/spec/mongo/protocol/registry_spec.rb +1 -1
- data/spec/mongo/protocol/reply_spec.rb +1 -1
- data/spec/mongo/query_cache_middleware_spec.rb +1 -1
- data/spec/mongo/query_cache_spec.rb +1 -1
- data/spec/mongo/retryable_spec.rb +5 -3
- data/spec/mongo/semaphore_spec.rb +7 -7
- 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 +44 -66
- data/spec/mongo/server/connection_auth_spec.rb +1 -1
- data/spec/mongo/server/connection_common_spec.rb +1 -1
- data/spec/mongo/server/connection_pool/populator_spec.rb +17 -3
- data/spec/mongo/server/connection_pool_spec.rb +447 -10
- data/spec/mongo/server/connection_spec.rb +17 -4
- data/spec/mongo/server/description/features_spec.rb +1 -1
- data/spec/mongo/server/description_query_methods_spec.rb +1 -1
- data/spec/mongo/server/description_spec.rb +1 -1
- data/spec/mongo/server/monitor/app_metadata_spec.rb +1 -1
- data/spec/mongo/server/monitor/connection_spec.rb +3 -3
- data/spec/mongo/server/monitor_spec.rb +6 -5
- data/spec/mongo/server/push_monitor_spec.rb +1 -1
- data/spec/mongo/server/round_trip_time_averager_spec.rb +1 -1
- data/spec/mongo/server_selector/nearest_spec.rb +1 -1
- data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -1
- data/spec/mongo/server_selector/primary_spec.rb +1 -1
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -1
- data/spec/mongo/server_selector/secondary_spec.rb +1 -1
- data/spec/mongo/server_selector_spec.rb +1 -1
- data/spec/mongo/server_spec.rb +32 -5
- data/spec/mongo/session/server_session_spec.rb +1 -1
- data/spec/mongo/session/session_pool_spec.rb +1 -1
- data/spec/mongo/session_spec.rb +1 -1
- data/spec/mongo/session_transaction_spec.rb +2 -2
- data/spec/mongo/socket/ssl_spec.rb +3 -9
- data/spec/mongo/socket/tcp_spec.rb +1 -1
- data/spec/mongo/socket/unix_spec.rb +1 -1
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/srv/monitor_spec.rb +1 -1
- data/spec/mongo/srv/result_spec.rb +1 -1
- data/spec/mongo/timeout_spec.rb +1 -1
- data/spec/mongo/tls_context_hooks_spec.rb +1 -1
- data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +150 -2
- data/spec/mongo/uri_option_parsing_spec.rb +1 -1
- data/spec/mongo/uri_spec.rb +143 -2
- data/spec/mongo/utils_spec.rb +1 -1
- data/spec/mongo/write_concern/acknowledged_spec.rb +1 -1
- data/spec/mongo/write_concern/unacknowledged_spec.rb +1 -1
- data/spec/mongo/write_concern_spec.rb +1 -1
- data/spec/runners/auth.rb +1 -1
- data/spec/runners/change_streams/outcome.rb +1 -1
- data/spec/runners/change_streams/spec.rb +1 -1
- data/spec/runners/change_streams/test.rb +1 -1
- data/spec/runners/cmap/verifier.rb +2 -2
- data/spec/runners/cmap.rb +188 -45
- data/spec/runners/command_monitoring.rb +1 -1
- data/spec/runners/connection_string.rb +1 -1
- data/spec/runners/crud/context.rb +1 -1
- data/spec/runners/crud/operation.rb +2 -2
- data/spec/runners/crud/outcome.rb +1 -1
- data/spec/runners/crud/requirement.rb +3 -3
- data/spec/runners/crud/spec.rb +2 -2
- data/spec/runners/crud/test.rb +1 -1
- data/spec/runners/crud/test_base.rb +2 -2
- data/spec/runners/crud/verifier.rb +3 -3
- data/spec/runners/crud.rb +1 -1
- data/spec/runners/gridfs.rb +1 -1
- data/spec/runners/read_write_concern_document.rb +1 -1
- data/spec/runners/sdam/verifier.rb +1 -1
- data/spec/runners/sdam.rb +1 -1
- data/spec/runners/server_selection.rb +1 -1
- data/spec/runners/server_selection_rtt.rb +1 -1
- data/spec/runners/transactions/operation.rb +15 -9
- data/spec/runners/transactions/spec.rb +1 -1
- data/spec/runners/transactions/test.rb +44 -3
- data/spec/runners/transactions.rb +1 -1
- data/spec/runners/unified/assertions.rb +94 -77
- data/spec/runners/unified/change_stream_operations.rb +14 -3
- data/spec/runners/unified/client_side_encryption_operations.rb +1 -1
- data/spec/runners/unified/crud_operations.rb +11 -2
- data/spec/runners/unified/ddl_operations.rb +80 -4
- data/spec/runners/unified/entity_map.rb +1 -1
- data/spec/runners/unified/error.rb +1 -1
- data/spec/runners/unified/event_subscriber.rb +9 -3
- data/spec/runners/unified/exceptions.rb +1 -1
- data/spec/runners/unified/grid_fs_operations.rb +1 -1
- data/spec/runners/unified/support_operations.rb +66 -2
- data/spec/runners/unified/test.rb +86 -12
- data/spec/runners/unified/test_group.rb +1 -1
- data/spec/runners/unified/thread_operations.rb +73 -0
- data/spec/runners/unified.rb +9 -6
- data/spec/shared/lib/mrss/docker_runner.rb +4 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +24 -19
- data/spec/shared/shlib/server.sh +32 -8
- data/spec/shared/shlib/set_env.sh +4 -4
- data/spec/solo/clean_exit_spec.rb +4 -11
- data/spec/spec_helper.rb +1 -1
- data/spec/spec_tests/auth_spec.rb +1 -1
- data/spec/spec_tests/change_streams_unified_spec.rb +2 -1
- data/spec/spec_tests/client_side_encryption_spec.rb +25 -2
- data/spec/spec_tests/client_side_encryption_unified_spec.rb +12 -2
- data/spec/spec_tests/cmap_spec.rb +29 -15
- data/spec/spec_tests/collection_management_spec.rb +1 -1
- data/spec/spec_tests/command_monitoring_unified_spec.rb +1 -1
- data/spec/spec_tests/connection_string_spec.rb +1 -1
- data/spec/spec_tests/crud_spec.rb +1 -1
- data/spec/spec_tests/crud_unified_spec.rb +1 -1
- 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 +2 -6
- data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -3
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -3
- data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +15 -6
- data/spec/spec_tests/data/client_side_encryption/awsTemporary.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/{fle2-BypassQueryAnalysis.yml → fle2v2-BypassQueryAnalysis.yml} +18 -30
- data/spec/spec_tests/data/client_side_encryption/{fle2-Compact.yml → fle2v2-Compact.yml} +5 -3
- data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection-OldServer.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/{fle2-CreateCollection.yml → fle2v2-CreateCollection.yml} +212 -538
- data/spec/spec_tests/data/client_side_encryption/{fle2-DecryptExistingData.yml → fle2v2-DecryptExistingData.yml} +4 -2
- data/spec/spec_tests/data/client_side_encryption/{fle2-Delete.yml → fle2v2-Delete.yml} +17 -24
- data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFields-vs-EncryptedFieldsMap.yml → fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml} +5 -6
- data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFields-vs-jsonSchema.yml → fle2v2-EncryptedFields-vs-jsonSchema.yml} +18 -6
- data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFieldsMap-defaults.yml → fle2v2-EncryptedFieldsMap-defaults.yml} +6 -5
- data/spec/spec_tests/data/client_side_encryption/{fle2-FindOneAndUpdate.yml → fle2v2-FindOneAndUpdate.yml} +31 -44
- data/spec/spec_tests/data/client_side_encryption/{fle2-InsertFind-Indexed.yml → fle2v2-InsertFind-Indexed.yml} +16 -6
- data/spec/spec_tests/data/client_side_encryption/{fle2-InsertFind-Unindexed.yml → fle2v2-InsertFind-Unindexed.yml} +10 -4
- data/spec/spec_tests/data/client_side_encryption/{fle2-MissingKey.yml → fle2v2-MissingKey.yml} +5 -3
- data/spec/spec_tests/data/client_side_encryption/{fle2-NoEncryption.yml → fle2v2-NoEncryption.yml} +4 -2
- 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/{fle2-Update.yml → fle2v2-Update.yml} +33 -44
- data/spec/spec_tests/data/client_side_encryption/{fle2-validatorAndPartialFieldExpression.yml → fle2v2-validatorAndPartialFieldExpression.yml} +10 -9
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +1 -1
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +1 -1
- 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 +2 -0
- 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 +66 -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 +9 -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/modifyCollection-errorResponse.yml +59 -0
- data/spec/spec_tests/data/collection_management/timeseries-collection.yml +35 -0
- data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +8 -0
- data/spec/spec_tests/data/command_monitoring_unified/writeConcernError.yml +80 -0
- data/spec/spec_tests/data/crud_unified/aggregate-merge-errorResponse.yml +42 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-errorResponse.yml +50 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-errorResponse.yml +46 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +44 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-errorResponse.yml +69 -0
- data/spec/spec_tests/data/crud_unified/insertOne-errorResponse.yml +46 -0
- data/spec/spec_tests/data/crud_unified/updateOne-errorResponse.yml +47 -0
- data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1266 -53
- data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +706 -58
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-noWritesPerformedError.yml +54 -0
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +1 -1
- data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
- 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 +20 -18
- 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 +1 -1
- 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 +9 -10
- 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 +23 -21
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +38 -39
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +38 -39
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.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 +6 -5
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +2 -2
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +5 -4
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +1 -1
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +4 -3
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +4 -3
- data/spec/spec_tests/data/sessions_unified/implicit-sessions-default-causal-consistency.yml +119 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +1 -1
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +1 -1
- data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +1 -1
- 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-pass/assertNumberConnectionsCheckedOut.yml +17 -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/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 +18 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +18 -12
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +3 -3
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +2 -2
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +1 -1
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +1 -1
- data/spec/spec_tests/data/versioned_api/transaction-handling.yml +4 -4
- data/spec/spec_tests/gridfs_spec.rb +1 -1
- data/spec/spec_tests/gridfs_unified_spec.rb +1 -1
- data/spec/spec_tests/load_balancers_spec.rb +1 -1
- data/spec/spec_tests/max_staleness_spec.rb +1 -1
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
- data/spec/spec_tests/read_write_concern_document_spec.rb +1 -1
- data/spec/spec_tests/read_write_concern_operaton_spec.rb +1 -1
- data/spec/spec_tests/retryable_reads_spec.rb +3 -1
- data/spec/spec_tests/retryable_reads_unified_spec.rb +1 -1
- data/spec/spec_tests/retryable_writes_spec.rb +1 -1
- data/spec/spec_tests/retryable_writes_unified_spec.rb +1 -1
- data/spec/spec_tests/sdam_monitoring_spec.rb +1 -1
- data/spec/spec_tests/sdam_spec.rb +5 -1
- data/spec/spec_tests/sdam_unified_spec.rb +13 -0
- data/spec/spec_tests/seed_list_discovery_spec.rb +1 -1
- data/spec/spec_tests/server_selection_rtt_spec.rb +1 -1
- data/spec/spec_tests/server_selection_spec.rb +1 -1
- data/spec/spec_tests/sessions_unified_spec.rb +1 -1
- data/spec/spec_tests/transactions_api_spec.rb +1 -1
- data/spec/spec_tests/transactions_spec.rb +1 -1
- data/spec/spec_tests/transactions_unified_spec.rb +1 -1
- data/spec/spec_tests/unified_spec.rb +1 -6
- data/spec/spec_tests/uri_options_spec.rb +1 -1
- data/spec/spec_tests/versioned_api_spec.rb +1 -1
- data/spec/stress/cleanup_spec.rb +1 -1
- data/spec/stress/connection_pool_stress_spec.rb +1 -62
- data/spec/stress/connection_pool_timing_spec.rb +9 -34
- data/spec/stress/fork_reconnect_stress_spec.rb +7 -8
- data/spec/stress/push_monitor_close_spec.rb +1 -1
- data/spec/support/authorization.rb +1 -1
- data/spec/support/aws_utils/base.rb +1 -1
- data/spec/support/aws_utils/inspector.rb +1 -1
- data/spec/support/aws_utils/orchestrator.rb +20 -8
- data/spec/support/aws_utils/provisioner.rb +1 -1
- data/spec/support/aws_utils.rb +4 -3
- data/spec/support/background_thread_registry.rb +1 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +67 -67
- data/spec/support/certificates/atlas-ocsp.crt +103 -103
- data/spec/support/certificates/retrieve-atlas-cert +2 -0
- data/spec/support/client_registry.rb +6 -2
- data/spec/support/client_registry_macros.rb +1 -1
- data/spec/support/cluster_tools.rb +13 -8
- data/spec/support/common_shortcuts.rb +30 -5
- data/spec/support/constraints.rb +15 -1
- data/spec/support/crypt/{encryptedFields.json → encrypted_fields/encryptedFields.json} +0 -1
- 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.rb +13 -3
- data/spec/support/dns.rb +1 -1
- data/spec/support/json_ext_formatter.rb +1 -1
- data/spec/support/keyword_struct.rb +1 -1
- data/spec/support/local_resource_registry.rb +1 -1
- data/spec/support/macros.rb +1 -0
- data/spec/support/matchers.rb +5 -5
- data/spec/support/mongos_macros.rb +7 -0
- data/spec/support/monitoring_ext.rb +1 -1
- data/spec/support/primary_socket.rb +1 -1
- data/spec/support/sdam_formatter_integration.rb +1 -1
- data/spec/support/shared/app_metadata.rb +15 -3
- data/spec/support/shared/auth_context.rb +1 -0
- data/spec/support/shared/protocol.rb +1 -1
- data/spec/support/shared/scram_conversation.rb +1 -1
- data/spec/support/shared/server_selector.rb +1 -1
- data/spec/support/shared/session.rb +1 -1
- data/spec/support/spec_config.rb +40 -3
- data/spec/support/spec_setup.rb +1 -1
- data/spec/support/using_hash.rb +11 -2
- data/spec/support/utils.rb +277 -249
- data.tar.gz.sig +0 -0
- metadata +1456 -1173
- metadata.gz.sig +0 -0
- 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 -85
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -118
- data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +0 -152
- data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +0 -148
- data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +0 -219
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -88
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -117
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -98
- data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +0 -15
- data/spec/spec_tests/sdam_integration_spec.rb +0 -16
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# encoding: utf-8
|
|
3
2
|
|
|
4
3
|
require 'spec_helper'
|
|
5
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
|
|
6
17
|
describe Mongo::Client do
|
|
7
18
|
clean_slate
|
|
8
19
|
|
|
@@ -10,13 +21,15 @@ describe Mongo::Client do
|
|
|
10
21
|
|
|
11
22
|
describe '.new' do
|
|
12
23
|
context 'with scan: false' do
|
|
24
|
+
fails_on_jruby
|
|
25
|
+
|
|
13
26
|
it 'does not perform i/o' do
|
|
14
27
|
allow_any_instance_of(Mongo::Server::Monitor).to receive(:run!)
|
|
15
28
|
expect_any_instance_of(Mongo::Server::Monitor).not_to receive(:scan!)
|
|
16
|
-
|
|
29
|
+
|
|
17
30
|
# return should be instant
|
|
18
31
|
c = Timeout.timeout(1) do
|
|
19
|
-
ClientRegistry.instance.new_local_client(['1.1.1.1'], scan: false)
|
|
32
|
+
ClientRegistry.instance.new_local_client([ '1.1.1.1' ], scan: false)
|
|
20
33
|
end
|
|
21
34
|
expect(c.cluster.servers).to be_empty
|
|
22
35
|
c.close
|
|
@@ -24,23 +37,21 @@ describe Mongo::Client do
|
|
|
24
37
|
end
|
|
25
38
|
|
|
26
39
|
context 'with default scan: true' do
|
|
27
|
-
|
|
28
40
|
shared_examples 'does not wait for server selection timeout' do
|
|
29
|
-
|
|
30
41
|
let(:logger) do
|
|
31
|
-
Logger.new(
|
|
42
|
+
Logger.new($stdout, level: Logger::DEBUG)
|
|
32
43
|
end
|
|
33
44
|
|
|
34
45
|
let(:subscriber) do
|
|
35
46
|
Mongo::Monitoring::UnifiedSdamLogSubscriber.new(
|
|
36
47
|
logger: logger,
|
|
37
|
-
log_prefix: 'CCS-SDAM'
|
|
48
|
+
log_prefix: 'CCS-SDAM'
|
|
38
49
|
)
|
|
39
50
|
end
|
|
40
51
|
|
|
41
52
|
let(:client) do
|
|
42
53
|
ClientRegistry.instance.new_local_client(
|
|
43
|
-
[address],
|
|
54
|
+
[ address ],
|
|
44
55
|
# Specify server selection timeout here because test suite sets
|
|
45
56
|
# one by default and it's fairly low
|
|
46
57
|
SpecConfig.instance.test_options.merge(
|
|
@@ -49,10 +60,9 @@ describe Mongo::Client do
|
|
|
49
60
|
server_selection_timeout: 8,
|
|
50
61
|
logger: logger,
|
|
51
62
|
log_prefix: 'CCS-CLIENT',
|
|
52
|
-
sdam_proc:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
))
|
|
63
|
+
sdam_proc: ->(client) { subscriber.subscribe(client) }
|
|
64
|
+
)
|
|
65
|
+
)
|
|
56
66
|
end
|
|
57
67
|
|
|
58
68
|
it 'does not wait for server selection timeout' do
|
|
@@ -73,11 +83,11 @@ describe Mongo::Client do
|
|
|
73
83
|
|
|
74
84
|
actual_class = client.cluster.topology.class
|
|
75
85
|
expect([
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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)
|
|
81
91
|
expect(time_taken).to be < 5
|
|
82
92
|
|
|
83
93
|
# run a command to ensure the client is a working one
|
|
@@ -88,17 +98,17 @@ describe Mongo::Client do
|
|
|
88
98
|
context 'when cluster is monitored' do
|
|
89
99
|
require_topology :single, :replica_set, :sharded
|
|
90
100
|
|
|
91
|
-
# TODO this test requires there being no outstanding background
|
|
101
|
+
# TODO: this test requires there being no outstanding background
|
|
92
102
|
# monitoring threads running, as otherwise the scan! expectation
|
|
93
103
|
# can be executed on a thread that belongs to one of the global
|
|
94
104
|
# clients for instance
|
|
95
105
|
it 'performs one round of sdam' do
|
|
96
106
|
# Does not work due to
|
|
97
107
|
# https://github.com/rspec/rspec-mocks/issues/1242.
|
|
98
|
-
#
|
|
108
|
+
#
|
|
109
|
+
# expect_any_instance_of(Mongo::Server::Monitor).to receive(:scan!).
|
|
99
110
|
# exactly(SpecConfig.instance.addresses.length).times.and_call_original
|
|
100
|
-
c = new_local_client(
|
|
101
|
-
SpecConfig.instance.addresses, SpecConfig.instance.test_options)
|
|
111
|
+
c = new_local_client(SpecConfig.instance.addresses, SpecConfig.instance.test_options)
|
|
102
112
|
expect(c.cluster.servers).not_to be_empty
|
|
103
113
|
end
|
|
104
114
|
|
|
@@ -126,7 +136,7 @@ describe Mongo::Client do
|
|
|
126
136
|
|
|
127
137
|
context 'with monitoring_io: false' do
|
|
128
138
|
let(:client) do
|
|
129
|
-
new_local_client(
|
|
139
|
+
new_local_client(SINGLE_CLIENT, monitoring_io: false)
|
|
130
140
|
end
|
|
131
141
|
|
|
132
142
|
it 'passes monitoring_io: false to cluster' do
|
|
@@ -178,7 +188,7 @@ describe Mongo::Client do
|
|
|
178
188
|
let(:mongocryptd_uri) { 'mongodb://localhost:27021' }
|
|
179
189
|
let(:mongocryptd_bypass_spawn) { true }
|
|
180
190
|
let(:mongocryptd_spawn_path) { '/spawn/path' }
|
|
181
|
-
let(:mongocryptd_spawn_args) { ['--idleShutdownTimeoutSecs=100'] }
|
|
191
|
+
let(:mongocryptd_spawn_args) { [ '--idleShutdownTimeoutSecs=100' ] }
|
|
182
192
|
|
|
183
193
|
shared_examples 'a functioning auto encryption client' do
|
|
184
194
|
let(:encryption_options) { client.encrypter.options }
|
|
@@ -203,7 +213,10 @@ describe Mongo::Client do
|
|
|
203
213
|
let(:key_vault_namespace) { 'not.good.formatting' }
|
|
204
214
|
|
|
205
215
|
it 'raises an exception' do
|
|
206
|
-
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
|
+
)
|
|
207
220
|
end
|
|
208
221
|
end
|
|
209
222
|
|
|
@@ -219,7 +232,10 @@ describe Mongo::Client do
|
|
|
219
232
|
let(:kms_providers) { { random_key: 'hello' } }
|
|
220
233
|
|
|
221
234
|
it 'raises an exception' do
|
|
222
|
-
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
|
+
)
|
|
223
239
|
end
|
|
224
240
|
end
|
|
225
241
|
|
|
@@ -227,15 +243,25 @@ describe Mongo::Client do
|
|
|
227
243
|
let(:kms_providers) { { local: { wrong_key: 'hello' } } }
|
|
228
244
|
|
|
229
245
|
it 'raises an exception' do
|
|
230
|
-
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
|
+
)
|
|
231
250
|
end
|
|
232
251
|
end
|
|
233
252
|
|
|
234
253
|
context 'when aws kms_provider is incorrectly formatted' do
|
|
235
254
|
let(:kms_providers) { { aws: { wrong_key: 'hello' } } }
|
|
236
255
|
|
|
256
|
+
let(:expected_options_format) do
|
|
257
|
+
"{ access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' }"
|
|
258
|
+
end
|
|
259
|
+
|
|
237
260
|
it 'raises an exception' do
|
|
238
|
-
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
|
+
)
|
|
239
265
|
end
|
|
240
266
|
end
|
|
241
267
|
|
|
@@ -265,7 +291,7 @@ describe Mongo::Client do
|
|
|
265
291
|
expect(encryption_options[:key_vault_namespace]).to eq(key_vault_namespace)
|
|
266
292
|
# Don't explicitly expect kms_providers to avoid accidentally exposing
|
|
267
293
|
# sensitive data in evergreen logs
|
|
268
|
-
expect(encryption_options[:kms_providers]).to
|
|
294
|
+
expect(encryption_options[:kms_providers]).to be_a(Hash)
|
|
269
295
|
expect(encryption_options[:schema_map]).to eq(schema_map)
|
|
270
296
|
expect(encryption_options[:bypass_auto_encryption]).to eq(bypass_auto_encryption)
|
|
271
297
|
expect(encryption_options[:extra_options][:mongocryptd_uri]).to eq(mongocryptd_uri)
|
|
@@ -298,20 +324,22 @@ describe Mongo::Client do
|
|
|
298
324
|
expect(encryption_options[:extra_options][:mongocryptd_uri]).to eq('mongodb://localhost:27020')
|
|
299
325
|
expect(encryption_options[:extra_options][:mongocryptd_bypass_spawn]).to be false
|
|
300
326
|
expect(encryption_options[:extra_options][:mongocryptd_spawn_path]).to eq('mongocryptd')
|
|
301
|
-
expect(encryption_options[:extra_options][:mongocryptd_spawn_args])
|
|
327
|
+
expect(encryption_options[:extra_options][:mongocryptd_spawn_args])
|
|
328
|
+
.to eq([ '--idleShutdownTimeoutSecs=60' ])
|
|
302
329
|
end
|
|
303
330
|
end
|
|
304
331
|
|
|
305
332
|
context 'with mongocryptd_spawn_args that don\'t include idleShutdownTimeoutSecs' do
|
|
306
|
-
let(:mongocryptd_spawn_args) { ['--otherArgument=true'] }
|
|
333
|
+
let(:mongocryptd_spawn_args) { [ '--otherArgument=true' ] }
|
|
307
334
|
|
|
308
335
|
it 'adds a default value to mongocryptd_spawn_args' do
|
|
309
|
-
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' ])
|
|
310
338
|
end
|
|
311
339
|
end
|
|
312
340
|
|
|
313
341
|
context 'with mongocryptd_spawn_args that has idleShutdownTimeoutSecs as two arguments' do
|
|
314
|
-
let(:mongocryptd_spawn_args) { ['--idleShutdownTimeoutSecs', 100] }
|
|
342
|
+
let(:mongocryptd_spawn_args) { [ '--idleShutdownTimeoutSecs', 100 ] }
|
|
315
343
|
|
|
316
344
|
it 'does not modify mongocryptd_spawn_args' do
|
|
317
345
|
expect(encryption_options[:extra_options][:mongocryptd_spawn_args]).to eq(mongocryptd_spawn_args)
|
|
@@ -324,7 +352,7 @@ describe Mongo::Client do
|
|
|
324
352
|
it 'creates a key_vault_client' do
|
|
325
353
|
key_vault_client = encryption_options[:key_vault_client]
|
|
326
354
|
|
|
327
|
-
expect(key_vault_client).to
|
|
355
|
+
expect(key_vault_client).to be_a(described_class)
|
|
328
356
|
end
|
|
329
357
|
end
|
|
330
358
|
end
|
|
@@ -345,54 +373,47 @@ describe Mongo::Client do
|
|
|
345
373
|
|
|
346
374
|
context 'timeout options' do
|
|
347
375
|
let(:client) do
|
|
348
|
-
new_local_client(
|
|
349
|
-
SpecConfig.instance.
|
|
376
|
+
new_local_client(
|
|
377
|
+
SpecConfig.instance.addresses,
|
|
378
|
+
SpecConfig.instance.authorized_test_options.merge(options)
|
|
379
|
+
)
|
|
350
380
|
end
|
|
351
381
|
|
|
352
382
|
context 'when network timeouts are zero' do
|
|
353
|
-
let(:options)
|
|
354
|
-
{ socket_timeout: 0, connect_timeout: 0 }
|
|
355
|
-
end
|
|
383
|
+
let(:options) { { socket_timeout: 0, connect_timeout: 0 } }
|
|
356
384
|
|
|
357
385
|
it 'sets options to zeros' do
|
|
358
|
-
client.options[:socket_timeout].
|
|
359
|
-
client.options[:connect_timeout].
|
|
386
|
+
expect(client.options[:socket_timeout]).to be == 0
|
|
387
|
+
expect(client.options[:connect_timeout]).to be == 0
|
|
360
388
|
end
|
|
361
389
|
|
|
362
390
|
it 'connects and performs operations successfully' do
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
end.should_not raise_error
|
|
391
|
+
expect { client.database.command(ping: 1) }
|
|
392
|
+
.not_to raise_error
|
|
366
393
|
end
|
|
367
394
|
end
|
|
368
395
|
|
|
369
|
-
%i
|
|
396
|
+
%i[ socket_timeout connect_timeout ].each do |option|
|
|
370
397
|
context "when #{option} is negative" do
|
|
371
|
-
let(:options)
|
|
372
|
-
{ option => -1 }
|
|
373
|
-
end
|
|
398
|
+
let(:options) { { option => -1 } }
|
|
374
399
|
|
|
375
400
|
it 'fails client creation' do
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
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/)
|
|
379
403
|
end
|
|
380
404
|
end
|
|
381
405
|
|
|
382
406
|
context "when #{option} is of the wrong type" do
|
|
383
|
-
let(:options)
|
|
384
|
-
{ option => '42' }
|
|
385
|
-
end
|
|
407
|
+
let(:options) { { option => '42' } }
|
|
386
408
|
|
|
387
409
|
it 'fails client creation' do
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
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/)
|
|
391
412
|
end
|
|
392
413
|
end
|
|
393
414
|
end
|
|
394
415
|
|
|
395
|
-
context
|
|
416
|
+
context 'when :connect_timeout is very small' do
|
|
396
417
|
# The driver reads first and checks the deadline second.
|
|
397
418
|
# This means the read (in a monitor) can technically take more than
|
|
398
419
|
# the connect timeout. Restrict to TLS configurations to make
|
|
@@ -404,18 +425,15 @@ describe Mongo::Client do
|
|
|
404
425
|
end
|
|
405
426
|
|
|
406
427
|
it 'allows client creation' do
|
|
407
|
-
|
|
408
|
-
client
|
|
409
|
-
end.should_not raise_error
|
|
428
|
+
expect { client }.not_to raise_error
|
|
410
429
|
end
|
|
411
430
|
|
|
412
431
|
context 'non-lb' do
|
|
413
432
|
require_topology :single, :replica_set, :sharded
|
|
414
433
|
|
|
415
434
|
it 'fails server selection due to very small timeout' do
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
end.should raise_error(Mongo::Error::NoServerAvailable)
|
|
435
|
+
expect { client.database.command(ping: 1) }
|
|
436
|
+
.to raise_error(Mongo::Error::NoServerAvailable)
|
|
419
437
|
end
|
|
420
438
|
end
|
|
421
439
|
|
|
@@ -423,14 +441,13 @@ describe Mongo::Client do
|
|
|
423
441
|
require_topology :load_balanced
|
|
424
442
|
|
|
425
443
|
it 'fails the operation after successful server selection' do
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
end.should raise_error(Mongo::Error::SocketTimeoutError, /socket took over.*to connect/)
|
|
444
|
+
expect { client.database.command(ping: 1) }
|
|
445
|
+
.to raise_error(Mongo::Error::SocketTimeoutError, /socket took over.*to connect/)
|
|
429
446
|
end
|
|
430
447
|
end
|
|
431
448
|
end
|
|
432
449
|
|
|
433
|
-
context
|
|
450
|
+
context 'when :socket_timeout is very small' do
|
|
434
451
|
# The driver reads first and checks the deadline second.
|
|
435
452
|
# This means the read (in a monitor) can technically take more than
|
|
436
453
|
# the connect timeout. Restrict to TLS configurations to make
|
|
@@ -442,16 +459,13 @@ describe Mongo::Client do
|
|
|
442
459
|
end
|
|
443
460
|
|
|
444
461
|
it 'allows client creation' do
|
|
445
|
-
|
|
446
|
-
client
|
|
447
|
-
end.should_not raise_error
|
|
462
|
+
expect { client }.not_to raise_error
|
|
448
463
|
end
|
|
449
464
|
|
|
450
465
|
retry_test
|
|
451
466
|
it 'fails operations due to very small timeout' do
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
end.should raise_error(Mongo::Error::SocketTimeoutError)
|
|
467
|
+
expect { client.database.command(ping: 1) }
|
|
468
|
+
.to raise_error(Mongo::Error::SocketTimeoutError)
|
|
455
469
|
end
|
|
456
470
|
end
|
|
457
471
|
end
|
|
@@ -462,7 +476,6 @@ describe Mongo::Client do
|
|
|
462
476
|
end
|
|
463
477
|
|
|
464
478
|
context 'when retry_writes is true' do
|
|
465
|
-
|
|
466
479
|
let(:options) do
|
|
467
480
|
{ retry_writes: true }
|
|
468
481
|
end
|
|
@@ -473,7 +486,6 @@ describe Mongo::Client do
|
|
|
473
486
|
end
|
|
474
487
|
|
|
475
488
|
context 'when retry_writes is false' do
|
|
476
|
-
|
|
477
489
|
let(:options) do
|
|
478
490
|
{ retry_writes: false }
|
|
479
491
|
end
|
|
@@ -484,10 +496,7 @@ describe Mongo::Client do
|
|
|
484
496
|
end
|
|
485
497
|
|
|
486
498
|
context 'when retry_writes is not given' do
|
|
487
|
-
|
|
488
|
-
let(:options) do
|
|
489
|
-
{ }
|
|
490
|
-
end
|
|
499
|
+
let(:options) { {} }
|
|
491
500
|
|
|
492
501
|
it 'sets retry_writes to true' do
|
|
493
502
|
expect(client.options['retry_writes']).to be true
|
|
@@ -496,17 +505,18 @@ describe Mongo::Client do
|
|
|
496
505
|
end
|
|
497
506
|
|
|
498
507
|
context 'when compressors are provided' do
|
|
499
|
-
|
|
500
508
|
let(:client) do
|
|
501
|
-
new_local_client(
|
|
502
|
-
SpecConfig.instance.
|
|
509
|
+
new_local_client(
|
|
510
|
+
SpecConfig.instance.addresses,
|
|
511
|
+
SpecConfig.instance.all_test_options.merge(options)
|
|
512
|
+
)
|
|
503
513
|
end
|
|
504
514
|
|
|
505
515
|
context 'when the compressor is not supported by the driver' do
|
|
506
516
|
require_warning_clean
|
|
507
517
|
|
|
508
518
|
let(:options) do
|
|
509
|
-
{ compressors: [
|
|
519
|
+
{ compressors: %w[ snoopy ] }
|
|
510
520
|
end
|
|
511
521
|
|
|
512
522
|
it 'does not set the compressor and warns' do
|
|
@@ -523,16 +533,16 @@ describe Mongo::Client do
|
|
|
523
533
|
min_server_fcv '3.6'
|
|
524
534
|
|
|
525
535
|
let(:options) do
|
|
526
|
-
{ compressors: [
|
|
536
|
+
{ compressors: %w[ zlib snoopy ] }
|
|
527
537
|
end
|
|
528
538
|
|
|
529
539
|
it 'does not set the unsupported compressor and warns' do
|
|
530
540
|
expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
|
|
531
|
-
expect(client.options['compressors']).to eq([
|
|
541
|
+
expect(client.options['compressors']).to eq(%w[ zlib ])
|
|
532
542
|
end
|
|
533
543
|
|
|
534
544
|
it 'sets the compression key of the handshake document to the list of supported compressors' do
|
|
535
|
-
expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([
|
|
545
|
+
expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(%w[ zlib ])
|
|
536
546
|
end
|
|
537
547
|
end
|
|
538
548
|
end
|
|
@@ -541,7 +551,7 @@ describe Mongo::Client do
|
|
|
541
551
|
max_server_version '3.4'
|
|
542
552
|
|
|
543
553
|
let(:options) do
|
|
544
|
-
{ compressors: [
|
|
554
|
+
{ compressors: %w[ zlib ] }
|
|
545
555
|
end
|
|
546
556
|
|
|
547
557
|
it 'does not set the compressor and warns' do
|
|
@@ -554,7 +564,7 @@ describe Mongo::Client do
|
|
|
554
564
|
require_zlib_compression
|
|
555
565
|
|
|
556
566
|
let(:options) do
|
|
557
|
-
{ compressors: [
|
|
567
|
+
{ compressors: %w[ zlib ] }
|
|
558
568
|
end
|
|
559
569
|
|
|
560
570
|
it 'sets the compressor' do
|
|
@@ -576,9 +586,7 @@ describe Mongo::Client do
|
|
|
576
586
|
|
|
577
587
|
it 'does not use compression for authentication messages' do
|
|
578
588
|
expect(Mongo::Protocol::Compressed).not_to receive(:new)
|
|
579
|
-
client.cluster.next_primary.send(:with_connection)
|
|
580
|
-
conn.connect!
|
|
581
|
-
end
|
|
589
|
+
client.cluster.next_primary.send(:with_connection, &:connect!)
|
|
582
590
|
end
|
|
583
591
|
end
|
|
584
592
|
|
|
@@ -586,14 +594,14 @@ describe Mongo::Client do
|
|
|
586
594
|
min_server_version '3.6'
|
|
587
595
|
|
|
588
596
|
let(:options) do
|
|
589
|
-
{ compressors: [
|
|
597
|
+
{ compressors: %w[ snappy ] }
|
|
590
598
|
end
|
|
591
599
|
|
|
592
600
|
context 'when snappy gem is installed' do
|
|
593
601
|
require_snappy_compression
|
|
594
602
|
|
|
595
603
|
it 'creates the client' do
|
|
596
|
-
expect(client.options['compressors']).to eq([
|
|
604
|
+
expect(client.options['compressors']).to eq(%w[ snappy ])
|
|
597
605
|
end
|
|
598
606
|
end
|
|
599
607
|
|
|
@@ -612,14 +620,14 @@ describe Mongo::Client do
|
|
|
612
620
|
min_server_version '4.2'
|
|
613
621
|
|
|
614
622
|
let(:options) do
|
|
615
|
-
{ compressors: [
|
|
623
|
+
{ compressors: %w[ zstd ] }
|
|
616
624
|
end
|
|
617
625
|
|
|
618
626
|
context 'when zstd gem is installed' do
|
|
619
627
|
require_zstd_compression
|
|
620
628
|
|
|
621
629
|
it 'creates the client' do
|
|
622
|
-
expect(client.options['compressors']).to eq([
|
|
630
|
+
expect(client.options['compressors']).to eq(%w[ zstd ])
|
|
623
631
|
end
|
|
624
632
|
end
|
|
625
633
|
|
|
@@ -661,7 +669,10 @@ describe Mongo::Client do
|
|
|
661
669
|
min_server_fcv '3.6'
|
|
662
670
|
|
|
663
671
|
let(:client) do
|
|
664
|
-
new_local_client_nmio(
|
|
672
|
+
new_local_client_nmio(
|
|
673
|
+
SpecConfig.instance.addresses,
|
|
674
|
+
SpecConfig.instance.test_options.merge(zlib_compression_level: 1)
|
|
675
|
+
)
|
|
665
676
|
end
|
|
666
677
|
|
|
667
678
|
it 'sets the option on the client' do
|
|
@@ -670,26 +681,25 @@ describe Mongo::Client do
|
|
|
670
681
|
end
|
|
671
682
|
|
|
672
683
|
context 'when ssl options are provided' do
|
|
673
|
-
|
|
674
684
|
let(:options) do
|
|
675
685
|
{
|
|
676
|
-
:
|
|
677
|
-
:
|
|
678
|
-
:
|
|
679
|
-
:
|
|
680
|
-
:
|
|
681
|
-
:
|
|
682
|
-
:
|
|
683
|
-
:
|
|
684
|
-
:
|
|
685
|
-
:
|
|
686
|
-
:
|
|
687
|
-
:
|
|
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,
|
|
688
698
|
}
|
|
689
699
|
end
|
|
690
700
|
|
|
691
701
|
let(:client) do
|
|
692
|
-
new_local_client_nmio(
|
|
702
|
+
new_local_client_nmio(SINGLE_CLIENT, options)
|
|
693
703
|
end
|
|
694
704
|
|
|
695
705
|
it 'sets the ssl option' do
|
|
@@ -742,9 +752,8 @@ describe Mongo::Client do
|
|
|
742
752
|
end
|
|
743
753
|
|
|
744
754
|
context 'when no database is provided' do
|
|
745
|
-
|
|
746
755
|
let(:client) do
|
|
747
|
-
new_local_client_nmio(
|
|
756
|
+
new_local_client_nmio(SINGLE_CLIENT, read: { mode: :secondary })
|
|
748
757
|
end
|
|
749
758
|
|
|
750
759
|
it 'defaults the database to admin' do
|
|
@@ -753,9 +762,8 @@ describe Mongo::Client do
|
|
|
753
762
|
end
|
|
754
763
|
|
|
755
764
|
context 'when a database is provided' do
|
|
756
|
-
|
|
757
765
|
let(:client) do
|
|
758
|
-
new_local_client_nmio(
|
|
766
|
+
new_local_client_nmio(SINGLE_CLIENT, database: :testdb)
|
|
759
767
|
end
|
|
760
768
|
|
|
761
769
|
it 'sets the current database' do
|
|
@@ -764,9 +772,8 @@ describe Mongo::Client do
|
|
|
764
772
|
end
|
|
765
773
|
|
|
766
774
|
context 'when providing a custom logger' do
|
|
767
|
-
|
|
768
775
|
let(:logger) do
|
|
769
|
-
Logger.new(
|
|
776
|
+
Logger.new($stdout).tap do |l|
|
|
770
777
|
l.level = Logger::FATAL
|
|
771
778
|
end
|
|
772
779
|
end
|
|
@@ -776,14 +783,13 @@ describe Mongo::Client do
|
|
|
776
783
|
end
|
|
777
784
|
|
|
778
785
|
it 'does not use the global logger' do
|
|
779
|
-
expect(client.cluster.logger).
|
|
786
|
+
expect(client.cluster.logger).not_to eq(Mongo::Logger.logger)
|
|
780
787
|
end
|
|
781
788
|
end
|
|
782
789
|
|
|
783
790
|
context 'when providing a heartbeat_frequency' do
|
|
784
|
-
|
|
785
791
|
let(:client) do
|
|
786
|
-
new_local_client_nmio(
|
|
792
|
+
new_local_client_nmio(SINGLE_CLIENT, heartbeat_frequency: 2)
|
|
787
793
|
end
|
|
788
794
|
|
|
789
795
|
it 'sets the heartbeat frequency' do
|
|
@@ -792,37 +798,20 @@ describe Mongo::Client do
|
|
|
792
798
|
end
|
|
793
799
|
|
|
794
800
|
context 'when min_pool_size is provided' do
|
|
795
|
-
|
|
796
|
-
let(:client) do
|
|
797
|
-
new_local_client_nmio(['127.0.0.1:27017'], options)
|
|
798
|
-
end
|
|
801
|
+
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
|
799
802
|
|
|
800
803
|
context 'when max_pool_size is provided' do
|
|
801
|
-
|
|
802
804
|
context 'when the min_pool_size is greater than the max_pool_size' do
|
|
803
|
-
|
|
804
|
-
let(:options) do
|
|
805
|
-
{
|
|
806
|
-
:min_pool_size => 20,
|
|
807
|
-
:max_pool_size => 10
|
|
808
|
-
}
|
|
809
|
-
end
|
|
805
|
+
let(:options) { { min_pool_size: 20, max_pool_size: 10 } }
|
|
810
806
|
|
|
811
807
|
it 'raises an Exception' do
|
|
812
|
-
expect {
|
|
813
|
-
|
|
814
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
808
|
+
expect { client }
|
|
809
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
815
810
|
end
|
|
816
811
|
end
|
|
817
812
|
|
|
818
813
|
context 'when the min_pool_size is less than the max_pool_size' do
|
|
819
|
-
|
|
820
|
-
let(:options) do
|
|
821
|
-
{
|
|
822
|
-
:min_pool_size => 10,
|
|
823
|
-
:max_pool_size => 20
|
|
824
|
-
}
|
|
825
|
-
end
|
|
814
|
+
let(:options) { { min_pool_size: 10, max_pool_size: 20 } }
|
|
826
815
|
|
|
827
816
|
it 'sets the option' do
|
|
828
817
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -831,13 +820,7 @@ describe Mongo::Client do
|
|
|
831
820
|
end
|
|
832
821
|
|
|
833
822
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
834
|
-
|
|
835
|
-
let(:options) do
|
|
836
|
-
{
|
|
837
|
-
:min_pool_size => 10,
|
|
838
|
-
:max_pool_size => 10
|
|
839
|
-
}
|
|
840
|
-
end
|
|
823
|
+
let(:options) { { min_pool_size: 10, max_pool_size: 10 } }
|
|
841
824
|
|
|
842
825
|
it 'sets the option' do
|
|
843
826
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -846,12 +829,7 @@ describe Mongo::Client do
|
|
|
846
829
|
end
|
|
847
830
|
|
|
848
831
|
context 'when max_pool_size is zero (unlimited)' do
|
|
849
|
-
let(:options)
|
|
850
|
-
{
|
|
851
|
-
:min_pool_size => 10,
|
|
852
|
-
:max_pool_size => 0
|
|
853
|
-
}
|
|
854
|
-
end
|
|
832
|
+
let(:options) { { min_pool_size: 10, max_pool_size: 0 } }
|
|
855
833
|
|
|
856
834
|
it 'sets the option' do
|
|
857
835
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -861,29 +839,17 @@ describe Mongo::Client do
|
|
|
861
839
|
end
|
|
862
840
|
|
|
863
841
|
context 'when max_pool_size is not provided' do
|
|
864
|
-
|
|
865
842
|
context 'when the min_pool_size is greater than the default max_pool_size' do
|
|
866
|
-
|
|
867
|
-
let(:options) do
|
|
868
|
-
{
|
|
869
|
-
:min_pool_size => 30
|
|
870
|
-
}
|
|
871
|
-
end
|
|
843
|
+
let(:options) { { min_pool_size: 30 } }
|
|
872
844
|
|
|
873
845
|
it 'raises an Exception' do
|
|
874
|
-
expect {
|
|
875
|
-
|
|
876
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
846
|
+
expect { client }
|
|
847
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
877
848
|
end
|
|
878
849
|
end
|
|
879
850
|
|
|
880
851
|
context 'when the min_pool_size is less than the default max_pool_size' do
|
|
881
|
-
|
|
882
|
-
let(:options) do
|
|
883
|
-
{
|
|
884
|
-
:min_pool_size => 3
|
|
885
|
-
}
|
|
886
|
-
end
|
|
852
|
+
let(:options) { { min_pool_size: 3 } }
|
|
887
853
|
|
|
888
854
|
it 'sets the option' do
|
|
889
855
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -891,10 +857,9 @@ describe Mongo::Client do
|
|
|
891
857
|
end
|
|
892
858
|
|
|
893
859
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
894
|
-
|
|
895
860
|
let(:options) do
|
|
896
861
|
{
|
|
897
|
-
:
|
|
862
|
+
min_pool_size: Mongo::Server::ConnectionPool::DEFAULT_MAX_SIZE
|
|
898
863
|
}
|
|
899
864
|
end
|
|
900
865
|
|
|
@@ -905,36 +870,18 @@ describe Mongo::Client do
|
|
|
905
870
|
end
|
|
906
871
|
end
|
|
907
872
|
|
|
908
|
-
context 'when max_pool_size is
|
|
909
|
-
let(:client)
|
|
910
|
-
|
|
911
|
-
end
|
|
873
|
+
context 'when max_pool_size is 0 (unlimited)' do
|
|
874
|
+
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
|
875
|
+
let(:options) { { max_pool_size: 0 } }
|
|
912
876
|
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
{
|
|
916
|
-
:max_pool_size => 0
|
|
917
|
-
}
|
|
918
|
-
end
|
|
919
|
-
|
|
920
|
-
it 'sets the option' do
|
|
921
|
-
expect(client.options[:max_pool_size]).to eq(options[:max_pool_size])
|
|
922
|
-
end
|
|
877
|
+
it 'sets the option' do
|
|
878
|
+
expect(client.options[:max_pool_size]).to eq(options[:max_pool_size])
|
|
923
879
|
end
|
|
924
880
|
end
|
|
925
881
|
|
|
926
882
|
context 'when max_pool_size and min_pool_size are both nil' do
|
|
927
|
-
|
|
928
|
-
let(:client)
|
|
929
|
-
new_local_client_nmio(['127.0.0.1:27017'], options)
|
|
930
|
-
end
|
|
931
|
-
|
|
932
|
-
let(:options) do
|
|
933
|
-
{
|
|
934
|
-
:min_pool_size => nil,
|
|
935
|
-
:max_pool_size => nil
|
|
936
|
-
}
|
|
937
|
-
end
|
|
883
|
+
let(:options) { { min_pool_size: nil, max_pool_size: nil } }
|
|
884
|
+
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
|
938
885
|
|
|
939
886
|
it 'does not set either option' do
|
|
940
887
|
expect(client.options[:max_pool_size]).to be_nil
|
|
@@ -943,28 +890,26 @@ describe Mongo::Client do
|
|
|
943
890
|
end
|
|
944
891
|
|
|
945
892
|
context 'when platform details are specified' do
|
|
946
|
-
|
|
947
893
|
let(:app_metadata) do
|
|
948
894
|
client.cluster.app_metadata
|
|
949
895
|
end
|
|
950
896
|
|
|
951
897
|
let(:client) do
|
|
952
|
-
new_local_client_nmio(
|
|
898
|
+
new_local_client_nmio(SINGLE_CLIENT, platform: 'mongoid-6.0.2')
|
|
953
899
|
end
|
|
954
900
|
|
|
955
901
|
it 'includes the platform info in the app metadata' do
|
|
956
|
-
expect(app_metadata.
|
|
902
|
+
expect(app_metadata.client_document[:platform]).to match(/mongoid-6\.0\.2/)
|
|
957
903
|
end
|
|
958
904
|
end
|
|
959
905
|
|
|
960
906
|
context 'when platform details are not specified' do
|
|
961
|
-
|
|
962
907
|
let(:app_metadata) do
|
|
963
908
|
client.cluster.app_metadata
|
|
964
909
|
end
|
|
965
910
|
|
|
966
911
|
let(:client) do
|
|
967
|
-
new_local_client_nmio(
|
|
912
|
+
new_local_client_nmio(SINGLE_CLIENT)
|
|
968
913
|
end
|
|
969
914
|
|
|
970
915
|
context 'mri' do
|
|
@@ -980,7 +925,7 @@ describe Mongo::Client do
|
|
|
980
925
|
end
|
|
981
926
|
|
|
982
927
|
it 'does not include the platform info in the app metadata' do
|
|
983
|
-
expect(app_metadata.
|
|
928
|
+
expect(app_metadata.client_document[:platform]).to eq(platform_string)
|
|
984
929
|
end
|
|
985
930
|
end
|
|
986
931
|
|
|
@@ -999,24 +944,18 @@ describe Mongo::Client do
|
|
|
999
944
|
end
|
|
1000
945
|
|
|
1001
946
|
it 'does not include the platform info in the app metadata' do
|
|
1002
|
-
expect(app_metadata.
|
|
947
|
+
expect(app_metadata.client_document[:platform]).to eq(platform_string)
|
|
1003
948
|
end
|
|
1004
949
|
end
|
|
1005
950
|
end
|
|
1006
951
|
end
|
|
1007
952
|
|
|
1008
953
|
context 'when providing a connection string' do
|
|
1009
|
-
|
|
1010
954
|
context 'when the string uses the SRV Protocol' do
|
|
1011
955
|
require_external_connectivity
|
|
1012
956
|
|
|
1013
|
-
let
|
|
1014
|
-
|
|
1015
|
-
end
|
|
1016
|
-
|
|
1017
|
-
let(:client) do
|
|
1018
|
-
new_local_client_nmio(uri)
|
|
1019
|
-
end
|
|
957
|
+
let(:uri) { 'mongodb+srv://test5.test.build.10gen.cc/testdb' }
|
|
958
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1020
959
|
|
|
1021
960
|
it 'sets the database' do
|
|
1022
961
|
expect(client.options[:database]).to eq('testdb')
|
|
@@ -1024,29 +963,17 @@ describe Mongo::Client do
|
|
|
1024
963
|
end
|
|
1025
964
|
|
|
1026
965
|
context 'when a database is provided' do
|
|
1027
|
-
|
|
1028
|
-
let
|
|
1029
|
-
'mongodb://127.0.0.1:27017/testdb'
|
|
1030
|
-
end
|
|
1031
|
-
|
|
1032
|
-
let(:client) do
|
|
1033
|
-
new_local_client_nmio(uri)
|
|
1034
|
-
end
|
|
966
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb' }
|
|
967
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1035
968
|
|
|
1036
969
|
it 'sets the database' do
|
|
1037
|
-
expect { client[:users] }.
|
|
970
|
+
expect { client[:users] }.not_to raise_error
|
|
1038
971
|
end
|
|
1039
972
|
end
|
|
1040
973
|
|
|
1041
974
|
context 'when a database is not provided' do
|
|
1042
|
-
|
|
1043
|
-
let
|
|
1044
|
-
'mongodb://127.0.0.1:27017'
|
|
1045
|
-
end
|
|
1046
|
-
|
|
1047
|
-
let(:client) do
|
|
1048
|
-
new_local_client_nmio(uri)
|
|
1049
|
-
end
|
|
975
|
+
let(:uri) { 'mongodb://127.0.0.1:27017' }
|
|
976
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1050
977
|
|
|
1051
978
|
it 'defaults the database to admin' do
|
|
1052
979
|
expect(client.database.name).to eq('admin')
|
|
@@ -1054,19 +981,17 @@ describe Mongo::Client do
|
|
|
1054
981
|
end
|
|
1055
982
|
|
|
1056
983
|
context 'when URI options are provided' do
|
|
1057
|
-
|
|
1058
|
-
let
|
|
1059
|
-
'mongodb://127.0.0.1:27017/testdb?w=3'
|
|
1060
|
-
end
|
|
1061
|
-
|
|
1062
|
-
let(:client) do
|
|
1063
|
-
new_local_client_nmio(uri)
|
|
1064
|
-
end
|
|
984
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?w=3' }
|
|
985
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1065
986
|
|
|
1066
987
|
let(:expected_options) do
|
|
1067
|
-
Mongo::Options::Redacted.new(
|
|
1068
|
-
|
|
1069
|
-
|
|
988
|
+
Mongo::Options::Redacted.new(
|
|
989
|
+
write_concern: { w: 3 },
|
|
990
|
+
monitoring_io: false,
|
|
991
|
+
database: 'testdb',
|
|
992
|
+
retry_writes: true,
|
|
993
|
+
retry_reads: true
|
|
994
|
+
)
|
|
1070
995
|
end
|
|
1071
996
|
|
|
1072
997
|
it 'sets the options' do
|
|
@@ -1074,24 +999,19 @@ describe Mongo::Client do
|
|
|
1074
999
|
end
|
|
1075
1000
|
|
|
1076
1001
|
context 'when min_pool_size is provided' do
|
|
1077
|
-
|
|
1078
1002
|
context 'when max_pool_size is provided' do
|
|
1079
|
-
|
|
1080
1003
|
context 'when the min_pool_size is greater than the max_pool_size' do
|
|
1081
|
-
|
|
1082
1004
|
let(:uri) do
|
|
1083
1005
|
'mongodb://127.0.0.1:27017/?minPoolSize=20&maxPoolSize=10'
|
|
1084
1006
|
end
|
|
1085
1007
|
|
|
1086
1008
|
it 'raises an Exception' do
|
|
1087
|
-
expect {
|
|
1088
|
-
|
|
1089
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1009
|
+
expect { client }
|
|
1010
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1090
1011
|
end
|
|
1091
1012
|
end
|
|
1092
1013
|
|
|
1093
1014
|
context 'when the min_pool_size is less than the max_pool_size' do
|
|
1094
|
-
|
|
1095
1015
|
let(:uri) do
|
|
1096
1016
|
'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=20'
|
|
1097
1017
|
end
|
|
@@ -1103,7 +1023,6 @@ describe Mongo::Client do
|
|
|
1103
1023
|
end
|
|
1104
1024
|
|
|
1105
1025
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
1106
|
-
|
|
1107
1026
|
let(:uri) do
|
|
1108
1027
|
'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=10'
|
|
1109
1028
|
end
|
|
@@ -1127,25 +1046,17 @@ describe Mongo::Client do
|
|
|
1127
1046
|
end
|
|
1128
1047
|
|
|
1129
1048
|
context 'when max_pool_size is not provided' do
|
|
1130
|
-
|
|
1131
1049
|
context 'when the min_pool_size is greater than the default max_pool_size' do
|
|
1132
|
-
|
|
1133
|
-
let(:uri) do
|
|
1134
|
-
'mongodb://127.0.0.1:27017/?minPoolSize=30'
|
|
1135
|
-
end
|
|
1050
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=30' }
|
|
1136
1051
|
|
|
1137
1052
|
it 'raises an Exception' do
|
|
1138
|
-
expect {
|
|
1139
|
-
|
|
1140
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1053
|
+
expect { client }
|
|
1054
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1141
1055
|
end
|
|
1142
1056
|
end
|
|
1143
1057
|
|
|
1144
1058
|
context 'when the min_pool_size is less than the default max_pool_size' do
|
|
1145
|
-
|
|
1146
|
-
let(:uri) do
|
|
1147
|
-
'mongodb://127.0.0.1:27017/?minPoolSize=3'
|
|
1148
|
-
end
|
|
1059
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=3' }
|
|
1149
1060
|
|
|
1150
1061
|
it 'sets the option' do
|
|
1151
1062
|
expect(client.options[:min_pool_size]).to eq(3)
|
|
@@ -1153,10 +1064,7 @@ describe Mongo::Client do
|
|
|
1153
1064
|
end
|
|
1154
1065
|
|
|
1155
1066
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
1156
|
-
|
|
1157
|
-
let(:uri) do
|
|
1158
|
-
'mongodb://127.0.0.1:27017/?minPoolSize=5'
|
|
1159
|
-
end
|
|
1067
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=5' }
|
|
1160
1068
|
|
|
1161
1069
|
it 'sets the option' do
|
|
1162
1070
|
expect(client.options[:min_pool_size]).to eq(5)
|
|
@@ -1166,11 +1074,8 @@ describe Mongo::Client do
|
|
|
1166
1074
|
end
|
|
1167
1075
|
|
|
1168
1076
|
context 'when retryReads URI option is given' do
|
|
1169
|
-
|
|
1170
1077
|
context 'it is false' do
|
|
1171
|
-
let
|
|
1172
|
-
'mongodb://127.0.0.1:27017/testdb?retryReads=false'
|
|
1173
|
-
end
|
|
1078
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryReads=false' }
|
|
1174
1079
|
|
|
1175
1080
|
it 'sets the option on the client' do
|
|
1176
1081
|
expect(client.options[:retry_reads]).to be false
|
|
@@ -1178,9 +1083,7 @@ describe Mongo::Client do
|
|
|
1178
1083
|
end
|
|
1179
1084
|
|
|
1180
1085
|
context 'it is true' do
|
|
1181
|
-
let
|
|
1182
|
-
'mongodb://127.0.0.1:27017/testdb?retryReads=true'
|
|
1183
|
-
end
|
|
1086
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryReads=true' }
|
|
1184
1087
|
|
|
1185
1088
|
it 'sets the option on the client' do
|
|
1186
1089
|
expect(client.options[:retry_reads]).to be true
|
|
@@ -1189,11 +1092,8 @@ describe Mongo::Client do
|
|
|
1189
1092
|
end
|
|
1190
1093
|
|
|
1191
1094
|
context 'when retryWrites URI option is given' do
|
|
1192
|
-
|
|
1193
1095
|
context 'it is false' do
|
|
1194
|
-
let
|
|
1195
|
-
'mongodb://127.0.0.1:27017/testdb?retryWrites=false'
|
|
1196
|
-
end
|
|
1096
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryWrites=false' }
|
|
1197
1097
|
|
|
1198
1098
|
it 'sets the option on the client' do
|
|
1199
1099
|
expect(client.options[:retry_writes]).to be false
|
|
@@ -1201,9 +1101,7 @@ describe Mongo::Client do
|
|
|
1201
1101
|
end
|
|
1202
1102
|
|
|
1203
1103
|
context 'it is true' do
|
|
1204
|
-
let
|
|
1205
|
-
'mongodb://127.0.0.1:27017/testdb?retryWrites=true'
|
|
1206
|
-
end
|
|
1104
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryWrites=true' }
|
|
1207
1105
|
|
|
1208
1106
|
it 'sets the option on the client' do
|
|
1209
1107
|
expect(client.options[:retry_writes]).to be true
|
|
@@ -1213,19 +1111,20 @@ describe Mongo::Client do
|
|
|
1213
1111
|
end
|
|
1214
1112
|
|
|
1215
1113
|
context 'when options are provided not in the string' do
|
|
1216
|
-
|
|
1217
|
-
let!(:uri) do
|
|
1218
|
-
'mongodb://127.0.0.1:27017/testdb'
|
|
1219
|
-
end
|
|
1114
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb' }
|
|
1220
1115
|
|
|
1221
1116
|
let(:client) do
|
|
1222
|
-
new_local_client_nmio(uri, :
|
|
1117
|
+
new_local_client_nmio(uri, write: { w: 3 })
|
|
1223
1118
|
end
|
|
1224
1119
|
|
|
1225
1120
|
let(:expected_options) do
|
|
1226
|
-
Mongo::Options::Redacted.new(
|
|
1227
|
-
|
|
1228
|
-
|
|
1121
|
+
Mongo::Options::Redacted.new(
|
|
1122
|
+
write: { w: 3 },
|
|
1123
|
+
monitoring_io: false,
|
|
1124
|
+
database: 'testdb',
|
|
1125
|
+
retry_writes: true,
|
|
1126
|
+
retry_reads: true
|
|
1127
|
+
)
|
|
1229
1128
|
end
|
|
1230
1129
|
|
|
1231
1130
|
it 'sets the options' do
|
|
@@ -1234,19 +1133,20 @@ describe Mongo::Client do
|
|
|
1234
1133
|
end
|
|
1235
1134
|
|
|
1236
1135
|
context 'when options are provided in the URI and as Ruby options' do
|
|
1237
|
-
|
|
1238
|
-
let!(:uri) do
|
|
1239
|
-
'mongodb://127.0.0.1:27017/testdb?w=3'
|
|
1240
|
-
end
|
|
1136
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?w=3' }
|
|
1241
1137
|
|
|
1242
1138
|
let(:client) do
|
|
1243
|
-
new_local_client_nmio(uri, option_name => { :
|
|
1139
|
+
new_local_client_nmio(uri, option_name => { w: 4 })
|
|
1244
1140
|
end
|
|
1245
1141
|
|
|
1246
1142
|
let(:expected_options) do
|
|
1247
|
-
Mongo::Options::Redacted.new(
|
|
1248
|
-
|
|
1249
|
-
|
|
1143
|
+
Mongo::Options::Redacted.new(
|
|
1144
|
+
option_name => { w: 4 },
|
|
1145
|
+
monitoring_io: false,
|
|
1146
|
+
database: 'testdb',
|
|
1147
|
+
retry_writes: true,
|
|
1148
|
+
retry_reads: true
|
|
1149
|
+
)
|
|
1250
1150
|
end
|
|
1251
1151
|
|
|
1252
1152
|
shared_examples_for 'allows explicit options to take preference' do
|
|
@@ -1269,14 +1169,8 @@ describe Mongo::Client do
|
|
|
1269
1169
|
end
|
|
1270
1170
|
|
|
1271
1171
|
context 'when a replica set name is provided' do
|
|
1272
|
-
|
|
1273
|
-
let
|
|
1274
|
-
'mongodb://127.0.0.1:27017/testdb?replicaSet=testing'
|
|
1275
|
-
end
|
|
1276
|
-
|
|
1277
|
-
let(:client) do
|
|
1278
|
-
new_local_client_nmio(uri)
|
|
1279
|
-
end
|
|
1172
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?replicaSet=testing' }
|
|
1173
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1280
1174
|
|
|
1281
1175
|
it 'sets the correct cluster topology' do
|
|
1282
1176
|
expect(client.cluster.topology).to be_a(Mongo::Cluster::Topology::ReplicaSetNoPrimary)
|
|
@@ -1286,295 +1180,262 @@ describe Mongo::Client do
|
|
|
1286
1180
|
|
|
1287
1181
|
context 'when Ruby options are provided' do
|
|
1288
1182
|
let(:client) do
|
|
1289
|
-
new_local_client_nmio(
|
|
1183
|
+
new_local_client_nmio(SINGLE_CLIENT, options)
|
|
1290
1184
|
end
|
|
1291
1185
|
|
|
1292
1186
|
describe 'connection option conflicts' do
|
|
1293
1187
|
context 'direct_connection: true and multiple seeds' do
|
|
1294
1188
|
let(:client) do
|
|
1295
|
-
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
|
|
1296
|
-
direct_connection: true)
|
|
1189
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], direct_connection: true)
|
|
1297
1190
|
end
|
|
1298
1191
|
|
|
1299
1192
|
it 'is rejected' do
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with multiple seeds/)
|
|
1193
|
+
expect { client }
|
|
1194
|
+
.to raise_error(ArgumentError, /direct_connection=true cannot be used with multiple seeds/)
|
|
1303
1195
|
end
|
|
1304
1196
|
end
|
|
1305
1197
|
|
|
1306
1198
|
context 'direct_connection: true and connect: :direct' do
|
|
1307
1199
|
let(:options) do
|
|
1308
|
-
{direct_connection: true, connect: :direct}
|
|
1200
|
+
{ direct_connection: true, connect: :direct }
|
|
1309
1201
|
end
|
|
1310
1202
|
|
|
1311
1203
|
it 'is accepted' do
|
|
1312
|
-
client.options[:direct_connection].
|
|
1313
|
-
client.options[:connect].
|
|
1204
|
+
expect(client.options[:direct_connection]).to be true
|
|
1205
|
+
expect(client.options[:connect]).to be :direct
|
|
1314
1206
|
end
|
|
1315
1207
|
end
|
|
1316
1208
|
|
|
1317
1209
|
context 'direct_connection: true and connect: :replica_set' do
|
|
1318
1210
|
let(:options) do
|
|
1319
|
-
{direct_connection: true, connect: :replica_set}
|
|
1211
|
+
{ direct_connection: true, connect: :replica_set }
|
|
1320
1212
|
end
|
|
1321
1213
|
|
|
1322
1214
|
it 'is rejected' do
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1215
|
+
expect { client }
|
|
1216
|
+
.to raise_error(
|
|
1217
|
+
ArgumentError,
|
|
1218
|
+
/Conflicting client options: direct_connection=true and connect=replica_set/
|
|
1219
|
+
)
|
|
1326
1220
|
end
|
|
1327
1221
|
end
|
|
1328
1222
|
|
|
1329
1223
|
context 'direct_connection: true and connect: :sharded' do
|
|
1330
1224
|
let(:options) do
|
|
1331
|
-
{direct_connection: true, connect: :sharded}
|
|
1225
|
+
{ direct_connection: true, connect: :sharded }
|
|
1332
1226
|
end
|
|
1333
1227
|
|
|
1334
1228
|
it 'is rejected' do
|
|
1335
|
-
|
|
1336
|
-
client
|
|
1337
|
-
end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=sharded/)
|
|
1229
|
+
expect { client }
|
|
1230
|
+
.to raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=sharded/)
|
|
1338
1231
|
end
|
|
1339
1232
|
end
|
|
1340
1233
|
|
|
1341
1234
|
context 'direct_connection: false and connect: :direct' do
|
|
1342
1235
|
let(:options) do
|
|
1343
|
-
{direct_connection: false, connect: :direct}
|
|
1236
|
+
{ direct_connection: false, connect: :direct }
|
|
1344
1237
|
end
|
|
1345
1238
|
|
|
1346
1239
|
it 'is rejected' do
|
|
1347
|
-
|
|
1348
|
-
client
|
|
1349
|
-
end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=false and connect=direct/)
|
|
1240
|
+
expect { client }
|
|
1241
|
+
.to raise_error(ArgumentError, /Conflicting client options: direct_connection=false and connect=direct/)
|
|
1350
1242
|
end
|
|
1351
1243
|
end
|
|
1352
1244
|
|
|
1353
1245
|
context 'direct_connection: false and connect: :replica_set' do
|
|
1354
1246
|
let(:options) do
|
|
1355
|
-
{direct_connection: false, connect: :replica_set, replica_set: 'foo'}
|
|
1247
|
+
{ direct_connection: false, connect: :replica_set, replica_set: 'foo' }
|
|
1356
1248
|
end
|
|
1357
1249
|
|
|
1358
1250
|
it 'is accepted' do
|
|
1359
|
-
client.options[:direct_connection].
|
|
1360
|
-
client.options[:connect].
|
|
1251
|
+
expect(client.options[:direct_connection]).to be false
|
|
1252
|
+
expect(client.options[:connect]).to be :replica_set
|
|
1361
1253
|
end
|
|
1362
1254
|
end
|
|
1363
1255
|
|
|
1364
1256
|
context 'direct_connection: false and connect: :sharded' do
|
|
1365
1257
|
let(:options) do
|
|
1366
|
-
{direct_connection: false, connect: :sharded}
|
|
1258
|
+
{ direct_connection: false, connect: :sharded }
|
|
1367
1259
|
end
|
|
1368
1260
|
|
|
1369
1261
|
it 'is accepted' do
|
|
1370
|
-
client.options[:direct_connection].
|
|
1371
|
-
client.options[:connect].
|
|
1262
|
+
expect(client.options[:direct_connection]).to be false
|
|
1263
|
+
expect(client.options[:connect]).to be :sharded
|
|
1372
1264
|
end
|
|
1373
1265
|
end
|
|
1374
1266
|
|
|
1375
1267
|
context 'load_balanced: true and multiple seeds' do
|
|
1376
1268
|
let(:client) do
|
|
1377
|
-
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
|
|
1378
|
-
load_balanced: true)
|
|
1269
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], load_balanced: true)
|
|
1379
1270
|
end
|
|
1380
1271
|
|
|
1381
1272
|
it 'is rejected' do
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
end.should raise_error(ArgumentError, /load_balanced=true cannot be used with multiple seeds/)
|
|
1273
|
+
expect { client }
|
|
1274
|
+
.to raise_error(ArgumentError, /load_balanced=true cannot be used with multiple seeds/)
|
|
1385
1275
|
end
|
|
1386
1276
|
end
|
|
1387
1277
|
|
|
1388
1278
|
context 'load_balanced: false and multiple seeds' do
|
|
1389
1279
|
let(:client) do
|
|
1390
|
-
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
|
|
1391
|
-
load_balanced: false)
|
|
1280
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], load_balanced: false)
|
|
1392
1281
|
end
|
|
1393
1282
|
|
|
1394
1283
|
it 'is accepted' do
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
end.should_not raise_error
|
|
1398
|
-
client.options[:load_balanced].should be false
|
|
1284
|
+
expect { client }.not_to raise_error
|
|
1285
|
+
expect(client.options[:load_balanced]).to be false
|
|
1399
1286
|
end
|
|
1400
1287
|
end
|
|
1401
1288
|
|
|
1402
1289
|
context 'load_balanced: true and direct_connection: true' do
|
|
1403
1290
|
let(:client) do
|
|
1404
|
-
new_local_client_nmio(
|
|
1405
|
-
load_balanced: true, direct_connection: true)
|
|
1291
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, direct_connection: true)
|
|
1406
1292
|
end
|
|
1407
1293
|
|
|
1408
1294
|
it 'is rejected' do
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with load_balanced=true/)
|
|
1295
|
+
expect { client }
|
|
1296
|
+
.to raise_error(ArgumentError, /direct_connection=true cannot be used with load_balanced=true/)
|
|
1412
1297
|
end
|
|
1413
1298
|
end
|
|
1414
1299
|
|
|
1415
1300
|
context 'load_balanced: true and direct_connection: false' do
|
|
1416
1301
|
let(:client) do
|
|
1417
|
-
new_local_client_nmio(
|
|
1418
|
-
load_balanced: true, direct_connection: false)
|
|
1302
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, direct_connection: false)
|
|
1419
1303
|
end
|
|
1420
1304
|
|
|
1421
1305
|
it 'is accepted' do
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
client.options[:load_balanced].should be true
|
|
1426
|
-
client.options[:direct_connection].should be false
|
|
1306
|
+
expect { client }.not_to raise_error
|
|
1307
|
+
expect(client.options[:load_balanced]).to be true
|
|
1308
|
+
expect(client.options[:direct_connection]).to be false
|
|
1427
1309
|
end
|
|
1428
1310
|
end
|
|
1429
1311
|
|
|
1430
1312
|
context 'load_balanced: false and direct_connection: true' do
|
|
1431
1313
|
let(:client) do
|
|
1432
|
-
new_local_client_nmio(
|
|
1433
|
-
load_balanced: false, direct_connection: true)
|
|
1314
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: false, direct_connection: true)
|
|
1434
1315
|
end
|
|
1435
1316
|
|
|
1436
1317
|
it 'is accepted' do
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
client.options[:load_balanced].should be false
|
|
1441
|
-
client.options[:direct_connection].should be true
|
|
1318
|
+
expect { client }.not_to raise_error
|
|
1319
|
+
expect(client.options[:load_balanced]).to be false
|
|
1320
|
+
expect(client.options[:direct_connection]).to be true
|
|
1442
1321
|
end
|
|
1443
1322
|
end
|
|
1444
1323
|
|
|
1445
|
-
[:direct, 'direct', :sharded, 'sharded'].each do |v|
|
|
1324
|
+
[ :direct, 'direct', :sharded, 'sharded' ].each do |v|
|
|
1446
1325
|
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1447
1326
|
let(:client) do
|
|
1448
|
-
new_local_client_nmio(
|
|
1449
|
-
load_balanced: true, connect: v)
|
|
1327
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
|
|
1450
1328
|
end
|
|
1451
1329
|
|
|
1452
1330
|
it 'is rejected' do
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
end.should raise_error(ArgumentError, /connect=#{v} cannot be used with load_balanced=true/)
|
|
1331
|
+
expect { client }
|
|
1332
|
+
.to raise_error(ArgumentError, /connect=#{v} cannot be used with load_balanced=true/)
|
|
1456
1333
|
end
|
|
1457
1334
|
end
|
|
1458
1335
|
end
|
|
1459
1336
|
|
|
1460
|
-
[nil].each do |v|
|
|
1337
|
+
[ nil ].each do |v|
|
|
1461
1338
|
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1462
1339
|
let(:client) do
|
|
1463
|
-
new_local_client_nmio(
|
|
1464
|
-
load_balanced: true, connect: v)
|
|
1340
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
|
|
1465
1341
|
end
|
|
1466
1342
|
|
|
1467
1343
|
it 'is accepted' do
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
client.options[:load_balanced].should be true
|
|
1472
|
-
client.options[:connect].should eq v
|
|
1344
|
+
expect { client }.not_to raise_error
|
|
1345
|
+
expect(client.options[:load_balanced]).to be true
|
|
1346
|
+
expect(client.options[:connect]).to eq v
|
|
1473
1347
|
end
|
|
1474
1348
|
end
|
|
1475
1349
|
end
|
|
1476
1350
|
|
|
1477
|
-
[:load_balanced, 'load_balanced'].each do |v|
|
|
1351
|
+
[ :load_balanced, 'load_balanced' ].each do |v|
|
|
1478
1352
|
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1479
1353
|
let(:client) do
|
|
1480
|
-
new_local_client_nmio(
|
|
1481
|
-
load_balanced: true, connect: v)
|
|
1354
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
|
|
1482
1355
|
end
|
|
1483
1356
|
|
|
1484
1357
|
it 'is accepted' do
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
client.options[:load_balanced].should be true
|
|
1489
|
-
client.options[:connect].should eq v
|
|
1358
|
+
expect { client }.not_to raise_error
|
|
1359
|
+
expect(client.options[:load_balanced]).to be true
|
|
1360
|
+
expect(client.options[:connect]).to eq v
|
|
1490
1361
|
end
|
|
1491
1362
|
end
|
|
1492
1363
|
|
|
1493
1364
|
context "replica_set and connect: #{v.inspect}" do
|
|
1494
1365
|
let(:client) do
|
|
1495
|
-
new_local_client_nmio(
|
|
1496
|
-
replica_set: 'foo', connect: v)
|
|
1366
|
+
new_local_client_nmio(SINGLE_CLIENT, replica_set: 'foo', connect: v)
|
|
1497
1367
|
end
|
|
1498
1368
|
|
|
1499
1369
|
it 'is rejected' do
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
end.should raise_error(ArgumentError, /connect=load_balanced cannot be used with replica_set option/)
|
|
1370
|
+
expect { client }
|
|
1371
|
+
.to raise_error(ArgumentError, /connect=load_balanced cannot be used with replica_set option/)
|
|
1503
1372
|
end
|
|
1504
1373
|
end
|
|
1505
1374
|
|
|
1506
1375
|
context "direct_connection=true and connect: #{v.inspect}" do
|
|
1507
1376
|
let(:client) do
|
|
1508
|
-
new_local_client_nmio(
|
|
1509
|
-
direct_connection: true, connect: v)
|
|
1377
|
+
new_local_client_nmio(SINGLE_CLIENT, direct_connection: true, connect: v)
|
|
1510
1378
|
end
|
|
1511
1379
|
|
|
1512
1380
|
it 'is rejected' do
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1381
|
+
expect { client }
|
|
1382
|
+
.to raise_error(
|
|
1383
|
+
ArgumentError,
|
|
1384
|
+
/Conflicting client options: direct_connection=true and connect=load_balanced/
|
|
1385
|
+
)
|
|
1516
1386
|
end
|
|
1517
1387
|
end
|
|
1518
1388
|
|
|
1519
1389
|
context "multiple seed addresses and connect: #{v.inspect}" do
|
|
1520
1390
|
let(:client) do
|
|
1521
|
-
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.1:1234'],
|
|
1522
|
-
connect: v)
|
|
1391
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.1:1234' ], connect: v)
|
|
1523
1392
|
end
|
|
1524
1393
|
|
|
1525
1394
|
it 'is rejected' do
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
end.should raise_error(ArgumentError, /connect=load_balanced cannot be used with multiple seeds/)
|
|
1395
|
+
expect { client }
|
|
1396
|
+
.to raise_error(ArgumentError, /connect=load_balanced cannot be used with multiple seeds/)
|
|
1529
1397
|
end
|
|
1530
1398
|
end
|
|
1531
1399
|
end
|
|
1532
1400
|
|
|
1533
|
-
[:replica_set, 'replica_set'].each do |v|
|
|
1401
|
+
[ :replica_set, 'replica_set' ].each do |v|
|
|
1534
1402
|
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1535
1403
|
let(:client) do
|
|
1536
|
-
new_local_client_nmio(
|
|
1537
|
-
load_balanced: true, connect: v, replica_set: 'x')
|
|
1404
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v, replica_set: 'x')
|
|
1538
1405
|
end
|
|
1539
1406
|
|
|
1540
1407
|
it 'is rejected' do
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
end.should raise_error(ArgumentError, /connect=replica_set cannot be used with load_balanced=true/)
|
|
1408
|
+
expect { client }
|
|
1409
|
+
.to raise_error(ArgumentError, /connect=replica_set cannot be used with load_balanced=true/)
|
|
1544
1410
|
end
|
|
1545
1411
|
end
|
|
1546
1412
|
|
|
1547
1413
|
context "load_balanced: true and #{v.inspect} option" do
|
|
1548
1414
|
let(:client) do
|
|
1549
|
-
new_local_client_nmio(
|
|
1550
|
-
load_balanced: true, v => 'rs')
|
|
1415
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, v => 'rs')
|
|
1551
1416
|
end
|
|
1552
1417
|
|
|
1553
1418
|
it 'is rejected' do
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
end.should raise_error(ArgumentError, /load_balanced=true cannot be used with replica_set option/)
|
|
1419
|
+
expect { client }
|
|
1420
|
+
.to raise_error(ArgumentError, /load_balanced=true cannot be used with replica_set option/)
|
|
1557
1421
|
end
|
|
1558
1422
|
end
|
|
1559
1423
|
end
|
|
1560
1424
|
|
|
1561
1425
|
context 'srv_max_hosts > 0 and load_balanced: true' do
|
|
1562
1426
|
let(:client) do
|
|
1563
|
-
new_local_client_nmio(
|
|
1564
|
-
srv_max_hosts: 1, load_balanced: true)
|
|
1427
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1, load_balanced: true)
|
|
1565
1428
|
end
|
|
1566
1429
|
|
|
1567
1430
|
it 'it is rejected' do
|
|
1568
|
-
expect
|
|
1569
|
-
|
|
1570
|
-
end.to raise_error(ArgumentError, /:srv_max_hosts > 0 cannot be used with :load_balanced=true/)
|
|
1431
|
+
expect { client }
|
|
1432
|
+
.to raise_error(ArgumentError, /:srv_max_hosts > 0 cannot be used with :load_balanced=true/)
|
|
1571
1433
|
end
|
|
1572
1434
|
end
|
|
1573
1435
|
|
|
1574
1436
|
context 'srv_max_hosts > 0 and replica_set' do
|
|
1575
1437
|
let(:client) do
|
|
1576
|
-
new_local_client_nmio(
|
|
1577
|
-
srv_max_hosts: 1, replica_set: 'rs')
|
|
1438
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1, replica_set: 'rs')
|
|
1578
1439
|
end
|
|
1579
1440
|
|
|
1580
1441
|
it 'it is rejected' do
|
|
@@ -1586,55 +1447,45 @@ describe Mongo::Client do
|
|
|
1586
1447
|
|
|
1587
1448
|
context 'srv_max_hosts < 0' do
|
|
1588
1449
|
let(:client) do
|
|
1589
|
-
new_local_client_nmio(
|
|
1590
|
-
srv_max_hosts: -1)
|
|
1450
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: -1)
|
|
1591
1451
|
end
|
|
1592
1452
|
|
|
1593
1453
|
it 'is accepted and does not add the srv_max_hosts to uri_options' do
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
end.should_not raise_error
|
|
1597
|
-
expect(client.options).to_not have_key(:srv_max_hosts)
|
|
1454
|
+
expect { client }.not_to raise_error
|
|
1455
|
+
expect(client.options).not_to have_key(:srv_max_hosts)
|
|
1598
1456
|
end
|
|
1599
1457
|
end
|
|
1600
1458
|
|
|
1601
1459
|
context 'srv_max_hosts invalid type' do
|
|
1602
1460
|
let(:client) do
|
|
1603
|
-
new_local_client_nmio(
|
|
1604
|
-
srv_max_hosts: 'foo')
|
|
1461
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 'foo')
|
|
1605
1462
|
end
|
|
1606
1463
|
|
|
1607
1464
|
it 'is accepted and does not add the srv_max_hosts to uri_options' do
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
end.should_not raise_error
|
|
1611
|
-
expect(client.options).to_not have_key(:srv_max_hosts)
|
|
1465
|
+
expect { client }.not_to raise_error
|
|
1466
|
+
expect(client.options).not_to have_key(:srv_max_hosts)
|
|
1612
1467
|
end
|
|
1613
1468
|
end
|
|
1614
1469
|
|
|
1615
1470
|
context 'srv_max_hosts with non-SRV URI' do
|
|
1616
1471
|
let(:client) do
|
|
1617
|
-
new_local_client_nmio(
|
|
1618
|
-
srv_max_hosts: 1)
|
|
1472
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1)
|
|
1619
1473
|
end
|
|
1620
1474
|
|
|
1621
1475
|
it 'is rejected' do
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
end.should raise_error(ArgumentError, /:srv_max_hosts cannot be used on non-SRV URI/)
|
|
1476
|
+
expect { client }
|
|
1477
|
+
.to raise_error(ArgumentError, /:srv_max_hosts cannot be used on non-SRV URI/)
|
|
1625
1478
|
end
|
|
1626
1479
|
end
|
|
1627
1480
|
|
|
1628
1481
|
context 'srv_service_name with non-SRV URI' do
|
|
1629
1482
|
let(:client) do
|
|
1630
|
-
new_local_client_nmio(
|
|
1631
|
-
srv_service_name: "customname")
|
|
1483
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_service_name: 'customname')
|
|
1632
1484
|
end
|
|
1633
1485
|
|
|
1634
1486
|
it 'is rejected' do
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
end.should raise_error(ArgumentError, /:srv_service_name cannot be used on non-SRV URI/)
|
|
1487
|
+
expect { client }
|
|
1488
|
+
.to raise_error(ArgumentError, /:srv_service_name cannot be used on non-SRV URI/)
|
|
1638
1489
|
end
|
|
1639
1490
|
end
|
|
1640
1491
|
end
|
|
@@ -1644,7 +1495,8 @@ describe Mongo::Client do
|
|
|
1644
1495
|
double('srv result').tap do |result|
|
|
1645
1496
|
allow(result).to receive(:empty?).and_return(false)
|
|
1646
1497
|
allow(result).to receive(:address_strs).and_return(
|
|
1647
|
-
[ClusterConfig.instance.primary_address_str]
|
|
1498
|
+
[ ClusterConfig.instance.primary_address_str ]
|
|
1499
|
+
)
|
|
1648
1500
|
end
|
|
1649
1501
|
end
|
|
1650
1502
|
|
|
@@ -1655,79 +1507,77 @@ describe Mongo::Client do
|
|
|
1655
1507
|
new_local_client_nmio('mongodb+srv://foo.a.b', options)
|
|
1656
1508
|
end
|
|
1657
1509
|
|
|
1658
|
-
context
|
|
1510
|
+
context 'when setting srv_max_hosts' do
|
|
1659
1511
|
let(:srv_max_hosts) { 1 }
|
|
1660
1512
|
let(:options) { { srv_max_hosts: srv_max_hosts } }
|
|
1661
1513
|
|
|
1662
1514
|
it 'is accepted and sets srv_max_hosts' do
|
|
1663
|
-
|
|
1664
|
-
client
|
|
1665
|
-
end.should_not raise_error
|
|
1515
|
+
expect { client }.not_to raise_error
|
|
1666
1516
|
expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
|
|
1667
1517
|
end
|
|
1668
1518
|
end
|
|
1669
1519
|
|
|
1670
|
-
context
|
|
1520
|
+
context 'when setting srv_max_hosts to 0' do
|
|
1671
1521
|
let(:srv_max_hosts) { 0 }
|
|
1672
1522
|
let(:options) { { srv_max_hosts: srv_max_hosts } }
|
|
1673
1523
|
|
|
1674
1524
|
it 'is accepted sets srv_max_hosts' do
|
|
1675
|
-
|
|
1676
|
-
client
|
|
1677
|
-
end.should_not raise_error
|
|
1525
|
+
expect { client }.not_to raise_error
|
|
1678
1526
|
expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
|
|
1679
1527
|
end
|
|
1680
1528
|
end
|
|
1681
1529
|
|
|
1682
|
-
context
|
|
1530
|
+
context 'when setting srv_service_name' do
|
|
1683
1531
|
let(:srv_service_name) { 'customname' }
|
|
1684
1532
|
let(:options) { { srv_service_name: srv_service_name } }
|
|
1685
1533
|
|
|
1686
1534
|
it 'is accepted and sets srv_service_name' do
|
|
1687
|
-
|
|
1688
|
-
client
|
|
1689
|
-
end.should_not raise_error
|
|
1535
|
+
expect { client }.not_to raise_error
|
|
1690
1536
|
expect(client.options[:srv_service_name]).to eq(srv_service_name)
|
|
1691
1537
|
end
|
|
1692
1538
|
end
|
|
1693
1539
|
end
|
|
1694
1540
|
|
|
1695
1541
|
context ':bg_error_backtrace option' do
|
|
1696
|
-
[true, false, nil, 42].each do |valid_value|
|
|
1542
|
+
[ true, false, nil, 42 ].each do |valid_value|
|
|
1697
1543
|
context "valid value: #{valid_value.inspect}" do
|
|
1698
1544
|
let(:options) do
|
|
1699
|
-
{bg_error_backtrace: valid_value}
|
|
1545
|
+
{ bg_error_backtrace: valid_value }
|
|
1700
1546
|
end
|
|
1701
1547
|
|
|
1702
1548
|
it 'is accepted' do
|
|
1703
|
-
client.options[:bg_error_backtrace].
|
|
1549
|
+
expect(client.options[:bg_error_backtrace]).to be == valid_value
|
|
1704
1550
|
end
|
|
1705
1551
|
end
|
|
1706
1552
|
end
|
|
1707
1553
|
|
|
1708
1554
|
context 'invalid value type' do
|
|
1709
1555
|
let(:options) do
|
|
1710
|
-
{bg_error_backtrace: 'yes'}
|
|
1556
|
+
{ bg_error_backtrace: 'yes' }
|
|
1711
1557
|
end
|
|
1712
1558
|
|
|
1713
1559
|
it 'is rejected' do
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1560
|
+
expect { client }
|
|
1561
|
+
.to raise_error(
|
|
1562
|
+
ArgumentError,
|
|
1563
|
+
/:bg_error_backtrace option value must be true, false, nil or a positive integer/
|
|
1564
|
+
)
|
|
1717
1565
|
end
|
|
1718
1566
|
end
|
|
1719
1567
|
|
|
1720
1568
|
context 'invalid value' do
|
|
1721
|
-
[0, -1, 42.0].each do |invalid_value|
|
|
1569
|
+
[ 0, -1, 42.0 ].each do |invalid_value|
|
|
1722
1570
|
context "invalid value: #{invalid_value.inspect}" do
|
|
1723
1571
|
let(:options) do
|
|
1724
|
-
{bg_error_backtrace: invalid_value}
|
|
1572
|
+
{ bg_error_backtrace: invalid_value }
|
|
1725
1573
|
end
|
|
1726
1574
|
|
|
1727
1575
|
it 'is rejected' do
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1576
|
+
expect { client }
|
|
1577
|
+
.to raise_error(
|
|
1578
|
+
ArgumentError,
|
|
1579
|
+
/:bg_error_backtrace option value must be true, false, nil or a positive integer/
|
|
1580
|
+
)
|
|
1731
1581
|
end
|
|
1732
1582
|
end
|
|
1733
1583
|
end
|
|
@@ -1735,32 +1585,30 @@ describe Mongo::Client do
|
|
|
1735
1585
|
end
|
|
1736
1586
|
|
|
1737
1587
|
describe ':read option' do
|
|
1738
|
-
[
|
|
1739
|
-
|
|
1740
|
-
].each do |sym|
|
|
1741
|
-
describe "#{sym}" do
|
|
1588
|
+
%i[ primary primary_preferred secondary secondary_preferred nearest ].each do |sym|
|
|
1589
|
+
describe sym.to_s do
|
|
1742
1590
|
context 'when given as symbol' do
|
|
1743
1591
|
let(:options) do
|
|
1744
|
-
{read: {mode: sym}}
|
|
1592
|
+
{ read: { mode: sym } }
|
|
1745
1593
|
end
|
|
1746
1594
|
|
|
1747
|
-
it
|
|
1595
|
+
it 'is accepted' do
|
|
1748
1596
|
# the key got converted to a string here
|
|
1749
|
-
expect(client.read_preference).to eq({'mode' => sym})
|
|
1597
|
+
expect(client.read_preference).to eq({ 'mode' => sym })
|
|
1750
1598
|
end
|
|
1751
1599
|
end
|
|
1752
1600
|
|
|
1753
1601
|
context 'when given as string' do
|
|
1754
1602
|
let(:options) do
|
|
1755
|
-
{read: {mode: sym.to_s}}
|
|
1603
|
+
{ read: { mode: sym.to_s } }
|
|
1756
1604
|
end
|
|
1757
1605
|
|
|
1758
1606
|
# string keys are not documented as being allowed
|
|
1759
1607
|
# but the code accepts them
|
|
1760
|
-
it
|
|
1608
|
+
it 'is accepted' do
|
|
1761
1609
|
# the key got converted to a string here
|
|
1762
1610
|
# the value remains a string
|
|
1763
|
-
expect(client.read_preference).to eq({'mode' => sym.to_s})
|
|
1611
|
+
expect(client.read_preference).to eq({ 'mode' => sym.to_s })
|
|
1764
1612
|
end
|
|
1765
1613
|
end
|
|
1766
1614
|
end
|
|
@@ -1771,30 +1619,41 @@ describe Mongo::Client do
|
|
|
1771
1619
|
|
|
1772
1620
|
it 'rejects bogus read preference as symbol' do
|
|
1773
1621
|
expect do
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1622
|
+
new_local_client_nmio(SINGLE_CLIENT, read: { mode: :bogus })
|
|
1623
|
+
end.to raise_error(
|
|
1624
|
+
Mongo::Error::InvalidReadOption,
|
|
1625
|
+
'Invalid read preference value: {"mode"=>:bogus}: ' \
|
|
1626
|
+
'mode bogus is not one of recognized modes'
|
|
1627
|
+
)
|
|
1777
1628
|
end
|
|
1778
1629
|
|
|
1779
1630
|
it 'rejects bogus read preference as string' do
|
|
1780
1631
|
expect do
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1632
|
+
new_local_client_nmio(SINGLE_CLIENT, read: { mode: 'bogus' })
|
|
1633
|
+
end.to raise_error(
|
|
1634
|
+
Mongo::Error::InvalidReadOption,
|
|
1635
|
+
'Invalid read preference value: {"mode"=>"bogus"}: mode bogus is not one of recognized modes'
|
|
1636
|
+
)
|
|
1784
1637
|
end
|
|
1785
1638
|
|
|
1786
1639
|
it 'rejects read option specified as a string' do
|
|
1787
1640
|
expect do
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1641
|
+
new_local_client_nmio(SINGLE_CLIENT, read: 'primary')
|
|
1642
|
+
end.to raise_error(
|
|
1643
|
+
Mongo::Error::InvalidReadOption,
|
|
1644
|
+
'Invalid read preference value: "primary": ' \
|
|
1645
|
+
'the read preference must be specified as a hash: { mode: "primary" }'
|
|
1646
|
+
)
|
|
1791
1647
|
end
|
|
1792
1648
|
|
|
1793
1649
|
it 'rejects read option specified as a symbol' do
|
|
1794
1650
|
expect do
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1651
|
+
new_local_client_nmio(SINGLE_CLIENT, read: :primary)
|
|
1652
|
+
end.to raise_error(
|
|
1653
|
+
Mongo::Error::InvalidReadOption,
|
|
1654
|
+
'Invalid read preference value: :primary: ' \
|
|
1655
|
+
'the read preference must be specified as a hash: { mode: :primary }'
|
|
1656
|
+
)
|
|
1798
1657
|
end
|
|
1799
1658
|
end
|
|
1800
1659
|
end
|
|
@@ -1808,7 +1667,7 @@ describe Mongo::Client do
|
|
|
1808
1667
|
end
|
|
1809
1668
|
|
|
1810
1669
|
it 'does not warn' do
|
|
1811
|
-
expect(Mongo::Logger.logger).
|
|
1670
|
+
expect(Mongo::Logger.logger).not_to receive(:warn)
|
|
1812
1671
|
new_local_client_nmio(SpecConfig.instance.addresses, options)
|
|
1813
1672
|
end
|
|
1814
1673
|
end
|
|
@@ -1834,15 +1693,17 @@ describe Mongo::Client do
|
|
|
1834
1693
|
it 'raises an exception' do
|
|
1835
1694
|
expect do
|
|
1836
1695
|
new_local_client_nmio(SpecConfig.instance.addresses, options)
|
|
1837
|
-
end.to raise_error(
|
|
1696
|
+
end.to raise_error(
|
|
1697
|
+
Mongo::Error::InvalidReadConcern,
|
|
1698
|
+
'The after_cluster_time read_concern option cannot be specified by the user'
|
|
1699
|
+
)
|
|
1838
1700
|
end
|
|
1839
1701
|
end
|
|
1840
1702
|
end
|
|
1841
1703
|
|
|
1842
1704
|
context 'when an invalid option is provided' do
|
|
1843
|
-
|
|
1844
1705
|
let(:options) do
|
|
1845
|
-
{ssl: false, invalid: :test}
|
|
1706
|
+
{ ssl: false, invalid: :test }
|
|
1846
1707
|
end
|
|
1847
1708
|
|
|
1848
1709
|
it 'does not set the option' do
|
|
@@ -1861,9 +1722,8 @@ describe Mongo::Client do
|
|
|
1861
1722
|
|
|
1862
1723
|
=begin WriteConcern object support
|
|
1863
1724
|
context 'when write concern is provided via a WriteConcern object' do
|
|
1864
|
-
|
|
1865
1725
|
let(:options) do
|
|
1866
|
-
{write_concern: wc}
|
|
1726
|
+
{ write_concern: wc }
|
|
1867
1727
|
end
|
|
1868
1728
|
|
|
1869
1729
|
let(:wc) { Mongo::WriteConcern.get(w: 2) }
|
|
@@ -1881,52 +1741,52 @@ describe Mongo::Client do
|
|
|
1881
1741
|
|
|
1882
1742
|
context ':wrapping_libraries option' do
|
|
1883
1743
|
let(:options) do
|
|
1884
|
-
{wrapping_libraries: wrapping_libraries}
|
|
1744
|
+
{ wrapping_libraries: wrapping_libraries }
|
|
1885
1745
|
end
|
|
1886
1746
|
|
|
1887
1747
|
context 'valid input' do
|
|
1888
1748
|
context 'symbol keys' do
|
|
1889
1749
|
let(:wrapping_libraries) do
|
|
1890
|
-
[name: 'Mongoid', version: '7.1.2'].freeze
|
|
1750
|
+
[ { name: 'Mongoid', version: '7.1.2' } ].freeze
|
|
1891
1751
|
end
|
|
1892
1752
|
|
|
1893
1753
|
it 'works' do
|
|
1894
|
-
client.options[:wrapping_libraries].
|
|
1754
|
+
expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
|
|
1895
1755
|
end
|
|
1896
1756
|
end
|
|
1897
1757
|
|
|
1898
1758
|
context 'string keys' do
|
|
1899
1759
|
let(:wrapping_libraries) do
|
|
1900
|
-
['name' => 'Mongoid', 'version' => '7.1.2'].freeze
|
|
1760
|
+
[ { 'name' => 'Mongoid', 'version' => '7.1.2' } ].freeze
|
|
1901
1761
|
end
|
|
1902
1762
|
|
|
1903
1763
|
it 'works' do
|
|
1904
|
-
client.options[:wrapping_libraries].
|
|
1764
|
+
expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
|
|
1905
1765
|
end
|
|
1906
1766
|
end
|
|
1907
1767
|
|
|
1908
1768
|
context 'Redacted keys' do
|
|
1909
1769
|
let(:wrapping_libraries) do
|
|
1910
|
-
[Mongo::Options::Redacted.new(name: 'Mongoid', version: '7.1.2')].freeze
|
|
1770
|
+
[ Mongo::Options::Redacted.new(name: 'Mongoid', version: '7.1.2') ].freeze
|
|
1911
1771
|
end
|
|
1912
1772
|
|
|
1913
1773
|
it 'works' do
|
|
1914
|
-
client.options[:wrapping_libraries].
|
|
1774
|
+
expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
|
|
1915
1775
|
end
|
|
1916
1776
|
end
|
|
1917
1777
|
|
|
1918
1778
|
context 'two libraries' do
|
|
1919
1779
|
let(:wrapping_libraries) do
|
|
1920
1780
|
[
|
|
1921
|
-
{name: 'Mongoid', version: '7.1.2'},
|
|
1922
|
-
{name: 'Rails', version: '4.0', platform: 'Foobar'},
|
|
1781
|
+
{ name: 'Mongoid', version: '7.1.2' },
|
|
1782
|
+
{ name: 'Rails', version: '4.0', platform: 'Foobar' },
|
|
1923
1783
|
].freeze
|
|
1924
1784
|
end
|
|
1925
1785
|
|
|
1926
1786
|
it 'works' do
|
|
1927
|
-
client.options[:wrapping_libraries].
|
|
1928
|
-
{'name' => 'Mongoid', 'version' => '7.1.2'},
|
|
1929
|
-
{'name' => 'Rails', 'version' => '4.0', 'platform' => 'Foobar'},
|
|
1787
|
+
expect(client.options[:wrapping_libraries]).to be == [
|
|
1788
|
+
{ 'name' => 'Mongoid', 'version' => '7.1.2' },
|
|
1789
|
+
{ 'name' => 'Rails', 'version' => '4.0', 'platform' => 'Foobar' },
|
|
1930
1790
|
]
|
|
1931
1791
|
end
|
|
1932
1792
|
end
|
|
@@ -1937,7 +1797,7 @@ describe Mongo::Client do
|
|
|
1937
1797
|
end
|
|
1938
1798
|
|
|
1939
1799
|
it 'works' do
|
|
1940
|
-
client.options[:wrapping_libraries].
|
|
1800
|
+
expect(client.options[:wrapping_libraries]).to be == []
|
|
1941
1801
|
end
|
|
1942
1802
|
end
|
|
1943
1803
|
|
|
@@ -1947,7 +1807,7 @@ describe Mongo::Client do
|
|
|
1947
1807
|
end
|
|
1948
1808
|
|
|
1949
1809
|
it 'works' do
|
|
1950
|
-
client.options[:wrapping_libraries].
|
|
1810
|
+
expect(client.options[:wrapping_libraries]).to be_nil
|
|
1951
1811
|
end
|
|
1952
1812
|
end
|
|
1953
1813
|
end
|
|
@@ -1955,37 +1815,34 @@ describe Mongo::Client do
|
|
|
1955
1815
|
context 'valid input' do
|
|
1956
1816
|
context 'hash given instead of an array' do
|
|
1957
1817
|
let(:wrapping_libraries) do
|
|
1958
|
-
{name: 'Mongoid', version: '7.1.2'}.freeze
|
|
1818
|
+
{ name: 'Mongoid', version: '7.1.2' }.freeze
|
|
1959
1819
|
end
|
|
1960
1820
|
|
|
1961
1821
|
it 'is rejected' do
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
end.should raise_error(ArgumentError, /:wrapping_libraries must be an array of hashes/)
|
|
1822
|
+
expect { client }
|
|
1823
|
+
.to raise_error(ArgumentError, /:wrapping_libraries must be an array of hashes/)
|
|
1965
1824
|
end
|
|
1966
1825
|
end
|
|
1967
1826
|
|
|
1968
1827
|
context 'invalid keys' do
|
|
1969
1828
|
let(:wrapping_libraries) do
|
|
1970
|
-
[name: 'Mongoid', invalid: '7.1.2'].freeze
|
|
1829
|
+
[ { name: 'Mongoid', invalid: '7.1.2' } ].freeze
|
|
1971
1830
|
end
|
|
1972
1831
|
|
|
1973
1832
|
it 'is rejected' do
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
end.should raise_error(ArgumentError, /:wrapping_libraries element has invalid keys/)
|
|
1833
|
+
expect { client }
|
|
1834
|
+
.to raise_error(ArgumentError, /:wrapping_libraries element has invalid keys/)
|
|
1977
1835
|
end
|
|
1978
1836
|
end
|
|
1979
1837
|
|
|
1980
1838
|
context 'value includes |' do
|
|
1981
1839
|
let(:wrapping_libraries) do
|
|
1982
|
-
[name: 'Mongoid|on|Rails', version: '7.1.2'].freeze
|
|
1840
|
+
[ { name: 'Mongoid|on|Rails', version: '7.1.2' } ].freeze
|
|
1983
1841
|
end
|
|
1984
1842
|
|
|
1985
1843
|
it 'is rejected' do
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
end.should raise_error(ArgumentError, /:wrapping_libraries element value cannot include '|'/)
|
|
1844
|
+
expect { client }
|
|
1845
|
+
.to raise_error(ArgumentError, /:wrapping_libraries element value cannot include '|'/)
|
|
1989
1846
|
end
|
|
1990
1847
|
end
|
|
1991
1848
|
end
|
|
@@ -1993,12 +1850,10 @@ describe Mongo::Client do
|
|
|
1993
1850
|
|
|
1994
1851
|
context ':auth_mech_properties option' do
|
|
1995
1852
|
context 'is nil' do
|
|
1996
|
-
let(:options)
|
|
1997
|
-
{auth_mech_properties: nil}
|
|
1998
|
-
end
|
|
1853
|
+
let(:options) { { auth_mech_properties: nil } }
|
|
1999
1854
|
|
|
2000
1855
|
it 'creates the client without the option' do
|
|
2001
|
-
client.options.
|
|
1856
|
+
expect(client.options).not_to have_key(:auth_mech_properties)
|
|
2002
1857
|
end
|
|
2003
1858
|
end
|
|
2004
1859
|
end
|
|
@@ -2007,15 +1862,17 @@ describe Mongo::Client do
|
|
|
2007
1862
|
context 'is a hash with symbol keys' do
|
|
2008
1863
|
context 'using known keys' do
|
|
2009
1864
|
let(:options) do
|
|
2010
|
-
{
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
1865
|
+
{
|
|
1866
|
+
server_api: {
|
|
1867
|
+
version: '1',
|
|
1868
|
+
strict: true,
|
|
1869
|
+
deprecation_errors: false,
|
|
1870
|
+
}
|
|
1871
|
+
}
|
|
2015
1872
|
end
|
|
2016
1873
|
|
|
2017
1874
|
it 'is accepted' do
|
|
2018
|
-
client.options[:server_api].
|
|
1875
|
+
expect(client.options[:server_api]).to be == {
|
|
2019
1876
|
'version' => '1',
|
|
2020
1877
|
'strict' => true,
|
|
2021
1878
|
'deprecation_errors' => false,
|
|
@@ -2025,41 +1882,34 @@ describe Mongo::Client do
|
|
|
2025
1882
|
|
|
2026
1883
|
context 'using an unknown version' do
|
|
2027
1884
|
let(:options) do
|
|
2028
|
-
{server_api: {
|
|
2029
|
-
version: '42',
|
|
2030
|
-
}}
|
|
1885
|
+
{ server_api: { version: '42' } }
|
|
2031
1886
|
end
|
|
2032
1887
|
|
|
2033
1888
|
it 'is rejected' do
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
end.should raise_error(ArgumentError, 'Unknown server API version: 42')
|
|
1889
|
+
expect { client }
|
|
1890
|
+
.to raise_error(ArgumentError, 'Unknown server API version: 42')
|
|
2037
1891
|
end
|
|
2038
1892
|
end
|
|
2039
1893
|
|
|
2040
1894
|
context 'using an unknown option' do
|
|
2041
1895
|
let(:options) do
|
|
2042
|
-
{server_api: {
|
|
2043
|
-
vversion: '1',
|
|
2044
|
-
}}
|
|
1896
|
+
{ server_api: { vversion: '1' } }
|
|
2045
1897
|
end
|
|
2046
1898
|
|
|
2047
1899
|
it 'is rejected' do
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
end.should raise_error(ArgumentError, 'Unknown keys under :server_api: "vversion"')
|
|
1900
|
+
expect { client }
|
|
1901
|
+
.to raise_error(ArgumentError, 'Unknown keys under :server_api: "vversion"')
|
|
2051
1902
|
end
|
|
2052
1903
|
end
|
|
2053
1904
|
|
|
2054
1905
|
context 'using a value which is not a hash' do
|
|
2055
1906
|
let(:options) do
|
|
2056
|
-
{server_api: 42}
|
|
1907
|
+
{ server_api: 42 }
|
|
2057
1908
|
end
|
|
2058
1909
|
|
|
2059
1910
|
it 'is rejected' do
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
end.should raise_error(ArgumentError, ':server_api value must be a hash: 42')
|
|
1911
|
+
expect { client }
|
|
1912
|
+
.to raise_error(ArgumentError, ':server_api value must be a hash: 42')
|
|
2063
1913
|
end
|
|
2064
1914
|
end
|
|
2065
1915
|
end
|
|
@@ -2068,16 +1918,18 @@ describe Mongo::Client do
|
|
|
2068
1918
|
max_server_version '3.4'
|
|
2069
1919
|
|
|
2070
1920
|
let(:options) do
|
|
2071
|
-
{server_api: {version: 1}}
|
|
1921
|
+
{ server_api: { version: 1 } }
|
|
2072
1922
|
end
|
|
2073
1923
|
|
|
2074
1924
|
let(:client) do
|
|
2075
|
-
new_local_client(
|
|
2076
|
-
SpecConfig.instance.
|
|
1925
|
+
new_local_client(
|
|
1926
|
+
SpecConfig.instance.addresses,
|
|
1927
|
+
SpecConfig.instance.all_test_options.merge(options)
|
|
1928
|
+
)
|
|
2077
1929
|
end
|
|
2078
1930
|
|
|
2079
1931
|
it 'constructs the client' do
|
|
2080
|
-
client.
|
|
1932
|
+
expect(client).to be_a(described_class)
|
|
2081
1933
|
end
|
|
2082
1934
|
|
|
2083
1935
|
it 'does not discover servers' do
|
|
@@ -2087,9 +1939,8 @@ describe Mongo::Client do
|
|
|
2087
1939
|
end
|
|
2088
1940
|
|
|
2089
1941
|
it 'fails operations' do
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
end.should raise_error(Mongo::Error::NoServerAvailable)
|
|
1942
|
+
expect { client.command(ping: 1) }
|
|
1943
|
+
.to raise_error(Mongo::Error::NoServerAvailable)
|
|
2093
1944
|
end
|
|
2094
1945
|
end
|
|
2095
1946
|
end
|
|
@@ -2099,9 +1950,9 @@ describe Mongo::Client do
|
|
|
2099
1950
|
context 'when the block doesn\'t raise an error' do
|
|
2100
1951
|
let(:block_client) do
|
|
2101
1952
|
c = nil
|
|
2102
|
-
|
|
1953
|
+
described_class.new(
|
|
2103
1954
|
SpecConfig.instance.addresses,
|
|
2104
|
-
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
1955
|
+
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
2105
1956
|
) do |client|
|
|
2106
1957
|
c = client
|
|
2107
1958
|
end
|
|
@@ -2109,55 +1960,112 @@ describe Mongo::Client do
|
|
|
2109
1960
|
end
|
|
2110
1961
|
|
|
2111
1962
|
it 'is closed after block' do
|
|
2112
|
-
expect(block_client.cluster.connected?).to
|
|
1963
|
+
expect(block_client.cluster.connected?).to be false
|
|
1964
|
+
end
|
|
1965
|
+
|
|
1966
|
+
context 'with auto encryption options' do
|
|
1967
|
+
require_libmongocrypt
|
|
1968
|
+
min_server_fcv '4.2'
|
|
1969
|
+
require_enterprise
|
|
1970
|
+
clean_slate
|
|
1971
|
+
|
|
1972
|
+
include_context 'define shared FLE helpers'
|
|
1973
|
+
include_context 'with local kms_providers'
|
|
1974
|
+
|
|
1975
|
+
let(:auto_encryption_options) do
|
|
1976
|
+
{
|
|
1977
|
+
key_vault_client: key_vault_client,
|
|
1978
|
+
key_vault_namespace: key_vault_namespace,
|
|
1979
|
+
kms_providers: kms_providers,
|
|
1980
|
+
schema_map: schema_map,
|
|
1981
|
+
extra_options: extra_options,
|
|
1982
|
+
}
|
|
1983
|
+
end
|
|
1984
|
+
|
|
1985
|
+
let(:key_vault_client) { new_local_client_nmio(SpecConfig.instance.addresses) }
|
|
1986
|
+
|
|
1987
|
+
let(:block_client) do
|
|
1988
|
+
c = nil
|
|
1989
|
+
described_class.new(
|
|
1990
|
+
SpecConfig.instance.addresses,
|
|
1991
|
+
SpecConfig.instance.test_options.merge(
|
|
1992
|
+
auto_encryption_options: auto_encryption_options,
|
|
1993
|
+
database: SpecConfig.instance.test_db
|
|
1994
|
+
)
|
|
1995
|
+
) do |client|
|
|
1996
|
+
c = client
|
|
1997
|
+
end
|
|
1998
|
+
c
|
|
1999
|
+
end
|
|
2000
|
+
|
|
2001
|
+
it 'closes all clients after block' do
|
|
2002
|
+
expect(block_client.cluster.connected?).to be false
|
|
2003
|
+
[
|
|
2004
|
+
block_client.encrypter.mongocryptd_client,
|
|
2005
|
+
block_client.encrypter.key_vault_client,
|
|
2006
|
+
block_client.encrypter.metadata_client
|
|
2007
|
+
].each do |crypt_client|
|
|
2008
|
+
expect(crypt_client.cluster.connected?).to be false
|
|
2009
|
+
end
|
|
2010
|
+
end
|
|
2113
2011
|
end
|
|
2114
2012
|
end
|
|
2115
2013
|
|
|
2116
2014
|
context 'when the block raises an error' do
|
|
2117
|
-
it '
|
|
2015
|
+
it 'is closed after the block' do
|
|
2118
2016
|
block_client_raise = nil
|
|
2119
2017
|
expect do
|
|
2120
|
-
|
|
2018
|
+
described_class.new(
|
|
2121
2019
|
SpecConfig.instance.addresses,
|
|
2122
|
-
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
2020
|
+
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
2123
2021
|
) do |client|
|
|
2124
2022
|
block_client_raise = client
|
|
2125
|
-
raise
|
|
2023
|
+
raise 'This is an error!'
|
|
2126
2024
|
end
|
|
2127
|
-
end.to raise_error(StandardError,
|
|
2128
|
-
expect(block_client_raise.cluster.connected?).to
|
|
2025
|
+
end.to raise_error(StandardError, 'This is an error!')
|
|
2026
|
+
expect(block_client_raise.cluster.connected?).to be false
|
|
2129
2027
|
end
|
|
2130
2028
|
end
|
|
2131
2029
|
|
|
2132
2030
|
context 'when the hosts given include the protocol' do
|
|
2133
2031
|
it 'raises an error on mongodb://' do
|
|
2134
2032
|
expect do
|
|
2135
|
-
|
|
2136
|
-
end.to raise_error(ArgumentError,
|
|
2033
|
+
described_class.new([ 'mongodb://127.0.0.1:27017/test' ])
|
|
2034
|
+
end.to raise_error(ArgumentError,
|
|
2035
|
+
"Host 'mongodb://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2036
|
+
'Did you mean to not use an array?')
|
|
2137
2037
|
end
|
|
2138
2038
|
|
|
2139
2039
|
it 'raises an error on mongodb+srv://' do
|
|
2140
2040
|
expect do
|
|
2141
|
-
|
|
2142
|
-
end.to raise_error(ArgumentError,
|
|
2041
|
+
described_class.new([ 'mongodb+srv://127.0.0.1:27017/test' ])
|
|
2042
|
+
end.to raise_error(ArgumentError,
|
|
2043
|
+
"Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2044
|
+
'Did you mean to not use an array?')
|
|
2143
2045
|
end
|
|
2144
2046
|
|
|
2145
2047
|
it 'raises an error on multiple items' do
|
|
2146
2048
|
expect do
|
|
2147
|
-
|
|
2148
|
-
end.to raise_error(ArgumentError,
|
|
2049
|
+
described_class.new([ '127.0.0.1:27017', 'mongodb+srv://127.0.0.1:27017/test' ])
|
|
2050
|
+
end.to raise_error(ArgumentError,
|
|
2051
|
+
"Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2052
|
+
'Did you mean to not use an array?')
|
|
2149
2053
|
end
|
|
2150
2054
|
|
|
2151
2055
|
it 'raises an error only at beginning of string' do
|
|
2152
2056
|
expect do
|
|
2153
|
-
|
|
2154
|
-
|
|
2057
|
+
described_class
|
|
2058
|
+
.new([ 'somethingmongodb://127.0.0.1:27017/test', 'mongodb+srv://127.0.0.1:27017/test' ])
|
|
2059
|
+
end.to raise_error(ArgumentError,
|
|
2060
|
+
"Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2061
|
+
'Did you mean to not use an array?')
|
|
2155
2062
|
end
|
|
2156
2063
|
|
|
2157
2064
|
it 'raises an error with different case' do
|
|
2158
|
-
expect
|
|
2159
|
-
|
|
2160
|
-
|
|
2065
|
+
expect { described_class.new([ 'MongOdB://127.0.0.1:27017/test' ]) }
|
|
2066
|
+
.to raise_error(ArgumentError,
|
|
2067
|
+
"Host 'MongOdB://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2068
|
+
'Did you mean to not use an array?')
|
|
2161
2069
|
end
|
|
2162
2070
|
end
|
|
2163
2071
|
end
|
|
@@ -2247,13 +2155,11 @@ describe Mongo::Client do
|
|
|
2247
2155
|
end
|
|
2248
2156
|
|
|
2249
2157
|
describe '#use' do
|
|
2250
|
-
|
|
2251
2158
|
let(:client) do
|
|
2252
|
-
new_local_client_nmio(
|
|
2159
|
+
new_local_client_nmio(SINGLE_CLIENT, database: SpecConfig.instance.test_db)
|
|
2253
2160
|
end
|
|
2254
2161
|
|
|
2255
2162
|
shared_examples_for 'a database switching object' do
|
|
2256
|
-
|
|
2257
2163
|
it 'returns the new client' do
|
|
2258
2164
|
expect(client.send(:database).name).to eq('ruby-driver')
|
|
2259
2165
|
end
|
|
@@ -2264,7 +2170,6 @@ describe Mongo::Client do
|
|
|
2264
2170
|
end
|
|
2265
2171
|
|
|
2266
2172
|
context 'when provided a string' do
|
|
2267
|
-
|
|
2268
2173
|
let(:database) do
|
|
2269
2174
|
client.use('testdb')
|
|
2270
2175
|
end
|
|
@@ -2273,7 +2178,6 @@ describe Mongo::Client do
|
|
|
2273
2178
|
end
|
|
2274
2179
|
|
|
2275
2180
|
context 'when provided a symbol' do
|
|
2276
|
-
|
|
2277
2181
|
let(:database) do
|
|
2278
2182
|
client.use(:testdb)
|
|
2279
2183
|
end
|
|
@@ -2282,45 +2186,29 @@ describe Mongo::Client do
|
|
|
2282
2186
|
end
|
|
2283
2187
|
|
|
2284
2188
|
context 'when providing nil' do
|
|
2285
|
-
|
|
2286
2189
|
it 'raises an exception' do
|
|
2287
|
-
expect {
|
|
2288
|
-
|
|
2289
|
-
}.to raise_error(Mongo::Error::InvalidDatabaseName)
|
|
2190
|
+
expect { client.use(nil) }
|
|
2191
|
+
.to raise_error(Mongo::Error::InvalidDatabaseName)
|
|
2290
2192
|
end
|
|
2291
2193
|
end
|
|
2292
2194
|
end
|
|
2293
2195
|
|
|
2294
2196
|
describe '#with' do
|
|
2295
|
-
|
|
2296
2197
|
let(:client) do
|
|
2297
|
-
new_local_client_nmio(
|
|
2198
|
+
new_local_client_nmio(SINGLE_CLIENT, database: SpecConfig.instance.test_db)
|
|
2298
2199
|
end
|
|
2299
2200
|
|
|
2300
2201
|
context 'when providing nil' do
|
|
2301
|
-
|
|
2302
2202
|
it 'returns the cloned client' do
|
|
2303
2203
|
expect(client.with(nil)).to eq(client)
|
|
2304
2204
|
end
|
|
2305
2205
|
end
|
|
2306
2206
|
|
|
2307
2207
|
context 'when the app_name is changed' do
|
|
2308
|
-
|
|
2309
|
-
let(:
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
let!(:original_options) do
|
|
2314
|
-
client.options
|
|
2315
|
-
end
|
|
2316
|
-
|
|
2317
|
-
let(:new_options) do
|
|
2318
|
-
{ app_name: 'client_test' }
|
|
2319
|
-
end
|
|
2320
|
-
|
|
2321
|
-
let!(:new_client) do
|
|
2322
|
-
authorized_client.with(new_options)
|
|
2323
|
-
end
|
|
2208
|
+
let(:client) { authorized_client }
|
|
2209
|
+
let(:original_options) { client.options }
|
|
2210
|
+
let(:new_options) { { app_name: 'client_test' } }
|
|
2211
|
+
let(:new_client) { authorized_client.with(new_options) }
|
|
2324
2212
|
|
|
2325
2213
|
it 'returns a new client' do
|
|
2326
2214
|
expect(new_client).not_to equal(client)
|
|
@@ -2346,27 +2234,25 @@ describe Mongo::Client do
|
|
|
2346
2234
|
new_local_client(SpecConfig.instance.addresses, options)
|
|
2347
2235
|
end
|
|
2348
2236
|
|
|
2349
|
-
before do
|
|
2350
|
-
client.options[:direct_connection].should be nil
|
|
2351
|
-
end
|
|
2352
|
-
|
|
2353
2237
|
let(:new_client) do
|
|
2354
2238
|
client.with(new_options)
|
|
2355
2239
|
end
|
|
2356
2240
|
|
|
2357
|
-
|
|
2241
|
+
before do
|
|
2242
|
+
expect(client.options[:direct_connection]).to be_nil
|
|
2243
|
+
end
|
|
2358
2244
|
|
|
2245
|
+
context 'direct_connection set to false' do
|
|
2359
2246
|
let(:new_options) do
|
|
2360
2247
|
{ direct_connection: false }
|
|
2361
2248
|
end
|
|
2362
2249
|
|
|
2363
2250
|
it 'is accepted' do
|
|
2364
|
-
new_client.options[:direct_connection].
|
|
2251
|
+
expect(new_client.options[:direct_connection]).to be false
|
|
2365
2252
|
end
|
|
2366
2253
|
end
|
|
2367
2254
|
|
|
2368
2255
|
context 'direct_connection set to true' do
|
|
2369
|
-
|
|
2370
2256
|
let(:new_options) do
|
|
2371
2257
|
{ direct_connection: true }
|
|
2372
2258
|
end
|
|
@@ -2374,10 +2260,9 @@ describe Mongo::Client do
|
|
|
2374
2260
|
context 'in single topology' do
|
|
2375
2261
|
require_topology :single
|
|
2376
2262
|
|
|
2377
|
-
|
|
2378
2263
|
it 'is accepted' do
|
|
2379
|
-
new_client.options[:direct_connection].
|
|
2380
|
-
new_client.cluster.topology.
|
|
2264
|
+
expect(new_client.options[:direct_connection]).to be true
|
|
2265
|
+
expect(new_client.cluster.topology).to be_a(Mongo::Cluster::Topology::Single)
|
|
2381
2266
|
end
|
|
2382
2267
|
end
|
|
2383
2268
|
|
|
@@ -2385,21 +2270,19 @@ describe Mongo::Client do
|
|
|
2385
2270
|
require_topology :replica_set, :sharded
|
|
2386
2271
|
|
|
2387
2272
|
it 'is rejected' do
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
|
|
2273
|
+
expect { new_client }
|
|
2274
|
+
.to raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
|
|
2391
2275
|
end
|
|
2392
2276
|
|
|
2393
2277
|
context 'when a new cluster is created' do
|
|
2394
|
-
|
|
2395
2278
|
let(:new_options) do
|
|
2396
2279
|
{ direct_connection: true, app_name: 'new-client' }
|
|
2397
2280
|
end
|
|
2398
2281
|
|
|
2399
2282
|
it 'is rejected' do
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2283
|
+
expect { new_client }
|
|
2284
|
+
.to raise_error(ArgumentError,
|
|
2285
|
+
/direct_connection=true cannot be used with topologies other than Single/)
|
|
2403
2286
|
end
|
|
2404
2287
|
end
|
|
2405
2288
|
end
|
|
@@ -2407,28 +2290,37 @@ describe Mongo::Client do
|
|
|
2407
2290
|
end
|
|
2408
2291
|
|
|
2409
2292
|
context 'when the write concern is not changed' do
|
|
2410
|
-
|
|
2411
2293
|
let(:client) do
|
|
2412
2294
|
new_local_client_nmio(
|
|
2413
|
-
|
|
2414
|
-
:
|
|
2295
|
+
SINGLE_CLIENT,
|
|
2296
|
+
read: { mode: :secondary },
|
|
2297
|
+
write: { w: 1 },
|
|
2298
|
+
database: SpecConfig.instance.test_db
|
|
2415
2299
|
)
|
|
2416
2300
|
end
|
|
2417
2301
|
|
|
2418
|
-
let
|
|
2419
|
-
client.with(:read => { :mode => :primary })
|
|
2420
|
-
end
|
|
2302
|
+
let(:new_client) { client.with(read: { mode: :primary }) }
|
|
2421
2303
|
|
|
2422
2304
|
let(:new_options) do
|
|
2423
|
-
Mongo::Options::Redacted.new(
|
|
2424
|
-
:
|
|
2425
|
-
:
|
|
2305
|
+
Mongo::Options::Redacted.new(
|
|
2306
|
+
read: { mode: :primary },
|
|
2307
|
+
write: { w: 1 },
|
|
2308
|
+
monitoring_io: false,
|
|
2309
|
+
database: SpecConfig.instance.test_db,
|
|
2310
|
+
retry_writes: true,
|
|
2311
|
+
retry_reads: true
|
|
2312
|
+
)
|
|
2426
2313
|
end
|
|
2427
2314
|
|
|
2428
2315
|
let(:original_options) do
|
|
2429
|
-
Mongo::Options::Redacted.new(
|
|
2430
|
-
:
|
|
2431
|
-
:
|
|
2316
|
+
Mongo::Options::Redacted.new(
|
|
2317
|
+
read: { mode: :secondary },
|
|
2318
|
+
write: { w: 1 },
|
|
2319
|
+
monitoring_io: false,
|
|
2320
|
+
database: SpecConfig.instance.test_db,
|
|
2321
|
+
retry_writes: true,
|
|
2322
|
+
retry_reads: true
|
|
2323
|
+
)
|
|
2432
2324
|
end
|
|
2433
2325
|
|
|
2434
2326
|
it 'returns a new client' do
|
|
@@ -2449,21 +2341,19 @@ describe Mongo::Client do
|
|
|
2449
2341
|
end
|
|
2450
2342
|
|
|
2451
2343
|
context 'when the write concern is changed' do
|
|
2452
|
-
|
|
2453
2344
|
let(:client) do
|
|
2454
|
-
new_local_client(
|
|
2455
|
-
|
|
2345
|
+
new_local_client(
|
|
2346
|
+
SINGLE_CLIENT,
|
|
2347
|
+
{ monitoring_io: false }.merge(client_options)
|
|
2348
|
+
)
|
|
2456
2349
|
end
|
|
2457
2350
|
|
|
2458
2351
|
let(:client_options) do
|
|
2459
|
-
{ :
|
|
2352
|
+
{ write: { w: 1 } }
|
|
2460
2353
|
end
|
|
2461
2354
|
|
|
2462
2355
|
context 'when the write concern has not been accessed' do
|
|
2463
|
-
|
|
2464
|
-
let!(:new_client) do
|
|
2465
|
-
client.with(:write => { :w => 0 })
|
|
2466
|
-
end
|
|
2356
|
+
let(:new_client) { client.with(write: { w: 0 }) }
|
|
2467
2357
|
|
|
2468
2358
|
let(:get_last_error) do
|
|
2469
2359
|
new_client.write_concern.get_last_error
|
|
@@ -2475,10 +2365,9 @@ describe Mongo::Client do
|
|
|
2475
2365
|
end
|
|
2476
2366
|
|
|
2477
2367
|
context 'when the write concern has been accessed' do
|
|
2478
|
-
|
|
2479
|
-
let!(:new_client) do
|
|
2368
|
+
let(:new_client) do
|
|
2480
2369
|
client.write_concern
|
|
2481
|
-
client.with(:
|
|
2370
|
+
client.with(write: { w: 0 })
|
|
2482
2371
|
end
|
|
2483
2372
|
|
|
2484
2373
|
let(:get_last_error) do
|
|
@@ -2491,9 +2380,8 @@ describe Mongo::Client do
|
|
|
2491
2380
|
end
|
|
2492
2381
|
|
|
2493
2382
|
context 'when write concern is given as :write' do
|
|
2494
|
-
|
|
2495
2383
|
let(:client_options) do
|
|
2496
|
-
{ :
|
|
2384
|
+
{ write: { w: 1 } }
|
|
2497
2385
|
end
|
|
2498
2386
|
|
|
2499
2387
|
it 'sets :write option' do
|
|
@@ -2501,7 +2389,7 @@ describe Mongo::Client do
|
|
|
2501
2389
|
end
|
|
2502
2390
|
|
|
2503
2391
|
it 'does not set :write_concern option' do
|
|
2504
|
-
expect(client.options[:write_concern]).to
|
|
2392
|
+
expect(client.options[:write_concern]).to be_nil
|
|
2505
2393
|
end
|
|
2506
2394
|
|
|
2507
2395
|
it 'returns correct write concern' do
|
|
@@ -2511,9 +2399,8 @@ describe Mongo::Client do
|
|
|
2511
2399
|
end
|
|
2512
2400
|
|
|
2513
2401
|
context 'when write concern is given as :write_concern' do
|
|
2514
|
-
|
|
2515
2402
|
let(:client_options) do
|
|
2516
|
-
{ :
|
|
2403
|
+
{ write_concern: { w: 1 } }
|
|
2517
2404
|
end
|
|
2518
2405
|
|
|
2519
2406
|
it 'sets :write_concern option' do
|
|
@@ -2521,20 +2408,19 @@ describe Mongo::Client do
|
|
|
2521
2408
|
end
|
|
2522
2409
|
|
|
2523
2410
|
it 'does not set :write option' do
|
|
2524
|
-
expect(client.options[:write]).to
|
|
2411
|
+
expect(client.options[:write]).to be_nil
|
|
2525
2412
|
end
|
|
2526
2413
|
|
|
2527
2414
|
it 'returns correct write concern' do
|
|
2528
|
-
|
|
2529
|
-
|
|
2415
|
+
expect(client.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
|
|
2416
|
+
expect(client.write_concern.options).to eq(w: 1)
|
|
2530
2417
|
end
|
|
2531
2418
|
end
|
|
2532
2419
|
|
|
2533
2420
|
context 'when write concern is given as both :write and :write_concern' do
|
|
2534
2421
|
context 'with identical values' do
|
|
2535
|
-
|
|
2536
2422
|
let(:client_options) do
|
|
2537
|
-
{ write: {w: 1}, write_concern: { w: 1 } }
|
|
2423
|
+
{ write: { w: 1 }, write_concern: { w: 1 } }
|
|
2538
2424
|
end
|
|
2539
2425
|
|
|
2540
2426
|
it 'sets :write_concern option' do
|
|
@@ -2552,9 +2438,8 @@ describe Mongo::Client do
|
|
|
2552
2438
|
end
|
|
2553
2439
|
|
|
2554
2440
|
context 'with different values' do
|
|
2555
|
-
|
|
2556
2441
|
let(:client_options) do
|
|
2557
|
-
{ write: {w: 1}, write_concern: { w: 2 } }
|
|
2442
|
+
{ write: { w: 1 }, write_concern: { w: 2 } }
|
|
2558
2443
|
end
|
|
2559
2444
|
|
|
2560
2445
|
it 'raises an exception' do
|
|
@@ -2566,43 +2451,35 @@ describe Mongo::Client do
|
|
|
2566
2451
|
end
|
|
2567
2452
|
|
|
2568
2453
|
context 'when #with uses a different write concern option name' do
|
|
2569
|
-
|
|
2570
2454
|
context 'from :write_concern to :write' do
|
|
2571
|
-
|
|
2572
2455
|
let(:client_options) do
|
|
2573
|
-
{ :
|
|
2456
|
+
{ write_concern: { w: 1 } }
|
|
2574
2457
|
end
|
|
2575
2458
|
|
|
2576
|
-
let
|
|
2577
|
-
client.with(:write => { :w => 2 })
|
|
2578
|
-
end
|
|
2459
|
+
let(:new_client) { client.with(write: { w: 2 }) }
|
|
2579
2460
|
|
|
2580
2461
|
it 'uses the new option' do
|
|
2581
2462
|
expect(new_client.options[:write]).to eq(Mongo::Options::Redacted.new(w: 2))
|
|
2582
|
-
expect(new_client.options[:write_concern]).to
|
|
2463
|
+
expect(new_client.options[:write_concern]).to be_nil
|
|
2583
2464
|
end
|
|
2584
2465
|
end
|
|
2585
2466
|
|
|
2586
2467
|
context 'from :write to :write_concern' do
|
|
2587
|
-
|
|
2588
2468
|
let(:client_options) do
|
|
2589
|
-
{ :
|
|
2469
|
+
{ write: { w: 1 } }
|
|
2590
2470
|
end
|
|
2591
2471
|
|
|
2592
|
-
let
|
|
2593
|
-
client.with(:write_concern => { :w => 2 })
|
|
2594
|
-
end
|
|
2472
|
+
let(:new_client) { client.with(write_concern: { w: 2 }) }
|
|
2595
2473
|
|
|
2596
2474
|
it 'uses the new option' do
|
|
2597
2475
|
expect(new_client.options[:write_concern]).to eq(Mongo::Options::Redacted.new(w: 2))
|
|
2598
|
-
expect(new_client.options[:write]).to
|
|
2476
|
+
expect(new_client.options[:write]).to be_nil
|
|
2599
2477
|
end
|
|
2600
2478
|
end
|
|
2601
2479
|
end
|
|
2602
2480
|
end
|
|
2603
2481
|
|
|
2604
2482
|
context 'when an invalid option is provided' do
|
|
2605
|
-
|
|
2606
2483
|
let(:new_client) do
|
|
2607
2484
|
client.with(invalid: :option, ssl: false)
|
|
2608
2485
|
end
|
|
@@ -2623,24 +2500,18 @@ describe Mongo::Client do
|
|
|
2623
2500
|
|
|
2624
2501
|
context 'when client is created with ipv6 address' do
|
|
2625
2502
|
let(:client) do
|
|
2626
|
-
new_local_client_nmio(['[::1]:27017'], :
|
|
2503
|
+
new_local_client_nmio([ '[::1]:27017' ], database: SpecConfig.instance.test_db)
|
|
2627
2504
|
end
|
|
2628
2505
|
|
|
2629
2506
|
context 'when providing nil' do
|
|
2630
|
-
|
|
2631
2507
|
it 'returns the cloned client' do
|
|
2632
2508
|
expect(client.with(nil)).to eq(client)
|
|
2633
2509
|
end
|
|
2634
2510
|
end
|
|
2635
2511
|
|
|
2636
2512
|
context 'when changing options' do
|
|
2637
|
-
let(:new_options)
|
|
2638
|
-
|
|
2639
|
-
end
|
|
2640
|
-
|
|
2641
|
-
let!(:new_client) do
|
|
2642
|
-
client.with(new_options)
|
|
2643
|
-
end
|
|
2513
|
+
let(:new_options) { { app_name: 'client_test' } }
|
|
2514
|
+
let(:new_client) { client.with(new_options) }
|
|
2644
2515
|
|
|
2645
2516
|
it 'returns a new client' do
|
|
2646
2517
|
expect(new_client).not_to equal(client)
|
|
@@ -2650,11 +2521,14 @@ describe Mongo::Client do
|
|
|
2650
2521
|
|
|
2651
2522
|
context 'when new client has a new cluster' do
|
|
2652
2523
|
let(:client) do
|
|
2653
|
-
new_local_client(
|
|
2524
|
+
new_local_client(
|
|
2525
|
+
SINGLE_CLIENT,
|
|
2654
2526
|
database: SpecConfig.instance.test_db,
|
|
2655
2527
|
server_selection_timeout: 0.5,
|
|
2656
|
-
socket_timeout: 0.1, connect_timeout: 0.1
|
|
2528
|
+
socket_timeout: 0.1, connect_timeout: 0.1, populator_io: false
|
|
2529
|
+
)
|
|
2657
2530
|
end
|
|
2531
|
+
|
|
2658
2532
|
let(:new_client) do
|
|
2659
2533
|
client.with(app_name: 'client_construction_spec').tap do |new_client|
|
|
2660
2534
|
expect(new_client.cluster).not_to eql(client.cluster)
|
|
@@ -2678,26 +2552,28 @@ describe Mongo::Client do
|
|
|
2678
2552
|
# in #with, the consistent behavior is to never transfer sdam_proc to
|
|
2679
2553
|
# the new client.
|
|
2680
2554
|
context 'when sdam_proc is given on original client' do
|
|
2681
|
-
|
|
2682
2555
|
let(:sdam_proc) do
|
|
2683
|
-
|
|
2556
|
+
proc do |client|
|
|
2684
2557
|
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
|
2685
2558
|
end
|
|
2686
2559
|
end
|
|
2687
2560
|
|
|
2688
2561
|
let(:client) do
|
|
2689
|
-
new_local_client(
|
|
2562
|
+
new_local_client(
|
|
2563
|
+
SpecConfig.instance.addresses,
|
|
2690
2564
|
SpecConfig.instance.test_options.merge(
|
|
2691
2565
|
sdam_proc: sdam_proc,
|
|
2692
2566
|
connect_timeout: 3.08, socket_timeout: 3.09,
|
|
2693
2567
|
server_selection_timeout: 2.92,
|
|
2694
2568
|
heartbeat_frequency: 100,
|
|
2695
|
-
database: SpecConfig.instance.test_db
|
|
2569
|
+
database: SpecConfig.instance.test_db
|
|
2570
|
+
)
|
|
2571
|
+
)
|
|
2696
2572
|
end
|
|
2697
2573
|
|
|
2698
2574
|
let(:new_client) do
|
|
2699
2575
|
client.with(app_name: 'foo').tap do |new_client|
|
|
2700
|
-
new_client.cluster.
|
|
2576
|
+
expect(new_client.cluster).not_to be == client.cluster
|
|
2701
2577
|
end
|
|
2702
2578
|
end
|
|
2703
2579
|
|
|
@@ -2706,14 +2582,14 @@ describe Mongo::Client do
|
|
|
2706
2582
|
events = subscriber.select_started_events(Mongo::Monitoring::Event::ServerHeartbeatStarted)
|
|
2707
2583
|
if ClusterConfig.instance.topology == :load_balanced
|
|
2708
2584
|
# No server monitoring in LB topology
|
|
2709
|
-
events.length.
|
|
2585
|
+
expect(events.length).to be == 0
|
|
2710
2586
|
else
|
|
2711
|
-
events.length.
|
|
2587
|
+
expect(events.length).to be > 0
|
|
2712
2588
|
end
|
|
2713
2589
|
end
|
|
2714
2590
|
|
|
2715
2591
|
it 'does not copy sdam_proc option to new client' do
|
|
2716
|
-
expect(new_client.options[:sdam_proc]).to
|
|
2592
|
+
expect(new_client.options[:sdam_proc]).to be_nil
|
|
2717
2593
|
end
|
|
2718
2594
|
|
|
2719
2595
|
it 'does not notify subscribers set up by sdam_proc' do
|
|
@@ -2735,34 +2611,34 @@ describe Mongo::Client do
|
|
|
2735
2611
|
new_client.cluster.next_primary
|
|
2736
2612
|
|
|
2737
2613
|
# Diagnostics
|
|
2614
|
+
# rubocop:disable Style/IfUnlessModifier, Lint/Debugger
|
|
2738
2615
|
unless subscriber.started_events.empty?
|
|
2739
2616
|
p subscriber.started_events
|
|
2740
2617
|
end
|
|
2618
|
+
# rubocop:enable Style/IfUnlessModifier, Lint/Debugger
|
|
2741
2619
|
|
|
2742
2620
|
expect(subscriber.started_events.length).to eq 0
|
|
2743
|
-
new_client.cluster.topology.class.
|
|
2621
|
+
expect(new_client.cluster.topology.class).not_to be Mongo::Cluster::Topology::Unknown
|
|
2744
2622
|
end
|
|
2745
2623
|
end
|
|
2746
2624
|
|
|
2747
2625
|
context 'when :server_api is changed' do
|
|
2748
|
-
|
|
2749
2626
|
let(:client) do
|
|
2750
|
-
new_local_client_nmio(
|
|
2627
|
+
new_local_client_nmio(SINGLE_CLIENT)
|
|
2751
2628
|
end
|
|
2752
2629
|
|
|
2753
2630
|
let(:new_client) do
|
|
2754
|
-
client.with(server_api: {version: '1'})
|
|
2631
|
+
client.with(server_api: { version: '1' })
|
|
2755
2632
|
end
|
|
2756
2633
|
|
|
2757
2634
|
it 'changes :server_api' do
|
|
2758
|
-
new_client.options[:server_api].
|
|
2635
|
+
expect(new_client.options[:server_api]).to be == { 'version' => '1' }
|
|
2759
2636
|
end
|
|
2760
2637
|
end
|
|
2761
2638
|
|
|
2762
2639
|
context 'when :server_api is cleared' do
|
|
2763
|
-
|
|
2764
2640
|
let(:client) do
|
|
2765
|
-
new_local_client_nmio(
|
|
2641
|
+
new_local_client_nmio(SINGLE_CLIENT, server_api: { version: '1' })
|
|
2766
2642
|
end
|
|
2767
2643
|
|
|
2768
2644
|
let(:new_client) do
|
|
@@ -2770,19 +2646,17 @@ describe Mongo::Client do
|
|
|
2770
2646
|
end
|
|
2771
2647
|
|
|
2772
2648
|
it 'clears :server_api' do
|
|
2773
|
-
new_client.options[:server_api].
|
|
2649
|
+
expect(new_client.options[:server_api]).to be_nil
|
|
2774
2650
|
end
|
|
2775
2651
|
end
|
|
2776
|
-
|
|
2777
2652
|
end
|
|
2778
2653
|
|
|
2779
2654
|
describe '#dup' do
|
|
2780
|
-
|
|
2781
2655
|
let(:client) do
|
|
2782
2656
|
new_local_client_nmio(
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2657
|
+
SINGLE_CLIENT,
|
|
2658
|
+
read: { mode: :primary },
|
|
2659
|
+
database: SpecConfig.instance.test_db
|
|
2786
2660
|
)
|
|
2787
2661
|
end
|
|
2788
2662
|
|
|
@@ -2795,3 +2669,7 @@ describe Mongo::Client do
|
|
|
2795
2669
|
it_behaves_like 'duplicated client with reused monitoring'
|
|
2796
2670
|
end
|
|
2797
2671
|
end
|
|
2672
|
+
# rubocop:enable RSpec/ExpectInHook, RSpec/MessageSpies, RSpec/ExampleLength
|
|
2673
|
+
# rubocop:enable RSpec/ContextWording, RSpec/RepeatedExampleGroupDescription
|
|
2674
|
+
# rubocop:enable RSpec/ExampleWording, Style/BlockComments, RSpec/AnyInstance
|
|
2675
|
+
# rubocop:enable RSpec/VerifiedDoubles
|