mongo 2.12.1 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +8 -36
- data/LICENSE +1 -1
- data/README.md +54 -54
- data/Rakefile +16 -10
- data/lib/mongo.rb +8 -3
- data/lib/mongo/active_support.rb +1 -1
- data/lib/mongo/address.rb +78 -37
- data/lib/mongo/address/ipv4.rb +32 -5
- data/lib/mongo/address/ipv6.rb +32 -5
- data/lib/mongo/address/unix.rb +3 -3
- data/lib/mongo/address/validator.rb +1 -1
- data/lib/mongo/auth.rb +36 -13
- data/lib/mongo/auth/aws.rb +37 -0
- data/lib/mongo/auth/aws/conversation.rb +128 -0
- data/lib/mongo/auth/aws/credentials_retriever.rb +219 -0
- data/lib/mongo/auth/aws/request.rb +283 -0
- data/lib/mongo/auth/base.rb +129 -0
- data/lib/mongo/auth/conversation_base.rb +52 -0
- data/lib/mongo/auth/cr.rb +9 -36
- data/lib/mongo/auth/cr/conversation.rb +24 -69
- data/lib/mongo/auth/credential_cache.rb +1 -1
- data/lib/mongo/auth/gssapi.rb +38 -0
- data/lib/mongo/auth/gssapi/conversation.rb +108 -0
- data/lib/mongo/auth/ldap.rb +9 -34
- data/lib/mongo/auth/ldap/conversation.rb +3 -43
- data/lib/mongo/auth/roles.rb +1 -1
- data/lib/mongo/auth/sasl_conversation_base.rb +111 -0
- data/lib/mongo/auth/scram.rb +39 -51
- data/lib/mongo/auth/scram/conversation.rb +12 -506
- data/lib/mongo/auth/scram256.rb +31 -0
- data/lib/mongo/auth/scram256/conversation.rb +63 -0
- data/lib/mongo/auth/scram_conversation_base.rb +402 -0
- data/lib/mongo/auth/stringprep.rb +5 -4
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +2 -1
- data/lib/mongo/auth/stringprep/tables.rb +2 -1
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -0
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -0
- data/lib/mongo/auth/user.rb +2 -2
- data/lib/mongo/auth/user/view.rb +1 -1
- data/lib/mongo/auth/x509.rb +14 -32
- data/lib/mongo/auth/x509/conversation.rb +15 -42
- data/lib/mongo/background_thread.rb +11 -2
- data/lib/mongo/bson.rb +1 -1
- data/lib/mongo/bulk_write.rb +62 -26
- data/lib/mongo/bulk_write/combineable.rb +20 -8
- 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 +9 -10
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/validatable.rb +5 -1
- data/lib/mongo/client.rb +214 -31
- data/lib/mongo/client_encryption.rb +1 -1
- data/lib/mongo/cluster.rb +177 -69
- data/lib/mongo/cluster/periodic_executor.rb +1 -1
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +1 -1
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
- data/lib/mongo/cluster/sdam_flow.rb +36 -17
- data/lib/mongo/cluster/topology.rb +19 -2
- data/lib/mongo/cluster/topology/base.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 +4 -3
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
- data/lib/mongo/cluster/topology/sharded.rb +2 -2
- data/lib/mongo/cluster/topology/single.rb +2 -2
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/cluster_time.rb +1 -1
- data/lib/mongo/collection.rb +39 -15
- data/lib/mongo/collection/view.rb +6 -2
- data/lib/mongo/collection/view/aggregation.rb +6 -3
- data/lib/mongo/collection/view/builder.rb +1 -1
- data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
- data/lib/mongo/collection/view/builder/find_command.rb +9 -1
- data/lib/mongo/collection/view/builder/flags.rb +1 -1
- data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
- data/lib/mongo/collection/view/builder/op_query.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +3 -6
- data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
- 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 +8 -2
- data/lib/mongo/collection/view/map_reduce.rb +7 -4
- data/lib/mongo/collection/view/readable.rb +13 -3
- data/lib/mongo/collection/view/writable.rb +93 -13
- data/lib/mongo/crypt.rb +1 -1
- data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
- data/lib/mongo/crypt/auto_encrypter.rb +1 -1
- data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
- data/lib/mongo/crypt/binary.rb +1 -1
- data/lib/mongo/crypt/binding.rb +1 -1
- data/lib/mongo/crypt/context.rb +1 -1
- data/lib/mongo/crypt/data_key_context.rb +1 -1
- data/lib/mongo/crypt/encryption_io.rb +41 -24
- data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
- data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
- data/lib/mongo/crypt/explicit_encryption_context.rb +1 -1
- data/lib/mongo/crypt/handle.rb +1 -1
- data/lib/mongo/crypt/hooks.rb +1 -1
- data/lib/mongo/crypt/kms_context.rb +1 -1
- data/lib/mongo/crypt/status.rb +1 -1
- data/lib/mongo/cursor.rb +3 -3
- data/lib/mongo/cursor/builder.rb +1 -1
- data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
- data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
- data/lib/mongo/database.rb +35 -5
- data/lib/mongo/database/view.rb +21 -6
- data/lib/mongo/dbref.rb +1 -1
- data/lib/mongo/distinguishing_semaphore.rb +55 -0
- data/lib/mongo/error.rb +28 -2
- data/lib/mongo/error/auth_error.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/closed_stream.rb +1 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
- data/lib/mongo/error/connection_perished.rb +23 -0
- data/lib/mongo/error/credential_check_error.rb +26 -0
- data/lib/mongo/error/extra_file_chunk.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/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_cursor_operation.rb +1 -1
- data/lib/mongo/error/invalid_database_name.rb +1 -1
- data/lib/mongo/error/invalid_document.rb +1 -1
- data/lib/mongo/error/invalid_file.rb +1 -1
- data/lib/mongo/error/invalid_file_revision.rb +1 -1
- data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
- data/lib/mongo/error/invalid_nonce.rb +2 -2
- 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 +22 -0
- data/lib/mongo/error/invalid_server_auth_response.rb +23 -0
- data/lib/mongo/error/invalid_server_preference.rb +6 -1
- data/lib/mongo/error/invalid_session.rb +3 -2
- 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/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_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 +27 -0
- 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_srv_records.rb +1 -1
- data/lib/mongo/error/notable.rb +18 -3
- data/lib/mongo/error/operation_failure.rb +63 -44
- data/lib/mongo/error/parser.rb +16 -5
- data/lib/mongo/error/pool_closed_error.rb +1 -1
- data/lib/mongo/error/raise_original_error.rb +29 -0
- data/lib/mongo/error/session_ended.rb +1 -1
- data/lib/mongo/error/sessions_not_supported.rb +35 -0
- 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/unsupported_array_filters.rb +7 -2
- data/lib/mongo/error/unsupported_collation.rb +7 -2
- 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 +99 -0
- data/lib/mongo/error/write_retryable.rb +1 -1
- data/lib/mongo/event.rb +1 -1
- data/lib/mongo/event/base.rb +7 -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/grid.rb +1 -1
- data/lib/mongo/grid/file.rb +6 -1
- data/lib/mongo/grid/file/chunk.rb +3 -1
- data/lib/mongo/grid/file/info.rb +1 -1
- data/lib/mongo/grid/fs_bucket.rb +22 -15
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/grid/stream/write.rb +10 -4
- data/lib/mongo/id.rb +1 -1
- data/lib/mongo/index.rb +2 -1
- data/lib/mongo/index/view.rb +61 -11
- data/lib/mongo/lint.rb +10 -0
- data/lib/mongo/loggable.rb +1 -1
- data/lib/mongo/logger.rb +1 -1
- data/lib/mongo/monitoring.rb +39 -1
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/command_log_subscriber.rb +20 -5
- data/lib/mongo/monitoring/event.rb +1 -1
- data/lib/mongo/monitoring/event/cmap.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 +1 -1
- 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/command_failed.rb +12 -1
- data/lib/mongo/monitoring/event/command_started.rb +44 -3
- data/lib/mongo/monitoring/event/command_succeeded.rb +12 -1
- data/lib/mongo/monitoring/event/secure.rb +8 -2
- data/lib/mongo/monitoring/event/server_closed.rb +2 -2
- data/lib/mongo/monitoring/event/server_description_changed.rb +28 -5
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +10 -3
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +10 -3
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +10 -3
- data/lib/mongo/monitoring/event/server_opening.rb +2 -2
- data/lib/mongo/monitoring/event/topology_changed.rb +2 -2
- data/lib/mongo/monitoring/event/topology_closed.rb +2 -2
- data/lib/mongo/monitoring/event/topology_opening.rb +2 -2
- data/lib/mongo/monitoring/publishable.rb +9 -9
- 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 +10 -2
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +2 -2
- 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/operation.rb +1 -0
- data/lib/mongo/operation/aggregate.rb +1 -1
- data/lib/mongo/operation/aggregate/command.rb +5 -5
- data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
- data/lib/mongo/operation/aggregate/result.rb +1 -1
- data/lib/mongo/operation/collections_info.rb +3 -36
- data/lib/mongo/operation/collections_info/command.rb +40 -0
- data/lib/mongo/operation/collections_info/result.rb +1 -1
- data/lib/mongo/operation/command.rb +1 -1
- data/lib/mongo/operation/command/command.rb +3 -3
- data/lib/mongo/operation/command/op_msg.rb +1 -1
- data/lib/mongo/operation/count.rb +1 -1
- data/lib/mongo/operation/count/command.rb +3 -3
- data/lib/mongo/operation/count/op_msg.rb +1 -1
- data/lib/mongo/operation/create.rb +1 -1
- data/lib/mongo/operation/create/command.rb +3 -3
- data/lib/mongo/operation/create/op_msg.rb +1 -1
- data/lib/mongo/operation/create_index.rb +1 -1
- data/lib/mongo/operation/create_index/command.rb +4 -4
- data/lib/mongo/operation/create_index/op_msg.rb +6 -3
- data/lib/mongo/operation/create_user.rb +1 -1
- data/lib/mongo/operation/create_user/command.rb +4 -4
- data/lib/mongo/operation/create_user/op_msg.rb +2 -2
- data/lib/mongo/operation/delete.rb +1 -1
- data/lib/mongo/operation/delete/bulk_result.rb +1 -1
- data/lib/mongo/operation/delete/command.rb +4 -4
- data/lib/mongo/operation/delete/legacy.rb +2 -2
- data/lib/mongo/operation/delete/op_msg.rb +4 -4
- data/lib/mongo/operation/delete/result.rb +2 -2
- data/lib/mongo/operation/distinct.rb +1 -1
- data/lib/mongo/operation/distinct/command.rb +3 -3
- data/lib/mongo/operation/distinct/op_msg.rb +1 -1
- data/lib/mongo/operation/drop.rb +1 -1
- data/lib/mongo/operation/drop/command.rb +3 -3
- data/lib/mongo/operation/drop/op_msg.rb +1 -1
- data/lib/mongo/operation/drop_database.rb +1 -1
- data/lib/mongo/operation/drop_database/command.rb +3 -3
- data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
- data/lib/mongo/operation/drop_index.rb +1 -1
- data/lib/mongo/operation/drop_index/command.rb +4 -4
- data/lib/mongo/operation/drop_index/op_msg.rb +2 -2
- data/lib/mongo/operation/explain.rb +1 -1
- data/lib/mongo/operation/explain/command.rb +3 -3
- data/lib/mongo/operation/explain/legacy.rb +3 -3
- data/lib/mongo/operation/explain/op_msg.rb +1 -1
- data/lib/mongo/operation/explain/result.rb +1 -1
- data/lib/mongo/operation/find.rb +1 -1
- data/lib/mongo/operation/find/command.rb +3 -3
- data/lib/mongo/operation/find/legacy.rb +3 -3
- data/lib/mongo/operation/find/legacy/result.rb +1 -1
- data/lib/mongo/operation/find/op_msg.rb +2 -12
- data/lib/mongo/operation/find/result.rb +1 -1
- data/lib/mongo/operation/get_more.rb +1 -1
- data/lib/mongo/operation/get_more/command.rb +3 -3
- data/lib/mongo/operation/get_more/legacy.rb +2 -2
- data/lib/mongo/operation/get_more/op_msg.rb +2 -12
- data/lib/mongo/operation/get_more/result.rb +1 -1
- data/lib/mongo/operation/indexes.rb +1 -1
- data/lib/mongo/operation/indexes/command.rb +3 -3
- data/lib/mongo/operation/indexes/legacy.rb +4 -4
- data/lib/mongo/operation/indexes/op_msg.rb +1 -1
- data/lib/mongo/operation/indexes/result.rb +1 -1
- data/lib/mongo/operation/insert.rb +3 -2
- data/lib/mongo/operation/insert/bulk_result.rb +6 -2
- data/lib/mongo/operation/insert/command.rb +7 -7
- data/lib/mongo/operation/insert/legacy.rb +9 -5
- data/lib/mongo/operation/insert/op_msg.rb +6 -6
- data/lib/mongo/operation/insert/result.rb +7 -4
- data/lib/mongo/operation/kill_cursors.rb +1 -1
- data/lib/mongo/operation/kill_cursors/command.rb +3 -3
- data/lib/mongo/operation/kill_cursors/legacy.rb +2 -2
- data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
- data/lib/mongo/operation/list_collections.rb +1 -1
- data/lib/mongo/operation/list_collections/command.rb +4 -4
- data/lib/mongo/operation/list_collections/op_msg.rb +2 -2
- data/lib/mongo/operation/list_collections/result.rb +1 -1
- data/lib/mongo/operation/map_reduce.rb +1 -1
- data/lib/mongo/operation/map_reduce/command.rb +3 -3
- 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/op_msg_base.rb +3 -3
- data/lib/mongo/operation/parallel_scan.rb +1 -1
- data/lib/mongo/operation/parallel_scan/command.rb +5 -5
- data/lib/mongo/operation/parallel_scan/op_msg.rb +2 -2
- data/lib/mongo/operation/parallel_scan/result.rb +1 -1
- data/lib/mongo/operation/remove_user.rb +1 -1
- data/lib/mongo/operation/remove_user/command.rb +4 -4
- data/lib/mongo/operation/remove_user/op_msg.rb +2 -2
- data/lib/mongo/operation/result.rb +28 -4
- data/lib/mongo/operation/shared/bypass_document_validation.rb +10 -4
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +3 -3
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +56 -0
- data/lib/mongo/operation/shared/executable.rb +46 -28
- data/lib/mongo/operation/shared/executable_no_validate.rb +3 -3
- 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 +10 -2
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
- data/lib/mongo/operation/shared/op_msg_or_command.rb +7 -5
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +8 -6
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +8 -6
- 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 +19 -16
- data/lib/mongo/operation/shared/response_handling.rb +83 -8
- 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 +50 -27
- data/lib/mongo/operation/shared/specifiable.rb +32 -20
- data/lib/mongo/operation/shared/write.rb +25 -19
- data/lib/mongo/operation/shared/write_concern_supported.rb +6 -6
- data/lib/mongo/operation/update.rb +1 -1
- data/lib/mongo/operation/update/bulk_result.rb +1 -1
- data/lib/mongo/operation/update/command.rb +4 -4
- data/lib/mongo/operation/update/legacy.rb +2 -2
- data/lib/mongo/operation/update/legacy/result.rb +1 -1
- data/lib/mongo/operation/update/op_msg.rb +4 -4
- data/lib/mongo/operation/update/result.rb +2 -2
- data/lib/mongo/operation/update_user.rb +1 -1
- data/lib/mongo/operation/update_user/command.rb +4 -4
- data/lib/mongo/operation/update_user/op_msg.rb +2 -2
- data/lib/mongo/operation/users_info.rb +1 -1
- data/lib/mongo/operation/users_info/command.rb +4 -4
- data/lib/mongo/operation/users_info/op_msg.rb +2 -2
- data/lib/mongo/operation/users_info/result.rb +1 -1
- data/lib/mongo/options.rb +1 -1
- data/lib/mongo/options/mapper.rb +1 -1
- data/lib/mongo/options/redacted.rb +1 -1
- data/lib/mongo/protocol/bit_vector.rb +1 -1
- data/lib/mongo/protocol/compressed.rb +1 -1
- data/lib/mongo/protocol/delete.rb +1 -1
- data/lib/mongo/protocol/get_more.rb +1 -1
- data/lib/mongo/protocol/insert.rb +1 -1
- data/lib/mongo/protocol/kill_cursors.rb +1 -1
- data/lib/mongo/protocol/message.rb +37 -9
- data/lib/mongo/protocol/msg.rb +37 -4
- 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 +6 -3
- data/lib/mongo/protocol/update.rb +1 -1
- data/lib/mongo/retryable.rb +23 -10
- data/lib/mongo/semaphore.rb +1 -1
- data/lib/mongo/server.rb +40 -8
- data/lib/mongo/server/app_metadata.rb +44 -7
- data/lib/mongo/server/connection.rb +37 -133
- data/lib/mongo/server/connection_base.rb +56 -15
- data/lib/mongo/server/connection_common.rb +75 -1
- data/lib/mongo/server/connection_pool.rb +20 -1
- data/lib/mongo/server/connection_pool/populator.rb +1 -1
- data/lib/mongo/server/context.rb +1 -1
- data/lib/mongo/server/description.rb +49 -2
- data/lib/mongo/server/description/features.rb +12 -3
- data/lib/mongo/server/monitor.rb +145 -69
- data/lib/mongo/server/monitor/app_metadata.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +110 -80
- data/lib/mongo/server/pending_connection.rb +215 -3
- data/lib/mongo/server/push_monitor.rb +173 -0
- data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
- data/lib/mongo/server/round_trip_time_averager.rb +12 -3
- data/lib/mongo/server_selector.rb +2 -2
- data/lib/mongo/server_selector/{selectable.rb → base.rb} +159 -86
- data/lib/mongo/server_selector/nearest.rb +26 -21
- data/lib/mongo/server_selector/primary.rb +24 -28
- data/lib/mongo/server_selector/primary_preferred.rb +32 -25
- data/lib/mongo/server_selector/secondary.rb +26 -21
- data/lib/mongo/server_selector/secondary_preferred.rb +29 -34
- data/lib/mongo/session.rb +14 -1
- data/lib/mongo/session/server_session.rb +1 -1
- data/lib/mongo/session/session_pool.rb +1 -1
- data/lib/mongo/socket.rb +121 -41
- data/lib/mongo/socket/ssl.rb +98 -35
- data/lib/mongo/socket/tcp.rb +39 -31
- data/lib/mongo/socket/unix.rb +14 -6
- data/lib/mongo/srv.rb +1 -1
- data/lib/mongo/srv/monitor.rb +1 -1
- data/lib/mongo/srv/resolver.rb +1 -1
- data/lib/mongo/srv/result.rb +1 -1
- data/lib/mongo/timeout.rb +9 -9
- data/lib/mongo/topology_version.rb +89 -0
- data/lib/mongo/uri.rb +61 -47
- data/lib/mongo/uri/srv_protocol.rb +9 -1
- data/lib/mongo/utils.rb +62 -0
- data/lib/mongo/version.rb +2 -2
- data/lib/mongo/write_concern.rb +1 -1
- 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/mongo.gemspec +1 -1
- data/spec/NOTES.aws-auth.md +291 -0
- data/spec/README.aws-auth.md +318 -0
- data/spec/README.md +64 -17
- data/spec/integration/auth_spec.rb +29 -9
- data/spec/integration/awaited_ismaster_spec.rb +28 -0
- data/spec/integration/aws_auth_request_spec.rb +74 -0
- data/spec/integration/aws_credentials_retriever_spec.rb +103 -0
- data/spec/integration/bulk_write_spec.rb +19 -0
- data/spec/integration/change_stream_examples_spec.rb +6 -2
- data/spec/integration/change_stream_spec.rb +123 -51
- data/spec/integration/check_clean_slate_spec.rb +16 -0
- data/spec/integration/client_construction_aws_auth_spec.rb +191 -0
- data/spec/integration/client_construction_spec.rb +2 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +3 -3
- data/spec/integration/collection_indexes_prose_spec.rb +55 -0
- data/spec/integration/command_monitoring_spec.rb +30 -6
- data/spec/integration/command_spec.rb +11 -9
- data/spec/integration/connect_single_rs_name_spec.rb +10 -5
- data/spec/integration/connection_spec.rb +7 -3
- data/spec/integration/crud_spec.rb +32 -4
- data/spec/integration/cursor_reaping_spec.rb +14 -10
- data/spec/integration/docs_examples_spec.rb +6 -0
- data/spec/integration/fork_reconnect_spec.rb +143 -0
- data/spec/integration/get_more_spec.rb +10 -3
- data/spec/integration/grid_fs_bucket_spec.rb +48 -0
- data/spec/integration/heartbeat_events_spec.rb +5 -24
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/read_preference_spec.rb +41 -11
- data/spec/integration/reconnect_spec.rb +2 -3
- data/spec/integration/retryable_errors_spec.rb +33 -14
- data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +55 -51
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +401 -0
- data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +15 -0
- data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +24 -0
- data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +25 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +215 -0
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +232 -0
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +110 -0
- data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +19 -0
- data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +25 -0
- data/spec/integration/retryable_writes/shared/supports_retries.rb +16 -0
- data/spec/integration/sdam_error_handling_spec.rb +142 -22
- data/spec/integration/sdam_events_spec.rb +77 -5
- data/spec/integration/sdam_prose_spec.rb +64 -0
- data/spec/integration/server_monitor_spec.rb +25 -1
- data/spec/integration/server_spec.rb +42 -26
- data/spec/integration/size_limit_spec.rb +26 -9
- data/spec/integration/ssl_uri_options_spec.rb +2 -2
- data/spec/integration/step_down_spec.rb +15 -15
- data/spec/integration/transactions_api_examples_spec.rb +59 -0
- data/spec/integration/transactions_examples_spec.rb +5 -2
- data/spec/integration/x509_auth_spec.rb +109 -0
- data/spec/integration/zlib_compression_spec.rb +25 -0
- data/spec/kerberos/kerberos_spec.rb +10 -6
- data/spec/lite_spec_helper.rb +31 -22
- data/spec/mongo/address/ipv4_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +2 -2
- data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
- data/spec/mongo/auth/aws/request_spec.rb +76 -0
- data/spec/mongo/auth/cr_spec.rb +7 -7
- data/spec/mongo/auth/gssapi/conversation_spec.rb +121 -0
- 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 +3 -3
- data/spec/mongo/auth/scram/conversation_spec.rb +119 -334
- data/spec/mongo/auth/scram256/conversation_spec.rb +171 -0
- data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +13 -8
- data/spec/mongo/auth/scram_spec.rb +29 -69
- 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 +8 -8
- data/spec/mongo/auth_spec.rb +4 -4
- data/spec/mongo/bulk_write_spec.rb +206 -2
- data/spec/mongo/client_construction_spec.rb +609 -86
- data/spec/mongo/client_spec.rb +59 -5
- data/spec/mongo/cluster/topology/replica_set_spec.rb +52 -9
- data/spec/mongo/cluster/topology/single_spec.rb +4 -2
- data/spec/mongo/cluster_spec.rb +37 -36
- data/spec/mongo/collection/view/aggregation_spec.rb +6 -2
- data/spec/mongo/collection/view/builder/find_command_spec.rb +17 -6
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +392 -0
- data/spec/mongo/collection/view/change_stream_spec.rb +0 -318
- data/spec/mongo/collection/view/iterable_spec.rb +38 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +6 -2
- data/spec/mongo/collection/view/readable_spec.rb +15 -1
- data/spec/mongo/collection/view/writable_spec.rb +208 -1
- data/spec/mongo/collection_spec.rb +531 -43
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +6 -1
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +6 -1
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +6 -1
- data/spec/mongo/cursor_spec.rb +9 -1
- data/spec/mongo/database_spec.rb +251 -10
- data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
- data/spec/mongo/error/operation_failure_heavy_spec.rb +58 -0
- data/spec/mongo/error/operation_failure_spec.rb +167 -69
- data/spec/mongo/error/unsupported_option_spec.rb +54 -0
- data/spec/mongo/grid/fs_bucket_spec.rb +18 -0
- data/spec/mongo/grid/stream/write_spec.rb +32 -0
- data/spec/mongo/index/view_spec.rb +312 -0
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
- data/spec/mongo/operation/aggregate/result_spec.rb +6 -1
- data/spec/mongo/operation/delete/bulk_spec.rb +18 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +22 -14
- data/spec/mongo/operation/find/legacy_spec.rb +27 -7
- data/spec/mongo/operation/get_more_spec.rb +6 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +21 -7
- data/spec/mongo/operation/insert/command_spec.rb +4 -0
- data/spec/mongo/operation/insert/op_msg_spec.rb +22 -14
- data/spec/mongo/operation/limited_spec.rb +5 -3
- data/spec/mongo/operation/read_preference_legacy_spec.rb +16 -4
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +115 -5
- data/spec/mongo/operation/result_spec.rb +6 -1
- data/spec/mongo/operation/update/bulk_spec.rb +18 -6
- data/spec/mongo/operation/update/command_spec.rb +4 -0
- data/spec/mongo/operation/update/op_msg_spec.rb +22 -14
- data/spec/mongo/protocol/msg_spec.rb +10 -0
- data/spec/mongo/retryable_spec.rb +71 -70
- data/spec/mongo/semaphore_spec.rb +51 -0
- data/spec/mongo/server/app_metadata_shared.rb +136 -0
- data/spec/mongo/server/app_metadata_spec.rb +8 -1
- data/spec/mongo/server/connection_auth_spec.rb +33 -14
- data/spec/mongo/server/connection_pool_spec.rb +0 -31
- data/spec/mongo/server/connection_spec.rb +118 -71
- data/spec/mongo/server/monitor/app_metadata_spec.rb +8 -1
- data/spec/mongo/server/monitor/connection_spec.rb +1 -82
- data/spec/mongo/server/monitor_spec.rb +76 -17
- data/spec/mongo/server/round_trip_time_averager_spec.rb +5 -3
- data/spec/mongo/server_selector/nearest_spec.rb +24 -23
- data/spec/mongo/server_selector/primary_preferred_spec.rb +27 -26
- data/spec/mongo/server_selector/primary_spec.rb +27 -9
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +40 -23
- data/spec/mongo/server_selector/secondary_spec.rb +19 -18
- data/spec/mongo/server_selector_spec.rb +4 -5
- data/spec/mongo/session/session_pool_spec.rb +7 -3
- data/spec/mongo/session_spec.rb +35 -0
- data/spec/mongo/socket/ssl_spec.rb +2 -2
- data/spec/mongo/socket/tcp_spec.rb +2 -2
- data/spec/mongo/socket/unix_spec.rb +2 -2
- data/spec/mongo/socket_spec.rb +9 -9
- data/spec/mongo/timeout_spec.rb +22 -68
- data/spec/mongo/uri_spec.rb +21 -6
- data/spec/runners/auth.rb +5 -6
- data/spec/runners/change_streams/outcome.rb +42 -0
- data/spec/runners/change_streams/spec.rb +57 -0
- data/spec/runners/change_streams/test.rb +229 -0
- data/spec/runners/cmap.rb +1 -1
- data/spec/runners/cmap/verifier.rb +1 -1
- data/spec/runners/command_monitoring.rb +4 -35
- data/spec/runners/connection_string.rb +3 -2
- data/spec/runners/crud.rb +2 -2
- data/spec/runners/crud/context.rb +10 -6
- data/spec/runners/crud/operation.rb +177 -55
- data/spec/runners/crud/outcome.rb +1 -1
- data/spec/runners/crud/spec.rb +0 -7
- data/spec/runners/crud/test.rb +8 -26
- data/spec/runners/crud/test_base.rb +47 -0
- data/spec/runners/crud/verifier.rb +21 -3
- data/spec/runners/gridfs.rb +1 -1
- data/spec/runners/{server_discovery_and_monitoring.rb → sdam.rb} +41 -22
- data/spec/runners/sdam/verifier.rb +26 -8
- data/spec/runners/server_selection.rb +242 -28
- data/spec/runners/transactions.rb +13 -14
- data/spec/runners/transactions/operation.rb +155 -25
- data/spec/runners/transactions/spec.rb +1 -1
- data/spec/runners/transactions/test.rb +103 -65
- data/spec/spec_tests/auth_spec.rb +2 -0
- data/spec/spec_tests/change_streams_spec.rb +39 -4
- data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
- data/spec/spec_tests/cmap_spec.rb +5 -0
- data/spec/spec_tests/command_monitoring_spec.rb +25 -12
- data/spec/spec_tests/connection_string_spec.rb +2 -0
- data/spec/spec_tests/crud_spec.rb +3 -1
- data/spec/spec_tests/data/auth/connection-string.yml +57 -1
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +27 -1
- data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +1173 -0
- data/spec/spec_tests/data/change_streams/change-streams.yml +5 -4
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +1 -1
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +33 -11
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
- data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +65 -0
- data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-false.yml +10 -0
- data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-true.yml +5 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
- data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
- data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +37 -0
- data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
- data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +22 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +23 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +25 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +24 -0
- data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
- data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +24 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +69 -0
- data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +23 -0
- data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +23 -0
- data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +54 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +37 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +64 -0
- data/spec/spec_tests/data/sdam/rs/compatible.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +43 -0
- data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +35 -0
- data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +1 -1
- data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +50 -0
- data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +50 -0
- data/spec/spec_tests/data/sdam/rs/discover_passives.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +81 -0
- data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +42 -0
- data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +49 -0
- data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +1 -1
- data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +43 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +23 -27
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +79 -55
- data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +20 -0
- data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +3 -2
- data/spec/spec_tests/data/sdam/rs/too_new.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +66 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +189 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +62 -0
- data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +23 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +1 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +22 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -2
- data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +38 -0
- data/spec/spec_tests/data/sdam/single/discover_standalone.yml +34 -0
- data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
- data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +46 -0
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
- data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
- data/spec/spec_tests/data/transactions/create-index.yml +152 -0
- data/spec/spec_tests/data/transactions/error-labels.yml +87 -21
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -0
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
- data/spec/spec_tests/data/transactions/retryable-abort.yml +17 -2
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
- data/spec/spec_tests/data/transactions/retryable-commit.yml +24 -9
- data/spec/spec_tests/data/uri_options/connection-options.yml +43 -0
- data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +57 -0
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +3 -1
- data/spec/spec_tests/gridfs_spec.rb +2 -0
- data/spec/spec_tests/max_staleness_spec.rb +5 -141
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +2 -0
- data/spec/spec_tests/read_write_concern_operaton_spec.rb +10 -0
- data/spec/spec_tests/retryable_reads_spec.rb +4 -2
- data/spec/spec_tests/retryable_writes_spec.rb +8 -1
- data/spec/spec_tests/sdam_integration_spec.rb +13 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +3 -2
- data/spec/spec_tests/sdam_spec.rb +70 -1
- data/spec/spec_tests/server_selection_rtt_spec.rb +2 -0
- data/spec/spec_tests/server_selection_spec.rb +5 -115
- data/spec/spec_tests/transactions_api_spec.rb +5 -0
- data/spec/spec_tests/transactions_spec.rb +5 -0
- data/spec/spec_tests/uri_options_spec.rb +2 -0
- data/spec/stress/cleanup_spec.rb +58 -0
- data/spec/stress/connection_pool_stress_spec.rb +11 -13
- data/spec/stress/connection_pool_timing_spec.rb +3 -6
- data/spec/stress/fork_reconnect_stress_spec.rb +109 -0
- data/spec/support/authorization.rb +1 -11
- data/spec/support/aws_utils.rb +62 -0
- data/spec/support/aws_utils/base.rb +134 -0
- data/spec/support/aws_utils/inspector.rb +224 -0
- data/spec/support/aws_utils/orchestrator.rb +370 -0
- data/spec/support/aws_utils/provisioner.rb +360 -0
- data/spec/support/background_thread_registry.rb +6 -2
- data/spec/support/child_process_helper.rb +78 -0
- data/spec/support/client_registry.rb +6 -24
- data/spec/support/cluster_config.rb +5 -0
- data/spec/support/common_shortcuts.rb +43 -0
- data/spec/support/constraints.rb +27 -7
- data/spec/support/crypt.rb +1 -1
- data/spec/support/event_subscriber.rb +184 -84
- data/spec/support/keyword_struct.rb +26 -0
- data/spec/support/lite_constraints.rb +47 -0
- data/spec/support/shared/scram_conversation.rb +100 -0
- data/spec/support/shared/server_selector.rb +93 -1
- data/spec/support/shared/session.rb +29 -21
- data/spec/support/spec_config.rb +76 -21
- data/spec/support/spec_organizer.rb +129 -0
- data/spec/support/spec_setup.rb +9 -5
- data/spec/support/utils.rb +161 -24
- metadata +1189 -742
- metadata.gz.sig +0 -0
- data/lib/mongo/server/connectable.rb +0 -107
- data/spec/runners/change_streams.rb +0 -262
- data/spec/runners/change_streams/operation.rb +0 -89
- data/spec/runners/sdam_monitoring.rb +0 -89
- data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +0 -27
data/spec/mongo/auth_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe Mongo::Auth do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
let(:cr) do
|
14
|
-
described_class.get(user)
|
14
|
+
described_class.get(user, double('connection'))
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'returns CR' do
|
@@ -26,7 +26,7 @@ describe Mongo::Auth do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
let(:x509) do
|
29
|
-
described_class.get(user)
|
29
|
+
described_class.get(user, double('connection'))
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'returns X509' do
|
@@ -41,7 +41,7 @@ describe Mongo::Auth do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
let(:ldap) do
|
44
|
-
described_class.get(user)
|
44
|
+
described_class.get(user, double('connection'))
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'returns LDAP' do
|
@@ -57,7 +57,7 @@ describe Mongo::Auth do
|
|
57
57
|
|
58
58
|
it 'raises an error' do
|
59
59
|
expect {
|
60
|
-
described_class.get(user)
|
60
|
+
described_class.get(user, double('connection'))
|
61
61
|
}.to raise_error(Mongo::Auth::InvalidMechanism)
|
62
62
|
end
|
63
63
|
end
|
@@ -235,6 +235,44 @@ describe Mongo::BulkWrite do
|
|
235
235
|
expect(authorized_collection.find(_id: 0).count).to eq(0)
|
236
236
|
end
|
237
237
|
|
238
|
+
context 'when the write has specified a hint option' do
|
239
|
+
let(:requests) do
|
240
|
+
[{
|
241
|
+
delete_one: {
|
242
|
+
filter: { _id: 1 },
|
243
|
+
hint: '_id_',
|
244
|
+
}
|
245
|
+
}]
|
246
|
+
end
|
247
|
+
|
248
|
+
context 'with unacknowledged write concern' do
|
249
|
+
let(:bulk_write) do
|
250
|
+
described_class.new(
|
251
|
+
collection,
|
252
|
+
requests,
|
253
|
+
options.merge(write_concern: { w: 0 })
|
254
|
+
)
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'raises a client-side error' do
|
258
|
+
expect do
|
259
|
+
bulk_write.execute
|
260
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
265
|
+
context 'on server versions < 3.4' do
|
266
|
+
max_server_fcv '3.2'
|
267
|
+
|
268
|
+
it 'raises a client-side error' do
|
269
|
+
expect do
|
270
|
+
bulk_write.execute
|
271
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
238
276
|
context 'when a session is provided' do
|
239
277
|
|
240
278
|
let(:operation) do
|
@@ -348,6 +386,44 @@ describe Mongo::BulkWrite do
|
|
348
386
|
end
|
349
387
|
|
350
388
|
context 'when bulk executing update_one' do
|
389
|
+
context 'when the write has specified a hint option' do
|
390
|
+
let(:requests) do
|
391
|
+
[{
|
392
|
+
update_one: {
|
393
|
+
filter: { _id: 1 },
|
394
|
+
update: { '$set' => { 'x.$[i].y' => 5 } },
|
395
|
+
hint: '_id_',
|
396
|
+
}
|
397
|
+
}]
|
398
|
+
end
|
399
|
+
|
400
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
401
|
+
context 'on server versions < 3.4' do
|
402
|
+
max_server_fcv '3.2'
|
403
|
+
|
404
|
+
it 'raises a client-side error' do
|
405
|
+
expect do
|
406
|
+
bulk_write.execute
|
407
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
context 'with unacknowledged write concern' do
|
412
|
+
let(:bulk_write) do
|
413
|
+
described_class.new(
|
414
|
+
collection,
|
415
|
+
requests,
|
416
|
+
options.merge(write_concern: { w: 0 })
|
417
|
+
)
|
418
|
+
end
|
419
|
+
|
420
|
+
it 'raises a client-side error' do
|
421
|
+
expect do
|
422
|
+
bulk_write.execute
|
423
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
424
|
+
end
|
425
|
+
end
|
426
|
+
end
|
351
427
|
|
352
428
|
context 'when the write has specified arrayFilters' do
|
353
429
|
|
@@ -392,6 +468,45 @@ describe Mongo::BulkWrite do
|
|
392
468
|
end
|
393
469
|
|
394
470
|
context 'when bulk executing update_many' do
|
471
|
+
context 'when the write has specified a hint option' do
|
472
|
+
let(:requests) do
|
473
|
+
[{
|
474
|
+
update_many: {
|
475
|
+
filter: { '$or' => [{ _id: 1 }, { _id: 2 }]},
|
476
|
+
update: { '$set' => { 'x.$[i].y' => 5 } },
|
477
|
+
hint: '_id_',
|
478
|
+
}
|
479
|
+
}]
|
480
|
+
end
|
481
|
+
|
482
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
483
|
+
context 'on server versions < 3.4' do
|
484
|
+
max_server_fcv '3.2'
|
485
|
+
|
486
|
+
it 'raises a client-side error' do
|
487
|
+
expect do
|
488
|
+
bulk_write.execute
|
489
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
493
|
+
context 'with unacknowledged write concern' do
|
494
|
+
let(:bulk_write) do
|
495
|
+
described_class.new(
|
496
|
+
collection,
|
497
|
+
requests,
|
498
|
+
options.merge(write_concern: { w: 0 })
|
499
|
+
)
|
500
|
+
end
|
501
|
+
|
502
|
+
it 'raises a client-side error' do
|
503
|
+
expect do
|
504
|
+
bulk_write.execute
|
505
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
506
|
+
end
|
507
|
+
end
|
508
|
+
end
|
509
|
+
|
395
510
|
|
396
511
|
context 'when the write has specified arrayFilters' do
|
397
512
|
|
@@ -639,6 +754,44 @@ describe Mongo::BulkWrite do
|
|
639
754
|
expect(authorized_collection.find(_id: 0).count).to eq(0)
|
640
755
|
end
|
641
756
|
|
757
|
+
context 'when the write has specified a hint option' do
|
758
|
+
let(:requests) do
|
759
|
+
[{
|
760
|
+
delete_many: {
|
761
|
+
filter: { _id: 1 },
|
762
|
+
hint: '_id_',
|
763
|
+
}
|
764
|
+
}]
|
765
|
+
end
|
766
|
+
|
767
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
768
|
+
context 'on server versions < 3.4' do
|
769
|
+
max_server_fcv '3.2'
|
770
|
+
|
771
|
+
it 'raises a client-side error' do
|
772
|
+
expect do
|
773
|
+
bulk_write.execute
|
774
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
775
|
+
end
|
776
|
+
end
|
777
|
+
|
778
|
+
context 'with unacknowledged write concern' do
|
779
|
+
let(:bulk_write) do
|
780
|
+
described_class.new(
|
781
|
+
collection,
|
782
|
+
requests,
|
783
|
+
options.merge(write_concern: { w: 0 })
|
784
|
+
)
|
785
|
+
end
|
786
|
+
|
787
|
+
it 'raises a client-side error' do
|
788
|
+
expect do
|
789
|
+
bulk_write.execute
|
790
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
791
|
+
end
|
792
|
+
end
|
793
|
+
end
|
794
|
+
|
642
795
|
context 'when a session is provided' do
|
643
796
|
|
644
797
|
let(:operation) do
|
@@ -918,6 +1071,45 @@ describe Mongo::BulkWrite do
|
|
918
1071
|
expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
|
919
1072
|
end
|
920
1073
|
|
1074
|
+
context 'when a hint option is provided' do
|
1075
|
+
let(:requests) do
|
1076
|
+
[{
|
1077
|
+
replace_one: {
|
1078
|
+
filter: { _id: 0 },
|
1079
|
+
replacements: { name: 'test' },
|
1080
|
+
hint: '_id_'
|
1081
|
+
}
|
1082
|
+
}]
|
1083
|
+
end
|
1084
|
+
|
1085
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
1086
|
+
context 'on server versions < 3.4' do
|
1087
|
+
max_server_fcv '3.2'
|
1088
|
+
|
1089
|
+
it 'raises a client-side error' do
|
1090
|
+
expect do
|
1091
|
+
bulk_write.execute
|
1092
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
1093
|
+
end
|
1094
|
+
end
|
1095
|
+
|
1096
|
+
context 'with unacknowledged write concern' do
|
1097
|
+
let(:bulk_write) do
|
1098
|
+
described_class.new(
|
1099
|
+
collection,
|
1100
|
+
requests,
|
1101
|
+
options.merge(write_concern: { w: 0 })
|
1102
|
+
)
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
it 'raises a client-side error' do
|
1106
|
+
expect do
|
1107
|
+
bulk_write.execute
|
1108
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
1109
|
+
end
|
1110
|
+
end
|
1111
|
+
end
|
1112
|
+
|
921
1113
|
context 'when a session is provided' do
|
922
1114
|
|
923
1115
|
let(:operation) do
|
@@ -1141,13 +1333,17 @@ describe Mongo::BulkWrite do
|
|
1141
1333
|
end
|
1142
1334
|
|
1143
1335
|
context 'when the number of updates exceeds the max batch size' do
|
1336
|
+
# Test uses doubles for server descriptions, doubles are
|
1337
|
+
# incompatible with freezing which linting does for descriptions
|
1338
|
+
skip_if_linting
|
1144
1339
|
|
1145
1340
|
let(:batch_size) do
|
1146
1341
|
11
|
1147
1342
|
end
|
1148
1343
|
|
1149
1344
|
before do
|
1150
|
-
|
1345
|
+
allow_any_instance_of(Mongo::Server::Description).to \
|
1346
|
+
receive(:max_write_batch_size).and_return(batch_size - 1)
|
1151
1347
|
end
|
1152
1348
|
|
1153
1349
|
let(:requests) do
|
@@ -1814,13 +2010,21 @@ describe Mongo::BulkWrite do
|
|
1814
2010
|
end
|
1815
2011
|
|
1816
2012
|
context 'when the operations need to be split' do
|
2013
|
+
# Test uses doubles for server descriptions, doubles are
|
2014
|
+
# incompatible with freezing which linting does for descriptions
|
2015
|
+
skip_if_linting
|
1817
2016
|
|
1818
2017
|
let(:batch_size) do
|
1819
2018
|
11
|
1820
2019
|
end
|
1821
2020
|
|
2021
|
+
let(:connection) do
|
2022
|
+
server = client.cluster.next_primary
|
2023
|
+
end
|
2024
|
+
|
1822
2025
|
before do
|
1823
|
-
|
2026
|
+
allow_any_instance_of(Mongo::Server::Description).to \
|
2027
|
+
receive(:max_write_batch_size).and_return(batch_size - 1)
|
1824
2028
|
end
|
1825
2029
|
|
1826
2030
|
context 'when a write error occurs' do
|
@@ -3,64 +3,9 @@ require 'spec_helper'
|
|
3
3
|
describe Mongo::Client do
|
4
4
|
clean_slate
|
5
5
|
|
6
|
-
|
7
|
-
describe 'options' do
|
8
|
-
describe 'read' do
|
9
|
-
[
|
10
|
-
:primary, :primary_preferred, :secondary, :secondary_preferred, :nearest
|
11
|
-
].each do |sym|
|
12
|
-
it "accepts #{sym} as symbol" do
|
13
|
-
client = new_local_client_nmio(['127.0.0.1:27017'],
|
14
|
-
:read => {:mode => sym})
|
15
|
-
# the key got converted to a string here
|
16
|
-
expect(client.read_preference).to eq({'mode' => sym})
|
17
|
-
end
|
18
|
-
|
19
|
-
# string keys are not documented as being allowed
|
20
|
-
# but the code accepts them
|
21
|
-
it "accepts #{sym} as string" do
|
22
|
-
client = new_local_client_nmio(['127.0.0.1:27017'],
|
23
|
-
:read => {:mode => sym.to_s})
|
24
|
-
# the key got converted to a string here
|
25
|
-
# the value remains a string
|
26
|
-
expect(client.read_preference).to eq({'mode' => sym.to_s})
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'when not linting' do
|
31
|
-
skip_if_linting
|
32
|
-
|
33
|
-
it 'rejects bogus read preference as symbol' do
|
34
|
-
expect do
|
35
|
-
client = new_local_client_nmio(['127.0.0.1:27017'],
|
36
|
-
:read => {:mode => :bogus})
|
37
|
-
end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: {"mode"=>:bogus}: mode bogus is not one of recognized modes')
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'rejects bogus read preference as string' do
|
41
|
-
expect do
|
42
|
-
client = new_local_client_nmio(['127.0.0.1:27017'],
|
43
|
-
:read => {:mode => 'bogus'})
|
44
|
-
end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: {"mode"=>"bogus"}: mode bogus is not one of recognized modes')
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'rejects read option specified as a string' do
|
48
|
-
expect do
|
49
|
-
client = new_local_client_nmio(['127.0.0.1:27017'],
|
50
|
-
:read => 'primary')
|
51
|
-
end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: primary: must be a hash')
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'rejects read option specified as a symbol' do
|
55
|
-
expect do
|
56
|
-
client = new_local_client_nmio(['127.0.0.1:27017'],
|
57
|
-
:read => :primary)
|
58
|
-
end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: primary: must be a hash')
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
6
|
+
let(:subscriber) { EventSubscriber.new }
|
63
7
|
|
8
|
+
describe '.new' do
|
64
9
|
context 'with scan: false' do
|
65
10
|
it 'does not perform i/o' do
|
66
11
|
allow_any_instance_of(Mongo::Server::Monitor).to receive(:run!)
|
@@ -374,6 +319,104 @@ describe Mongo::Client do
|
|
374
319
|
end
|
375
320
|
end
|
376
321
|
|
322
|
+
context 'timeout options' do
|
323
|
+
let(:client) do
|
324
|
+
new_local_client(SpecConfig.instance.addresses,
|
325
|
+
SpecConfig.instance.authorized_test_options.merge(options))
|
326
|
+
end
|
327
|
+
|
328
|
+
context 'when network timeouts are zero' do
|
329
|
+
let(:options) do
|
330
|
+
{ socket_timeout: 0, connect_timeout: 0 }
|
331
|
+
end
|
332
|
+
|
333
|
+
it 'sets options to zeros' do
|
334
|
+
client.options[:socket_timeout].should == 0
|
335
|
+
client.options[:connect_timeout].should == 0
|
336
|
+
end
|
337
|
+
|
338
|
+
it 'connects and performs operations successfully' do
|
339
|
+
lambda do
|
340
|
+
client.database.command(ping: 1)
|
341
|
+
end.should_not raise_error
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
%i(socket_timeout connect_timeout).each do |option|
|
346
|
+
context "when #{option} is negative" do
|
347
|
+
let(:options) do
|
348
|
+
{ option => -1 }
|
349
|
+
end
|
350
|
+
|
351
|
+
it 'fails client creation' do
|
352
|
+
lambda do
|
353
|
+
client
|
354
|
+
end.should raise_error(ArgumentError, /#{option} must be a non-negative number/)
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
context "when #{option} is of the wrong type" do
|
359
|
+
let(:options) do
|
360
|
+
{ option => '42' }
|
361
|
+
end
|
362
|
+
|
363
|
+
it 'fails client creation' do
|
364
|
+
lambda do
|
365
|
+
client
|
366
|
+
end.should raise_error(ArgumentError, /#{option} must be a non-negative number/)
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
context "when :connect_timeout is very small" do
|
372
|
+
# The driver reads first and checks the deadline second.
|
373
|
+
# This means the read (in a monitor) can technically take more than
|
374
|
+
# the connect timeout. Restrict to TLS configurations to make
|
375
|
+
# the network I/O take longer.
|
376
|
+
require_tls
|
377
|
+
|
378
|
+
let(:options) do
|
379
|
+
{ connect_timeout: 1e-6, server_selection_timeout: 2 }
|
380
|
+
end
|
381
|
+
|
382
|
+
it 'allows client creation' do
|
383
|
+
lambda do
|
384
|
+
client
|
385
|
+
end.should_not raise_error
|
386
|
+
end
|
387
|
+
|
388
|
+
it 'fails server selection due to very small timeout' do
|
389
|
+
lambda do
|
390
|
+
client.database.command(ping: 1)
|
391
|
+
end.should raise_error(Mongo::Error::NoServerAvailable)
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
context "when :socket_timeout is very small" do
|
396
|
+
# The driver reads first and checks the deadline second.
|
397
|
+
# This means the read (in a monitor) can technically take more than
|
398
|
+
# the connect timeout. Restrict to TLS configurations to make
|
399
|
+
# the network I/O take longer.
|
400
|
+
require_tls
|
401
|
+
|
402
|
+
let(:options) do
|
403
|
+
{ socket_timeout: 1e-6, server_selection_timeout: 2 }
|
404
|
+
end
|
405
|
+
|
406
|
+
it 'allows client creation' do
|
407
|
+
lambda do
|
408
|
+
client
|
409
|
+
end.should_not raise_error
|
410
|
+
end
|
411
|
+
|
412
|
+
it 'fails operations due to very small timeout' do
|
413
|
+
lambda do
|
414
|
+
client.database.command(ping: 1)
|
415
|
+
end.should raise_error(Mongo::Error::SocketTimeoutError)
|
416
|
+
end
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
377
420
|
context 'retry_writes option' do
|
378
421
|
let(:client) do
|
379
422
|
new_local_client_nmio(SpecConfig.instance.addresses, options)
|
@@ -447,7 +490,7 @@ describe Mongo::Client do
|
|
447
490
|
it 'does not use compression for authentication messages' do
|
448
491
|
expect(Mongo::Protocol::Compressed).not_to receive(:new)
|
449
492
|
client.cluster.next_primary.send(:with_connection) do |conn|
|
450
|
-
conn.
|
493
|
+
conn.connect!
|
451
494
|
end
|
452
495
|
end
|
453
496
|
end
|
@@ -800,16 +843,38 @@ describe Mongo::Client do
|
|
800
843
|
new_local_client_nmio(['127.0.0.1:27017'])
|
801
844
|
end
|
802
845
|
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
846
|
+
context 'mri' do
|
847
|
+
only_mri
|
848
|
+
|
849
|
+
let(:platform_string) do
|
850
|
+
[
|
851
|
+
"Ruby #{RUBY_VERSION}",
|
852
|
+
RUBY_PLATFORM,
|
853
|
+
RbConfig::CONFIG['build']
|
854
|
+
].join(', ')
|
855
|
+
end
|
856
|
+
|
857
|
+
it 'does not include the platform info in the app metadata' do
|
858
|
+
expect(app_metadata.send(:full_client_document)[:platform]).to eq(platform_string)
|
859
|
+
end
|
809
860
|
end
|
810
861
|
|
811
|
-
|
812
|
-
|
862
|
+
context 'jruby' do
|
863
|
+
require_jruby
|
864
|
+
|
865
|
+
let(:platform_string) do
|
866
|
+
[
|
867
|
+
"JRuby #{JRUBY_VERSION}",
|
868
|
+
"like Ruby #{RUBY_VERSION}",
|
869
|
+
RUBY_PLATFORM,
|
870
|
+
"JVM #{java.lang.System.get_property('java.version')}",
|
871
|
+
RbConfig::CONFIG['build']
|
872
|
+
].join(', ')
|
873
|
+
end
|
874
|
+
|
875
|
+
it 'does not include the platform info in the app metadata' do
|
876
|
+
expect(app_metadata.send(:full_client_document)[:platform]).to eq(platform_string)
|
877
|
+
end
|
813
878
|
end
|
814
879
|
end
|
815
880
|
end
|
@@ -862,7 +927,7 @@ describe Mongo::Client do
|
|
862
927
|
end
|
863
928
|
end
|
864
929
|
|
865
|
-
context 'when options are provided' do
|
930
|
+
context 'when URI options are provided' do
|
866
931
|
|
867
932
|
let!(:uri) do
|
868
933
|
'mongodb://127.0.0.1:27017/testdb?w=3'
|
@@ -1080,11 +1145,208 @@ describe Mongo::Client do
|
|
1080
1145
|
expect(client.cluster.topology).to be_a(Mongo::Cluster::Topology::ReplicaSetNoPrimary)
|
1081
1146
|
end
|
1082
1147
|
end
|
1148
|
+
end
|
1149
|
+
|
1150
|
+
context 'when Ruby options are provided' do
|
1151
|
+
let(:client) do
|
1152
|
+
new_local_client_nmio(['127.0.0.1:27017'], options)
|
1153
|
+
end
|
1154
|
+
|
1155
|
+
describe 'connection option conflicts' do
|
1156
|
+
context 'direct_connection: true and multiple seeds' do
|
1157
|
+
let(:client) do
|
1158
|
+
new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
|
1159
|
+
direct_connection: true)
|
1160
|
+
end
|
1161
|
+
|
1162
|
+
it 'is rejected' do
|
1163
|
+
lambda do
|
1164
|
+
client
|
1165
|
+
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with multiple seeds/)
|
1166
|
+
end
|
1167
|
+
end
|
1168
|
+
|
1169
|
+
context 'direct_connection: true and connect: :direct' do
|
1170
|
+
let(:options) do
|
1171
|
+
{direct_connection: true, connect: :direct}
|
1172
|
+
end
|
1173
|
+
|
1174
|
+
it 'is accepted' do
|
1175
|
+
client.options[:direct_connection].should be true
|
1176
|
+
client.options[:connect].should be :direct
|
1177
|
+
end
|
1178
|
+
end
|
1179
|
+
|
1180
|
+
context 'direct_connection: true and connect: :replica_set' do
|
1181
|
+
let(:options) do
|
1182
|
+
{direct_connection: true, connect: :replica_set}
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
it 'is rejected' do
|
1186
|
+
lambda do
|
1187
|
+
client
|
1188
|
+
end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=replica_set/)
|
1189
|
+
end
|
1190
|
+
end
|
1191
|
+
|
1192
|
+
context 'direct_connection: true and connect: :sharded' do
|
1193
|
+
let(:options) do
|
1194
|
+
{direct_connection: true, connect: :sharded}
|
1195
|
+
end
|
1196
|
+
|
1197
|
+
it 'is rejected' do
|
1198
|
+
lambda do
|
1199
|
+
client
|
1200
|
+
end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=sharded/)
|
1201
|
+
end
|
1202
|
+
end
|
1203
|
+
|
1204
|
+
context 'direct_connection: false and connect: :direct' do
|
1205
|
+
let(:options) do
|
1206
|
+
{direct_connection: false, connect: :direct}
|
1207
|
+
end
|
1208
|
+
|
1209
|
+
it 'is rejected' do
|
1210
|
+
lambda do
|
1211
|
+
client
|
1212
|
+
end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=false and connect=direct/)
|
1213
|
+
end
|
1214
|
+
end
|
1215
|
+
|
1216
|
+
context 'direct_connection: false and connect: :replica_set' do
|
1217
|
+
let(:options) do
|
1218
|
+
{direct_connection: false, connect: :replica_set, replica_set: 'foo'}
|
1219
|
+
end
|
1220
|
+
|
1221
|
+
it 'is accepted' do
|
1222
|
+
client.options[:direct_connection].should be false
|
1223
|
+
client.options[:connect].should be :replica_set
|
1224
|
+
end
|
1225
|
+
end
|
1226
|
+
|
1227
|
+
context 'direct_connection: false and connect: :sharded' do
|
1228
|
+
let(:options) do
|
1229
|
+
{direct_connection: false, connect: :sharded}
|
1230
|
+
end
|
1231
|
+
|
1232
|
+
it 'is accepted' do
|
1233
|
+
client.options[:direct_connection].should be false
|
1234
|
+
client.options[:connect].should be :sharded
|
1235
|
+
end
|
1236
|
+
end
|
1237
|
+
end
|
1238
|
+
|
1239
|
+
context ':bg_error_backtrace option' do
|
1240
|
+
[true, false, nil, 42].each do |valid_value|
|
1241
|
+
context "valid value: #{valid_value.inspect}" do
|
1242
|
+
let(:options) do
|
1243
|
+
{bg_error_backtrace: valid_value}
|
1244
|
+
end
|
1245
|
+
|
1246
|
+
it 'is accepted' do
|
1247
|
+
client.options[:bg_error_backtrace].should == valid_value
|
1248
|
+
end
|
1249
|
+
end
|
1250
|
+
end
|
1251
|
+
|
1252
|
+
context 'invalid value type' do
|
1253
|
+
let(:options) do
|
1254
|
+
{bg_error_backtrace: 'yes'}
|
1255
|
+
end
|
1256
|
+
|
1257
|
+
it 'is rejected' do
|
1258
|
+
lambda do
|
1259
|
+
client
|
1260
|
+
end.should raise_error(ArgumentError, /:bg_error_backtrace option value must be true, false, nil or a positive integer/)
|
1261
|
+
end
|
1262
|
+
end
|
1263
|
+
|
1264
|
+
context 'invalid value' do
|
1265
|
+
[0, -1, 42.0].each do |invalid_value|
|
1266
|
+
context "invalid value: #{invalid_value.inspect}" do
|
1267
|
+
let(:options) do
|
1268
|
+
{bg_error_backtrace: invalid_value}
|
1269
|
+
end
|
1270
|
+
|
1271
|
+
it 'is rejected' do
|
1272
|
+
lambda do
|
1273
|
+
client
|
1274
|
+
end.should raise_error(ArgumentError, /:bg_error_backtrace option value must be true, false, nil or a positive integer/)
|
1275
|
+
end
|
1276
|
+
end
|
1277
|
+
end
|
1278
|
+
end
|
1279
|
+
end
|
1280
|
+
|
1281
|
+
describe ':read option' do
|
1282
|
+
[
|
1283
|
+
:primary, :primary_preferred, :secondary, :secondary_preferred, :nearest
|
1284
|
+
].each do |sym|
|
1285
|
+
describe "#{sym}" do
|
1286
|
+
context 'when given as symbol' do
|
1287
|
+
let(:options) do
|
1288
|
+
{read: {mode: sym}}
|
1289
|
+
end
|
1290
|
+
|
1291
|
+
it "is accepted" do
|
1292
|
+
# the key got converted to a string here
|
1293
|
+
expect(client.read_preference).to eq({'mode' => sym})
|
1294
|
+
end
|
1295
|
+
end
|
1296
|
+
|
1297
|
+
context 'when given as string' do
|
1298
|
+
let(:options) do
|
1299
|
+
{read: {mode: sym.to_s}}
|
1300
|
+
end
|
1301
|
+
|
1302
|
+
# string keys are not documented as being allowed
|
1303
|
+
# but the code accepts them
|
1304
|
+
it "is accepted" do
|
1305
|
+
# the key got converted to a string here
|
1306
|
+
# the value remains a string
|
1307
|
+
expect(client.read_preference).to eq({'mode' => sym.to_s})
|
1308
|
+
end
|
1309
|
+
end
|
1310
|
+
end
|
1311
|
+
end
|
1312
|
+
|
1313
|
+
context 'when not linting' do
|
1314
|
+
skip_if_linting
|
1315
|
+
|
1316
|
+
it 'rejects bogus read preference as symbol' do
|
1317
|
+
expect do
|
1318
|
+
client = new_local_client_nmio(['127.0.0.1:27017'],
|
1319
|
+
:read => {:mode => :bogus})
|
1320
|
+
end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: {"mode"=>:bogus}: mode bogus is not one of recognized modes')
|
1321
|
+
end
|
1322
|
+
|
1323
|
+
it 'rejects bogus read preference as string' do
|
1324
|
+
expect do
|
1325
|
+
client = new_local_client_nmio(['127.0.0.1:27017'],
|
1326
|
+
:read => {:mode => 'bogus'})
|
1327
|
+
end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: {"mode"=>"bogus"}: mode bogus is not one of recognized modes')
|
1328
|
+
end
|
1329
|
+
|
1330
|
+
it 'rejects read option specified as a string' do
|
1331
|
+
expect do
|
1332
|
+
client = new_local_client_nmio(['127.0.0.1:27017'],
|
1333
|
+
:read => 'primary')
|
1334
|
+
end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: primary: must be a hash')
|
1335
|
+
end
|
1336
|
+
|
1337
|
+
it 'rejects read option specified as a symbol' do
|
1338
|
+
expect do
|
1339
|
+
client = new_local_client_nmio(['127.0.0.1:27017'],
|
1340
|
+
:read => :primary)
|
1341
|
+
end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: primary: must be a hash')
|
1342
|
+
end
|
1343
|
+
end
|
1344
|
+
end
|
1083
1345
|
|
1084
1346
|
context 'when an invalid option is provided' do
|
1085
1347
|
|
1086
|
-
let(:
|
1087
|
-
|
1348
|
+
let(:options) do
|
1349
|
+
{ssl: false, invalid: :test}
|
1088
1350
|
end
|
1089
1351
|
|
1090
1352
|
it 'does not set the option' do
|
@@ -1104,8 +1366,8 @@ describe Mongo::Client do
|
|
1104
1366
|
=begin WriteConcern object support
|
1105
1367
|
context 'when write concern is provided via a WriteConcern object' do
|
1106
1368
|
|
1107
|
-
let(:
|
1108
|
-
|
1369
|
+
let(:options) do
|
1370
|
+
{write_concern: wc}
|
1109
1371
|
end
|
1110
1372
|
|
1111
1373
|
let(:wc) { Mongo::WriteConcern.get(w: 2) }
|
@@ -1120,6 +1382,185 @@ describe Mongo::Client do
|
|
1120
1382
|
end
|
1121
1383
|
end
|
1122
1384
|
=end
|
1385
|
+
|
1386
|
+
context ':wrapping_libraries option' do
|
1387
|
+
let(:options) do
|
1388
|
+
{wrapping_libraries: wrapping_libraries}
|
1389
|
+
end
|
1390
|
+
|
1391
|
+
context 'valid input' do
|
1392
|
+
context 'symbol keys' do
|
1393
|
+
let(:wrapping_libraries) do
|
1394
|
+
[name: 'Mongoid', version: '7.1.2'].freeze
|
1395
|
+
end
|
1396
|
+
|
1397
|
+
it 'works' do
|
1398
|
+
client.options[:wrapping_libraries].should == ['name' => 'Mongoid', 'version' => '7.1.2']
|
1399
|
+
end
|
1400
|
+
end
|
1401
|
+
|
1402
|
+
context 'string keys' do
|
1403
|
+
let(:wrapping_libraries) do
|
1404
|
+
['name' => 'Mongoid', 'version' => '7.1.2'].freeze
|
1405
|
+
end
|
1406
|
+
|
1407
|
+
it 'works' do
|
1408
|
+
client.options[:wrapping_libraries].should == ['name' => 'Mongoid', 'version' => '7.1.2']
|
1409
|
+
end
|
1410
|
+
end
|
1411
|
+
|
1412
|
+
context 'Redacted keys' do
|
1413
|
+
let(:wrapping_libraries) do
|
1414
|
+
[Mongo::Options::Redacted.new(name: 'Mongoid', version: '7.1.2')].freeze
|
1415
|
+
end
|
1416
|
+
|
1417
|
+
it 'works' do
|
1418
|
+
client.options[:wrapping_libraries].should == ['name' => 'Mongoid', 'version' => '7.1.2']
|
1419
|
+
end
|
1420
|
+
end
|
1421
|
+
|
1422
|
+
context 'two libraries' do
|
1423
|
+
let(:wrapping_libraries) do
|
1424
|
+
[
|
1425
|
+
{name: 'Mongoid', version: '7.1.2'},
|
1426
|
+
{name: 'Rails', version: '4.0', platform: 'Foobar'},
|
1427
|
+
].freeze
|
1428
|
+
end
|
1429
|
+
|
1430
|
+
it 'works' do
|
1431
|
+
client.options[:wrapping_libraries].should == [
|
1432
|
+
{'name' => 'Mongoid', 'version' => '7.1.2'},
|
1433
|
+
{'name' => 'Rails', 'version' => '4.0', 'platform' => 'Foobar'},
|
1434
|
+
]
|
1435
|
+
end
|
1436
|
+
end
|
1437
|
+
|
1438
|
+
context 'empty array' do
|
1439
|
+
let(:wrapping_libraries) do
|
1440
|
+
[]
|
1441
|
+
end
|
1442
|
+
|
1443
|
+
it 'works' do
|
1444
|
+
client.options[:wrapping_libraries].should == []
|
1445
|
+
end
|
1446
|
+
end
|
1447
|
+
|
1448
|
+
context 'empty array' do
|
1449
|
+
let(:wrapping_libraries) do
|
1450
|
+
nil
|
1451
|
+
end
|
1452
|
+
|
1453
|
+
it 'works' do
|
1454
|
+
client.options[:wrapping_libraries].should be nil
|
1455
|
+
end
|
1456
|
+
end
|
1457
|
+
end
|
1458
|
+
|
1459
|
+
context 'valid input' do
|
1460
|
+
context 'hash given instead of an array' do
|
1461
|
+
let(:wrapping_libraries) do
|
1462
|
+
{name: 'Mongoid', version: '7.1.2'}.freeze
|
1463
|
+
end
|
1464
|
+
|
1465
|
+
it 'is rejected' do
|
1466
|
+
lambda do
|
1467
|
+
client
|
1468
|
+
end.should raise_error(ArgumentError, /:wrapping_libraries must be an array of hashes/)
|
1469
|
+
end
|
1470
|
+
end
|
1471
|
+
|
1472
|
+
context 'invalid keys' do
|
1473
|
+
let(:wrapping_libraries) do
|
1474
|
+
[name: 'Mongoid', invalid: '7.1.2'].freeze
|
1475
|
+
end
|
1476
|
+
|
1477
|
+
it 'is rejected' do
|
1478
|
+
lambda do
|
1479
|
+
client
|
1480
|
+
end.should raise_error(ArgumentError, /:wrapping_libraries element has invalid keys/)
|
1481
|
+
end
|
1482
|
+
end
|
1483
|
+
|
1484
|
+
context 'value includes |' do
|
1485
|
+
let(:wrapping_libraries) do
|
1486
|
+
[name: 'Mongoid|on|Rails', version: '7.1.2'].freeze
|
1487
|
+
end
|
1488
|
+
|
1489
|
+
it 'is rejected' do
|
1490
|
+
lambda do
|
1491
|
+
client
|
1492
|
+
end.should raise_error(ArgumentError, /:wrapping_libraries element value cannot include '|'/)
|
1493
|
+
end
|
1494
|
+
end
|
1495
|
+
end
|
1496
|
+
end
|
1497
|
+
end
|
1498
|
+
|
1499
|
+
context 'when making a block client' do
|
1500
|
+
context 'when the block doesn\'t raise an error' do
|
1501
|
+
let(:block_client) do
|
1502
|
+
c = nil
|
1503
|
+
Mongo::Client.new(
|
1504
|
+
SpecConfig.instance.addresses,
|
1505
|
+
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db),
|
1506
|
+
) do |client|
|
1507
|
+
c = client
|
1508
|
+
end
|
1509
|
+
c
|
1510
|
+
end
|
1511
|
+
|
1512
|
+
it 'is closed after block' do
|
1513
|
+
expect(block_client.cluster.connected?).to eq(false)
|
1514
|
+
end
|
1515
|
+
end
|
1516
|
+
|
1517
|
+
context 'when the block raises an error' do
|
1518
|
+
it 'it is closed after the block' do
|
1519
|
+
block_client_raise = nil
|
1520
|
+
expect do
|
1521
|
+
Mongo::Client.new(
|
1522
|
+
SpecConfig.instance.addresses,
|
1523
|
+
SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db),
|
1524
|
+
) do |client|
|
1525
|
+
block_client_raise = client
|
1526
|
+
raise "This is an error!"
|
1527
|
+
end
|
1528
|
+
end.to raise_error(StandardError, "This is an error!")
|
1529
|
+
expect(block_client_raise.cluster.connected?).to eq(false)
|
1530
|
+
end
|
1531
|
+
end
|
1532
|
+
|
1533
|
+
context 'when the hosts given include the protocol' do
|
1534
|
+
it 'raises an error on mongodb://' do
|
1535
|
+
expect do
|
1536
|
+
Mongo::Client.new(['mongodb://127.0.0.1:27017/test'])
|
1537
|
+
end.to raise_error(ArgumentError, "Host 'mongodb://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
|
1538
|
+
end
|
1539
|
+
|
1540
|
+
it 'raises an error on mongodb+srv://' do
|
1541
|
+
expect do
|
1542
|
+
Mongo::Client.new(['mongodb+srv://127.0.0.1:27017/test'])
|
1543
|
+
end.to raise_error(ArgumentError, "Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
|
1544
|
+
end
|
1545
|
+
|
1546
|
+
it 'raises an error on multiple items' do
|
1547
|
+
expect do
|
1548
|
+
Mongo::Client.new(['127.0.0.1:27017', 'mongodb+srv://127.0.0.1:27017/test'])
|
1549
|
+
end.to raise_error(ArgumentError, "Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
|
1550
|
+
end
|
1551
|
+
|
1552
|
+
it 'raises an error only at beginning of string' do
|
1553
|
+
expect do
|
1554
|
+
Mongo::Client.new(['somethingmongodb://127.0.0.1:27017/test', 'mongodb+srv://127.0.0.1:27017/test'])
|
1555
|
+
end.to raise_error(ArgumentError, "Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
|
1556
|
+
end
|
1557
|
+
|
1558
|
+
it 'raises an error with different case' do
|
1559
|
+
expect do
|
1560
|
+
Mongo::Client.new(['MongOdB://127.0.0.1:27017/test'])
|
1561
|
+
end.to raise_error(ArgumentError, "Host 'MongOdB://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
|
1562
|
+
end
|
1563
|
+
end
|
1123
1564
|
end
|
1124
1565
|
end
|
1125
1566
|
|
@@ -1133,7 +1574,7 @@ describe Mongo::Client do
|
|
1133
1574
|
|
1134
1575
|
it 'copies monitoring subscribers' do
|
1135
1576
|
monitoring.subscribers.clear
|
1136
|
-
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT,
|
1577
|
+
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
1137
1578
|
expect(monitoring.present_subscribers.length).to eq(1)
|
1138
1579
|
expect(monitoring.subscribers[Mongo::Monitoring::SERVER_HEARTBEAT].length).to eq(1)
|
1139
1580
|
|
@@ -1144,12 +1585,12 @@ describe Mongo::Client do
|
|
1144
1585
|
|
1145
1586
|
it 'does not change subscribers on original client' do
|
1146
1587
|
monitoring.subscribers.clear
|
1147
|
-
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT,
|
1588
|
+
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
1148
1589
|
expect(monitoring.present_subscribers.length).to eq(1)
|
1149
1590
|
expect(monitoring.subscribers[Mongo::Monitoring::SERVER_HEARTBEAT].length).to eq(1)
|
1150
1591
|
|
1151
|
-
new_client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT,
|
1152
|
-
new_client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT,
|
1592
|
+
new_client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
1593
|
+
new_client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
1153
1594
|
expect(new_monitoring.present_subscribers.length).to eq(1)
|
1154
1595
|
expect(new_monitoring.subscribers[Mongo::Monitoring::SERVER_HEARTBEAT].length).to eq(3)
|
1155
1596
|
# original client should not have gotten any of the new subscribers
|
@@ -1177,7 +1618,7 @@ describe Mongo::Client do
|
|
1177
1618
|
|
1178
1619
|
it 'resets monitoring subscribers' do
|
1179
1620
|
monitoring.subscribers.clear
|
1180
|
-
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT,
|
1621
|
+
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
1181
1622
|
expect(monitoring.present_subscribers.length).to eq(1)
|
1182
1623
|
expect(monitoring.subscribers[Mongo::Monitoring::SERVER_HEARTBEAT].length).to eq(1)
|
1183
1624
|
|
@@ -1190,12 +1631,12 @@ describe Mongo::Client do
|
|
1190
1631
|
|
1191
1632
|
it 'does not change subscribers on original client' do
|
1192
1633
|
monitoring.subscribers.clear
|
1193
|
-
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT,
|
1634
|
+
client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
1194
1635
|
expect(monitoring.present_subscribers.length).to eq(1)
|
1195
1636
|
expect(monitoring.subscribers[Mongo::Monitoring::SERVER_HEARTBEAT].length).to eq(1)
|
1196
1637
|
|
1197
|
-
new_client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT,
|
1198
|
-
new_client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT,
|
1638
|
+
new_client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
1639
|
+
new_client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
|
1199
1640
|
# 7 default subscribers + heartbeat
|
1200
1641
|
expect(new_monitoring.present_subscribers.length).to eq(8)
|
1201
1642
|
# the heartbeat subscriber on the original client is not inherited
|
@@ -1299,6 +1740,73 @@ describe Mongo::Client do
|
|
1299
1740
|
end
|
1300
1741
|
end
|
1301
1742
|
|
1743
|
+
context 'when direct_connection option is given' do
|
1744
|
+
let(:client) do
|
1745
|
+
options = SpecConfig.instance.test_options
|
1746
|
+
options.delete(:connect)
|
1747
|
+
new_local_client(SpecConfig.instance.addresses, options)
|
1748
|
+
end
|
1749
|
+
|
1750
|
+
before do
|
1751
|
+
client.options[:direct_connection].should be nil
|
1752
|
+
end
|
1753
|
+
|
1754
|
+
let(:new_client) do
|
1755
|
+
client.with(new_options)
|
1756
|
+
end
|
1757
|
+
|
1758
|
+
context 'direct_connection set to false' do
|
1759
|
+
|
1760
|
+
let(:new_options) do
|
1761
|
+
{ direct_connection: false }
|
1762
|
+
end
|
1763
|
+
|
1764
|
+
it 'is accepted' do
|
1765
|
+
new_client.options[:direct_connection].should be false
|
1766
|
+
end
|
1767
|
+
end
|
1768
|
+
|
1769
|
+
context 'direct_connection set to true' do
|
1770
|
+
|
1771
|
+
let(:new_options) do
|
1772
|
+
{ direct_connection: true }
|
1773
|
+
end
|
1774
|
+
|
1775
|
+
context 'in single topology' do
|
1776
|
+
require_topology :single
|
1777
|
+
|
1778
|
+
|
1779
|
+
it 'is accepted' do
|
1780
|
+
new_client.options[:direct_connection].should be true
|
1781
|
+
new_client.cluster.topology.should be_a(Mongo::Cluster::Topology::Single)
|
1782
|
+
end
|
1783
|
+
end
|
1784
|
+
|
1785
|
+
context 'in replica set or sharded cluster topology' do
|
1786
|
+
require_topology :replica_set, :sharded
|
1787
|
+
|
1788
|
+
it 'is rejected' do
|
1789
|
+
lambda do
|
1790
|
+
new_client
|
1791
|
+
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
|
1792
|
+
end
|
1793
|
+
|
1794
|
+
context 'when a new cluster is created' do
|
1795
|
+
|
1796
|
+
let(:new_options) do
|
1797
|
+
{ direct_connection: true, app_name: 'new-client' }
|
1798
|
+
end
|
1799
|
+
|
1800
|
+
it 'is rejected' do
|
1801
|
+
lambda do
|
1802
|
+
new_client
|
1803
|
+
end.should raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
|
1804
|
+
end
|
1805
|
+
end
|
1806
|
+
end
|
1807
|
+
end
|
1808
|
+
end
|
1809
|
+
|
1302
1810
|
context 'when the write concern is not changed' do
|
1303
1811
|
|
1304
1812
|
let(:client) do
|
@@ -1571,7 +2079,6 @@ describe Mongo::Client do
|
|
1571
2079
|
# in #with, the consistent behavior is to never transfer sdam_proc to
|
1572
2080
|
# the new client.
|
1573
2081
|
context 'when sdam_proc is given on original client' do
|
1574
|
-
let(:subscriber) { EventSubscriber.new }
|
1575
2082
|
|
1576
2083
|
let(:sdam_proc) do
|
1577
2084
|
Proc.new do |client|
|
@@ -1579,25 +2086,41 @@ describe Mongo::Client do
|
|
1579
2086
|
end
|
1580
2087
|
end
|
1581
2088
|
|
1582
|
-
let(:
|
2089
|
+
let(:client) do
|
2090
|
+
new_local_client(SpecConfig.instance.addresses,
|
2091
|
+
SpecConfig.instance.test_options.merge(
|
2092
|
+
sdam_proc: sdam_proc,
|
2093
|
+
connect_timeout: 3.08, socket_timeout: 3.09,
|
2094
|
+
server_selection_timeout: 2.92,
|
2095
|
+
database: SpecConfig.instance.test_db))
|
2096
|
+
end
|
2097
|
+
|
2098
|
+
let(:new_client) do
|
2099
|
+
client.with(app_name: 'foo').tap do |new_client|
|
2100
|
+
new_client.cluster.should_not == client.cluster
|
2101
|
+
end
|
2102
|
+
end
|
2103
|
+
|
2104
|
+
before do
|
2105
|
+
client.cluster.next_primary
|
2106
|
+
events = subscriber.select_started_events(Mongo::Monitoring::Event::ServerHeartbeatStarted)
|
2107
|
+
events.length.should > 0
|
2108
|
+
end
|
1583
2109
|
|
1584
2110
|
it 'does not copy sdam_proc option to new client' do
|
1585
|
-
client = new_local_client_nmio(['a'], sdam_proc: sdam_proc)
|
1586
2111
|
expect(new_client.options[:sdam_proc]).to be nil
|
1587
2112
|
end
|
1588
2113
|
|
1589
2114
|
it 'does not notify subscribers set up by sdam_proc' do
|
1590
|
-
client = new_local_client(['a'], sdam_proc: sdam_proc,
|
1591
|
-
connect_timeout: 0.1, socket_timeout: 0.1,
|
1592
|
-
server_selection_timeout: 0.1)
|
1593
2115
|
expect(subscriber.started_events.length).to be > 0
|
1594
2116
|
subscriber.started_events.clear
|
1595
2117
|
|
1596
2118
|
# If this test takes longer than heartbeat interval,
|
1597
2119
|
# subscriber may receive events from the original client.
|
1598
2120
|
|
1599
|
-
new_client
|
2121
|
+
new_client.cluster.next_primary
|
1600
2122
|
expect(subscriber.started_events.length).to eq 0
|
2123
|
+
new_client.cluster.topology.class.should_not be Mongo::Cluster::Topology::Unknown
|
1601
2124
|
end
|
1602
2125
|
end
|
1603
2126
|
end
|