mongo 2.12.4 → 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 +40 -13
- 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 +216 -44
- 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 +41 -21
- 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 +10 -2
- 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 +68 -49
- 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 +1 -1
- data/lib/mongo/grid/file/chunk.rb +1 -1
- data/lib/mongo/grid/file/info.rb +1 -1
- data/lib/mongo/grid/fs_bucket.rb +9 -4
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/grid/stream/write.rb +1 -1
- 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 -18
- data/lib/mongo/protocol/msg.rb +19 -5
- data/lib/mongo/protocol/query.rb +1 -37
- data/lib/mongo/protocol/registry.rb +1 -1
- data/lib/mongo/protocol/reply.rb +1 -1
- data/lib/mongo/protocol/serializers.rb +1 -1
- 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 +27 -10
- 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/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_authentication_options_spec.rb +0 -37
- 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 +2 -6
- 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/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 +22 -23
- 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/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 +507 -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 +1185 -744
- 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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Mongo::Collection::View::Iterable do
|
|
4
|
+
let(:selector) do
|
|
5
|
+
{}
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
let(:options) do
|
|
9
|
+
{}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
let(:view) do
|
|
13
|
+
Mongo::Collection::View.new(authorized_collection, selector, options)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
before do
|
|
17
|
+
authorized_collection.drop
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe '#each' do
|
|
21
|
+
context 'when allow_disk_use is provided' do
|
|
22
|
+
let(:options) { { allow_disk_use: true } }
|
|
23
|
+
|
|
24
|
+
# Other cases are adequately covered by spec tests.
|
|
25
|
+
context 'on server versions < 3.2' do
|
|
26
|
+
max_server_fcv '3.0'
|
|
27
|
+
|
|
28
|
+
it 'raises an exception' do
|
|
29
|
+
expect do
|
|
30
|
+
view.each do |document|
|
|
31
|
+
#Do nothing
|
|
32
|
+
end
|
|
33
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the allow_disk_use option on this command/)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -239,12 +239,16 @@ describe Mongo::Collection::View::MapReduce do
|
|
|
239
239
|
Mongo::Collection::View.new(client[TEST_COLL], selector, view_options)
|
|
240
240
|
end
|
|
241
241
|
|
|
242
|
+
let(:subscriber) { EventSubscriber.new }
|
|
243
|
+
|
|
242
244
|
let(:client) do
|
|
243
|
-
|
|
245
|
+
authorized_client.tap do |client|
|
|
246
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
|
247
|
+
end
|
|
244
248
|
end
|
|
245
249
|
|
|
246
250
|
let(:find_command) do
|
|
247
|
-
|
|
251
|
+
subscriber.started_events[-1].command
|
|
248
252
|
end
|
|
249
253
|
|
|
250
254
|
before do
|
|
@@ -68,6 +68,20 @@ describe Mongo::Collection::View::Readable do
|
|
|
68
68
|
end
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
+
describe '#allow_disk_use' do
|
|
72
|
+
let(:new_view) do
|
|
73
|
+
view.allow_disk_use
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'sets the flag' do
|
|
77
|
+
expect(new_view.options[:allow_disk_use]).to be true
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it 'returns the new View' do
|
|
81
|
+
expect(new_view).not_to be(view)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
71
85
|
describe '#aggregate' do
|
|
72
86
|
|
|
73
87
|
let(:documents) do
|
|
@@ -192,7 +206,7 @@ describe Mongo::Collection::View::Readable do
|
|
|
192
206
|
|
|
193
207
|
let(:command) do
|
|
194
208
|
operation
|
|
195
|
-
|
|
209
|
+
subscriber.started_events.find { |cmd| cmd.command_name == 'mapReduce' }.command
|
|
196
210
|
end
|
|
197
211
|
|
|
198
212
|
it_behaves_like 'an operation supporting causally consistent reads'
|
|
@@ -10,8 +10,12 @@ describe Mongo::Collection::View::Writable do
|
|
|
10
10
|
{}
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
let(:view_collection) do
|
|
14
|
+
authorized_collection
|
|
15
|
+
end
|
|
16
|
+
|
|
13
17
|
let(:view) do
|
|
14
|
-
Mongo::Collection::View.new(
|
|
18
|
+
Mongo::Collection::View.new(view_collection, selector, options)
|
|
15
19
|
end
|
|
16
20
|
|
|
17
21
|
before do
|
|
@@ -24,6 +28,32 @@ describe Mongo::Collection::View::Writable do
|
|
|
24
28
|
authorized_collection.insert_many([{ field: 'test1' }])
|
|
25
29
|
end
|
|
26
30
|
|
|
31
|
+
context 'when hint option is provided' do
|
|
32
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
|
33
|
+
context 'on server versions < 4.2' do
|
|
34
|
+
max_server_fcv '4.0'
|
|
35
|
+
|
|
36
|
+
it 'raises a client-side exception' do
|
|
37
|
+
expect do
|
|
38
|
+
view.find_one_and_delete(hint: '_id_')
|
|
39
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context 'when the write concern is unacknowledged' do
|
|
44
|
+
let(:view_collection) do
|
|
45
|
+
client = authorized_client.with(write_concern: { w: 0 })
|
|
46
|
+
client[authorized_collection.name]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it 'raises a client-side error' do
|
|
50
|
+
expect do
|
|
51
|
+
view.find_one_and_delete(hint: '_id_')
|
|
52
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
27
57
|
context 'when a matching document is found' do
|
|
28
58
|
|
|
29
59
|
let(:selector) do
|
|
@@ -218,6 +248,32 @@ describe Mongo::Collection::View::Writable do
|
|
|
218
248
|
authorized_collection.insert_many([{ field: 'test1', other: 'sth' }])
|
|
219
249
|
end
|
|
220
250
|
|
|
251
|
+
context 'when hint option is provided' do
|
|
252
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
|
253
|
+
context 'on server versions < 4.2' do
|
|
254
|
+
max_server_fcv '4.0'
|
|
255
|
+
|
|
256
|
+
it 'raises a client-side exception' do
|
|
257
|
+
expect do
|
|
258
|
+
view.find_one_and_replace({ field: 'testing' }, { hint: '_id_' })
|
|
259
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
context 'when the write concern is unacknowledged' do
|
|
264
|
+
let(:view_collection) do
|
|
265
|
+
client = authorized_client.with(write_concern: { w: 0 })
|
|
266
|
+
client[authorized_collection.name]
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
it 'raises a client-side error' do
|
|
270
|
+
expect do
|
|
271
|
+
view.find_one_and_replace({ field: 'testing' }, { hint: '_id_' })
|
|
272
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
221
277
|
context 'when a matching document is found' do
|
|
222
278
|
|
|
223
279
|
let(:selector) do
|
|
@@ -435,6 +491,32 @@ describe Mongo::Collection::View::Writable do
|
|
|
435
491
|
authorized_collection.insert_many([{ field: 'test1' }])
|
|
436
492
|
end
|
|
437
493
|
|
|
494
|
+
context 'when hint option is provided' do
|
|
495
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
|
496
|
+
context 'on server versions < 4.2' do
|
|
497
|
+
max_server_fcv '4.0'
|
|
498
|
+
|
|
499
|
+
it 'raises a client-side exception' do
|
|
500
|
+
expect do
|
|
501
|
+
view.find_one_and_update({ '$set' => { field: 'testing' } }, { hint: '_id_' })
|
|
502
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
|
503
|
+
end
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
context 'when the write concern is unacknowledged' do
|
|
507
|
+
let(:view_collection) do
|
|
508
|
+
client = authorized_client.with(write_concern: { w: 0 })
|
|
509
|
+
client[authorized_collection.name]
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
it 'raises a client-side error' do
|
|
513
|
+
expect do
|
|
514
|
+
view.find_one_and_update({ '$set' => { field: 'testing' } }, { hint: '_id_' })
|
|
515
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
|
516
|
+
end
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
|
|
438
520
|
context 'when a matching document is found' do
|
|
439
521
|
|
|
440
522
|
let(:selector) do
|
|
@@ -625,6 +707,31 @@ describe Mongo::Collection::View::Writable do
|
|
|
625
707
|
end
|
|
626
708
|
|
|
627
709
|
describe '#delete_many' do
|
|
710
|
+
context 'when a hint option is provided' do
|
|
711
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
|
712
|
+
context 'on server versions < 3.4' do
|
|
713
|
+
max_server_fcv '3.2'
|
|
714
|
+
|
|
715
|
+
it 'raises a client-side exception' do
|
|
716
|
+
expect do
|
|
717
|
+
view.delete_many(hint: '_id_')
|
|
718
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
|
719
|
+
end
|
|
720
|
+
end
|
|
721
|
+
|
|
722
|
+
context 'when the write concern is unacknowledged' do
|
|
723
|
+
let(:view_collection) do
|
|
724
|
+
client = authorized_client.with(write_concern: { w: 0 })
|
|
725
|
+
client[authorized_collection.name]
|
|
726
|
+
end
|
|
727
|
+
|
|
728
|
+
it 'raises a client-side error' do
|
|
729
|
+
expect do
|
|
730
|
+
view.delete_many(hint: '_id_')
|
|
731
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
|
732
|
+
end
|
|
733
|
+
end
|
|
734
|
+
end
|
|
628
735
|
|
|
629
736
|
context 'when a selector was provided' do
|
|
630
737
|
|
|
@@ -787,6 +894,31 @@ describe Mongo::Collection::View::Writable do
|
|
|
787
894
|
end
|
|
788
895
|
|
|
789
896
|
describe '#delete_one' do
|
|
897
|
+
context 'when a hint option is provided' do
|
|
898
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
|
899
|
+
context 'on server versions < 3.4' do
|
|
900
|
+
max_server_fcv '3.2'
|
|
901
|
+
|
|
902
|
+
it 'raises a client-side exception' do
|
|
903
|
+
expect do
|
|
904
|
+
view.delete_one(hint: '_id_')
|
|
905
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
|
906
|
+
end
|
|
907
|
+
end
|
|
908
|
+
|
|
909
|
+
context 'when the write concern is unacknowledged' do
|
|
910
|
+
let(:view_collection) do
|
|
911
|
+
client = authorized_client.with(write_concern: { w: 0 })
|
|
912
|
+
client[authorized_collection.name]
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
it 'raises a client-side error' do
|
|
916
|
+
expect do
|
|
917
|
+
view.delete_many(hint: '_id_')
|
|
918
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
|
919
|
+
end
|
|
920
|
+
end
|
|
921
|
+
end
|
|
790
922
|
|
|
791
923
|
context 'when a selector was provided' do
|
|
792
924
|
|
|
@@ -950,6 +1082,31 @@ describe Mongo::Collection::View::Writable do
|
|
|
950
1082
|
end
|
|
951
1083
|
|
|
952
1084
|
describe '#replace_one' do
|
|
1085
|
+
context 'when a hint option is provided' do
|
|
1086
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
|
1087
|
+
context 'on server versions < 3.4' do
|
|
1088
|
+
max_server_fcv '3.2'
|
|
1089
|
+
|
|
1090
|
+
it 'raises a client-side exception' do
|
|
1091
|
+
expect do
|
|
1092
|
+
view.replace_one({ field: 'testing' }, { hint: '_id_' })
|
|
1093
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
|
1094
|
+
end
|
|
1095
|
+
end
|
|
1096
|
+
|
|
1097
|
+
context 'when the write concern is unacknowledged' do
|
|
1098
|
+
let(:view_collection) do
|
|
1099
|
+
client = authorized_client.with(write_concern: { w: 0 })
|
|
1100
|
+
client[authorized_collection.name]
|
|
1101
|
+
end
|
|
1102
|
+
|
|
1103
|
+
it 'raises a client-side error' do
|
|
1104
|
+
expect do
|
|
1105
|
+
view.delete_many(hint: '_id_')
|
|
1106
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
|
1107
|
+
end
|
|
1108
|
+
end
|
|
1109
|
+
end
|
|
953
1110
|
|
|
954
1111
|
context 'when a selector was provided' do
|
|
955
1112
|
|
|
@@ -1182,6 +1339,31 @@ describe Mongo::Collection::View::Writable do
|
|
|
1182
1339
|
end
|
|
1183
1340
|
|
|
1184
1341
|
describe '#update_many' do
|
|
1342
|
+
context 'when a hint option is provided' do
|
|
1343
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
|
1344
|
+
context 'on server versions < 3.4' do
|
|
1345
|
+
max_server_fcv '3.2'
|
|
1346
|
+
|
|
1347
|
+
it 'raises a client-side exception' do
|
|
1348
|
+
expect do
|
|
1349
|
+
view.update_many({ '$set' => { field: 'testing' } }, { hint: '_id_' })
|
|
1350
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
|
1351
|
+
end
|
|
1352
|
+
end
|
|
1353
|
+
|
|
1354
|
+
context 'when the write concern is unacknowledged' do
|
|
1355
|
+
let(:view_collection) do
|
|
1356
|
+
client = authorized_client.with(write_concern: { w: 0 })
|
|
1357
|
+
client[authorized_collection.name]
|
|
1358
|
+
end
|
|
1359
|
+
|
|
1360
|
+
it 'raises a client-side error' do
|
|
1361
|
+
expect do
|
|
1362
|
+
view.delete_many(hint: '_id_')
|
|
1363
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
|
1364
|
+
end
|
|
1365
|
+
end
|
|
1366
|
+
end
|
|
1185
1367
|
|
|
1186
1368
|
context 'when a selector was provided' do
|
|
1187
1369
|
|
|
@@ -1420,6 +1602,31 @@ describe Mongo::Collection::View::Writable do
|
|
|
1420
1602
|
end
|
|
1421
1603
|
|
|
1422
1604
|
describe '#update_one' do
|
|
1605
|
+
context 'when a hint option is provided' do
|
|
1606
|
+
# Functionality on more recent servers is sufficiently covered by spec tests.
|
|
1607
|
+
context 'on server versions < 3.4' do
|
|
1608
|
+
max_server_fcv '3.2'
|
|
1609
|
+
|
|
1610
|
+
it 'raises a client-side exception' do
|
|
1611
|
+
expect do
|
|
1612
|
+
view.update_one({ '$set' => { field: 'testing' } }, { hint: '_id_' })
|
|
1613
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
|
|
1614
|
+
end
|
|
1615
|
+
end
|
|
1616
|
+
|
|
1617
|
+
context 'when the write concern is unacknowledged' do
|
|
1618
|
+
let(:view_collection) do
|
|
1619
|
+
client = authorized_client.with(write_concern: { w: 0 })
|
|
1620
|
+
client[authorized_collection.name]
|
|
1621
|
+
end
|
|
1622
|
+
|
|
1623
|
+
it 'raises a client-side error' do
|
|
1624
|
+
expect do
|
|
1625
|
+
view.update_one({ '$set' => { field: 'testing' } }, { hint: '_id_' })
|
|
1626
|
+
end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
|
|
1627
|
+
end
|
|
1628
|
+
end
|
|
1629
|
+
end
|
|
1423
1630
|
|
|
1424
1631
|
context 'when a selector was provided' do
|
|
1425
1632
|
|
|
@@ -2,8 +2,18 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe Mongo::Collection do
|
|
4
4
|
|
|
5
|
+
let(:subscriber) { EventSubscriber.new }
|
|
6
|
+
|
|
7
|
+
let(:client) do
|
|
8
|
+
authorized_client.tap do |client|
|
|
9
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
let(:authorized_collection) { client['collection_spec'] }
|
|
14
|
+
|
|
5
15
|
before do
|
|
6
|
-
|
|
16
|
+
authorized_client['collection_spec'].drop
|
|
7
17
|
end
|
|
8
18
|
|
|
9
19
|
let(:collection_invalid_write_concern) do
|
|
@@ -14,10 +24,6 @@ describe Mongo::Collection do
|
|
|
14
24
|
authorized_client[:validating]
|
|
15
25
|
end
|
|
16
26
|
|
|
17
|
-
let(:client) do
|
|
18
|
-
authorized_client
|
|
19
|
-
end
|
|
20
|
-
|
|
21
27
|
describe '#==' do
|
|
22
28
|
|
|
23
29
|
let(:database) do
|
|
@@ -246,6 +252,7 @@ describe Mongo::Collection do
|
|
|
246
252
|
authorized_client.with(client_options).tap do |client|
|
|
247
253
|
expect(client.options[:read]).to eq(Mongo::Options::Redacted.new(
|
|
248
254
|
mode: :primary_preferred))
|
|
255
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
|
249
256
|
end
|
|
250
257
|
end
|
|
251
258
|
|
|
@@ -278,12 +285,6 @@ describe Mongo::Collection do
|
|
|
278
285
|
{read: { mode: :primary_preferred }}
|
|
279
286
|
end
|
|
280
287
|
|
|
281
|
-
let(:subscriber) { EventSubscriber.new }
|
|
282
|
-
|
|
283
|
-
before do
|
|
284
|
-
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
|
285
|
-
end
|
|
286
|
-
|
|
287
288
|
shared_examples_for "uses collection's read preference when reading" do
|
|
288
289
|
it "uses collection's read preference when reading" do
|
|
289
290
|
expect do
|
|
@@ -1230,10 +1231,6 @@ describe Mongo::Collection do
|
|
|
1230
1231
|
{ session: session }
|
|
1231
1232
|
end
|
|
1232
1233
|
|
|
1233
|
-
let(:client) do
|
|
1234
|
-
subscribed_client
|
|
1235
|
-
end
|
|
1236
|
-
|
|
1237
1234
|
let(:session) do
|
|
1238
1235
|
client.start_session
|
|
1239
1236
|
end
|
|
@@ -1244,7 +1241,7 @@ describe Mongo::Collection do
|
|
|
1244
1241
|
|
|
1245
1242
|
let(:command) do
|
|
1246
1243
|
client[TEST_COLL].find({}, session: session).explain
|
|
1247
|
-
|
|
1244
|
+
subscriber.started_events.find { |c| c.command_name == 'explain' }.command
|
|
1248
1245
|
end
|
|
1249
1246
|
|
|
1250
1247
|
it 'sends the session id' do
|
|
@@ -1261,7 +1258,7 @@ describe Mongo::Collection do
|
|
|
1261
1258
|
|
|
1262
1259
|
let(:command) do
|
|
1263
1260
|
operation
|
|
1264
|
-
|
|
1261
|
+
subscriber.started_events.find { |cmd| cmd.command_name == 'find' }.command
|
|
1265
1262
|
end
|
|
1266
1263
|
|
|
1267
1264
|
it_behaves_like 'an operation supporting causally consistent reads'
|
|
@@ -1461,7 +1458,7 @@ describe Mongo::Collection do
|
|
|
1461
1458
|
context 'when unacknowledged writes is used with an implicit session' do
|
|
1462
1459
|
|
|
1463
1460
|
let(:collection_with_unacknowledged_write_concern) do
|
|
1464
|
-
|
|
1461
|
+
client.with(write: { w: 0 })[TEST_COLL]
|
|
1465
1462
|
end
|
|
1466
1463
|
|
|
1467
1464
|
let(:operation) do
|
|
@@ -1543,20 +1540,16 @@ describe Mongo::Collection do
|
|
|
1543
1540
|
context 'when the documents are sent with OP_MSG' do
|
|
1544
1541
|
min_server_fcv '3.6'
|
|
1545
1542
|
|
|
1546
|
-
let(:client) do
|
|
1547
|
-
subscribed_client
|
|
1548
|
-
end
|
|
1549
|
-
|
|
1550
1543
|
let(:documents) do
|
|
1551
1544
|
[{ '_id' => 1, 'name' => '1'*16777191 }, { '_id' => 'y' }]
|
|
1552
1545
|
end
|
|
1553
1546
|
|
|
1554
1547
|
before do
|
|
1555
|
-
|
|
1548
|
+
authorized_collection.insert_many(documents)
|
|
1556
1549
|
end
|
|
1557
1550
|
|
|
1558
1551
|
let(:insert_events) do
|
|
1559
|
-
|
|
1552
|
+
subscriber.started_events.select { |e| e.command_name == 'insert' }
|
|
1560
1553
|
end
|
|
1561
1554
|
|
|
1562
1555
|
it 'sends the documents in one OP_MSG' do
|
|
@@ -1632,6 +1625,40 @@ describe Mongo::Collection do
|
|
|
1632
1625
|
expect(result.inserted_count).to be(0)
|
|
1633
1626
|
end
|
|
1634
1627
|
end
|
|
1628
|
+
|
|
1629
|
+
context 'when various options passed in' do
|
|
1630
|
+
# w: 2 requires a replica set
|
|
1631
|
+
require_topology :replica_set
|
|
1632
|
+
|
|
1633
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
1634
|
+
min_server_fcv '3.6'
|
|
1635
|
+
|
|
1636
|
+
let(:session) do
|
|
1637
|
+
authorized_client.start_session
|
|
1638
|
+
end
|
|
1639
|
+
|
|
1640
|
+
let(:events) do
|
|
1641
|
+
subscriber.command_started_events('insert')
|
|
1642
|
+
end
|
|
1643
|
+
|
|
1644
|
+
let(:collection) do
|
|
1645
|
+
authorized_collection.with(write_concern: {w: 2})
|
|
1646
|
+
end
|
|
1647
|
+
|
|
1648
|
+
let!(:command) do
|
|
1649
|
+
Utils.get_command_event(authorized_client, 'insert') do |client|
|
|
1650
|
+
collection.insert_many([{ name: 'test1' }, { name: 'test2' }], session: session,
|
|
1651
|
+
write_concern: {w: 1}, bypass_document_validation: true)
|
|
1652
|
+
end.command
|
|
1653
|
+
end
|
|
1654
|
+
|
|
1655
|
+
it 'inserts many successfully with correct options sent to server' do
|
|
1656
|
+
expect(events.length).to eq(1)
|
|
1657
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
1658
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
|
1659
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
|
1660
|
+
end
|
|
1661
|
+
end
|
|
1635
1662
|
end
|
|
1636
1663
|
|
|
1637
1664
|
describe '#insert_one' do
|
|
@@ -1704,7 +1731,7 @@ describe Mongo::Collection do
|
|
|
1704
1731
|
context 'when unacknowledged writes is used with an implicit session' do
|
|
1705
1732
|
|
|
1706
1733
|
let(:collection_with_unacknowledged_write_concern) do
|
|
1707
|
-
|
|
1734
|
+
client.with(write: { w: 0 })[TEST_COLL]
|
|
1708
1735
|
end
|
|
1709
1736
|
|
|
1710
1737
|
let(:operation) do
|
|
@@ -1714,6 +1741,37 @@ describe Mongo::Collection do
|
|
|
1714
1741
|
it_behaves_like 'an implicit session with an unacknowledged write'
|
|
1715
1742
|
end
|
|
1716
1743
|
|
|
1744
|
+
context 'when various options passed in' do
|
|
1745
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
1746
|
+
min_server_fcv '3.6'
|
|
1747
|
+
|
|
1748
|
+
let(:session) do
|
|
1749
|
+
authorized_client.start_session
|
|
1750
|
+
end
|
|
1751
|
+
|
|
1752
|
+
let(:events) do
|
|
1753
|
+
subscriber.command_started_events('insert')
|
|
1754
|
+
end
|
|
1755
|
+
|
|
1756
|
+
let(:collection) do
|
|
1757
|
+
authorized_collection.with(write_concern: {w: 3})
|
|
1758
|
+
end
|
|
1759
|
+
|
|
1760
|
+
let!(:command) do
|
|
1761
|
+
Utils.get_command_event(authorized_client, 'insert') do |client|
|
|
1762
|
+
collection.insert_one({name: 'test1'}, session: session, write_concern: {w: 1},
|
|
1763
|
+
bypass_document_validation: true)
|
|
1764
|
+
end.command
|
|
1765
|
+
end
|
|
1766
|
+
|
|
1767
|
+
it 'inserts one successfully with correct options sent to server' do
|
|
1768
|
+
expect(events.length).to eq(1)
|
|
1769
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
1770
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
|
1771
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
|
1772
|
+
end
|
|
1773
|
+
end
|
|
1774
|
+
|
|
1717
1775
|
context 'when the document contains invalid keys' do
|
|
1718
1776
|
|
|
1719
1777
|
let(:doc) do
|
|
@@ -1822,6 +1880,52 @@ describe Mongo::Collection do
|
|
|
1822
1880
|
end
|
|
1823
1881
|
end
|
|
1824
1882
|
|
|
1883
|
+
describe '#bulk_write' do
|
|
1884
|
+
|
|
1885
|
+
context 'when various options passed in' do
|
|
1886
|
+
min_server_fcv '3.2'
|
|
1887
|
+
require_topology :replica_set
|
|
1888
|
+
|
|
1889
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
1890
|
+
min_server_fcv '3.6'
|
|
1891
|
+
|
|
1892
|
+
let(:requests) do
|
|
1893
|
+
[
|
|
1894
|
+
{ insert_one: { name: "anne" }},
|
|
1895
|
+
{ insert_one: { name: "bob" }},
|
|
1896
|
+
{ insert_one: { name: "charlie" }}
|
|
1897
|
+
]
|
|
1898
|
+
end
|
|
1899
|
+
|
|
1900
|
+
let(:session) do
|
|
1901
|
+
authorized_client.start_session
|
|
1902
|
+
end
|
|
1903
|
+
|
|
1904
|
+
let!(:command) do
|
|
1905
|
+
Utils.get_command_event(authorized_client, 'insert') do |client|
|
|
1906
|
+
collection.bulk_write(requests, session: session, write_concern: {w: 1},
|
|
1907
|
+
bypass_document_validation: true)
|
|
1908
|
+
end.command
|
|
1909
|
+
end
|
|
1910
|
+
|
|
1911
|
+
let(:events) do
|
|
1912
|
+
subscriber.command_started_events('insert')
|
|
1913
|
+
end
|
|
1914
|
+
|
|
1915
|
+
let(:collection) do
|
|
1916
|
+
authorized_collection.with(write_concern: {w: 2})
|
|
1917
|
+
end
|
|
1918
|
+
|
|
1919
|
+
it 'inserts successfully with correct options sent to server' do
|
|
1920
|
+
expect(collection.count).to eq(3)
|
|
1921
|
+
expect(events.length).to eq(1)
|
|
1922
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
1923
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
|
1924
|
+
expect(command[:bypassDocumentValidation]).to eq(true)
|
|
1925
|
+
end
|
|
1926
|
+
end
|
|
1927
|
+
end
|
|
1928
|
+
|
|
1825
1929
|
describe '#inspect' do
|
|
1826
1930
|
|
|
1827
1931
|
it 'includes the object id' do
|
|
@@ -1914,7 +2018,7 @@ describe Mongo::Collection do
|
|
|
1914
2018
|
|
|
1915
2019
|
let(:command) do
|
|
1916
2020
|
operation
|
|
1917
|
-
|
|
2021
|
+
subscriber.started_events.find { |cmd| cmd.command_name == 'aggregate' }.command
|
|
1918
2022
|
end
|
|
1919
2023
|
|
|
1920
2024
|
it_behaves_like 'an operation supporting causally consistent reads'
|
|
@@ -2031,6 +2135,39 @@ describe Mongo::Collection do
|
|
|
2031
2135
|
end
|
|
2032
2136
|
|
|
2033
2137
|
describe '#count_documents' do
|
|
2138
|
+
|
|
2139
|
+
before do
|
|
2140
|
+
authorized_collection.delete_many
|
|
2141
|
+
end
|
|
2142
|
+
|
|
2143
|
+
context 'no argument provided' do
|
|
2144
|
+
|
|
2145
|
+
context 'when collection is empty' do
|
|
2146
|
+
it 'returns 0 matching documents' do
|
|
2147
|
+
expect(authorized_collection.count_documents).to eq(0)
|
|
2148
|
+
end
|
|
2149
|
+
end
|
|
2150
|
+
|
|
2151
|
+
context 'when collection is not empty' do
|
|
2152
|
+
|
|
2153
|
+
let(:documents) do
|
|
2154
|
+
documents = []
|
|
2155
|
+
1.upto(10) do |index|
|
|
2156
|
+
documents << { key: 'a', _id: "in#{index}" }
|
|
2157
|
+
end
|
|
2158
|
+
documents
|
|
2159
|
+
end
|
|
2160
|
+
|
|
2161
|
+
before do
|
|
2162
|
+
authorized_collection.insert_many(documents)
|
|
2163
|
+
end
|
|
2164
|
+
|
|
2165
|
+
it 'returns 10 matching documents' do
|
|
2166
|
+
expect(authorized_collection.count_documents).to eq(10)
|
|
2167
|
+
end
|
|
2168
|
+
end
|
|
2169
|
+
end
|
|
2170
|
+
|
|
2034
2171
|
context 'when transactions are enabled' do
|
|
2035
2172
|
require_wired_tiger
|
|
2036
2173
|
require_transaction_support
|
|
@@ -2119,7 +2256,7 @@ describe Mongo::Collection do
|
|
|
2119
2256
|
|
|
2120
2257
|
let(:command) do
|
|
2121
2258
|
operation
|
|
2122
|
-
|
|
2259
|
+
subscriber.started_events.find { |cmd| cmd.command_name == 'count' }.command
|
|
2123
2260
|
end
|
|
2124
2261
|
|
|
2125
2262
|
it_behaves_like 'an operation supporting causally consistent reads'
|
|
@@ -2237,7 +2374,7 @@ describe Mongo::Collection do
|
|
|
2237
2374
|
|
|
2238
2375
|
let(:command) do
|
|
2239
2376
|
operation
|
|
2240
|
-
|
|
2377
|
+
subscriber.started_events.find { |cmd| cmd.command_name == 'distinct' }.command
|
|
2241
2378
|
end
|
|
2242
2379
|
|
|
2243
2380
|
it_behaves_like 'an operation supporting causally consistent reads'
|
|
@@ -2399,7 +2536,7 @@ describe Mongo::Collection do
|
|
|
2399
2536
|
context 'when unacknowledged writes is used with an implicit session' do
|
|
2400
2537
|
|
|
2401
2538
|
let(:collection_with_unacknowledged_write_concern) do
|
|
2402
|
-
|
|
2539
|
+
client.with(write: { w: 0 })[TEST_COLL]
|
|
2403
2540
|
end
|
|
2404
2541
|
|
|
2405
2542
|
let(:operation) do
|
|
@@ -2509,6 +2646,48 @@ describe Mongo::Collection do
|
|
|
2509
2646
|
expect(authorized_collection.find(name: 'bang').count).to eq(1)
|
|
2510
2647
|
end
|
|
2511
2648
|
end
|
|
2649
|
+
|
|
2650
|
+
context 'when various options passed in' do
|
|
2651
|
+
# w: 2 requires a replica set
|
|
2652
|
+
require_topology :replica_set
|
|
2653
|
+
|
|
2654
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
2655
|
+
min_server_fcv '3.6'
|
|
2656
|
+
|
|
2657
|
+
before do
|
|
2658
|
+
authorized_collection.insert_many([{ name: 'test1' }, { name: 'test2' }])
|
|
2659
|
+
end
|
|
2660
|
+
|
|
2661
|
+
let(:selector) do
|
|
2662
|
+
{name: 'test2'}
|
|
2663
|
+
end
|
|
2664
|
+
|
|
2665
|
+
let(:session) do
|
|
2666
|
+
authorized_client.start_session
|
|
2667
|
+
end
|
|
2668
|
+
|
|
2669
|
+
let(:events) do
|
|
2670
|
+
subscriber.command_started_events('delete')
|
|
2671
|
+
end
|
|
2672
|
+
|
|
2673
|
+
let(:collection) do
|
|
2674
|
+
authorized_collection.with(write_concern: {w: 2})
|
|
2675
|
+
end
|
|
2676
|
+
|
|
2677
|
+
let!(:command) do
|
|
2678
|
+
Utils.get_command_event(authorized_client, 'delete') do |client|
|
|
2679
|
+
collection.delete_one(selector, session: session, write_concern: {w: 1},
|
|
2680
|
+
bypass_document_validation: true)
|
|
2681
|
+
end.command
|
|
2682
|
+
end
|
|
2683
|
+
|
|
2684
|
+
it 'deletes one successfully with correct options sent to server' do
|
|
2685
|
+
expect(events.length).to eq(1)
|
|
2686
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
2687
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
|
2688
|
+
expect(command[:bypassDocumentValidation]).to eq(true)
|
|
2689
|
+
end
|
|
2690
|
+
end
|
|
2512
2691
|
end
|
|
2513
2692
|
|
|
2514
2693
|
describe '#delete_many' do
|
|
@@ -2571,7 +2750,7 @@ describe Mongo::Collection do
|
|
|
2571
2750
|
it_behaves_like 'a failed operation using a session'
|
|
2572
2751
|
end
|
|
2573
2752
|
|
|
2574
|
-
context 'when unacknowledged writes
|
|
2753
|
+
context 'when unacknowledged writes are used with an explicit session' do
|
|
2575
2754
|
|
|
2576
2755
|
let(:collection_with_unacknowledged_write_concern) do
|
|
2577
2756
|
authorized_collection.with(write: { w: 0 })
|
|
@@ -2584,10 +2763,10 @@ describe Mongo::Collection do
|
|
|
2584
2763
|
it_behaves_like 'an explicit session with an unacknowledged write'
|
|
2585
2764
|
end
|
|
2586
2765
|
|
|
2587
|
-
context 'when unacknowledged writes
|
|
2766
|
+
context 'when unacknowledged writes are used with an implicit session' do
|
|
2588
2767
|
|
|
2589
2768
|
let(:collection_with_unacknowledged_write_concern) do
|
|
2590
|
-
|
|
2769
|
+
client.with(write: { w: 0 })[TEST_COLL]
|
|
2591
2770
|
end
|
|
2592
2771
|
|
|
2593
2772
|
let(:operation) do
|
|
@@ -2699,6 +2878,48 @@ describe Mongo::Collection do
|
|
|
2699
2878
|
expect(authorized_collection.find(name: 'bang').count).to eq(2)
|
|
2700
2879
|
end
|
|
2701
2880
|
end
|
|
2881
|
+
|
|
2882
|
+
context 'when various options passed in' do
|
|
2883
|
+
# w: 2 requires a replica set
|
|
2884
|
+
require_topology :replica_set
|
|
2885
|
+
|
|
2886
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
2887
|
+
min_server_fcv '3.6'
|
|
2888
|
+
|
|
2889
|
+
before do
|
|
2890
|
+
collection.insert_many([{ name: 'test1' }, { name: 'test2' }, { name: 'test3'}])
|
|
2891
|
+
end
|
|
2892
|
+
|
|
2893
|
+
let(:selector) do
|
|
2894
|
+
{name: 'test1'}
|
|
2895
|
+
end
|
|
2896
|
+
|
|
2897
|
+
let(:session) do
|
|
2898
|
+
authorized_client.start_session
|
|
2899
|
+
end
|
|
2900
|
+
|
|
2901
|
+
let(:events) do
|
|
2902
|
+
subscriber.command_started_events('delete')
|
|
2903
|
+
end
|
|
2904
|
+
|
|
2905
|
+
let(:collection) do
|
|
2906
|
+
authorized_collection.with(write_concern: {w: 1})
|
|
2907
|
+
end
|
|
2908
|
+
|
|
2909
|
+
let!(:command) do
|
|
2910
|
+
Utils.get_command_event(authorized_client, 'delete') do |client|
|
|
2911
|
+
collection.delete_many(selector, session: session, write_concern: {w: 2},
|
|
2912
|
+
bypass_document_validation: true)
|
|
2913
|
+
end.command
|
|
2914
|
+
end
|
|
2915
|
+
|
|
2916
|
+
it 'deletes many successfully with correct options sent to server' do
|
|
2917
|
+
expect(events.length).to eq(1)
|
|
2918
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
2919
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
|
2920
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
|
2921
|
+
end
|
|
2922
|
+
end
|
|
2702
2923
|
end
|
|
2703
2924
|
|
|
2704
2925
|
describe '#parallel_scan' do
|
|
@@ -2755,7 +2976,6 @@ describe Mongo::Collection do
|
|
|
2755
2976
|
end
|
|
2756
2977
|
|
|
2757
2978
|
context 'when a session is not provided' do
|
|
2758
|
-
let(:client) { subscribed_client }
|
|
2759
2979
|
let(:collection) { client['test'] }
|
|
2760
2980
|
|
|
2761
2981
|
let(:cursors) do
|
|
@@ -2772,7 +2992,7 @@ describe Mongo::Collection do
|
|
|
2772
2992
|
|
|
2773
2993
|
let(:command) do
|
|
2774
2994
|
operation
|
|
2775
|
-
event =
|
|
2995
|
+
event = subscriber.started_events.find { |cmd| cmd.command_name == 'parallelCollectionScan' }
|
|
2776
2996
|
expect(event).not_to be_nil
|
|
2777
2997
|
event.command
|
|
2778
2998
|
end
|
|
@@ -2794,7 +3014,7 @@ describe Mongo::Collection do
|
|
|
2794
3014
|
|
|
2795
3015
|
let(:command) do
|
|
2796
3016
|
operation
|
|
2797
|
-
event =
|
|
3017
|
+
event = subscriber.started_events.find { |cmd| cmd.command_name == 'parallelCollectionScan' }
|
|
2798
3018
|
expect(event).not_to be_nil
|
|
2799
3019
|
event.command
|
|
2800
3020
|
end
|
|
@@ -3197,7 +3417,7 @@ describe Mongo::Collection do
|
|
|
3197
3417
|
context 'when unacknowledged writes is used with an implicit session' do
|
|
3198
3418
|
|
|
3199
3419
|
let(:collection_with_unacknowledged_write_concern) do
|
|
3200
|
-
|
|
3420
|
+
client.with(write: { w: 0 })[TEST_COLL]
|
|
3201
3421
|
end
|
|
3202
3422
|
|
|
3203
3423
|
let(:operation) do
|
|
@@ -3206,6 +3426,51 @@ describe Mongo::Collection do
|
|
|
3206
3426
|
|
|
3207
3427
|
it_behaves_like 'an implicit session with an unacknowledged write'
|
|
3208
3428
|
end
|
|
3429
|
+
|
|
3430
|
+
context 'when various options passed in' do
|
|
3431
|
+
# w: 2 requires a replica set
|
|
3432
|
+
require_topology :replica_set
|
|
3433
|
+
|
|
3434
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
3435
|
+
min_server_fcv '3.6'
|
|
3436
|
+
|
|
3437
|
+
before do
|
|
3438
|
+
authorized_collection.insert_one({field: 'test1'})
|
|
3439
|
+
end
|
|
3440
|
+
|
|
3441
|
+
let(:session) do
|
|
3442
|
+
authorized_client.start_session
|
|
3443
|
+
end
|
|
3444
|
+
|
|
3445
|
+
let(:events) do
|
|
3446
|
+
subscriber.command_started_events('update')
|
|
3447
|
+
end
|
|
3448
|
+
|
|
3449
|
+
let(:collection) do
|
|
3450
|
+
authorized_collection.with(write_concern: {w: 3})
|
|
3451
|
+
end
|
|
3452
|
+
|
|
3453
|
+
let(:updated) do
|
|
3454
|
+
collection.find(field: 'test4').first
|
|
3455
|
+
end
|
|
3456
|
+
|
|
3457
|
+
let!(:command) do
|
|
3458
|
+
Utils.get_command_event(authorized_client, 'update') do |client|
|
|
3459
|
+
collection.replace_one(selector, { field: 'test4'},
|
|
3460
|
+
session: session, :return_document => :after, write_concern: {w: 2},
|
|
3461
|
+
upsert: true, bypass_document_validation: true)
|
|
3462
|
+
end.command
|
|
3463
|
+
end
|
|
3464
|
+
|
|
3465
|
+
it 'replaced one successfully with correct options sent to server' do
|
|
3466
|
+
expect(updated[:field]).to eq('test4')
|
|
3467
|
+
expect(events.length).to eq(1)
|
|
3468
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
3469
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
|
3470
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
|
3471
|
+
expect(command[:updates][0][:upsert]).to be(true)
|
|
3472
|
+
end
|
|
3473
|
+
end
|
|
3209
3474
|
end
|
|
3210
3475
|
|
|
3211
3476
|
describe '#update_many' do
|
|
@@ -3619,7 +3884,7 @@ describe Mongo::Collection do
|
|
|
3619
3884
|
context 'when unacknowledged writes is used with an implicit session' do
|
|
3620
3885
|
|
|
3621
3886
|
let(:collection_with_unacknowledged_write_concern) do
|
|
3622
|
-
|
|
3887
|
+
client.with(write: { w: 0 })[TEST_COLL]
|
|
3623
3888
|
end
|
|
3624
3889
|
|
|
3625
3890
|
let(:operation) do
|
|
@@ -3628,6 +3893,45 @@ describe Mongo::Collection do
|
|
|
3628
3893
|
|
|
3629
3894
|
it_behaves_like 'an implicit session with an unacknowledged write'
|
|
3630
3895
|
end
|
|
3896
|
+
|
|
3897
|
+
context 'when various options passed in' do
|
|
3898
|
+
# w: 2 requires a replica set
|
|
3899
|
+
require_topology :replica_set
|
|
3900
|
+
|
|
3901
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
3902
|
+
min_server_fcv '3.6'
|
|
3903
|
+
|
|
3904
|
+
before do
|
|
3905
|
+
collection.insert_many([{ field: 'test' }, { field: 'test2' }], session: session)
|
|
3906
|
+
end
|
|
3907
|
+
|
|
3908
|
+
let(:session) do
|
|
3909
|
+
authorized_client.start_session
|
|
3910
|
+
end
|
|
3911
|
+
|
|
3912
|
+
let(:collection) do
|
|
3913
|
+
authorized_collection.with(write_concern: {w: 1})
|
|
3914
|
+
end
|
|
3915
|
+
|
|
3916
|
+
let(:events) do
|
|
3917
|
+
subscriber.command_started_events('update')
|
|
3918
|
+
end
|
|
3919
|
+
|
|
3920
|
+
let!(:command) do
|
|
3921
|
+
Utils.get_command_event(authorized_client, 'update') do |client|
|
|
3922
|
+
collection.update_many(selector, {'$set'=> { field: 'testing' }}, session: session,
|
|
3923
|
+
write_concern: {w: 2}, bypass_document_validation: true, upsert: true)
|
|
3924
|
+
end.command
|
|
3925
|
+
end
|
|
3926
|
+
|
|
3927
|
+
it 'updates many successfully with correct options sent to server' do
|
|
3928
|
+
expect(events.length).to eq(1)
|
|
3929
|
+
expect(collection.options[:write_concern]).to eq(w: 1)
|
|
3930
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
|
3931
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
|
3932
|
+
expect(command[:updates][0][:upsert]).to be(true)
|
|
3933
|
+
end
|
|
3934
|
+
end
|
|
3631
3935
|
end
|
|
3632
3936
|
|
|
3633
3937
|
describe '#update_one' do
|
|
@@ -3977,10 +4281,6 @@ describe Mongo::Collection do
|
|
|
3977
4281
|
context 'when the documents are sent with OP_MSG' do
|
|
3978
4282
|
min_server_fcv '3.6'
|
|
3979
4283
|
|
|
3980
|
-
let(:client) do
|
|
3981
|
-
subscribed_client
|
|
3982
|
-
end
|
|
3983
|
-
|
|
3984
4284
|
let(:documents) do
|
|
3985
4285
|
[{ '_id' => 1, 'name' => '1'*16777191 }, { '_id' => 'y' }]
|
|
3986
4286
|
end
|
|
@@ -3991,7 +4291,7 @@ describe Mongo::Collection do
|
|
|
3991
4291
|
end
|
|
3992
4292
|
|
|
3993
4293
|
let(:update_events) do
|
|
3994
|
-
|
|
4294
|
+
subscriber.started_events.select { |e| e.command_name == 'update' }
|
|
3995
4295
|
end
|
|
3996
4296
|
|
|
3997
4297
|
it 'sends the documents in one OP_MSG' do
|
|
@@ -4041,7 +4341,7 @@ describe Mongo::Collection do
|
|
|
4041
4341
|
context 'when unacknowledged writes is used with an implicit session' do
|
|
4042
4342
|
|
|
4043
4343
|
let(:collection_with_unacknowledged_write_concern) do
|
|
4044
|
-
|
|
4344
|
+
client.with(write: { w: 0 })[TEST_COLL]
|
|
4045
4345
|
end
|
|
4046
4346
|
|
|
4047
4347
|
let(:operation) do
|
|
@@ -4050,6 +4350,47 @@ describe Mongo::Collection do
|
|
|
4050
4350
|
|
|
4051
4351
|
it_behaves_like 'an implicit session with an unacknowledged write'
|
|
4052
4352
|
end
|
|
4353
|
+
|
|
4354
|
+
context 'when various options passed in' do
|
|
4355
|
+
# w: 2 requires a replica set
|
|
4356
|
+
require_topology :replica_set
|
|
4357
|
+
|
|
4358
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
4359
|
+
min_server_fcv '3.6'
|
|
4360
|
+
|
|
4361
|
+
before do
|
|
4362
|
+
collection.insert_many([{ field: 'test1' }, { field: 'test2' }], session: session)
|
|
4363
|
+
end
|
|
4364
|
+
|
|
4365
|
+
let(:session) do
|
|
4366
|
+
authorized_client.start_session
|
|
4367
|
+
end
|
|
4368
|
+
|
|
4369
|
+
let(:collection) do
|
|
4370
|
+
authorized_collection.with(write_concern: {w: 1})
|
|
4371
|
+
end
|
|
4372
|
+
|
|
4373
|
+
let(:events) do
|
|
4374
|
+
subscriber.command_started_events('update')
|
|
4375
|
+
end
|
|
4376
|
+
|
|
4377
|
+
let!(:command) do
|
|
4378
|
+
Utils.get_command_event(authorized_client, 'update') do |client|
|
|
4379
|
+
collection.update_one(selector, { '$set'=> { field: 'testing' } }, session: session,
|
|
4380
|
+
write_concern: {w: 2}, bypass_document_validation: true, :return_document => :after,
|
|
4381
|
+
upsert: true)
|
|
4382
|
+
end.command
|
|
4383
|
+
end
|
|
4384
|
+
|
|
4385
|
+
it 'updates one successfully with correct options sent to server' do
|
|
4386
|
+
expect(events.length).to eq(1)
|
|
4387
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
4388
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
|
4389
|
+
expect(collection.options[:write_concern]).to eq(w:1)
|
|
4390
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
|
4391
|
+
expect(command[:updates][0][:upsert]).to be(true)
|
|
4392
|
+
end
|
|
4393
|
+
end
|
|
4053
4394
|
end
|
|
4054
4395
|
|
|
4055
4396
|
describe '#find_one_and_delete' do
|
|
@@ -4267,6 +4608,46 @@ describe Mongo::Collection do
|
|
|
4267
4608
|
expect(result).to be_nil
|
|
4268
4609
|
end
|
|
4269
4610
|
end
|
|
4611
|
+
|
|
4612
|
+
context 'when various options passed in' do
|
|
4613
|
+
# w: 2 requires a replica set
|
|
4614
|
+
require_topology :replica_set
|
|
4615
|
+
|
|
4616
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
4617
|
+
min_server_fcv '3.6'
|
|
4618
|
+
|
|
4619
|
+
before do
|
|
4620
|
+
authorized_collection.delete_many
|
|
4621
|
+
authorized_collection.insert_many([{ name: 'test1' }, { name: 'test2' }])
|
|
4622
|
+
end
|
|
4623
|
+
|
|
4624
|
+
let(:collection) do
|
|
4625
|
+
authorized_collection.with(write_concern: {w: 2})
|
|
4626
|
+
end
|
|
4627
|
+
|
|
4628
|
+
let(:session) do
|
|
4629
|
+
authorized_client.start_session
|
|
4630
|
+
end
|
|
4631
|
+
|
|
4632
|
+
let!(:command) do
|
|
4633
|
+
Utils.get_command_event(authorized_client, 'findAndModify') do |client|
|
|
4634
|
+
collection.find_one_and_delete(selector, session: session, write_concern: {w: 2},
|
|
4635
|
+
bypass_document_validation: true, max_time_ms: 300)
|
|
4636
|
+
end.command
|
|
4637
|
+
end
|
|
4638
|
+
|
|
4639
|
+
let(:events) do
|
|
4640
|
+
subscriber.command_started_events('findAndModify')
|
|
4641
|
+
end
|
|
4642
|
+
|
|
4643
|
+
it 'finds and deletes successfully with correct options sent to server' do
|
|
4644
|
+
expect(events.length).to eq(1)
|
|
4645
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
4646
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
|
4647
|
+
expect(command[:bypassDocumentValidation]).to eq(true)
|
|
4648
|
+
expect(command[:maxTimeMS]).to eq(300)
|
|
4649
|
+
end
|
|
4650
|
+
end
|
|
4270
4651
|
end
|
|
4271
4652
|
|
|
4272
4653
|
describe '#find_one_and_update' do
|
|
@@ -4688,6 +5069,51 @@ describe Mongo::Collection do
|
|
|
4688
5069
|
end
|
|
4689
5070
|
end
|
|
4690
5071
|
end
|
|
5072
|
+
|
|
5073
|
+
context 'when various options passed in' do
|
|
5074
|
+
# w: 2 requires a replica set
|
|
5075
|
+
require_topology :replica_set
|
|
5076
|
+
|
|
5077
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
5078
|
+
min_server_fcv '3.6'
|
|
5079
|
+
|
|
5080
|
+
let(:session) do
|
|
5081
|
+
authorized_client.start_session
|
|
5082
|
+
end
|
|
5083
|
+
|
|
5084
|
+
let(:events) do
|
|
5085
|
+
subscriber.command_started_events('findAndModify')
|
|
5086
|
+
end
|
|
5087
|
+
|
|
5088
|
+
let(:collection) do
|
|
5089
|
+
authorized_collection.with(write_concern: {w: 2})
|
|
5090
|
+
end
|
|
5091
|
+
|
|
5092
|
+
let(:selector) do
|
|
5093
|
+
{field: 'test1'}
|
|
5094
|
+
end
|
|
5095
|
+
|
|
5096
|
+
before do
|
|
5097
|
+
collection.insert_one({field: 'test1'}, session: session)
|
|
5098
|
+
end
|
|
5099
|
+
|
|
5100
|
+
let!(:command) do
|
|
5101
|
+
Utils.get_command_event(authorized_client, 'findAndModify') do |client|
|
|
5102
|
+
collection.find_one_and_update(selector, { '$set' => {field: 'testing'}},
|
|
5103
|
+
:return_document => :after, write_concern: {w: 1}, upsert: true,
|
|
5104
|
+
bypass_document_validation: true, max_time_ms: 100, session: session)
|
|
5105
|
+
end.command
|
|
5106
|
+
end
|
|
5107
|
+
|
|
5108
|
+
it 'find and updates successfully with correct options sent to server' do
|
|
5109
|
+
expect(events.length).to eq(1)
|
|
5110
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
5111
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
|
5112
|
+
expect(command[:upsert]).to eq(true)
|
|
5113
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
|
5114
|
+
expect(command[:maxTimeMS]).to eq(100)
|
|
5115
|
+
end
|
|
5116
|
+
end
|
|
4691
5117
|
end
|
|
4692
5118
|
|
|
4693
5119
|
describe '#find_one_and_replace' do
|
|
@@ -5001,6 +5427,44 @@ describe Mongo::Collection do
|
|
|
5001
5427
|
expect(result).to be_nil
|
|
5002
5428
|
end
|
|
5003
5429
|
end
|
|
5430
|
+
|
|
5431
|
+
context 'when various options passed in' do
|
|
5432
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
|
5433
|
+
min_server_fcv '3.6'
|
|
5434
|
+
|
|
5435
|
+
before do
|
|
5436
|
+
authorized_collection.insert_one({field: 'test1'})
|
|
5437
|
+
end
|
|
5438
|
+
|
|
5439
|
+
let(:session) do
|
|
5440
|
+
authorized_client.start_session
|
|
5441
|
+
end
|
|
5442
|
+
|
|
5443
|
+
let(:events) do
|
|
5444
|
+
subscriber.command_started_events('findAndModify')
|
|
5445
|
+
end
|
|
5446
|
+
|
|
5447
|
+
let(:collection) do
|
|
5448
|
+
authorized_collection.with(write_concern: { w: 2 })
|
|
5449
|
+
end
|
|
5450
|
+
|
|
5451
|
+
let!(:command) do
|
|
5452
|
+
Utils.get_command_event(authorized_client, 'findAndModify') do |client|
|
|
5453
|
+
collection.find_one_and_replace(selector, { '$set' => {field: 'test5'}},
|
|
5454
|
+
:return_document => :after, write_concern: {w: 1}, session: session,
|
|
5455
|
+
upsert: true, bypass_document_validation: false, max_time_ms: 200)
|
|
5456
|
+
end.command
|
|
5457
|
+
end
|
|
5458
|
+
|
|
5459
|
+
it 'find and replaces successfully with correct options sent to server' do
|
|
5460
|
+
expect(events.length).to eq(1)
|
|
5461
|
+
expect(command[:writeConcern]).to_not be_nil
|
|
5462
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
|
5463
|
+
expect(command[:upsert]).to be(true)
|
|
5464
|
+
expect(command[:bypassDocumentValidation]).to be_nil
|
|
5465
|
+
expect(command[:maxTimeMS]).to eq(200)
|
|
5466
|
+
end
|
|
5467
|
+
end
|
|
5004
5468
|
end
|
|
5005
5469
|
|
|
5006
5470
|
describe '#watch' do
|