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/README.md
CHANGED
@@ -302,30 +302,50 @@ The driver test suite includes a number of Kerberos-related integration tests
|
|
302
302
|
in the `spec/kerberos` directory. These require a provisioned Kerberos
|
303
303
|
deployment and appropriately configured MongoDB deployment. One such deployment
|
304
304
|
is provided internally by MongoDB and is used in the driver's Evergreen
|
305
|
-
configuration; it is also possible to provision a test deployment locally
|
305
|
+
configuration; it is also possible to provision a test deployment locally,
|
306
|
+
either via the Docker tooling provided by the driver test suite or manually.
|
307
|
+
|
308
|
+
#### Via Docker
|
309
|
+
|
310
|
+
Run:
|
311
|
+
|
312
|
+
./.evergreen/test-on-docker -s .evergreen/run-tests-kerberos-integration.sh -pd rhel70
|
313
|
+
|
314
|
+
When `SASL_HOST` environment variable is not set, the Kerberos integration
|
315
|
+
test script `.evergreen/run-tests-kerberos-integration.sh` provisions a
|
316
|
+
local Kerberos deployment in the Docker container and configures the test suite
|
317
|
+
to use it.
|
318
|
+
|
319
|
+
Note: the tooling is currently set up to provision a working `rhel70`
|
320
|
+
container. Ubuntu distros are not presently supported.
|
321
|
+
|
322
|
+
#### Locally
|
306
323
|
|
307
324
|
The following additional environment variables must be set to run the
|
308
325
|
Kerberos integration tests:
|
309
326
|
|
310
327
|
- `MONGO_RUBY_DRIVER_KERBEROS_INTEGRATION=1`
|
311
|
-
- `SASL_HOST`: the host name of the MongoDB server that is configured to
|
328
|
+
- `SASL_HOST`: the FQDN host name of the MongoDB server that is configured to
|
312
329
|
use Kerberos. Note that this is NOT the Kerberos domain controller (KDC).
|
330
|
+
- `SASL_REALM`: the Kerberos realm. Depending on how Kerberos is configured,
|
331
|
+
this can be the same as or different from `SASL_HOST`. The Evergreen
|
332
|
+
configuration uses the same host and realm; Docker configuration provided
|
333
|
+
by the Ruby driver uses different host and realm.
|
313
334
|
- `SASL_PORT`: the port number that the Kerberized MongoDB server is
|
314
|
-
|
335
|
+
listening on.
|
315
336
|
- `SASL_USER`: the username to provide to MongoDB for authentication.
|
316
|
-
|
337
|
+
This must match the username of the principal.
|
317
338
|
- `SASL_DB`: the database that stores the user used for authentication. This
|
318
339
|
is the "auth soure" in MongoDB parlance. Normally this should be `$external`.
|
319
340
|
- `PRINCIPAL`: the Kerberos principal to use for authentication, in the
|
320
341
|
form of `username@realm`. Note that the realm is commonly uppercased.
|
321
342
|
- `KERBEROS_DB`: the database that the user has access to.
|
322
|
-
- `KEYTAB_BASE64`: Base64 encoded keytab for the user. Used instead of the
|
323
|
-
password.
|
324
343
|
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
344
|
+
Note that the driver does not directly provide a password to the MongoDB
|
345
|
+
server when using Kerberos authentication, and because of this there is no
|
346
|
+
user password provided to the test suite either when Kerberos authentication
|
347
|
+
is used. Instead, there must be a local session established via e.g. `kinit`.
|
348
|
+
Consult the `.evergreen/run-tests-kerberos-integration.sh` file for details.
|
329
349
|
|
330
350
|
## Client-Side Encryption
|
331
351
|
|
@@ -470,11 +490,44 @@ set names:
|
|
470
490
|
However, as noted in the caveats section, changing the database name used by
|
471
491
|
the test suite is not supported.
|
472
492
|
|
493
|
+
## Special Tests
|
494
|
+
|
473
495
|
Some tests require internet connectivity, for example to test DNS seed lists
|
474
496
|
and SRV URIs. These tests can be skipped by setting the following environment
|
475
497
|
variable:
|
476
498
|
|
477
|
-
EXTERNAL_DISABLED=
|
499
|
+
EXTERNAL_DISABLED=1
|
500
|
+
|
501
|
+
Some tests are designed to validate the driver's behavior under load, or
|
502
|
+
otherwise execute a large number of operations which may take a sizable amount
|
503
|
+
of time. Such tests are skipped by default and can be run by setting the
|
504
|
+
following environment variable:
|
505
|
+
|
506
|
+
STRESS=1
|
507
|
+
|
508
|
+
Some tests fork the process to validate the driver's behavior when forking is
|
509
|
+
involved. These tests are skipped by default and can be run by setting the
|
510
|
+
following environment variable:
|
511
|
+
|
512
|
+
FORK=1
|
513
|
+
|
514
|
+
## Debug Logging
|
515
|
+
|
516
|
+
The test suite is run with the driver log level set to `WARN` by default.
|
517
|
+
This produces a fair amount of output as many tests trigger various conditions
|
518
|
+
resulting in the driver outputting warnings. This is expected behavior.
|
519
|
+
|
520
|
+
To increase the driver log level to `DEBUG`, set the
|
521
|
+
`MONGO_RUBY_DRIVER_CLIENT_DEBUG` environment variable to `1`, `true` or `yes`.
|
522
|
+
This will produce additional log output pertaining to, for example, SDAM
|
523
|
+
events and transitions performed by the driver, as well as log all
|
524
|
+
commands sent to and responses received from the database.
|
525
|
+
|
526
|
+
To debug authentication and user management commands, set the
|
527
|
+
`MONGO_RUBY_DRIVER_UNREDACT_EVENTS` environment variable to `1`, `true` or
|
528
|
+
`yes`. This will disable redaction of command monitoring payloads for sensitive
|
529
|
+
commands. Normally this environment variable should be used with
|
530
|
+
`MONGO_RUBY_DRIVER_CLIENT_DEBUG` to see the command payloads.
|
478
531
|
|
479
532
|
## Caveats
|
480
533
|
|
@@ -515,12 +568,6 @@ enabled. This is accomplished by starting `mongod` with the following option:
|
|
515
568
|
|
516
569
|
--setParameter enableTestCommands=1
|
517
570
|
|
518
|
-
### Log Output
|
519
|
-
|
520
|
-
The test suite is run with the driver log level set to WARN by default.
|
521
|
-
This produces a fair amount of output as many tests trigger various conditions
|
522
|
-
resulting in the driver outputting warnings. This is expected behavior.
|
523
|
-
|
524
571
|
## Running Individual Examples
|
525
572
|
|
526
573
|
Individual examples can be run by invoking `rspec` instead of `rake`. Prior
|
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'Auth' do
|
4
|
+
# User creation with a password fails on the server if, for example,
|
5
|
+
# only MONGODB-AWS auth mechanism is allowed in server configuration.
|
6
|
+
require_no_external_user
|
7
|
+
|
4
8
|
describe 'Unauthorized exception message' do
|
5
9
|
let(:server) do
|
6
10
|
authorized_client.cluster.next_primary
|
@@ -173,7 +177,7 @@ describe 'Auth' do
|
|
173
177
|
context 'attempting to connect to a tls server without tls' do
|
174
178
|
require_tls
|
175
179
|
|
176
|
-
let(:options) { {} }
|
180
|
+
let(:options) { {ssl: false} }
|
177
181
|
|
178
182
|
it 'reports host, port and tls status' do
|
179
183
|
begin
|
@@ -191,19 +195,13 @@ describe 'Auth' do
|
|
191
195
|
end
|
192
196
|
end
|
193
197
|
|
194
|
-
|
195
|
-
clean_slate
|
196
|
-
min_server_version '3.0'
|
197
|
-
require_no_x509_auth
|
198
|
-
|
199
|
-
let(:client) { authorized_client.with(max_pool_size: 2) }
|
200
|
-
|
198
|
+
shared_examples_for 'caches client key' do
|
201
199
|
it 'caches' do
|
202
200
|
client.close
|
203
201
|
Mongo::Auth::CredentialCache.clear
|
204
202
|
|
205
203
|
RSpec::Mocks.with_temporary_scope do
|
206
|
-
expect_any_instance_of(
|
204
|
+
expect_any_instance_of(conversation_class).to receive(:hi).exactly(:once).and_call_original
|
207
205
|
|
208
206
|
client.reconnect
|
209
207
|
server = client.cluster.next_primary
|
@@ -216,6 +214,28 @@ describe 'Auth' do
|
|
216
214
|
end
|
217
215
|
end
|
218
216
|
|
217
|
+
describe 'scram-sha-1 client key caching' do
|
218
|
+
clean_slate
|
219
|
+
min_server_version '3.0'
|
220
|
+
require_no_external_user
|
221
|
+
|
222
|
+
let(:client) { authorized_client.with(max_pool_size: 2, auth_mech: :scram) }
|
223
|
+
let(:conversation_class) { Mongo::Auth::Scram::Conversation }
|
224
|
+
|
225
|
+
it_behaves_like 'caches client key'
|
226
|
+
end
|
227
|
+
|
228
|
+
describe 'scram-sha-256 client key caching' do
|
229
|
+
clean_slate
|
230
|
+
min_server_version '4.0'
|
231
|
+
require_no_external_user
|
232
|
+
|
233
|
+
let(:client) { authorized_client.with(max_pool_size: 2, auth_mech: :scram256) }
|
234
|
+
let(:conversation_class) { Mongo::Auth::Scram256::Conversation }
|
235
|
+
|
236
|
+
it_behaves_like 'caches client key'
|
237
|
+
end
|
238
|
+
|
219
239
|
context 'when only auth source is specified' do
|
220
240
|
require_no_auth
|
221
241
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'awaited ismaster' do
|
4
|
+
min_server_fcv '4.4'
|
5
|
+
|
6
|
+
# If we send the consecutive ismasters to different mongoses,
|
7
|
+
# they have different process ids, and so the awaited one would return
|
8
|
+
# immediately.
|
9
|
+
require_no_multi_shard
|
10
|
+
|
11
|
+
let(:client) { authorized_client }
|
12
|
+
|
13
|
+
it 'waits' do
|
14
|
+
# Perform a regular ismaster to get topology version
|
15
|
+
resp = client.database.command(ismaster: 1)
|
16
|
+
doc = resp.replies.first.documents.first
|
17
|
+
tv = Mongo::TopologyVersion.new(doc['topologyVersion'])
|
18
|
+
tv.should be_a(BSON::Document)
|
19
|
+
|
20
|
+
elapsed_time = Benchmark.realtime do
|
21
|
+
resp = client.database.command(ismaster: 1,
|
22
|
+
topologyVersion: tv.to_doc, maxAwaitTimeMS: 500)
|
23
|
+
end
|
24
|
+
doc = resp.replies.first.documents.first
|
25
|
+
|
26
|
+
elapsed_time.should > 0.5
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'lite_spec_helper'
|
2
|
+
require 'net/http'
|
3
|
+
|
4
|
+
describe Mongo::Auth::Aws::Request do
|
5
|
+
require_aws_auth
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
if ENV['AUTH'] =~ /aws-(ec2|ecs)/
|
9
|
+
skip "This test requires explicit credentials to be provided"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:access_key_id) { ENV.fetch('MONGO_RUBY_DRIVER_AWS_AUTH_ACCESS_KEY_ID') }
|
14
|
+
let(:secret_access_key) { ENV.fetch('MONGO_RUBY_DRIVER_AWS_AUTH_SECRET_ACCESS_KEY') }
|
15
|
+
let(:session_token) { ENV['MONGO_RUBY_DRIVER_AWS_AUTH_SESSION_TOKEN'] }
|
16
|
+
|
17
|
+
describe '#authorization' do
|
18
|
+
let(:request) do
|
19
|
+
described_class.new(
|
20
|
+
access_key_id: access_key_id,
|
21
|
+
secret_access_key: secret_access_key,
|
22
|
+
session_token: session_token,
|
23
|
+
host: 'sts.amazonaws.com',
|
24
|
+
server_nonce: 'aaaaaaaaaaafake',
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:sts_request) do
|
29
|
+
Net::HTTP::Post.new("https://sts.amazonaws.com").tap do |req|
|
30
|
+
request.headers.each do |k, v|
|
31
|
+
req[k] = v
|
32
|
+
end
|
33
|
+
req['authorization'] = request.authorization
|
34
|
+
req['accept'] = 'application/json'
|
35
|
+
req.body = described_class::STS_REQUEST_BODY
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
let(:sts_response) do
|
40
|
+
http = Net::HTTP.new('sts.amazonaws.com', 443)
|
41
|
+
http.use_ssl = true
|
42
|
+
|
43
|
+
# Uncomment to log complete request headers and the response.
|
44
|
+
# WARNING: do not enable this in Evergreen as this can expose real
|
45
|
+
# AWS credentias.
|
46
|
+
#http.set_debug_output(STDERR)
|
47
|
+
|
48
|
+
http.start do
|
49
|
+
resp = http.request(sts_request)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
let(:sts_response_payload) do
|
54
|
+
JSON.parse(sts_response.body)
|
55
|
+
end
|
56
|
+
|
57
|
+
let(:result) do
|
58
|
+
sts_response_payload['GetCallerIdentityResponse']['GetCallerIdentityResult']
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'is usable' do
|
62
|
+
# This assertion intentionally does not use payload so that if it fails,
|
63
|
+
# the entire response is printed for diagnostic purposes.
|
64
|
+
sts_response.body.should_not =~ /"Error"/
|
65
|
+
|
66
|
+
sts_response.code.should == '200'
|
67
|
+
result['Arn'].should =~ /^arn:aws:(iam|sts)::/
|
68
|
+
result['Account'].should be_a(String)
|
69
|
+
result['UserId'].should =~ /^A/
|
70
|
+
|
71
|
+
puts "STS request successful with ARN #{result['Arn']}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'lite_spec_helper'
|
2
|
+
require 'support/aws_utils'
|
3
|
+
|
4
|
+
describe Mongo::Auth::Aws::CredentialsRetriever do
|
5
|
+
require_aws_auth
|
6
|
+
|
7
|
+
let(:retriever) do
|
8
|
+
described_class.new(user)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:credentials) do
|
12
|
+
retriever.credentials
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when user is not given' do
|
16
|
+
let(:user) do
|
17
|
+
Mongo::Auth::User.new(auth_mech: :aws)
|
18
|
+
end
|
19
|
+
|
20
|
+
shared_examples_for 'retrieves the credentials' do
|
21
|
+
it 'retrieves' do
|
22
|
+
credentials.should be_a(Mongo::Auth::Aws::Credentials)
|
23
|
+
|
24
|
+
# When user is not given, credentials retrieved are always temporary.
|
25
|
+
retriever.credentials.access_key_id.should =~ /^ASIA/
|
26
|
+
retriever.credentials.secret_access_key.should =~ /./
|
27
|
+
retriever.credentials.session_token.should =~ /./
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:request) do
|
31
|
+
Mongo::Auth::Aws::Request.new(
|
32
|
+
access_key_id: credentials.access_key_id,
|
33
|
+
secret_access_key: credentials.secret_access_key,
|
34
|
+
session_token: credentials.session_token,
|
35
|
+
host: 'sts.amazonaws.com',
|
36
|
+
server_nonce: 'test',
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'produces valid credentials' do
|
41
|
+
result = request.validate!
|
42
|
+
puts "STS request successful with ARN #{result['Arn']}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'ec2 instance role' do
|
47
|
+
require_ec2_host
|
48
|
+
|
49
|
+
before(:all) do
|
50
|
+
unless ENV['AUTH'] == 'aws-ec2'
|
51
|
+
skip "Set AUTH=aws-ec2 in environment to run EC2 instance role tests"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when instance profile is not assigned' do
|
56
|
+
before(:all) do
|
57
|
+
orchestrator = AwsUtils::Orchestrator.new(
|
58
|
+
region: ENV.fetch('MONGO_RUBY_DRIVER_AWS_AUTH_REGION'),
|
59
|
+
access_key_id: ENV.fetch('MONGO_RUBY_DRIVER_AWS_AUTH_ACCESS_KEY_ID'),
|
60
|
+
secret_access_key: ENV.fetch('MONGO_RUBY_DRIVER_AWS_AUTH_SECRET_ACCESS_KEY'),
|
61
|
+
)
|
62
|
+
|
63
|
+
orchestrator.clear_instance_profile(Utils.ec2_instance_id)
|
64
|
+
Utils.wait_for_no_instance_profile
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'raises an error' do
|
68
|
+
lambda do
|
69
|
+
credentials
|
70
|
+
end.should raise_error(Mongo::Auth::InvalidConfiguration, /Could not locate AWS credentials/)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when instance profile is assigned' do
|
75
|
+
before(:all) do
|
76
|
+
orchestrator = AwsUtils::Orchestrator.new(
|
77
|
+
region: ENV.fetch('MONGO_RUBY_DRIVER_AWS_AUTH_REGION'),
|
78
|
+
access_key_id: ENV.fetch('MONGO_RUBY_DRIVER_AWS_AUTH_ACCESS_KEY_ID'),
|
79
|
+
secret_access_key: ENV.fetch('MONGO_RUBY_DRIVER_AWS_AUTH_SECRET_ACCESS_KEY'),
|
80
|
+
)
|
81
|
+
|
82
|
+
orchestrator.set_instance_profile(Utils.ec2_instance_id,
|
83
|
+
instance_profile_name: nil,
|
84
|
+
instance_profile_arn: ENV.fetch('MONGO_RUBY_DRIVER_AWS_AUTH_INSTANCE_PROFILE_ARN'),
|
85
|
+
)
|
86
|
+
Utils.wait_for_instance_profile
|
87
|
+
end
|
88
|
+
|
89
|
+
it_behaves_like 'retrieves the credentials'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'ecs task role' do
|
94
|
+
before(:all) do
|
95
|
+
unless ENV['AUTH'] == 'aws-ecs'
|
96
|
+
skip "Set AUTH=aws-ecs in environment to run ECS task role tests"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it_behaves_like 'retrieves the credentials'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Bulk writes' do
|
4
|
+
before do
|
5
|
+
authorized_collection.drop
|
6
|
+
end
|
7
|
+
|
8
|
+
context 'when bulk write is larger than 48MB' do
|
9
|
+
let(:operations) do
|
10
|
+
[ { insert_one: { text: 'a' * 1000 * 1000 } } ] * 48
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'succeeds' do
|
14
|
+
expect do
|
15
|
+
authorized_collection.bulk_write(operations)
|
16
|
+
end.not_to raise_error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -174,8 +174,10 @@ describe 'change streams examples in Ruby' do
|
|
174
174
|
|
175
175
|
# Start Changestream Example 4
|
176
176
|
|
177
|
-
pipeline = [
|
178
|
-
|
177
|
+
pipeline = [
|
178
|
+
{ "$match" => { 'fullDocument.username' => 'alice' } },
|
179
|
+
{ "$addFields" => { 'newField' => 'this is an added field!' } }
|
180
|
+
];
|
179
181
|
cursor = inventory.watch(pipeline).to_enum
|
180
182
|
cursor.next
|
181
183
|
|
@@ -191,6 +193,8 @@ describe 'change streams examples in Ruby' do
|
|
191
193
|
expect(change['fullDocument']).not_to be_nil
|
192
194
|
expect(change['fullDocument']['_id']).not_to be_nil
|
193
195
|
expect(change['fullDocument']['username']).to eq('alice')
|
196
|
+
expect(change['newField']).not_to be_nil
|
197
|
+
expect(change['newField']).to eq('this is an added field!')
|
194
198
|
expect(change['ns']).not_to be_nil
|
195
199
|
expect(change['ns']['db']).to eq(SpecConfig.instance.test_db)
|
196
200
|
expect(change['ns']['coll']).to eq(inventory.name)
|
@@ -85,16 +85,20 @@ describe 'Change stream integration', retry: 4 do
|
|
85
85
|
min_server_fcv '4.0'
|
86
86
|
clear_fail_point_before
|
87
87
|
|
88
|
+
let(:client) do
|
89
|
+
authorized_client_without_any_retries
|
90
|
+
end
|
91
|
+
|
88
92
|
before do
|
89
|
-
|
93
|
+
client.use(:admin).command(fail_point_base_command.merge(
|
90
94
|
:mode => {:times => 1},
|
91
|
-
:data => {:failCommands => ['aggregate'], errorCode:
|
95
|
+
:data => {:failCommands => ['aggregate'], errorCode: 10107}))
|
92
96
|
end
|
93
97
|
|
94
98
|
it 'watch raises error' do
|
95
99
|
expect do
|
96
|
-
|
97
|
-
end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(
|
100
|
+
client['change-stream'].watch
|
101
|
+
end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(10107\)/)
|
98
102
|
end
|
99
103
|
end
|
100
104
|
|
@@ -105,35 +109,51 @@ describe 'Change stream integration', retry: 4 do
|
|
105
109
|
context 'error on first getMore' do
|
106
110
|
before do
|
107
111
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
108
|
-
:
|
109
|
-
:
|
112
|
+
mode: {times: 1},
|
113
|
+
data: {
|
114
|
+
failCommands: ['getMore'],
|
115
|
+
errorCode: error_code,
|
116
|
+
errorLabels: error_labels,
|
117
|
+
}))
|
110
118
|
end
|
111
119
|
|
112
120
|
context 'when the error is resumable' do
|
113
|
-
let(:
|
114
|
-
|
115
|
-
|
121
|
+
let(:error_code) { 10107 }
|
122
|
+
|
123
|
+
let(:error_labels) { ["ResumableChangeStreamError"] }
|
124
|
+
|
116
125
|
it_behaves_like 'returns a change document'
|
117
126
|
end
|
118
127
|
|
119
128
|
context 'when the error is Interrupted' do
|
120
|
-
let(:
|
121
|
-
|
122
|
-
|
129
|
+
let(:error_code) { 11601 }
|
130
|
+
|
131
|
+
let(:error_labels) { [] }
|
132
|
+
|
123
133
|
it_behaves_like 'raises an exception'
|
124
134
|
end
|
125
135
|
|
126
136
|
context 'when the error is CappedPositionLost' do
|
127
|
-
let(:
|
128
|
-
|
129
|
-
|
137
|
+
let(:error_code) { 136 }
|
138
|
+
|
139
|
+
let(:error_labels) { [] }
|
140
|
+
|
130
141
|
it_behaves_like 'raises an exception'
|
131
142
|
end
|
132
143
|
|
133
144
|
context 'when the error is CursorKilled' do
|
134
|
-
let(:
|
135
|
-
|
136
|
-
|
145
|
+
let(:error_code) { 237 }
|
146
|
+
|
147
|
+
let(:error_labels) { [] }
|
148
|
+
|
149
|
+
it_behaves_like 'raises an exception'
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'when the error is ElectionInProgress' do
|
153
|
+
let(:error_code) { 216 }
|
154
|
+
|
155
|
+
let(:error_labels) { [] }
|
156
|
+
|
137
157
|
it_behaves_like 'raises an exception'
|
138
158
|
end
|
139
159
|
end
|
@@ -150,35 +170,43 @@ describe 'Change stream integration', retry: 4 do
|
|
150
170
|
authorized_collection.insert_one(:a => 1)
|
151
171
|
|
152
172
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
153
|
-
:
|
154
|
-
:
|
173
|
+
mode: {times: 1},
|
174
|
+
data: {
|
175
|
+
failCommands: ['getMore'],
|
176
|
+
errorCode: error_code,
|
177
|
+
errorLabels: error_labels,
|
178
|
+
}))
|
155
179
|
end
|
156
180
|
|
157
181
|
context 'when the error is resumable' do
|
158
|
-
let(:
|
159
|
-
|
160
|
-
|
182
|
+
let(:error_code) { 10107 }
|
183
|
+
|
184
|
+
let(:error_labels) { ["ResumableChangeStreamError"] }
|
185
|
+
|
161
186
|
it_behaves_like 'returns a change document'
|
162
187
|
end
|
163
188
|
|
164
189
|
context 'when the error is Interrupted' do
|
165
|
-
let(:
|
166
|
-
|
167
|
-
|
190
|
+
let(:error_code) { 11601 }
|
191
|
+
|
192
|
+
let(:error_labels) { [] }
|
193
|
+
|
168
194
|
it_behaves_like 'raises an exception'
|
169
195
|
end
|
170
196
|
|
171
197
|
context 'when the error is CappedPositionLost' do
|
172
|
-
let(:
|
173
|
-
|
174
|
-
|
198
|
+
let(:error_code) { 136 }
|
199
|
+
|
200
|
+
let(:error_labels) { [] }
|
201
|
+
|
175
202
|
it_behaves_like 'raises an exception'
|
176
203
|
end
|
177
204
|
|
178
205
|
context 'when the error is CursorKilled' do
|
179
|
-
let(:
|
180
|
-
|
181
|
-
|
206
|
+
let(:error_code) { 237 }
|
207
|
+
|
208
|
+
let(:error_labels) { [] }
|
209
|
+
|
182
210
|
it_behaves_like 'raises an exception'
|
183
211
|
end
|
184
212
|
end
|
@@ -188,11 +216,19 @@ describe 'Change stream integration', retry: 4 do
|
|
188
216
|
min_server_fcv '4.0'
|
189
217
|
clear_fail_point_before
|
190
218
|
|
191
|
-
|
219
|
+
let(:error_code) { 10107 }
|
220
|
+
|
221
|
+
let(:error_labels) { ["ResumableChangeStreamError"] }
|
222
|
+
|
223
|
+
context 'error on first getMore' do
|
192
224
|
before do
|
193
225
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
194
|
-
:
|
195
|
-
:
|
226
|
+
mode: {times: 2},
|
227
|
+
data: {
|
228
|
+
failCommands: ['getMore'],
|
229
|
+
errorCode: error_code,
|
230
|
+
errorLabels: error_labels,
|
231
|
+
}))
|
196
232
|
end
|
197
233
|
|
198
234
|
# this retries twice because aggregation resets retry count,
|
@@ -212,8 +248,12 @@ describe 'Change stream integration', retry: 4 do
|
|
212
248
|
authorized_collection.insert_one(:a => 1)
|
213
249
|
|
214
250
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
215
|
-
:
|
216
|
-
:
|
251
|
+
mode: {times: 2},
|
252
|
+
data: {
|
253
|
+
failCommands: ['getMore'],
|
254
|
+
errorCode: error_code,
|
255
|
+
errorLabels: error_labels,
|
256
|
+
}))
|
217
257
|
end
|
218
258
|
|
219
259
|
# this retries twice because aggregation resets retry count,
|
@@ -282,6 +322,10 @@ describe 'Change stream integration', retry: 4 do
|
|
282
322
|
end
|
283
323
|
end
|
284
324
|
|
325
|
+
let(:error_code) { 10107 }
|
326
|
+
|
327
|
+
let(:error_labels) { ["ResumableChangeStreamError"] }
|
328
|
+
|
285
329
|
context 'one error on getMore' do
|
286
330
|
min_server_fcv '4.0'
|
287
331
|
clear_fail_point_before
|
@@ -289,8 +333,12 @@ describe 'Change stream integration', retry: 4 do
|
|
289
333
|
context 'error on first getMore' do
|
290
334
|
before do
|
291
335
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
292
|
-
:
|
293
|
-
:
|
336
|
+
mode: {times: 1},
|
337
|
+
data: {
|
338
|
+
failCommands: ['getMore'],
|
339
|
+
errorCode: error_code,
|
340
|
+
errorLabels: error_labels,
|
341
|
+
}))
|
294
342
|
end
|
295
343
|
|
296
344
|
it_behaves_like 'returns a change document'
|
@@ -304,8 +352,12 @@ describe 'Change stream integration', retry: 4 do
|
|
304
352
|
authorized_collection.insert_one(:a => 1)
|
305
353
|
|
306
354
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
307
|
-
:
|
308
|
-
:
|
355
|
+
mode: {times: 1},
|
356
|
+
data: {
|
357
|
+
failCommands: ['getMore'],
|
358
|
+
errorCode: error_code,
|
359
|
+
errorLabels: error_labels,
|
360
|
+
}))
|
309
361
|
end
|
310
362
|
|
311
363
|
it_behaves_like 'returns a change document'
|
@@ -323,8 +375,12 @@ describe 'Change stream integration', retry: 4 do
|
|
323
375
|
# getMore as no errors actually happen.
|
324
376
|
# 4.0.5-dev server appears to correctly set the fail point.
|
325
377
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
326
|
-
:
|
327
|
-
:
|
378
|
+
mode: {times: 2},
|
379
|
+
data: {
|
380
|
+
failCommands: ['getMore'],
|
381
|
+
errorCode: error_code,
|
382
|
+
errorLabels: error_labels,
|
383
|
+
}))
|
328
384
|
end
|
329
385
|
|
330
386
|
# this retries twice because aggregation resets retry count,
|
@@ -347,14 +403,18 @@ describe 'Change stream integration', retry: 4 do
|
|
347
403
|
enum = change_stream.to_enum
|
348
404
|
|
349
405
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
350
|
-
:
|
351
|
-
:
|
406
|
+
mode: {times: 3},
|
407
|
+
data: {
|
408
|
+
failCommands: ['getMore', 'aggregate'],
|
409
|
+
errorCode: error_code,
|
410
|
+
errorLabels: error_labels,
|
411
|
+
}))
|
352
412
|
|
353
413
|
sleep 0.5
|
354
414
|
|
355
415
|
expect do
|
356
416
|
enum.try_next
|
357
|
-
end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(
|
417
|
+
end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(10107\)/)
|
358
418
|
end
|
359
419
|
end
|
360
420
|
|
@@ -370,14 +430,18 @@ describe 'Change stream integration', retry: 4 do
|
|
370
430
|
enum = change_stream.to_enum
|
371
431
|
|
372
432
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
373
|
-
:
|
374
|
-
:
|
433
|
+
mode: {times: 3},
|
434
|
+
data: {
|
435
|
+
failCommands: ['getMore', 'aggregate'],
|
436
|
+
errorCode: error_code,
|
437
|
+
errorLabels: error_labels,
|
438
|
+
}))
|
375
439
|
|
376
440
|
sleep 0.5
|
377
441
|
|
378
442
|
expect do
|
379
443
|
enum.try_next
|
380
|
-
end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(
|
444
|
+
end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(10107\)/)
|
381
445
|
end
|
382
446
|
end
|
383
447
|
end
|
@@ -487,11 +551,19 @@ describe 'Change stream integration', retry: 4 do
|
|
487
551
|
|
488
552
|
authorized_collection.insert_one(x: 1)
|
489
553
|
authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
|
490
|
-
:
|
491
|
-
:
|
554
|
+
mode: {times: 1},
|
555
|
+
data: {
|
556
|
+
failCommands: ['getMore'],
|
557
|
+
errorCode: error_code,
|
558
|
+
errorLabels: error_labels,
|
559
|
+
}))
|
492
560
|
stream.to_enum.next
|
493
561
|
end
|
494
562
|
|
563
|
+
let(:error_code) { 10107 }
|
564
|
+
|
565
|
+
let(:error_labels) { ["ResumableChangeStreamError"] }
|
566
|
+
|
495
567
|
it 'does not startAfter even when passed in' do
|
496
568
|
expect(events.size == 2).to eq(true)
|
497
569
|
|