mongo 2.18.2 → 2.19.3
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 +52 -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 +16 -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 +2 -1
- data/lib/mongo/collection.rb +52 -13
- 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_max_connecting.rb +28 -0
- 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 +8 -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_search_indexes/op_msg.rb +31 -0
- data/lib/mongo/operation/create_search_indexes.rb +15 -0
- 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/drop_search_index/op_msg.rb +33 -0
- data/lib/mongo/operation/drop_search_index.rb +15 -0
- 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 -2
- data/lib/mongo/operation/shared/specifiable.rb +8 -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_search_index/op_msg.rb +34 -0
- data/lib/mongo/operation/update_search_index.rb +15 -0
- 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 +4 -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/search_index/view.rb +232 -0
- 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 +726 -265
- 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 +322 -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 +3 -1
- data/mongo.gemspec +5 -2
- data/spec/atlas/atlas_connectivity_spec.rb +2 -6
- data/spec/atlas/operations_spec.rb +4 -13
- 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 +2 -2
- data/spec/integration/error_detection_spec.rb +1 -1
- data/spec/integration/find_options_spec.rb +227 -0
- 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/search_indexes_prose_spec.rb +168 -0
- 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 +47 -12
- 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 +619 -693
- 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 +116 -66
- data/spec/mongo/collection_spec.rb +11 -7
- 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 -66
- 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 +162 -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/search_index_operations.rb +63 -0
- data/spec/runners/unified/support_operations.rb +66 -2
- data/spec/runners/unified/test.rb +101 -25
- 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 +2 -2
- 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/bypassedCommand.yml +5 -4
- 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 +64 -0
- data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +6 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +8 -0
- data/spec/spec_tests/data/cmap/pool-checkout-returned-connection-maxConnecting.yml +88 -0
- data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +49 -0
- data/spec/spec_tests/data/cmap/pool-clear-interrupting-pending-connections.yml +43 -0
- data/spec/spec_tests/data/cmap/pool-clear-min-size.yml +41 -0
- data/spec/spec_tests/data/cmap/pool-clear-paused.yml +18 -0
- data/spec/spec_tests/data/cmap/pool-clear-ready.yml +39 -0
- data/spec/spec_tests/data/cmap/pool-clear-schedule-run-interruptInUseConnections-false.yml +48 -0
- data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-create-max-size.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-create-min-size-error.yml +43 -0
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +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/index_management/createSearchIndex.yml +62 -0
- data/spec/spec_tests/data/index_management/createSearchIndexes.yml +83 -0
- data/spec/spec_tests/data/index_management/dropSearchIndex.yml +42 -0
- data/spec/spec_tests/data/index_management/listSearchIndexes.yml +85 -0
- data/spec/spec_tests/data/index_management/updateSearchIndex.yml +45 -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/collectionData-createOptions.yml +37 -0
- data/spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml +40 -0
- data/spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml +37 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml +39 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml +66 -0
- data/spec/spec_tests/data/unified/valid-pass/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/index_management_unified_spec.rb +13 -0
- 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/faas/app/aws_lambda/mongodb/Gemfile.lock +19 -0
- 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 +45 -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 +1504 -1191
- 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
|
|
@@ -791,38 +797,47 @@ describe Mongo::Client do
|
|
|
791
797
|
end
|
|
792
798
|
end
|
|
793
799
|
|
|
794
|
-
context 'when
|
|
795
|
-
|
|
800
|
+
context 'when max_connecting is provided' do
|
|
796
801
|
let(:client) do
|
|
797
|
-
new_local_client_nmio(
|
|
802
|
+
new_local_client_nmio(SINGLE_CLIENT, options)
|
|
798
803
|
end
|
|
799
804
|
|
|
800
|
-
context 'when
|
|
805
|
+
context 'when max_connecting is a positive integer' do
|
|
806
|
+
let(:options) do
|
|
807
|
+
{ max_connecting: 5 }
|
|
808
|
+
end
|
|
801
809
|
|
|
802
|
-
|
|
810
|
+
it 'sets the max connecting' do
|
|
811
|
+
expect(client.options[:max_connecting]).to eq(options[:max_connecting])
|
|
812
|
+
end
|
|
813
|
+
end
|
|
803
814
|
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
815
|
+
context 'when max_connecting is a negative integer' do
|
|
816
|
+
let(:options) do
|
|
817
|
+
{ max_connecting: -5 }
|
|
818
|
+
end
|
|
819
|
+
|
|
820
|
+
it 'raises an exception' do
|
|
821
|
+
expect { client }.to raise_error(Mongo::Error::InvalidMaxConnecting)
|
|
822
|
+
end
|
|
823
|
+
end
|
|
824
|
+
end
|
|
825
|
+
|
|
826
|
+
context 'when min_pool_size is provided' do
|
|
827
|
+
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
|
828
|
+
|
|
829
|
+
context 'when max_pool_size is provided' do
|
|
830
|
+
context 'when the min_pool_size is greater than the max_pool_size' do
|
|
831
|
+
let(:options) { { min_pool_size: 20, max_pool_size: 10 } }
|
|
810
832
|
|
|
811
833
|
it 'raises an Exception' do
|
|
812
|
-
expect {
|
|
813
|
-
|
|
814
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
834
|
+
expect { client }
|
|
835
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
815
836
|
end
|
|
816
837
|
end
|
|
817
838
|
|
|
818
839
|
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
|
|
840
|
+
let(:options) { { min_pool_size: 10, max_pool_size: 20 } }
|
|
826
841
|
|
|
827
842
|
it 'sets the option' do
|
|
828
843
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -831,13 +846,7 @@ describe Mongo::Client do
|
|
|
831
846
|
end
|
|
832
847
|
|
|
833
848
|
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
|
|
849
|
+
let(:options) { { min_pool_size: 10, max_pool_size: 10 } }
|
|
841
850
|
|
|
842
851
|
it 'sets the option' do
|
|
843
852
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -846,12 +855,7 @@ describe Mongo::Client do
|
|
|
846
855
|
end
|
|
847
856
|
|
|
848
857
|
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
|
|
858
|
+
let(:options) { { min_pool_size: 10, max_pool_size: 0 } }
|
|
855
859
|
|
|
856
860
|
it 'sets the option' do
|
|
857
861
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -861,29 +865,17 @@ describe Mongo::Client do
|
|
|
861
865
|
end
|
|
862
866
|
|
|
863
867
|
context 'when max_pool_size is not provided' do
|
|
864
|
-
|
|
865
868
|
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
|
|
869
|
+
let(:options) { { min_pool_size: 30 } }
|
|
872
870
|
|
|
873
871
|
it 'raises an Exception' do
|
|
874
|
-
expect {
|
|
875
|
-
|
|
876
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
872
|
+
expect { client }
|
|
873
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
877
874
|
end
|
|
878
875
|
end
|
|
879
876
|
|
|
880
877
|
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
|
|
878
|
+
let(:options) { { min_pool_size: 3 } }
|
|
887
879
|
|
|
888
880
|
it 'sets the option' do
|
|
889
881
|
expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
|
|
@@ -891,10 +883,9 @@ describe Mongo::Client do
|
|
|
891
883
|
end
|
|
892
884
|
|
|
893
885
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
894
|
-
|
|
895
886
|
let(:options) do
|
|
896
887
|
{
|
|
897
|
-
:
|
|
888
|
+
min_pool_size: Mongo::Server::ConnectionPool::DEFAULT_MAX_SIZE
|
|
898
889
|
}
|
|
899
890
|
end
|
|
900
891
|
|
|
@@ -905,36 +896,18 @@ describe Mongo::Client do
|
|
|
905
896
|
end
|
|
906
897
|
end
|
|
907
898
|
|
|
908
|
-
context 'when max_pool_size is
|
|
909
|
-
let(:client)
|
|
910
|
-
|
|
911
|
-
end
|
|
912
|
-
|
|
913
|
-
context 'when max_pool_size is 0 (unlimited)' do
|
|
914
|
-
let(:options) do
|
|
915
|
-
{
|
|
916
|
-
:max_pool_size => 0
|
|
917
|
-
}
|
|
918
|
-
end
|
|
899
|
+
context 'when max_pool_size is 0 (unlimited)' do
|
|
900
|
+
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
|
901
|
+
let(:options) { { max_pool_size: 0 } }
|
|
919
902
|
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
end
|
|
903
|
+
it 'sets the option' do
|
|
904
|
+
expect(client.options[:max_pool_size]).to eq(options[:max_pool_size])
|
|
923
905
|
end
|
|
924
906
|
end
|
|
925
907
|
|
|
926
908
|
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
|
|
909
|
+
let(:options) { { min_pool_size: nil, max_pool_size: nil } }
|
|
910
|
+
let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
|
|
938
911
|
|
|
939
912
|
it 'does not set either option' do
|
|
940
913
|
expect(client.options[:max_pool_size]).to be_nil
|
|
@@ -943,28 +916,26 @@ describe Mongo::Client do
|
|
|
943
916
|
end
|
|
944
917
|
|
|
945
918
|
context 'when platform details are specified' do
|
|
946
|
-
|
|
947
919
|
let(:app_metadata) do
|
|
948
920
|
client.cluster.app_metadata
|
|
949
921
|
end
|
|
950
922
|
|
|
951
923
|
let(:client) do
|
|
952
|
-
new_local_client_nmio(
|
|
924
|
+
new_local_client_nmio(SINGLE_CLIENT, platform: 'mongoid-6.0.2')
|
|
953
925
|
end
|
|
954
926
|
|
|
955
927
|
it 'includes the platform info in the app metadata' do
|
|
956
|
-
expect(app_metadata.
|
|
928
|
+
expect(app_metadata.client_document[:platform]).to match(/mongoid-6\.0\.2/)
|
|
957
929
|
end
|
|
958
930
|
end
|
|
959
931
|
|
|
960
932
|
context 'when platform details are not specified' do
|
|
961
|
-
|
|
962
933
|
let(:app_metadata) do
|
|
963
934
|
client.cluster.app_metadata
|
|
964
935
|
end
|
|
965
936
|
|
|
966
937
|
let(:client) do
|
|
967
|
-
new_local_client_nmio(
|
|
938
|
+
new_local_client_nmio(SINGLE_CLIENT)
|
|
968
939
|
end
|
|
969
940
|
|
|
970
941
|
context 'mri' do
|
|
@@ -980,7 +951,7 @@ describe Mongo::Client do
|
|
|
980
951
|
end
|
|
981
952
|
|
|
982
953
|
it 'does not include the platform info in the app metadata' do
|
|
983
|
-
expect(app_metadata.
|
|
954
|
+
expect(app_metadata.client_document[:platform]).to eq(platform_string)
|
|
984
955
|
end
|
|
985
956
|
end
|
|
986
957
|
|
|
@@ -999,24 +970,18 @@ describe Mongo::Client do
|
|
|
999
970
|
end
|
|
1000
971
|
|
|
1001
972
|
it 'does not include the platform info in the app metadata' do
|
|
1002
|
-
expect(app_metadata.
|
|
973
|
+
expect(app_metadata.client_document[:platform]).to eq(platform_string)
|
|
1003
974
|
end
|
|
1004
975
|
end
|
|
1005
976
|
end
|
|
1006
977
|
end
|
|
1007
978
|
|
|
1008
979
|
context 'when providing a connection string' do
|
|
1009
|
-
|
|
1010
980
|
context 'when the string uses the SRV Protocol' do
|
|
1011
981
|
require_external_connectivity
|
|
1012
982
|
|
|
1013
|
-
let
|
|
1014
|
-
|
|
1015
|
-
end
|
|
1016
|
-
|
|
1017
|
-
let(:client) do
|
|
1018
|
-
new_local_client_nmio(uri)
|
|
1019
|
-
end
|
|
983
|
+
let(:uri) { 'mongodb+srv://test5.test.build.10gen.cc/testdb' }
|
|
984
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1020
985
|
|
|
1021
986
|
it 'sets the database' do
|
|
1022
987
|
expect(client.options[:database]).to eq('testdb')
|
|
@@ -1024,29 +989,17 @@ describe Mongo::Client do
|
|
|
1024
989
|
end
|
|
1025
990
|
|
|
1026
991
|
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
|
|
992
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb' }
|
|
993
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1035
994
|
|
|
1036
995
|
it 'sets the database' do
|
|
1037
|
-
expect { client[:users] }.
|
|
996
|
+
expect { client[:users] }.not_to raise_error
|
|
1038
997
|
end
|
|
1039
998
|
end
|
|
1040
999
|
|
|
1041
1000
|
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
|
|
1001
|
+
let(:uri) { 'mongodb://127.0.0.1:27017' }
|
|
1002
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1050
1003
|
|
|
1051
1004
|
it 'defaults the database to admin' do
|
|
1052
1005
|
expect(client.database.name).to eq('admin')
|
|
@@ -1054,44 +1007,59 @@ describe Mongo::Client do
|
|
|
1054
1007
|
end
|
|
1055
1008
|
|
|
1056
1009
|
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
|
|
1010
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?w=3' }
|
|
1011
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1065
1012
|
|
|
1066
1013
|
let(:expected_options) do
|
|
1067
|
-
Mongo::Options::Redacted.new(
|
|
1068
|
-
|
|
1069
|
-
|
|
1014
|
+
Mongo::Options::Redacted.new(
|
|
1015
|
+
write_concern: { w: 3 },
|
|
1016
|
+
monitoring_io: false,
|
|
1017
|
+
database: 'testdb',
|
|
1018
|
+
retry_writes: true,
|
|
1019
|
+
retry_reads: true
|
|
1020
|
+
)
|
|
1070
1021
|
end
|
|
1071
1022
|
|
|
1072
1023
|
it 'sets the options' do
|
|
1073
1024
|
expect(client.options).to eq(expected_options)
|
|
1074
1025
|
end
|
|
1075
1026
|
|
|
1076
|
-
context 'when
|
|
1027
|
+
context 'when max_connecting is provided' do
|
|
1028
|
+
context 'when max_connecting is a positive integer' do
|
|
1029
|
+
let(:uri) do
|
|
1030
|
+
'mongodb://127.0.0.1:27017/?maxConnecting=10'
|
|
1031
|
+
end
|
|
1077
1032
|
|
|
1078
|
-
|
|
1033
|
+
it 'sets the max connecting' do
|
|
1034
|
+
expect(client.options[:max_connecting]).to eq(10)
|
|
1035
|
+
end
|
|
1036
|
+
end
|
|
1079
1037
|
|
|
1080
|
-
|
|
1038
|
+
context 'when max_connecting is a negative integer' do
|
|
1039
|
+
let(:uri) do
|
|
1040
|
+
'mongodb://127.0.0.1:27017/?maxConnecting=0'
|
|
1041
|
+
end
|
|
1081
1042
|
|
|
1043
|
+
it 'raises an exception' do
|
|
1044
|
+
expect { client }.to raise_error(Mongo::Error::InvalidMaxConnecting)
|
|
1045
|
+
end
|
|
1046
|
+
end
|
|
1047
|
+
end
|
|
1048
|
+
|
|
1049
|
+
context 'when min_pool_size is provided' do
|
|
1050
|
+
context 'when max_pool_size is provided' do
|
|
1051
|
+
context 'when the min_pool_size is greater than the max_pool_size' do
|
|
1082
1052
|
let(:uri) do
|
|
1083
1053
|
'mongodb://127.0.0.1:27017/?minPoolSize=20&maxPoolSize=10'
|
|
1084
1054
|
end
|
|
1085
1055
|
|
|
1086
1056
|
it 'raises an Exception' do
|
|
1087
|
-
expect {
|
|
1088
|
-
|
|
1089
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1057
|
+
expect { client }
|
|
1058
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1090
1059
|
end
|
|
1091
1060
|
end
|
|
1092
1061
|
|
|
1093
1062
|
context 'when the min_pool_size is less than the max_pool_size' do
|
|
1094
|
-
|
|
1095
1063
|
let(:uri) do
|
|
1096
1064
|
'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=20'
|
|
1097
1065
|
end
|
|
@@ -1103,7 +1071,6 @@ describe Mongo::Client do
|
|
|
1103
1071
|
end
|
|
1104
1072
|
|
|
1105
1073
|
context 'when the min_pool_size is equal to the max_pool_size' do
|
|
1106
|
-
|
|
1107
1074
|
let(:uri) do
|
|
1108
1075
|
'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=10'
|
|
1109
1076
|
end
|
|
@@ -1127,25 +1094,17 @@ describe Mongo::Client do
|
|
|
1127
1094
|
end
|
|
1128
1095
|
|
|
1129
1096
|
context 'when max_pool_size is not provided' do
|
|
1130
|
-
|
|
1131
1097
|
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
|
|
1098
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=30' }
|
|
1136
1099
|
|
|
1137
1100
|
it 'raises an Exception' do
|
|
1138
|
-
expect {
|
|
1139
|
-
|
|
1140
|
-
}.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1101
|
+
expect { client }
|
|
1102
|
+
.to raise_exception(Mongo::Error::InvalidMinPoolSize)
|
|
1141
1103
|
end
|
|
1142
1104
|
end
|
|
1143
1105
|
|
|
1144
1106
|
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
|
|
1107
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=3' }
|
|
1149
1108
|
|
|
1150
1109
|
it 'sets the option' do
|
|
1151
1110
|
expect(client.options[:min_pool_size]).to eq(3)
|
|
@@ -1153,10 +1112,7 @@ describe Mongo::Client do
|
|
|
1153
1112
|
end
|
|
1154
1113
|
|
|
1155
1114
|
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
|
|
1115
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=5' }
|
|
1160
1116
|
|
|
1161
1117
|
it 'sets the option' do
|
|
1162
1118
|
expect(client.options[:min_pool_size]).to eq(5)
|
|
@@ -1166,11 +1122,8 @@ describe Mongo::Client do
|
|
|
1166
1122
|
end
|
|
1167
1123
|
|
|
1168
1124
|
context 'when retryReads URI option is given' do
|
|
1169
|
-
|
|
1170
1125
|
context 'it is false' do
|
|
1171
|
-
let
|
|
1172
|
-
'mongodb://127.0.0.1:27017/testdb?retryReads=false'
|
|
1173
|
-
end
|
|
1126
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryReads=false' }
|
|
1174
1127
|
|
|
1175
1128
|
it 'sets the option on the client' do
|
|
1176
1129
|
expect(client.options[:retry_reads]).to be false
|
|
@@ -1178,9 +1131,7 @@ describe Mongo::Client do
|
|
|
1178
1131
|
end
|
|
1179
1132
|
|
|
1180
1133
|
context 'it is true' do
|
|
1181
|
-
let
|
|
1182
|
-
'mongodb://127.0.0.1:27017/testdb?retryReads=true'
|
|
1183
|
-
end
|
|
1134
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryReads=true' }
|
|
1184
1135
|
|
|
1185
1136
|
it 'sets the option on the client' do
|
|
1186
1137
|
expect(client.options[:retry_reads]).to be true
|
|
@@ -1189,11 +1140,8 @@ describe Mongo::Client do
|
|
|
1189
1140
|
end
|
|
1190
1141
|
|
|
1191
1142
|
context 'when retryWrites URI option is given' do
|
|
1192
|
-
|
|
1193
1143
|
context 'it is false' do
|
|
1194
|
-
let
|
|
1195
|
-
'mongodb://127.0.0.1:27017/testdb?retryWrites=false'
|
|
1196
|
-
end
|
|
1144
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryWrites=false' }
|
|
1197
1145
|
|
|
1198
1146
|
it 'sets the option on the client' do
|
|
1199
1147
|
expect(client.options[:retry_writes]).to be false
|
|
@@ -1201,9 +1149,7 @@ describe Mongo::Client do
|
|
|
1201
1149
|
end
|
|
1202
1150
|
|
|
1203
1151
|
context 'it is true' do
|
|
1204
|
-
let
|
|
1205
|
-
'mongodb://127.0.0.1:27017/testdb?retryWrites=true'
|
|
1206
|
-
end
|
|
1152
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryWrites=true' }
|
|
1207
1153
|
|
|
1208
1154
|
it 'sets the option on the client' do
|
|
1209
1155
|
expect(client.options[:retry_writes]).to be true
|
|
@@ -1213,19 +1159,20 @@ describe Mongo::Client do
|
|
|
1213
1159
|
end
|
|
1214
1160
|
|
|
1215
1161
|
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
|
|
1162
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb' }
|
|
1220
1163
|
|
|
1221
1164
|
let(:client) do
|
|
1222
|
-
new_local_client_nmio(uri, :
|
|
1165
|
+
new_local_client_nmio(uri, write: { w: 3 })
|
|
1223
1166
|
end
|
|
1224
1167
|
|
|
1225
1168
|
let(:expected_options) do
|
|
1226
|
-
Mongo::Options::Redacted.new(
|
|
1227
|
-
|
|
1228
|
-
|
|
1169
|
+
Mongo::Options::Redacted.new(
|
|
1170
|
+
write: { w: 3 },
|
|
1171
|
+
monitoring_io: false,
|
|
1172
|
+
database: 'testdb',
|
|
1173
|
+
retry_writes: true,
|
|
1174
|
+
retry_reads: true
|
|
1175
|
+
)
|
|
1229
1176
|
end
|
|
1230
1177
|
|
|
1231
1178
|
it 'sets the options' do
|
|
@@ -1234,19 +1181,20 @@ describe Mongo::Client do
|
|
|
1234
1181
|
end
|
|
1235
1182
|
|
|
1236
1183
|
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
|
|
1184
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?w=3' }
|
|
1241
1185
|
|
|
1242
1186
|
let(:client) do
|
|
1243
|
-
new_local_client_nmio(uri, option_name => { :
|
|
1187
|
+
new_local_client_nmio(uri, option_name => { w: 4 })
|
|
1244
1188
|
end
|
|
1245
1189
|
|
|
1246
1190
|
let(:expected_options) do
|
|
1247
|
-
Mongo::Options::Redacted.new(
|
|
1248
|
-
|
|
1249
|
-
|
|
1191
|
+
Mongo::Options::Redacted.new(
|
|
1192
|
+
option_name => { w: 4 },
|
|
1193
|
+
monitoring_io: false,
|
|
1194
|
+
database: 'testdb',
|
|
1195
|
+
retry_writes: true,
|
|
1196
|
+
retry_reads: true
|
|
1197
|
+
)
|
|
1250
1198
|
end
|
|
1251
1199
|
|
|
1252
1200
|
shared_examples_for 'allows explicit options to take preference' do
|
|
@@ -1269,14 +1217,8 @@ describe Mongo::Client do
|
|
|
1269
1217
|
end
|
|
1270
1218
|
|
|
1271
1219
|
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
|
|
1220
|
+
let(:uri) { 'mongodb://127.0.0.1:27017/testdb?replicaSet=testing' }
|
|
1221
|
+
let(:client) { new_local_client_nmio(uri) }
|
|
1280
1222
|
|
|
1281
1223
|
it 'sets the correct cluster topology' do
|
|
1282
1224
|
expect(client.cluster.topology).to be_a(Mongo::Cluster::Topology::ReplicaSetNoPrimary)
|
|
@@ -1286,295 +1228,262 @@ describe Mongo::Client do
|
|
|
1286
1228
|
|
|
1287
1229
|
context 'when Ruby options are provided' do
|
|
1288
1230
|
let(:client) do
|
|
1289
|
-
new_local_client_nmio(
|
|
1231
|
+
new_local_client_nmio(SINGLE_CLIENT, options)
|
|
1290
1232
|
end
|
|
1291
1233
|
|
|
1292
1234
|
describe 'connection option conflicts' do
|
|
1293
1235
|
context 'direct_connection: true and multiple seeds' do
|
|
1294
1236
|
let(:client) do
|
|
1295
|
-
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
|
|
1296
|
-
direct_connection: true)
|
|
1237
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], direct_connection: true)
|
|
1297
1238
|
end
|
|
1298
1239
|
|
|
1299
1240
|
it 'is rejected' do
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with multiple seeds/)
|
|
1241
|
+
expect { client }
|
|
1242
|
+
.to raise_error(ArgumentError, /direct_connection=true cannot be used with multiple seeds/)
|
|
1303
1243
|
end
|
|
1304
1244
|
end
|
|
1305
1245
|
|
|
1306
1246
|
context 'direct_connection: true and connect: :direct' do
|
|
1307
1247
|
let(:options) do
|
|
1308
|
-
{direct_connection: true, connect: :direct}
|
|
1248
|
+
{ direct_connection: true, connect: :direct }
|
|
1309
1249
|
end
|
|
1310
1250
|
|
|
1311
1251
|
it 'is accepted' do
|
|
1312
|
-
client.options[:direct_connection].
|
|
1313
|
-
client.options[:connect].
|
|
1252
|
+
expect(client.options[:direct_connection]).to be true
|
|
1253
|
+
expect(client.options[:connect]).to be :direct
|
|
1314
1254
|
end
|
|
1315
1255
|
end
|
|
1316
1256
|
|
|
1317
1257
|
context 'direct_connection: true and connect: :replica_set' do
|
|
1318
1258
|
let(:options) do
|
|
1319
|
-
{direct_connection: true, connect: :replica_set}
|
|
1259
|
+
{ direct_connection: true, connect: :replica_set }
|
|
1320
1260
|
end
|
|
1321
1261
|
|
|
1322
1262
|
it 'is rejected' do
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1263
|
+
expect { client }
|
|
1264
|
+
.to raise_error(
|
|
1265
|
+
ArgumentError,
|
|
1266
|
+
/Conflicting client options: direct_connection=true and connect=replica_set/
|
|
1267
|
+
)
|
|
1326
1268
|
end
|
|
1327
1269
|
end
|
|
1328
1270
|
|
|
1329
1271
|
context 'direct_connection: true and connect: :sharded' do
|
|
1330
1272
|
let(:options) do
|
|
1331
|
-
{direct_connection: true, connect: :sharded}
|
|
1273
|
+
{ direct_connection: true, connect: :sharded }
|
|
1332
1274
|
end
|
|
1333
1275
|
|
|
1334
1276
|
it 'is rejected' do
|
|
1335
|
-
|
|
1336
|
-
client
|
|
1337
|
-
end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=sharded/)
|
|
1277
|
+
expect { client }
|
|
1278
|
+
.to raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=sharded/)
|
|
1338
1279
|
end
|
|
1339
1280
|
end
|
|
1340
1281
|
|
|
1341
1282
|
context 'direct_connection: false and connect: :direct' do
|
|
1342
1283
|
let(:options) do
|
|
1343
|
-
{direct_connection: false, connect: :direct}
|
|
1284
|
+
{ direct_connection: false, connect: :direct }
|
|
1344
1285
|
end
|
|
1345
1286
|
|
|
1346
1287
|
it 'is rejected' do
|
|
1347
|
-
|
|
1348
|
-
client
|
|
1349
|
-
end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=false and connect=direct/)
|
|
1288
|
+
expect { client }
|
|
1289
|
+
.to raise_error(ArgumentError, /Conflicting client options: direct_connection=false and connect=direct/)
|
|
1350
1290
|
end
|
|
1351
1291
|
end
|
|
1352
1292
|
|
|
1353
1293
|
context 'direct_connection: false and connect: :replica_set' do
|
|
1354
1294
|
let(:options) do
|
|
1355
|
-
{direct_connection: false, connect: :replica_set, replica_set: 'foo'}
|
|
1295
|
+
{ direct_connection: false, connect: :replica_set, replica_set: 'foo' }
|
|
1356
1296
|
end
|
|
1357
1297
|
|
|
1358
1298
|
it 'is accepted' do
|
|
1359
|
-
client.options[:direct_connection].
|
|
1360
|
-
client.options[:connect].
|
|
1299
|
+
expect(client.options[:direct_connection]).to be false
|
|
1300
|
+
expect(client.options[:connect]).to be :replica_set
|
|
1361
1301
|
end
|
|
1362
1302
|
end
|
|
1363
1303
|
|
|
1364
1304
|
context 'direct_connection: false and connect: :sharded' do
|
|
1365
1305
|
let(:options) do
|
|
1366
|
-
{direct_connection: false, connect: :sharded}
|
|
1306
|
+
{ direct_connection: false, connect: :sharded }
|
|
1367
1307
|
end
|
|
1368
1308
|
|
|
1369
1309
|
it 'is accepted' do
|
|
1370
|
-
client.options[:direct_connection].
|
|
1371
|
-
client.options[:connect].
|
|
1310
|
+
expect(client.options[:direct_connection]).to be false
|
|
1311
|
+
expect(client.options[:connect]).to be :sharded
|
|
1372
1312
|
end
|
|
1373
1313
|
end
|
|
1374
1314
|
|
|
1375
1315
|
context 'load_balanced: true and multiple seeds' do
|
|
1376
1316
|
let(:client) do
|
|
1377
|
-
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
|
|
1378
|
-
load_balanced: true)
|
|
1317
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], load_balanced: true)
|
|
1379
1318
|
end
|
|
1380
1319
|
|
|
1381
1320
|
it 'is rejected' do
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
end.should raise_error(ArgumentError, /load_balanced=true cannot be used with multiple seeds/)
|
|
1321
|
+
expect { client }
|
|
1322
|
+
.to raise_error(ArgumentError, /load_balanced=true cannot be used with multiple seeds/)
|
|
1385
1323
|
end
|
|
1386
1324
|
end
|
|
1387
1325
|
|
|
1388
1326
|
context 'load_balanced: false and multiple seeds' do
|
|
1389
1327
|
let(:client) do
|
|
1390
|
-
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
|
|
1391
|
-
load_balanced: false)
|
|
1328
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], load_balanced: false)
|
|
1392
1329
|
end
|
|
1393
1330
|
|
|
1394
1331
|
it 'is accepted' do
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
end.should_not raise_error
|
|
1398
|
-
client.options[:load_balanced].should be false
|
|
1332
|
+
expect { client }.not_to raise_error
|
|
1333
|
+
expect(client.options[:load_balanced]).to be false
|
|
1399
1334
|
end
|
|
1400
1335
|
end
|
|
1401
1336
|
|
|
1402
1337
|
context 'load_balanced: true and direct_connection: true' do
|
|
1403
1338
|
let(:client) do
|
|
1404
|
-
new_local_client_nmio(
|
|
1405
|
-
load_balanced: true, direct_connection: true)
|
|
1339
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, direct_connection: true)
|
|
1406
1340
|
end
|
|
1407
1341
|
|
|
1408
1342
|
it 'is rejected' do
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with load_balanced=true/)
|
|
1343
|
+
expect { client }
|
|
1344
|
+
.to raise_error(ArgumentError, /direct_connection=true cannot be used with load_balanced=true/)
|
|
1412
1345
|
end
|
|
1413
1346
|
end
|
|
1414
1347
|
|
|
1415
1348
|
context 'load_balanced: true and direct_connection: false' do
|
|
1416
1349
|
let(:client) do
|
|
1417
|
-
new_local_client_nmio(
|
|
1418
|
-
load_balanced: true, direct_connection: false)
|
|
1350
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, direct_connection: false)
|
|
1419
1351
|
end
|
|
1420
1352
|
|
|
1421
1353
|
it 'is accepted' do
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
client.options[:load_balanced].should be true
|
|
1426
|
-
client.options[:direct_connection].should be false
|
|
1354
|
+
expect { client }.not_to raise_error
|
|
1355
|
+
expect(client.options[:load_balanced]).to be true
|
|
1356
|
+
expect(client.options[:direct_connection]).to be false
|
|
1427
1357
|
end
|
|
1428
1358
|
end
|
|
1429
1359
|
|
|
1430
1360
|
context 'load_balanced: false and direct_connection: true' do
|
|
1431
1361
|
let(:client) do
|
|
1432
|
-
new_local_client_nmio(
|
|
1433
|
-
load_balanced: false, direct_connection: true)
|
|
1362
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: false, direct_connection: true)
|
|
1434
1363
|
end
|
|
1435
1364
|
|
|
1436
1365
|
it 'is accepted' do
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
client.options[:load_balanced].should be false
|
|
1441
|
-
client.options[:direct_connection].should be true
|
|
1366
|
+
expect { client }.not_to raise_error
|
|
1367
|
+
expect(client.options[:load_balanced]).to be false
|
|
1368
|
+
expect(client.options[:direct_connection]).to be true
|
|
1442
1369
|
end
|
|
1443
1370
|
end
|
|
1444
1371
|
|
|
1445
|
-
[:direct, 'direct', :sharded, 'sharded'].each do |v|
|
|
1372
|
+
[ :direct, 'direct', :sharded, 'sharded' ].each do |v|
|
|
1446
1373
|
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1447
1374
|
let(:client) do
|
|
1448
|
-
new_local_client_nmio(
|
|
1449
|
-
load_balanced: true, connect: v)
|
|
1375
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
|
|
1450
1376
|
end
|
|
1451
1377
|
|
|
1452
1378
|
it 'is rejected' do
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
end.should raise_error(ArgumentError, /connect=#{v} cannot be used with load_balanced=true/)
|
|
1379
|
+
expect { client }
|
|
1380
|
+
.to raise_error(ArgumentError, /connect=#{v} cannot be used with load_balanced=true/)
|
|
1456
1381
|
end
|
|
1457
1382
|
end
|
|
1458
1383
|
end
|
|
1459
1384
|
|
|
1460
|
-
[nil].each do |v|
|
|
1385
|
+
[ nil ].each do |v|
|
|
1461
1386
|
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1462
1387
|
let(:client) do
|
|
1463
|
-
new_local_client_nmio(
|
|
1464
|
-
load_balanced: true, connect: v)
|
|
1388
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
|
|
1465
1389
|
end
|
|
1466
1390
|
|
|
1467
1391
|
it 'is accepted' do
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
client.options[:load_balanced].should be true
|
|
1472
|
-
client.options[:connect].should eq v
|
|
1392
|
+
expect { client }.not_to raise_error
|
|
1393
|
+
expect(client.options[:load_balanced]).to be true
|
|
1394
|
+
expect(client.options[:connect]).to eq v
|
|
1473
1395
|
end
|
|
1474
1396
|
end
|
|
1475
1397
|
end
|
|
1476
1398
|
|
|
1477
|
-
[:load_balanced, 'load_balanced'].each do |v|
|
|
1399
|
+
[ :load_balanced, 'load_balanced' ].each do |v|
|
|
1478
1400
|
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1479
1401
|
let(:client) do
|
|
1480
|
-
new_local_client_nmio(
|
|
1481
|
-
load_balanced: true, connect: v)
|
|
1402
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
|
|
1482
1403
|
end
|
|
1483
1404
|
|
|
1484
1405
|
it 'is accepted' do
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
client.options[:load_balanced].should be true
|
|
1489
|
-
client.options[:connect].should eq v
|
|
1406
|
+
expect { client }.not_to raise_error
|
|
1407
|
+
expect(client.options[:load_balanced]).to be true
|
|
1408
|
+
expect(client.options[:connect]).to eq v
|
|
1490
1409
|
end
|
|
1491
1410
|
end
|
|
1492
1411
|
|
|
1493
1412
|
context "replica_set and connect: #{v.inspect}" do
|
|
1494
1413
|
let(:client) do
|
|
1495
|
-
new_local_client_nmio(
|
|
1496
|
-
replica_set: 'foo', connect: v)
|
|
1414
|
+
new_local_client_nmio(SINGLE_CLIENT, replica_set: 'foo', connect: v)
|
|
1497
1415
|
end
|
|
1498
1416
|
|
|
1499
1417
|
it 'is rejected' do
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
end.should raise_error(ArgumentError, /connect=load_balanced cannot be used with replica_set option/)
|
|
1418
|
+
expect { client }
|
|
1419
|
+
.to raise_error(ArgumentError, /connect=load_balanced cannot be used with replica_set option/)
|
|
1503
1420
|
end
|
|
1504
1421
|
end
|
|
1505
1422
|
|
|
1506
1423
|
context "direct_connection=true and connect: #{v.inspect}" do
|
|
1507
1424
|
let(:client) do
|
|
1508
|
-
new_local_client_nmio(
|
|
1509
|
-
direct_connection: true, connect: v)
|
|
1425
|
+
new_local_client_nmio(SINGLE_CLIENT, direct_connection: true, connect: v)
|
|
1510
1426
|
end
|
|
1511
1427
|
|
|
1512
1428
|
it 'is rejected' do
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1429
|
+
expect { client }
|
|
1430
|
+
.to raise_error(
|
|
1431
|
+
ArgumentError,
|
|
1432
|
+
/Conflicting client options: direct_connection=true and connect=load_balanced/
|
|
1433
|
+
)
|
|
1516
1434
|
end
|
|
1517
1435
|
end
|
|
1518
1436
|
|
|
1519
1437
|
context "multiple seed addresses and connect: #{v.inspect}" do
|
|
1520
1438
|
let(:client) do
|
|
1521
|
-
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.1:1234'],
|
|
1522
|
-
connect: v)
|
|
1439
|
+
new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.1:1234' ], connect: v)
|
|
1523
1440
|
end
|
|
1524
1441
|
|
|
1525
1442
|
it 'is rejected' do
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
end.should raise_error(ArgumentError, /connect=load_balanced cannot be used with multiple seeds/)
|
|
1443
|
+
expect { client }
|
|
1444
|
+
.to raise_error(ArgumentError, /connect=load_balanced cannot be used with multiple seeds/)
|
|
1529
1445
|
end
|
|
1530
1446
|
end
|
|
1531
1447
|
end
|
|
1532
1448
|
|
|
1533
|
-
[:replica_set, 'replica_set'].each do |v|
|
|
1449
|
+
[ :replica_set, 'replica_set' ].each do |v|
|
|
1534
1450
|
context "load_balanced: true and connect: #{v.inspect}" do
|
|
1535
1451
|
let(:client) do
|
|
1536
|
-
new_local_client_nmio(
|
|
1537
|
-
load_balanced: true, connect: v, replica_set: 'x')
|
|
1452
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v, replica_set: 'x')
|
|
1538
1453
|
end
|
|
1539
1454
|
|
|
1540
1455
|
it 'is rejected' do
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
end.should raise_error(ArgumentError, /connect=replica_set cannot be used with load_balanced=true/)
|
|
1456
|
+
expect { client }
|
|
1457
|
+
.to raise_error(ArgumentError, /connect=replica_set cannot be used with load_balanced=true/)
|
|
1544
1458
|
end
|
|
1545
1459
|
end
|
|
1546
1460
|
|
|
1547
1461
|
context "load_balanced: true and #{v.inspect} option" do
|
|
1548
1462
|
let(:client) do
|
|
1549
|
-
new_local_client_nmio(
|
|
1550
|
-
load_balanced: true, v => 'rs')
|
|
1463
|
+
new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, v => 'rs')
|
|
1551
1464
|
end
|
|
1552
1465
|
|
|
1553
1466
|
it 'is rejected' do
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
end.should raise_error(ArgumentError, /load_balanced=true cannot be used with replica_set option/)
|
|
1467
|
+
expect { client }
|
|
1468
|
+
.to raise_error(ArgumentError, /load_balanced=true cannot be used with replica_set option/)
|
|
1557
1469
|
end
|
|
1558
1470
|
end
|
|
1559
1471
|
end
|
|
1560
1472
|
|
|
1561
1473
|
context 'srv_max_hosts > 0 and load_balanced: true' do
|
|
1562
1474
|
let(:client) do
|
|
1563
|
-
new_local_client_nmio(
|
|
1564
|
-
srv_max_hosts: 1, load_balanced: true)
|
|
1475
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1, load_balanced: true)
|
|
1565
1476
|
end
|
|
1566
1477
|
|
|
1567
1478
|
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/)
|
|
1479
|
+
expect { client }
|
|
1480
|
+
.to raise_error(ArgumentError, /:srv_max_hosts > 0 cannot be used with :load_balanced=true/)
|
|
1571
1481
|
end
|
|
1572
1482
|
end
|
|
1573
1483
|
|
|
1574
1484
|
context 'srv_max_hosts > 0 and replica_set' do
|
|
1575
1485
|
let(:client) do
|
|
1576
|
-
new_local_client_nmio(
|
|
1577
|
-
srv_max_hosts: 1, replica_set: 'rs')
|
|
1486
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1, replica_set: 'rs')
|
|
1578
1487
|
end
|
|
1579
1488
|
|
|
1580
1489
|
it 'it is rejected' do
|
|
@@ -1586,55 +1495,45 @@ describe Mongo::Client do
|
|
|
1586
1495
|
|
|
1587
1496
|
context 'srv_max_hosts < 0' do
|
|
1588
1497
|
let(:client) do
|
|
1589
|
-
new_local_client_nmio(
|
|
1590
|
-
srv_max_hosts: -1)
|
|
1498
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: -1)
|
|
1591
1499
|
end
|
|
1592
1500
|
|
|
1593
1501
|
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)
|
|
1502
|
+
expect { client }.not_to raise_error
|
|
1503
|
+
expect(client.options).not_to have_key(:srv_max_hosts)
|
|
1598
1504
|
end
|
|
1599
1505
|
end
|
|
1600
1506
|
|
|
1601
1507
|
context 'srv_max_hosts invalid type' do
|
|
1602
1508
|
let(:client) do
|
|
1603
|
-
new_local_client_nmio(
|
|
1604
|
-
srv_max_hosts: 'foo')
|
|
1509
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 'foo')
|
|
1605
1510
|
end
|
|
1606
1511
|
|
|
1607
1512
|
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)
|
|
1513
|
+
expect { client }.not_to raise_error
|
|
1514
|
+
expect(client.options).not_to have_key(:srv_max_hosts)
|
|
1612
1515
|
end
|
|
1613
1516
|
end
|
|
1614
1517
|
|
|
1615
1518
|
context 'srv_max_hosts with non-SRV URI' do
|
|
1616
1519
|
let(:client) do
|
|
1617
|
-
new_local_client_nmio(
|
|
1618
|
-
srv_max_hosts: 1)
|
|
1520
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1)
|
|
1619
1521
|
end
|
|
1620
1522
|
|
|
1621
1523
|
it 'is rejected' do
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
end.should raise_error(ArgumentError, /:srv_max_hosts cannot be used on non-SRV URI/)
|
|
1524
|
+
expect { client }
|
|
1525
|
+
.to raise_error(ArgumentError, /:srv_max_hosts cannot be used on non-SRV URI/)
|
|
1625
1526
|
end
|
|
1626
1527
|
end
|
|
1627
1528
|
|
|
1628
1529
|
context 'srv_service_name with non-SRV URI' do
|
|
1629
1530
|
let(:client) do
|
|
1630
|
-
new_local_client_nmio(
|
|
1631
|
-
srv_service_name: "customname")
|
|
1531
|
+
new_local_client_nmio(SINGLE_CLIENT, srv_service_name: 'customname')
|
|
1632
1532
|
end
|
|
1633
1533
|
|
|
1634
1534
|
it 'is rejected' do
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
end.should raise_error(ArgumentError, /:srv_service_name cannot be used on non-SRV URI/)
|
|
1535
|
+
expect { client }
|
|
1536
|
+
.to raise_error(ArgumentError, /:srv_service_name cannot be used on non-SRV URI/)
|
|
1638
1537
|
end
|
|
1639
1538
|
end
|
|
1640
1539
|
end
|
|
@@ -1644,7 +1543,8 @@ describe Mongo::Client do
|
|
|
1644
1543
|
double('srv result').tap do |result|
|
|
1645
1544
|
allow(result).to receive(:empty?).and_return(false)
|
|
1646
1545
|
allow(result).to receive(:address_strs).and_return(
|
|
1647
|
-
[ClusterConfig.instance.primary_address_str]
|
|
1546
|
+
[ ClusterConfig.instance.primary_address_str ]
|
|
1547
|
+
)
|
|
1648
1548
|
end
|
|
1649
1549
|
end
|
|
1650
1550
|
|
|
@@ -1655,79 +1555,77 @@ describe Mongo::Client do
|
|
|
1655
1555
|
new_local_client_nmio('mongodb+srv://foo.a.b', options)
|
|
1656
1556
|
end
|
|
1657
1557
|
|
|
1658
|
-
context
|
|
1558
|
+
context 'when setting srv_max_hosts' do
|
|
1659
1559
|
let(:srv_max_hosts) { 1 }
|
|
1660
1560
|
let(:options) { { srv_max_hosts: srv_max_hosts } }
|
|
1661
1561
|
|
|
1662
1562
|
it 'is accepted and sets srv_max_hosts' do
|
|
1663
|
-
|
|
1664
|
-
client
|
|
1665
|
-
end.should_not raise_error
|
|
1563
|
+
expect { client }.not_to raise_error
|
|
1666
1564
|
expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
|
|
1667
1565
|
end
|
|
1668
1566
|
end
|
|
1669
1567
|
|
|
1670
|
-
context
|
|
1568
|
+
context 'when setting srv_max_hosts to 0' do
|
|
1671
1569
|
let(:srv_max_hosts) { 0 }
|
|
1672
1570
|
let(:options) { { srv_max_hosts: srv_max_hosts } }
|
|
1673
1571
|
|
|
1674
1572
|
it 'is accepted sets srv_max_hosts' do
|
|
1675
|
-
|
|
1676
|
-
client
|
|
1677
|
-
end.should_not raise_error
|
|
1573
|
+
expect { client }.not_to raise_error
|
|
1678
1574
|
expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
|
|
1679
1575
|
end
|
|
1680
1576
|
end
|
|
1681
1577
|
|
|
1682
|
-
context
|
|
1578
|
+
context 'when setting srv_service_name' do
|
|
1683
1579
|
let(:srv_service_name) { 'customname' }
|
|
1684
1580
|
let(:options) { { srv_service_name: srv_service_name } }
|
|
1685
1581
|
|
|
1686
1582
|
it 'is accepted and sets srv_service_name' do
|
|
1687
|
-
|
|
1688
|
-
client
|
|
1689
|
-
end.should_not raise_error
|
|
1583
|
+
expect { client }.not_to raise_error
|
|
1690
1584
|
expect(client.options[:srv_service_name]).to eq(srv_service_name)
|
|
1691
1585
|
end
|
|
1692
1586
|
end
|
|
1693
1587
|
end
|
|
1694
1588
|
|
|
1695
1589
|
context ':bg_error_backtrace option' do
|
|
1696
|
-
[true, false, nil, 42].each do |valid_value|
|
|
1590
|
+
[ true, false, nil, 42 ].each do |valid_value|
|
|
1697
1591
|
context "valid value: #{valid_value.inspect}" do
|
|
1698
1592
|
let(:options) do
|
|
1699
|
-
{bg_error_backtrace: valid_value}
|
|
1593
|
+
{ bg_error_backtrace: valid_value }
|
|
1700
1594
|
end
|
|
1701
1595
|
|
|
1702
1596
|
it 'is accepted' do
|
|
1703
|
-
client.options[:bg_error_backtrace].
|
|
1597
|
+
expect(client.options[:bg_error_backtrace]).to be == valid_value
|
|
1704
1598
|
end
|
|
1705
1599
|
end
|
|
1706
1600
|
end
|
|
1707
1601
|
|
|
1708
1602
|
context 'invalid value type' do
|
|
1709
1603
|
let(:options) do
|
|
1710
|
-
{bg_error_backtrace: 'yes'}
|
|
1604
|
+
{ bg_error_backtrace: 'yes' }
|
|
1711
1605
|
end
|
|
1712
1606
|
|
|
1713
1607
|
it 'is rejected' do
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1608
|
+
expect { client }
|
|
1609
|
+
.to raise_error(
|
|
1610
|
+
ArgumentError,
|
|
1611
|
+
/:bg_error_backtrace option value must be true, false, nil or a positive integer/
|
|
1612
|
+
)
|
|
1717
1613
|
end
|
|
1718
1614
|
end
|
|
1719
1615
|
|
|
1720
1616
|
context 'invalid value' do
|
|
1721
|
-
[0, -1, 42.0].each do |invalid_value|
|
|
1617
|
+
[ 0, -1, 42.0 ].each do |invalid_value|
|
|
1722
1618
|
context "invalid value: #{invalid_value.inspect}" do
|
|
1723
1619
|
let(:options) do
|
|
1724
|
-
{bg_error_backtrace: invalid_value}
|
|
1620
|
+
{ bg_error_backtrace: invalid_value }
|
|
1725
1621
|
end
|
|
1726
1622
|
|
|
1727
1623
|
it 'is rejected' do
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1624
|
+
expect { client }
|
|
1625
|
+
.to raise_error(
|
|
1626
|
+
ArgumentError,
|
|
1627
|
+
/:bg_error_backtrace option value must be true, false, nil or a positive integer/
|
|
1628
|
+
)
|
|
1731
1629
|
end
|
|
1732
1630
|
end
|
|
1733
1631
|
end
|
|
@@ -1735,32 +1633,30 @@ describe Mongo::Client do
|
|
|
1735
1633
|
end
|
|
1736
1634
|
|
|
1737
1635
|
describe ':read option' do
|
|
1738
|
-
[
|
|
1739
|
-
|
|
1740
|
-
].each do |sym|
|
|
1741
|
-
describe "#{sym}" do
|
|
1636
|
+
%i[ primary primary_preferred secondary secondary_preferred nearest ].each do |sym|
|
|
1637
|
+
describe sym.to_s do
|
|
1742
1638
|
context 'when given as symbol' do
|
|
1743
1639
|
let(:options) do
|
|
1744
|
-
{read: {mode: sym}}
|
|
1640
|
+
{ read: { mode: sym } }
|
|
1745
1641
|
end
|
|
1746
1642
|
|
|
1747
|
-
it
|
|
1643
|
+
it 'is accepted' do
|
|
1748
1644
|
# the key got converted to a string here
|
|
1749
|
-
expect(client.read_preference).to eq({'mode' => sym})
|
|
1645
|
+
expect(client.read_preference).to eq({ 'mode' => sym })
|
|
1750
1646
|
end
|
|
1751
1647
|
end
|
|
1752
1648
|
|
|
1753
1649
|
context 'when given as string' do
|
|
1754
1650
|
let(:options) do
|
|
1755
|
-
{read: {mode: sym.to_s}}
|
|
1651
|
+
{ read: { mode: sym.to_s } }
|
|
1756
1652
|
end
|
|
1757
1653
|
|
|
1758
1654
|
# string keys are not documented as being allowed
|
|
1759
1655
|
# but the code accepts them
|
|
1760
|
-
it
|
|
1656
|
+
it 'is accepted' do
|
|
1761
1657
|
# the key got converted to a string here
|
|
1762
1658
|
# the value remains a string
|
|
1763
|
-
expect(client.read_preference).to eq({'mode' => sym.to_s})
|
|
1659
|
+
expect(client.read_preference).to eq({ 'mode' => sym.to_s })
|
|
1764
1660
|
end
|
|
1765
1661
|
end
|
|
1766
1662
|
end
|
|
@@ -1771,30 +1667,41 @@ describe Mongo::Client do
|
|
|
1771
1667
|
|
|
1772
1668
|
it 'rejects bogus read preference as symbol' do
|
|
1773
1669
|
expect do
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1670
|
+
new_local_client_nmio(SINGLE_CLIENT, read: { mode: :bogus })
|
|
1671
|
+
end.to raise_error(
|
|
1672
|
+
Mongo::Error::InvalidReadOption,
|
|
1673
|
+
'Invalid read preference value: {"mode"=>:bogus}: ' \
|
|
1674
|
+
'mode bogus is not one of recognized modes'
|
|
1675
|
+
)
|
|
1777
1676
|
end
|
|
1778
1677
|
|
|
1779
1678
|
it 'rejects bogus read preference as string' do
|
|
1780
1679
|
expect do
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1680
|
+
new_local_client_nmio(SINGLE_CLIENT, read: { mode: 'bogus' })
|
|
1681
|
+
end.to raise_error(
|
|
1682
|
+
Mongo::Error::InvalidReadOption,
|
|
1683
|
+
'Invalid read preference value: {"mode"=>"bogus"}: mode bogus is not one of recognized modes'
|
|
1684
|
+
)
|
|
1784
1685
|
end
|
|
1785
1686
|
|
|
1786
1687
|
it 'rejects read option specified as a string' do
|
|
1787
1688
|
expect do
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1689
|
+
new_local_client_nmio(SINGLE_CLIENT, read: 'primary')
|
|
1690
|
+
end.to raise_error(
|
|
1691
|
+
Mongo::Error::InvalidReadOption,
|
|
1692
|
+
'Invalid read preference value: "primary": ' \
|
|
1693
|
+
'the read preference must be specified as a hash: { mode: "primary" }'
|
|
1694
|
+
)
|
|
1791
1695
|
end
|
|
1792
1696
|
|
|
1793
1697
|
it 'rejects read option specified as a symbol' do
|
|
1794
1698
|
expect do
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1699
|
+
new_local_client_nmio(SINGLE_CLIENT, read: :primary)
|
|
1700
|
+
end.to raise_error(
|
|
1701
|
+
Mongo::Error::InvalidReadOption,
|
|
1702
|
+
'Invalid read preference value: :primary: ' \
|
|
1703
|
+
'the read preference must be specified as a hash: { mode: :primary }'
|
|
1704
|
+
)
|
|
1798
1705
|
end
|
|
1799
1706
|
end
|
|
1800
1707
|
end
|
|
@@ -1808,7 +1715,7 @@ describe Mongo::Client do
|
|
|
1808
1715
|
end
|
|
1809
1716
|
|
|
1810
1717
|
it 'does not warn' do
|
|
1811
|
-
expect(Mongo::Logger.logger).
|
|
1718
|
+
expect(Mongo::Logger.logger).not_to receive(:warn)
|
|
1812
1719
|
new_local_client_nmio(SpecConfig.instance.addresses, options)
|
|
1813
1720
|
end
|
|
1814
1721
|
end
|
|
@@ -1834,15 +1741,17 @@ describe Mongo::Client do
|
|
|
1834
1741
|
it 'raises an exception' do
|
|
1835
1742
|
expect do
|
|
1836
1743
|
new_local_client_nmio(SpecConfig.instance.addresses, options)
|
|
1837
|
-
end.to raise_error(
|
|
1744
|
+
end.to raise_error(
|
|
1745
|
+
Mongo::Error::InvalidReadConcern,
|
|
1746
|
+
'The after_cluster_time read_concern option cannot be specified by the user'
|
|
1747
|
+
)
|
|
1838
1748
|
end
|
|
1839
1749
|
end
|
|
1840
1750
|
end
|
|
1841
1751
|
|
|
1842
1752
|
context 'when an invalid option is provided' do
|
|
1843
|
-
|
|
1844
1753
|
let(:options) do
|
|
1845
|
-
{ssl: false, invalid: :test}
|
|
1754
|
+
{ ssl: false, invalid: :test }
|
|
1846
1755
|
end
|
|
1847
1756
|
|
|
1848
1757
|
it 'does not set the option' do
|
|
@@ -1861,9 +1770,8 @@ describe Mongo::Client do
|
|
|
1861
1770
|
|
|
1862
1771
|
=begin WriteConcern object support
|
|
1863
1772
|
context 'when write concern is provided via a WriteConcern object' do
|
|
1864
|
-
|
|
1865
1773
|
let(:options) do
|
|
1866
|
-
{write_concern: wc}
|
|
1774
|
+
{ write_concern: wc }
|
|
1867
1775
|
end
|
|
1868
1776
|
|
|
1869
1777
|
let(:wc) { Mongo::WriteConcern.get(w: 2) }
|
|
@@ -1881,52 +1789,52 @@ describe Mongo::Client do
|
|
|
1881
1789
|
|
|
1882
1790
|
context ':wrapping_libraries option' do
|
|
1883
1791
|
let(:options) do
|
|
1884
|
-
{wrapping_libraries: wrapping_libraries}
|
|
1792
|
+
{ wrapping_libraries: wrapping_libraries }
|
|
1885
1793
|
end
|
|
1886
1794
|
|
|
1887
1795
|
context 'valid input' do
|
|
1888
1796
|
context 'symbol keys' do
|
|
1889
1797
|
let(:wrapping_libraries) do
|
|
1890
|
-
[name: 'Mongoid', version: '7.1.2'].freeze
|
|
1798
|
+
[ { name: 'Mongoid', version: '7.1.2' } ].freeze
|
|
1891
1799
|
end
|
|
1892
1800
|
|
|
1893
1801
|
it 'works' do
|
|
1894
|
-
client.options[:wrapping_libraries].
|
|
1802
|
+
expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
|
|
1895
1803
|
end
|
|
1896
1804
|
end
|
|
1897
1805
|
|
|
1898
1806
|
context 'string keys' do
|
|
1899
1807
|
let(:wrapping_libraries) do
|
|
1900
|
-
['name' => 'Mongoid', 'version' => '7.1.2'].freeze
|
|
1808
|
+
[ { 'name' => 'Mongoid', 'version' => '7.1.2' } ].freeze
|
|
1901
1809
|
end
|
|
1902
1810
|
|
|
1903
1811
|
it 'works' do
|
|
1904
|
-
client.options[:wrapping_libraries].
|
|
1812
|
+
expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
|
|
1905
1813
|
end
|
|
1906
1814
|
end
|
|
1907
1815
|
|
|
1908
1816
|
context 'Redacted keys' do
|
|
1909
1817
|
let(:wrapping_libraries) do
|
|
1910
|
-
[Mongo::Options::Redacted.new(name: 'Mongoid', version: '7.1.2')].freeze
|
|
1818
|
+
[ Mongo::Options::Redacted.new(name: 'Mongoid', version: '7.1.2') ].freeze
|
|
1911
1819
|
end
|
|
1912
1820
|
|
|
1913
1821
|
it 'works' do
|
|
1914
|
-
client.options[:wrapping_libraries].
|
|
1822
|
+
expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
|
|
1915
1823
|
end
|
|
1916
1824
|
end
|
|
1917
1825
|
|
|
1918
1826
|
context 'two libraries' do
|
|
1919
1827
|
let(:wrapping_libraries) do
|
|
1920
1828
|
[
|
|
1921
|
-
{name: 'Mongoid', version: '7.1.2'},
|
|
1922
|
-
{name: 'Rails', version: '4.0', platform: 'Foobar'},
|
|
1829
|
+
{ name: 'Mongoid', version: '7.1.2' },
|
|
1830
|
+
{ name: 'Rails', version: '4.0', platform: 'Foobar' },
|
|
1923
1831
|
].freeze
|
|
1924
1832
|
end
|
|
1925
1833
|
|
|
1926
1834
|
it 'works' do
|
|
1927
|
-
client.options[:wrapping_libraries].
|
|
1928
|
-
{'name' => 'Mongoid', 'version' => '7.1.2'},
|
|
1929
|
-
{'name' => 'Rails', 'version' => '4.0', 'platform' => 'Foobar'},
|
|
1835
|
+
expect(client.options[:wrapping_libraries]).to be == [
|
|
1836
|
+
{ 'name' => 'Mongoid', 'version' => '7.1.2' },
|
|
1837
|
+
{ 'name' => 'Rails', 'version' => '4.0', 'platform' => 'Foobar' },
|
|
1930
1838
|
]
|
|
1931
1839
|
end
|
|
1932
1840
|
end
|
|
@@ -1937,7 +1845,7 @@ describe Mongo::Client do
|
|
|
1937
1845
|
end
|
|
1938
1846
|
|
|
1939
1847
|
it 'works' do
|
|
1940
|
-
client.options[:wrapping_libraries].
|
|
1848
|
+
expect(client.options[:wrapping_libraries]).to be == []
|
|
1941
1849
|
end
|
|
1942
1850
|
end
|
|
1943
1851
|
|
|
@@ -1947,7 +1855,7 @@ describe Mongo::Client do
|
|
|
1947
1855
|
end
|
|
1948
1856
|
|
|
1949
1857
|
it 'works' do
|
|
1950
|
-
client.options[:wrapping_libraries].
|
|
1858
|
+
expect(client.options[:wrapping_libraries]).to be_nil
|
|
1951
1859
|
end
|
|
1952
1860
|
end
|
|
1953
1861
|
end
|
|
@@ -1955,37 +1863,34 @@ describe Mongo::Client do
|
|
|
1955
1863
|
context 'valid input' do
|
|
1956
1864
|
context 'hash given instead of an array' do
|
|
1957
1865
|
let(:wrapping_libraries) do
|
|
1958
|
-
{name: 'Mongoid', version: '7.1.2'}.freeze
|
|
1866
|
+
{ name: 'Mongoid', version: '7.1.2' }.freeze
|
|
1959
1867
|
end
|
|
1960
1868
|
|
|
1961
1869
|
it 'is rejected' do
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
end.should raise_error(ArgumentError, /:wrapping_libraries must be an array of hashes/)
|
|
1870
|
+
expect { client }
|
|
1871
|
+
.to raise_error(ArgumentError, /:wrapping_libraries must be an array of hashes/)
|
|
1965
1872
|
end
|
|
1966
1873
|
end
|
|
1967
1874
|
|
|
1968
1875
|
context 'invalid keys' do
|
|
1969
1876
|
let(:wrapping_libraries) do
|
|
1970
|
-
[name: 'Mongoid', invalid: '7.1.2'].freeze
|
|
1877
|
+
[ { name: 'Mongoid', invalid: '7.1.2' } ].freeze
|
|
1971
1878
|
end
|
|
1972
1879
|
|
|
1973
1880
|
it 'is rejected' do
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
end.should raise_error(ArgumentError, /:wrapping_libraries element has invalid keys/)
|
|
1881
|
+
expect { client }
|
|
1882
|
+
.to raise_error(ArgumentError, /:wrapping_libraries element has invalid keys/)
|
|
1977
1883
|
end
|
|
1978
1884
|
end
|
|
1979
1885
|
|
|
1980
1886
|
context 'value includes |' do
|
|
1981
1887
|
let(:wrapping_libraries) do
|
|
1982
|
-
[name: 'Mongoid|on|Rails', version: '7.1.2'].freeze
|
|
1888
|
+
[ { name: 'Mongoid|on|Rails', version: '7.1.2' } ].freeze
|
|
1983
1889
|
end
|
|
1984
1890
|
|
|
1985
1891
|
it 'is rejected' do
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
end.should raise_error(ArgumentError, /:wrapping_libraries element value cannot include '|'/)
|
|
1892
|
+
expect { client }
|
|
1893
|
+
.to raise_error(ArgumentError, /:wrapping_libraries element value cannot include '|'/)
|
|
1989
1894
|
end
|
|
1990
1895
|
end
|
|
1991
1896
|
end
|
|
@@ -1993,12 +1898,10 @@ describe Mongo::Client do
|
|
|
1993
1898
|
|
|
1994
1899
|
context ':auth_mech_properties option' do
|
|
1995
1900
|
context 'is nil' do
|
|
1996
|
-
let(:options)
|
|
1997
|
-
{auth_mech_properties: nil}
|
|
1998
|
-
end
|
|
1901
|
+
let(:options) { { auth_mech_properties: nil } }
|
|
1999
1902
|
|
|
2000
1903
|
it 'creates the client without the option' do
|
|
2001
|
-
client.options.
|
|
1904
|
+
expect(client.options).not_to have_key(:auth_mech_properties)
|
|
2002
1905
|
end
|
|
2003
1906
|
end
|
|
2004
1907
|
end
|
|
@@ -2007,15 +1910,17 @@ describe Mongo::Client do
|
|
|
2007
1910
|
context 'is a hash with symbol keys' do
|
|
2008
1911
|
context 'using known keys' do
|
|
2009
1912
|
let(:options) do
|
|
2010
|
-
{
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
1913
|
+
{
|
|
1914
|
+
server_api: {
|
|
1915
|
+
version: '1',
|
|
1916
|
+
strict: true,
|
|
1917
|
+
deprecation_errors: false,
|
|
1918
|
+
}
|
|
1919
|
+
}
|
|
2015
1920
|
end
|
|
2016
1921
|
|
|
2017
1922
|
it 'is accepted' do
|
|
2018
|
-
client.options[:server_api].
|
|
1923
|
+
expect(client.options[:server_api]).to be == {
|
|
2019
1924
|
'version' => '1',
|
|
2020
1925
|
'strict' => true,
|
|
2021
1926
|
'deprecation_errors' => false,
|
|
@@ -2025,41 +1930,34 @@ describe Mongo::Client do
|
|
|
2025
1930
|
|
|
2026
1931
|
context 'using an unknown version' do
|
|
2027
1932
|
let(:options) do
|
|
2028
|
-
{server_api: {
|
|
2029
|
-
version: '42',
|
|
2030
|
-
}}
|
|
1933
|
+
{ server_api: { version: '42' } }
|
|
2031
1934
|
end
|
|
2032
1935
|
|
|
2033
1936
|
it 'is rejected' do
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
end.should raise_error(ArgumentError, 'Unknown server API version: 42')
|
|
1937
|
+
expect { client }
|
|
1938
|
+
.to raise_error(ArgumentError, 'Unknown server API version: 42')
|
|
2037
1939
|
end
|
|
2038
1940
|
end
|
|
2039
1941
|
|
|
2040
1942
|
context 'using an unknown option' do
|
|
2041
1943
|
let(:options) do
|
|
2042
|
-
{server_api: {
|
|
2043
|
-
vversion: '1',
|
|
2044
|
-
}}
|
|
1944
|
+
{ server_api: { vversion: '1' } }
|
|
2045
1945
|
end
|
|
2046
1946
|
|
|
2047
1947
|
it 'is rejected' do
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
end.should raise_error(ArgumentError, 'Unknown keys under :server_api: "vversion"')
|
|
1948
|
+
expect { client }
|
|
1949
|
+
.to raise_error(ArgumentError, 'Unknown keys under :server_api: "vversion"')
|
|
2051
1950
|
end
|
|
2052
1951
|
end
|
|
2053
1952
|
|
|
2054
1953
|
context 'using a value which is not a hash' do
|
|
2055
1954
|
let(:options) do
|
|
2056
|
-
{server_api: 42}
|
|
1955
|
+
{ server_api: 42 }
|
|
2057
1956
|
end
|
|
2058
1957
|
|
|
2059
1958
|
it 'is rejected' do
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
end.should raise_error(ArgumentError, ':server_api value must be a hash: 42')
|
|
1959
|
+
expect { client }
|
|
1960
|
+
.to raise_error(ArgumentError, ':server_api value must be a hash: 42')
|
|
2063
1961
|
end
|
|
2064
1962
|
end
|
|
2065
1963
|
end
|
|
@@ -2068,16 +1966,18 @@ describe Mongo::Client do
|
|
|
2068
1966
|
max_server_version '3.4'
|
|
2069
1967
|
|
|
2070
1968
|
let(:options) do
|
|
2071
|
-
{server_api: {version: 1}}
|
|
1969
|
+
{ server_api: { version: 1 } }
|
|
2072
1970
|
end
|
|
2073
1971
|
|
|
2074
1972
|
let(:client) do
|
|
2075
|
-
new_local_client(
|
|
2076
|
-
SpecConfig.instance.
|
|
1973
|
+
new_local_client(
|
|
1974
|
+
SpecConfig.instance.addresses,
|
|
1975
|
+
SpecConfig.instance.all_test_options.merge(options)
|
|
1976
|
+
)
|
|
2077
1977
|
end
|
|
2078
1978
|
|
|
2079
1979
|
it 'constructs the client' do
|
|
2080
|
-
client.
|
|
1980
|
+
expect(client).to be_a(described_class)
|
|
2081
1981
|
end
|
|
2082
1982
|
|
|
2083
1983
|
it 'does not discover servers' do
|
|
@@ -2087,9 +1987,8 @@ describe Mongo::Client do
|
|
|
2087
1987
|
end
|
|
2088
1988
|
|
|
2089
1989
|
it 'fails operations' do
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
end.should raise_error(Mongo::Error::NoServerAvailable)
|
|
1990
|
+
expect { client.command(ping: 1) }
|
|
1991
|
+
.to raise_error(Mongo::Error::NoServerAvailable)
|
|
2093
1992
|
end
|
|
2094
1993
|
end
|
|
2095
1994
|
end
|
|
@@ -2099,9 +1998,9 @@ describe Mongo::Client do
|
|
|
2099
1998
|
context 'when the block doesn\'t raise an error' do
|
|
2100
1999
|
let(:block_client) do
|
|
2101
2000
|
c = nil
|
|
2102
|
-
|
|
2001
|
+
described_class.new(
|
|
2103
2002
|
SpecConfig.instance.addresses,
|
|
2104
|
-
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
2003
|
+
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
2105
2004
|
) do |client|
|
|
2106
2005
|
c = client
|
|
2107
2006
|
end
|
|
@@ -2109,55 +2008,112 @@ describe Mongo::Client do
|
|
|
2109
2008
|
end
|
|
2110
2009
|
|
|
2111
2010
|
it 'is closed after block' do
|
|
2112
|
-
expect(block_client.cluster.connected?).to
|
|
2011
|
+
expect(block_client.cluster.connected?).to be false
|
|
2012
|
+
end
|
|
2013
|
+
|
|
2014
|
+
context 'with auto encryption options' do
|
|
2015
|
+
require_libmongocrypt
|
|
2016
|
+
min_server_fcv '4.2'
|
|
2017
|
+
require_enterprise
|
|
2018
|
+
clean_slate
|
|
2019
|
+
|
|
2020
|
+
include_context 'define shared FLE helpers'
|
|
2021
|
+
include_context 'with local kms_providers'
|
|
2022
|
+
|
|
2023
|
+
let(:auto_encryption_options) do
|
|
2024
|
+
{
|
|
2025
|
+
key_vault_client: key_vault_client,
|
|
2026
|
+
key_vault_namespace: key_vault_namespace,
|
|
2027
|
+
kms_providers: kms_providers,
|
|
2028
|
+
schema_map: schema_map,
|
|
2029
|
+
extra_options: extra_options,
|
|
2030
|
+
}
|
|
2031
|
+
end
|
|
2032
|
+
|
|
2033
|
+
let(:key_vault_client) { new_local_client_nmio(SpecConfig.instance.addresses) }
|
|
2034
|
+
|
|
2035
|
+
let(:block_client) do
|
|
2036
|
+
c = nil
|
|
2037
|
+
described_class.new(
|
|
2038
|
+
SpecConfig.instance.addresses,
|
|
2039
|
+
SpecConfig.instance.test_options.merge(
|
|
2040
|
+
auto_encryption_options: auto_encryption_options,
|
|
2041
|
+
database: SpecConfig.instance.test_db
|
|
2042
|
+
)
|
|
2043
|
+
) do |client|
|
|
2044
|
+
c = client
|
|
2045
|
+
end
|
|
2046
|
+
c
|
|
2047
|
+
end
|
|
2048
|
+
|
|
2049
|
+
it 'closes all clients after block' do
|
|
2050
|
+
expect(block_client.cluster.connected?).to be false
|
|
2051
|
+
[
|
|
2052
|
+
block_client.encrypter.mongocryptd_client,
|
|
2053
|
+
block_client.encrypter.key_vault_client,
|
|
2054
|
+
block_client.encrypter.metadata_client
|
|
2055
|
+
].each do |crypt_client|
|
|
2056
|
+
expect(crypt_client.cluster.connected?).to be false
|
|
2057
|
+
end
|
|
2058
|
+
end
|
|
2113
2059
|
end
|
|
2114
2060
|
end
|
|
2115
2061
|
|
|
2116
2062
|
context 'when the block raises an error' do
|
|
2117
|
-
it '
|
|
2063
|
+
it 'is closed after the block' do
|
|
2118
2064
|
block_client_raise = nil
|
|
2119
2065
|
expect do
|
|
2120
|
-
|
|
2066
|
+
described_class.new(
|
|
2121
2067
|
SpecConfig.instance.addresses,
|
|
2122
|
-
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
2068
|
+
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
|
|
2123
2069
|
) do |client|
|
|
2124
2070
|
block_client_raise = client
|
|
2125
|
-
raise
|
|
2071
|
+
raise 'This is an error!'
|
|
2126
2072
|
end
|
|
2127
|
-
end.to raise_error(StandardError,
|
|
2128
|
-
expect(block_client_raise.cluster.connected?).to
|
|
2073
|
+
end.to raise_error(StandardError, 'This is an error!')
|
|
2074
|
+
expect(block_client_raise.cluster.connected?).to be false
|
|
2129
2075
|
end
|
|
2130
2076
|
end
|
|
2131
2077
|
|
|
2132
2078
|
context 'when the hosts given include the protocol' do
|
|
2133
2079
|
it 'raises an error on mongodb://' do
|
|
2134
2080
|
expect do
|
|
2135
|
-
|
|
2136
|
-
end.to raise_error(ArgumentError,
|
|
2081
|
+
described_class.new([ 'mongodb://127.0.0.1:27017/test' ])
|
|
2082
|
+
end.to raise_error(ArgumentError,
|
|
2083
|
+
"Host 'mongodb://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2084
|
+
'Did you mean to not use an array?')
|
|
2137
2085
|
end
|
|
2138
2086
|
|
|
2139
2087
|
it 'raises an error on mongodb+srv://' do
|
|
2140
2088
|
expect do
|
|
2141
|
-
|
|
2142
|
-
end.to raise_error(ArgumentError,
|
|
2089
|
+
described_class.new([ 'mongodb+srv://127.0.0.1:27017/test' ])
|
|
2090
|
+
end.to raise_error(ArgumentError,
|
|
2091
|
+
"Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2092
|
+
'Did you mean to not use an array?')
|
|
2143
2093
|
end
|
|
2144
2094
|
|
|
2145
2095
|
it 'raises an error on multiple items' do
|
|
2146
2096
|
expect do
|
|
2147
|
-
|
|
2148
|
-
end.to raise_error(ArgumentError,
|
|
2097
|
+
described_class.new([ '127.0.0.1:27017', 'mongodb+srv://127.0.0.1:27017/test' ])
|
|
2098
|
+
end.to raise_error(ArgumentError,
|
|
2099
|
+
"Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2100
|
+
'Did you mean to not use an array?')
|
|
2149
2101
|
end
|
|
2150
2102
|
|
|
2151
2103
|
it 'raises an error only at beginning of string' do
|
|
2152
2104
|
expect do
|
|
2153
|
-
|
|
2154
|
-
|
|
2105
|
+
described_class
|
|
2106
|
+
.new([ 'somethingmongodb://127.0.0.1:27017/test', 'mongodb+srv://127.0.0.1:27017/test' ])
|
|
2107
|
+
end.to raise_error(ArgumentError,
|
|
2108
|
+
"Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2109
|
+
'Did you mean to not use an array?')
|
|
2155
2110
|
end
|
|
2156
2111
|
|
|
2157
2112
|
it 'raises an error with different case' do
|
|
2158
|
-
expect
|
|
2159
|
-
|
|
2160
|
-
|
|
2113
|
+
expect { described_class.new([ 'MongOdB://127.0.0.1:27017/test' ]) }
|
|
2114
|
+
.to raise_error(ArgumentError,
|
|
2115
|
+
"Host 'MongOdB://127.0.0.1:27017/test' should not contain protocol. " \
|
|
2116
|
+
'Did you mean to not use an array?')
|
|
2161
2117
|
end
|
|
2162
2118
|
end
|
|
2163
2119
|
end
|
|
@@ -2247,13 +2203,11 @@ describe Mongo::Client do
|
|
|
2247
2203
|
end
|
|
2248
2204
|
|
|
2249
2205
|
describe '#use' do
|
|
2250
|
-
|
|
2251
2206
|
let(:client) do
|
|
2252
|
-
new_local_client_nmio(
|
|
2207
|
+
new_local_client_nmio(SINGLE_CLIENT, database: SpecConfig.instance.test_db)
|
|
2253
2208
|
end
|
|
2254
2209
|
|
|
2255
2210
|
shared_examples_for 'a database switching object' do
|
|
2256
|
-
|
|
2257
2211
|
it 'returns the new client' do
|
|
2258
2212
|
expect(client.send(:database).name).to eq('ruby-driver')
|
|
2259
2213
|
end
|
|
@@ -2264,7 +2218,6 @@ describe Mongo::Client do
|
|
|
2264
2218
|
end
|
|
2265
2219
|
|
|
2266
2220
|
context 'when provided a string' do
|
|
2267
|
-
|
|
2268
2221
|
let(:database) do
|
|
2269
2222
|
client.use('testdb')
|
|
2270
2223
|
end
|
|
@@ -2273,7 +2226,6 @@ describe Mongo::Client do
|
|
|
2273
2226
|
end
|
|
2274
2227
|
|
|
2275
2228
|
context 'when provided a symbol' do
|
|
2276
|
-
|
|
2277
2229
|
let(:database) do
|
|
2278
2230
|
client.use(:testdb)
|
|
2279
2231
|
end
|
|
@@ -2282,45 +2234,29 @@ describe Mongo::Client do
|
|
|
2282
2234
|
end
|
|
2283
2235
|
|
|
2284
2236
|
context 'when providing nil' do
|
|
2285
|
-
|
|
2286
2237
|
it 'raises an exception' do
|
|
2287
|
-
expect {
|
|
2288
|
-
|
|
2289
|
-
}.to raise_error(Mongo::Error::InvalidDatabaseName)
|
|
2238
|
+
expect { client.use(nil) }
|
|
2239
|
+
.to raise_error(Mongo::Error::InvalidDatabaseName)
|
|
2290
2240
|
end
|
|
2291
2241
|
end
|
|
2292
2242
|
end
|
|
2293
2243
|
|
|
2294
2244
|
describe '#with' do
|
|
2295
|
-
|
|
2296
2245
|
let(:client) do
|
|
2297
|
-
new_local_client_nmio(
|
|
2246
|
+
new_local_client_nmio(SINGLE_CLIENT, database: SpecConfig.instance.test_db)
|
|
2298
2247
|
end
|
|
2299
2248
|
|
|
2300
2249
|
context 'when providing nil' do
|
|
2301
|
-
|
|
2302
2250
|
it 'returns the cloned client' do
|
|
2303
2251
|
expect(client.with(nil)).to eq(client)
|
|
2304
2252
|
end
|
|
2305
2253
|
end
|
|
2306
2254
|
|
|
2307
2255
|
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
|
|
2256
|
+
let(:client) { authorized_client }
|
|
2257
|
+
let(:original_options) { client.options }
|
|
2258
|
+
let(:new_options) { { app_name: 'client_test' } }
|
|
2259
|
+
let(:new_client) { authorized_client.with(new_options) }
|
|
2324
2260
|
|
|
2325
2261
|
it 'returns a new client' do
|
|
2326
2262
|
expect(new_client).not_to equal(client)
|
|
@@ -2346,27 +2282,25 @@ describe Mongo::Client do
|
|
|
2346
2282
|
new_local_client(SpecConfig.instance.addresses, options)
|
|
2347
2283
|
end
|
|
2348
2284
|
|
|
2349
|
-
before do
|
|
2350
|
-
client.options[:direct_connection].should be nil
|
|
2351
|
-
end
|
|
2352
|
-
|
|
2353
2285
|
let(:new_client) do
|
|
2354
2286
|
client.with(new_options)
|
|
2355
2287
|
end
|
|
2356
2288
|
|
|
2357
|
-
|
|
2289
|
+
before do
|
|
2290
|
+
expect(client.options[:direct_connection]).to be_nil
|
|
2291
|
+
end
|
|
2358
2292
|
|
|
2293
|
+
context 'direct_connection set to false' do
|
|
2359
2294
|
let(:new_options) do
|
|
2360
2295
|
{ direct_connection: false }
|
|
2361
2296
|
end
|
|
2362
2297
|
|
|
2363
2298
|
it 'is accepted' do
|
|
2364
|
-
new_client.options[:direct_connection].
|
|
2299
|
+
expect(new_client.options[:direct_connection]).to be false
|
|
2365
2300
|
end
|
|
2366
2301
|
end
|
|
2367
2302
|
|
|
2368
2303
|
context 'direct_connection set to true' do
|
|
2369
|
-
|
|
2370
2304
|
let(:new_options) do
|
|
2371
2305
|
{ direct_connection: true }
|
|
2372
2306
|
end
|
|
@@ -2374,10 +2308,9 @@ describe Mongo::Client do
|
|
|
2374
2308
|
context 'in single topology' do
|
|
2375
2309
|
require_topology :single
|
|
2376
2310
|
|
|
2377
|
-
|
|
2378
2311
|
it 'is accepted' do
|
|
2379
|
-
new_client.options[:direct_connection].
|
|
2380
|
-
new_client.cluster.topology.
|
|
2312
|
+
expect(new_client.options[:direct_connection]).to be true
|
|
2313
|
+
expect(new_client.cluster.topology).to be_a(Mongo::Cluster::Topology::Single)
|
|
2381
2314
|
end
|
|
2382
2315
|
end
|
|
2383
2316
|
|
|
@@ -2385,21 +2318,19 @@ describe Mongo::Client do
|
|
|
2385
2318
|
require_topology :replica_set, :sharded
|
|
2386
2319
|
|
|
2387
2320
|
it 'is rejected' do
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
|
|
2321
|
+
expect { new_client }
|
|
2322
|
+
.to raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
|
|
2391
2323
|
end
|
|
2392
2324
|
|
|
2393
2325
|
context 'when a new cluster is created' do
|
|
2394
|
-
|
|
2395
2326
|
let(:new_options) do
|
|
2396
2327
|
{ direct_connection: true, app_name: 'new-client' }
|
|
2397
2328
|
end
|
|
2398
2329
|
|
|
2399
2330
|
it 'is rejected' do
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2331
|
+
expect { new_client }
|
|
2332
|
+
.to raise_error(ArgumentError,
|
|
2333
|
+
/direct_connection=true cannot be used with topologies other than Single/)
|
|
2403
2334
|
end
|
|
2404
2335
|
end
|
|
2405
2336
|
end
|
|
@@ -2407,28 +2338,37 @@ describe Mongo::Client do
|
|
|
2407
2338
|
end
|
|
2408
2339
|
|
|
2409
2340
|
context 'when the write concern is not changed' do
|
|
2410
|
-
|
|
2411
2341
|
let(:client) do
|
|
2412
2342
|
new_local_client_nmio(
|
|
2413
|
-
|
|
2414
|
-
:
|
|
2343
|
+
SINGLE_CLIENT,
|
|
2344
|
+
read: { mode: :secondary },
|
|
2345
|
+
write: { w: 1 },
|
|
2346
|
+
database: SpecConfig.instance.test_db
|
|
2415
2347
|
)
|
|
2416
2348
|
end
|
|
2417
2349
|
|
|
2418
|
-
let
|
|
2419
|
-
client.with(:read => { :mode => :primary })
|
|
2420
|
-
end
|
|
2350
|
+
let(:new_client) { client.with(read: { mode: :primary }) }
|
|
2421
2351
|
|
|
2422
2352
|
let(:new_options) do
|
|
2423
|
-
Mongo::Options::Redacted.new(
|
|
2424
|
-
:
|
|
2425
|
-
:
|
|
2353
|
+
Mongo::Options::Redacted.new(
|
|
2354
|
+
read: { mode: :primary },
|
|
2355
|
+
write: { w: 1 },
|
|
2356
|
+
monitoring_io: false,
|
|
2357
|
+
database: SpecConfig.instance.test_db,
|
|
2358
|
+
retry_writes: true,
|
|
2359
|
+
retry_reads: true
|
|
2360
|
+
)
|
|
2426
2361
|
end
|
|
2427
2362
|
|
|
2428
2363
|
let(:original_options) do
|
|
2429
|
-
Mongo::Options::Redacted.new(
|
|
2430
|
-
:
|
|
2431
|
-
:
|
|
2364
|
+
Mongo::Options::Redacted.new(
|
|
2365
|
+
read: { mode: :secondary },
|
|
2366
|
+
write: { w: 1 },
|
|
2367
|
+
monitoring_io: false,
|
|
2368
|
+
database: SpecConfig.instance.test_db,
|
|
2369
|
+
retry_writes: true,
|
|
2370
|
+
retry_reads: true
|
|
2371
|
+
)
|
|
2432
2372
|
end
|
|
2433
2373
|
|
|
2434
2374
|
it 'returns a new client' do
|
|
@@ -2449,21 +2389,19 @@ describe Mongo::Client do
|
|
|
2449
2389
|
end
|
|
2450
2390
|
|
|
2451
2391
|
context 'when the write concern is changed' do
|
|
2452
|
-
|
|
2453
2392
|
let(:client) do
|
|
2454
|
-
new_local_client(
|
|
2455
|
-
|
|
2393
|
+
new_local_client(
|
|
2394
|
+
SINGLE_CLIENT,
|
|
2395
|
+
{ monitoring_io: false }.merge(client_options)
|
|
2396
|
+
)
|
|
2456
2397
|
end
|
|
2457
2398
|
|
|
2458
2399
|
let(:client_options) do
|
|
2459
|
-
{ :
|
|
2400
|
+
{ write: { w: 1 } }
|
|
2460
2401
|
end
|
|
2461
2402
|
|
|
2462
2403
|
context 'when the write concern has not been accessed' do
|
|
2463
|
-
|
|
2464
|
-
let!(:new_client) do
|
|
2465
|
-
client.with(:write => { :w => 0 })
|
|
2466
|
-
end
|
|
2404
|
+
let(:new_client) { client.with(write: { w: 0 }) }
|
|
2467
2405
|
|
|
2468
2406
|
let(:get_last_error) do
|
|
2469
2407
|
new_client.write_concern.get_last_error
|
|
@@ -2475,10 +2413,9 @@ describe Mongo::Client do
|
|
|
2475
2413
|
end
|
|
2476
2414
|
|
|
2477
2415
|
context 'when the write concern has been accessed' do
|
|
2478
|
-
|
|
2479
|
-
let!(:new_client) do
|
|
2416
|
+
let(:new_client) do
|
|
2480
2417
|
client.write_concern
|
|
2481
|
-
client.with(:
|
|
2418
|
+
client.with(write: { w: 0 })
|
|
2482
2419
|
end
|
|
2483
2420
|
|
|
2484
2421
|
let(:get_last_error) do
|
|
@@ -2491,9 +2428,8 @@ describe Mongo::Client do
|
|
|
2491
2428
|
end
|
|
2492
2429
|
|
|
2493
2430
|
context 'when write concern is given as :write' do
|
|
2494
|
-
|
|
2495
2431
|
let(:client_options) do
|
|
2496
|
-
{ :
|
|
2432
|
+
{ write: { w: 1 } }
|
|
2497
2433
|
end
|
|
2498
2434
|
|
|
2499
2435
|
it 'sets :write option' do
|
|
@@ -2501,7 +2437,7 @@ describe Mongo::Client do
|
|
|
2501
2437
|
end
|
|
2502
2438
|
|
|
2503
2439
|
it 'does not set :write_concern option' do
|
|
2504
|
-
expect(client.options[:write_concern]).to
|
|
2440
|
+
expect(client.options[:write_concern]).to be_nil
|
|
2505
2441
|
end
|
|
2506
2442
|
|
|
2507
2443
|
it 'returns correct write concern' do
|
|
@@ -2511,9 +2447,8 @@ describe Mongo::Client do
|
|
|
2511
2447
|
end
|
|
2512
2448
|
|
|
2513
2449
|
context 'when write concern is given as :write_concern' do
|
|
2514
|
-
|
|
2515
2450
|
let(:client_options) do
|
|
2516
|
-
{ :
|
|
2451
|
+
{ write_concern: { w: 1 } }
|
|
2517
2452
|
end
|
|
2518
2453
|
|
|
2519
2454
|
it 'sets :write_concern option' do
|
|
@@ -2521,20 +2456,19 @@ describe Mongo::Client do
|
|
|
2521
2456
|
end
|
|
2522
2457
|
|
|
2523
2458
|
it 'does not set :write option' do
|
|
2524
|
-
expect(client.options[:write]).to
|
|
2459
|
+
expect(client.options[:write]).to be_nil
|
|
2525
2460
|
end
|
|
2526
2461
|
|
|
2527
2462
|
it 'returns correct write concern' do
|
|
2528
|
-
|
|
2529
|
-
|
|
2463
|
+
expect(client.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
|
|
2464
|
+
expect(client.write_concern.options).to eq(w: 1)
|
|
2530
2465
|
end
|
|
2531
2466
|
end
|
|
2532
2467
|
|
|
2533
2468
|
context 'when write concern is given as both :write and :write_concern' do
|
|
2534
2469
|
context 'with identical values' do
|
|
2535
|
-
|
|
2536
2470
|
let(:client_options) do
|
|
2537
|
-
{ write: {w: 1}, write_concern: { w: 1 } }
|
|
2471
|
+
{ write: { w: 1 }, write_concern: { w: 1 } }
|
|
2538
2472
|
end
|
|
2539
2473
|
|
|
2540
2474
|
it 'sets :write_concern option' do
|
|
@@ -2552,9 +2486,8 @@ describe Mongo::Client do
|
|
|
2552
2486
|
end
|
|
2553
2487
|
|
|
2554
2488
|
context 'with different values' do
|
|
2555
|
-
|
|
2556
2489
|
let(:client_options) do
|
|
2557
|
-
{ write: {w: 1}, write_concern: { w: 2 } }
|
|
2490
|
+
{ write: { w: 1 }, write_concern: { w: 2 } }
|
|
2558
2491
|
end
|
|
2559
2492
|
|
|
2560
2493
|
it 'raises an exception' do
|
|
@@ -2566,43 +2499,35 @@ describe Mongo::Client do
|
|
|
2566
2499
|
end
|
|
2567
2500
|
|
|
2568
2501
|
context 'when #with uses a different write concern option name' do
|
|
2569
|
-
|
|
2570
2502
|
context 'from :write_concern to :write' do
|
|
2571
|
-
|
|
2572
2503
|
let(:client_options) do
|
|
2573
|
-
{ :
|
|
2504
|
+
{ write_concern: { w: 1 } }
|
|
2574
2505
|
end
|
|
2575
2506
|
|
|
2576
|
-
let
|
|
2577
|
-
client.with(:write => { :w => 2 })
|
|
2578
|
-
end
|
|
2507
|
+
let(:new_client) { client.with(write: { w: 2 }) }
|
|
2579
2508
|
|
|
2580
2509
|
it 'uses the new option' do
|
|
2581
2510
|
expect(new_client.options[:write]).to eq(Mongo::Options::Redacted.new(w: 2))
|
|
2582
|
-
expect(new_client.options[:write_concern]).to
|
|
2511
|
+
expect(new_client.options[:write_concern]).to be_nil
|
|
2583
2512
|
end
|
|
2584
2513
|
end
|
|
2585
2514
|
|
|
2586
2515
|
context 'from :write to :write_concern' do
|
|
2587
|
-
|
|
2588
2516
|
let(:client_options) do
|
|
2589
|
-
{ :
|
|
2517
|
+
{ write: { w: 1 } }
|
|
2590
2518
|
end
|
|
2591
2519
|
|
|
2592
|
-
let
|
|
2593
|
-
client.with(:write_concern => { :w => 2 })
|
|
2594
|
-
end
|
|
2520
|
+
let(:new_client) { client.with(write_concern: { w: 2 }) }
|
|
2595
2521
|
|
|
2596
2522
|
it 'uses the new option' do
|
|
2597
2523
|
expect(new_client.options[:write_concern]).to eq(Mongo::Options::Redacted.new(w: 2))
|
|
2598
|
-
expect(new_client.options[:write]).to
|
|
2524
|
+
expect(new_client.options[:write]).to be_nil
|
|
2599
2525
|
end
|
|
2600
2526
|
end
|
|
2601
2527
|
end
|
|
2602
2528
|
end
|
|
2603
2529
|
|
|
2604
2530
|
context 'when an invalid option is provided' do
|
|
2605
|
-
|
|
2606
2531
|
let(:new_client) do
|
|
2607
2532
|
client.with(invalid: :option, ssl: false)
|
|
2608
2533
|
end
|
|
@@ -2623,24 +2548,18 @@ describe Mongo::Client do
|
|
|
2623
2548
|
|
|
2624
2549
|
context 'when client is created with ipv6 address' do
|
|
2625
2550
|
let(:client) do
|
|
2626
|
-
new_local_client_nmio(['[::1]:27017'], :
|
|
2551
|
+
new_local_client_nmio([ '[::1]:27017' ], database: SpecConfig.instance.test_db)
|
|
2627
2552
|
end
|
|
2628
2553
|
|
|
2629
2554
|
context 'when providing nil' do
|
|
2630
|
-
|
|
2631
2555
|
it 'returns the cloned client' do
|
|
2632
2556
|
expect(client.with(nil)).to eq(client)
|
|
2633
2557
|
end
|
|
2634
2558
|
end
|
|
2635
2559
|
|
|
2636
2560
|
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
|
|
2561
|
+
let(:new_options) { { app_name: 'client_test' } }
|
|
2562
|
+
let(:new_client) { client.with(new_options) }
|
|
2644
2563
|
|
|
2645
2564
|
it 'returns a new client' do
|
|
2646
2565
|
expect(new_client).not_to equal(client)
|
|
@@ -2650,11 +2569,14 @@ describe Mongo::Client do
|
|
|
2650
2569
|
|
|
2651
2570
|
context 'when new client has a new cluster' do
|
|
2652
2571
|
let(:client) do
|
|
2653
|
-
new_local_client(
|
|
2572
|
+
new_local_client(
|
|
2573
|
+
SINGLE_CLIENT,
|
|
2654
2574
|
database: SpecConfig.instance.test_db,
|
|
2655
2575
|
server_selection_timeout: 0.5,
|
|
2656
|
-
socket_timeout: 0.1, connect_timeout: 0.1
|
|
2576
|
+
socket_timeout: 0.1, connect_timeout: 0.1, populator_io: false
|
|
2577
|
+
)
|
|
2657
2578
|
end
|
|
2579
|
+
|
|
2658
2580
|
let(:new_client) do
|
|
2659
2581
|
client.with(app_name: 'client_construction_spec').tap do |new_client|
|
|
2660
2582
|
expect(new_client.cluster).not_to eql(client.cluster)
|
|
@@ -2678,26 +2600,28 @@ describe Mongo::Client do
|
|
|
2678
2600
|
# in #with, the consistent behavior is to never transfer sdam_proc to
|
|
2679
2601
|
# the new client.
|
|
2680
2602
|
context 'when sdam_proc is given on original client' do
|
|
2681
|
-
|
|
2682
2603
|
let(:sdam_proc) do
|
|
2683
|
-
|
|
2604
|
+
proc do |client|
|
|
2684
2605
|
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
|
2685
2606
|
end
|
|
2686
2607
|
end
|
|
2687
2608
|
|
|
2688
2609
|
let(:client) do
|
|
2689
|
-
new_local_client(
|
|
2610
|
+
new_local_client(
|
|
2611
|
+
SpecConfig.instance.addresses,
|
|
2690
2612
|
SpecConfig.instance.test_options.merge(
|
|
2691
2613
|
sdam_proc: sdam_proc,
|
|
2692
2614
|
connect_timeout: 3.08, socket_timeout: 3.09,
|
|
2693
2615
|
server_selection_timeout: 2.92,
|
|
2694
2616
|
heartbeat_frequency: 100,
|
|
2695
|
-
database: SpecConfig.instance.test_db
|
|
2617
|
+
database: SpecConfig.instance.test_db
|
|
2618
|
+
)
|
|
2619
|
+
)
|
|
2696
2620
|
end
|
|
2697
2621
|
|
|
2698
2622
|
let(:new_client) do
|
|
2699
2623
|
client.with(app_name: 'foo').tap do |new_client|
|
|
2700
|
-
new_client.cluster.
|
|
2624
|
+
expect(new_client.cluster).not_to be == client.cluster
|
|
2701
2625
|
end
|
|
2702
2626
|
end
|
|
2703
2627
|
|
|
@@ -2706,14 +2630,14 @@ describe Mongo::Client do
|
|
|
2706
2630
|
events = subscriber.select_started_events(Mongo::Monitoring::Event::ServerHeartbeatStarted)
|
|
2707
2631
|
if ClusterConfig.instance.topology == :load_balanced
|
|
2708
2632
|
# No server monitoring in LB topology
|
|
2709
|
-
events.length.
|
|
2633
|
+
expect(events.length).to be == 0
|
|
2710
2634
|
else
|
|
2711
|
-
events.length.
|
|
2635
|
+
expect(events.length).to be > 0
|
|
2712
2636
|
end
|
|
2713
2637
|
end
|
|
2714
2638
|
|
|
2715
2639
|
it 'does not copy sdam_proc option to new client' do
|
|
2716
|
-
expect(new_client.options[:sdam_proc]).to
|
|
2640
|
+
expect(new_client.options[:sdam_proc]).to be_nil
|
|
2717
2641
|
end
|
|
2718
2642
|
|
|
2719
2643
|
it 'does not notify subscribers set up by sdam_proc' do
|
|
@@ -2735,34 +2659,34 @@ describe Mongo::Client do
|
|
|
2735
2659
|
new_client.cluster.next_primary
|
|
2736
2660
|
|
|
2737
2661
|
# Diagnostics
|
|
2662
|
+
# rubocop:disable Style/IfUnlessModifier, Lint/Debugger
|
|
2738
2663
|
unless subscriber.started_events.empty?
|
|
2739
2664
|
p subscriber.started_events
|
|
2740
2665
|
end
|
|
2666
|
+
# rubocop:enable Style/IfUnlessModifier, Lint/Debugger
|
|
2741
2667
|
|
|
2742
2668
|
expect(subscriber.started_events.length).to eq 0
|
|
2743
|
-
new_client.cluster.topology.class.
|
|
2669
|
+
expect(new_client.cluster.topology.class).not_to be Mongo::Cluster::Topology::Unknown
|
|
2744
2670
|
end
|
|
2745
2671
|
end
|
|
2746
2672
|
|
|
2747
2673
|
context 'when :server_api is changed' do
|
|
2748
|
-
|
|
2749
2674
|
let(:client) do
|
|
2750
|
-
new_local_client_nmio(
|
|
2675
|
+
new_local_client_nmio(SINGLE_CLIENT)
|
|
2751
2676
|
end
|
|
2752
2677
|
|
|
2753
2678
|
let(:new_client) do
|
|
2754
|
-
client.with(server_api: {version: '1'})
|
|
2679
|
+
client.with(server_api: { version: '1' })
|
|
2755
2680
|
end
|
|
2756
2681
|
|
|
2757
2682
|
it 'changes :server_api' do
|
|
2758
|
-
new_client.options[:server_api].
|
|
2683
|
+
expect(new_client.options[:server_api]).to be == { 'version' => '1' }
|
|
2759
2684
|
end
|
|
2760
2685
|
end
|
|
2761
2686
|
|
|
2762
2687
|
context 'when :server_api is cleared' do
|
|
2763
|
-
|
|
2764
2688
|
let(:client) do
|
|
2765
|
-
new_local_client_nmio(
|
|
2689
|
+
new_local_client_nmio(SINGLE_CLIENT, server_api: { version: '1' })
|
|
2766
2690
|
end
|
|
2767
2691
|
|
|
2768
2692
|
let(:new_client) do
|
|
@@ -2770,19 +2694,17 @@ describe Mongo::Client do
|
|
|
2770
2694
|
end
|
|
2771
2695
|
|
|
2772
2696
|
it 'clears :server_api' do
|
|
2773
|
-
new_client.options[:server_api].
|
|
2697
|
+
expect(new_client.options[:server_api]).to be_nil
|
|
2774
2698
|
end
|
|
2775
2699
|
end
|
|
2776
|
-
|
|
2777
2700
|
end
|
|
2778
2701
|
|
|
2779
2702
|
describe '#dup' do
|
|
2780
|
-
|
|
2781
2703
|
let(:client) do
|
|
2782
2704
|
new_local_client_nmio(
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2705
|
+
SINGLE_CLIENT,
|
|
2706
|
+
read: { mode: :primary },
|
|
2707
|
+
database: SpecConfig.instance.test_db
|
|
2786
2708
|
)
|
|
2787
2709
|
end
|
|
2788
2710
|
|
|
@@ -2795,3 +2717,7 @@ describe Mongo::Client do
|
|
|
2795
2717
|
it_behaves_like 'duplicated client with reused monitoring'
|
|
2796
2718
|
end
|
|
2797
2719
|
end
|
|
2720
|
+
# rubocop:enable RSpec/ExpectInHook, RSpec/MessageSpies, RSpec/ExampleLength
|
|
2721
|
+
# rubocop:enable RSpec/ContextWording, RSpec/RepeatedExampleGroupDescription
|
|
2722
|
+
# rubocop:enable RSpec/ExampleWording, Style/BlockComments, RSpec/AnyInstance
|
|
2723
|
+
# rubocop:enable RSpec/VerifiedDoubles
|