mongo 2.13.0 → 2.15.0.alpha
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 +1 -4
- data.tar.gz.sig +0 -0
- data/README.md +4 -1
- data/Rakefile +46 -18
- data/lib/mongo.rb +32 -0
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/auth/aws/conversation.rb +1 -4
- data/lib/mongo/auth/base.rb +13 -7
- data/lib/mongo/auth/conversation_base.rb +32 -0
- data/lib/mongo/auth/cr/conversation.rb +6 -29
- data/lib/mongo/auth/gssapi/conversation.rb +4 -15
- data/lib/mongo/auth/ldap/conversation.rb +3 -14
- data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
- data/lib/mongo/auth/scram_conversation_base.rb +7 -34
- data/lib/mongo/auth/user/view.rb +16 -9
- data/lib/mongo/auth/x509/conversation.rb +4 -25
- data/lib/mongo/background_thread.rb +11 -0
- data/lib/mongo/bulk_write.rb +38 -18
- data/lib/mongo/caching_cursor.rb +74 -0
- data/lib/mongo/client.rb +142 -16
- data/lib/mongo/cluster.rb +22 -31
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
- data/lib/mongo/cluster/sdam_flow.rb +14 -0
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/collection.rb +58 -18
- data/lib/mongo/collection/view.rb +24 -20
- data/lib/mongo/collection/view/aggregation.rb +26 -5
- data/lib/mongo/collection/view/builder/find_command.rb +38 -18
- data/lib/mongo/collection/view/change_stream.rb +1 -1
- data/lib/mongo/collection/view/explainable.rb +27 -8
- data/lib/mongo/collection/view/iterable.rb +73 -13
- data/lib/mongo/collection/view/map_reduce.rb +2 -2
- data/lib/mongo/collection/view/readable.rb +57 -21
- data/lib/mongo/collection/view/writable.rb +29 -15
- data/lib/mongo/crypt/encryption_io.rb +6 -6
- data/lib/mongo/cursor.rb +18 -5
- data/lib/mongo/database.rb +28 -5
- data/lib/mongo/database/view.rb +2 -2
- data/lib/mongo/error.rb +11 -1
- data/lib/mongo/error/bulk_write_error.rb +17 -3
- data/lib/mongo/error/internal_driver_error.rb +22 -0
- data/lib/mongo/error/invalid_read_concern.rb +28 -0
- data/lib/mongo/error/operation_failure.rb +26 -7
- data/lib/mongo/error/parser.rb +65 -12
- data/lib/mongo/error/server_api_conflict.rb +23 -0
- data/lib/mongo/error/server_api_not_supported.rb +24 -0
- data/lib/mongo/error/server_certificate_revoked.rb +22 -0
- data/lib/mongo/error/unmet_dependency.rb +21 -0
- data/lib/mongo/error/unsupported_option.rb +14 -12
- data/lib/mongo/grid/fs_bucket.rb +37 -37
- data/lib/mongo/index/view.rb +21 -11
- data/lib/mongo/lint.rb +2 -1
- data/lib/mongo/logger.rb +3 -3
- data/lib/mongo/monitoring.rb +13 -4
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
- data/lib/mongo/operation.rb +4 -2
- data/lib/mongo/operation/aggregate/result.rb +9 -8
- data/lib/mongo/operation/collections_info.rb +18 -1
- data/lib/mongo/operation/collections_info/command.rb +5 -0
- data/lib/mongo/operation/collections_info/result.rb +18 -1
- data/lib/mongo/operation/context.rb +99 -0
- data/lib/mongo/operation/delete/bulk_result.rb +2 -0
- data/lib/mongo/operation/delete/result.rb +3 -0
- data/lib/mongo/operation/explain/command.rb +4 -0
- data/lib/mongo/operation/explain/legacy.rb +4 -0
- data/lib/mongo/operation/explain/op_msg.rb +6 -0
- data/lib/mongo/operation/explain/result.rb +3 -0
- data/lib/mongo/operation/find/legacy/result.rb +2 -0
- data/lib/mongo/operation/find/result.rb +13 -0
- data/lib/mongo/operation/get_more/result.rb +3 -0
- data/lib/mongo/operation/indexes.rb +15 -1
- data/lib/mongo/operation/indexes/result.rb +5 -0
- data/lib/mongo/operation/insert/bulk_result.rb +5 -0
- data/lib/mongo/operation/insert/command.rb +2 -2
- data/lib/mongo/operation/insert/legacy.rb +2 -2
- data/lib/mongo/operation/insert/op_msg.rb +2 -2
- data/lib/mongo/operation/insert/result.rb +5 -0
- data/lib/mongo/operation/list_collections/result.rb +9 -1
- data/lib/mongo/operation/map_reduce/result.rb +10 -0
- data/lib/mongo/operation/parallel_scan/result.rb +4 -0
- data/lib/mongo/operation/result.rb +37 -6
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
- data/lib/mongo/operation/shared/executable.rb +25 -14
- data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
- data/lib/mongo/operation/shared/idable.rb +2 -1
- data/lib/mongo/operation/shared/limited.rb +1 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
- data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
- data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
- data/lib/mongo/operation/shared/response_handling.rb +23 -23
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +14 -2
- data/lib/mongo/operation/shared/specifiable.rb +1 -0
- data/lib/mongo/operation/shared/write.rb +9 -18
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
- data/lib/mongo/operation/update/legacy/result.rb +7 -0
- data/lib/mongo/operation/update/result.rb +8 -0
- data/lib/mongo/operation/users_info/result.rb +3 -0
- data/lib/mongo/protocol/compressed.rb +51 -5
- data/lib/mongo/protocol/message.rb +31 -4
- data/lib/mongo/protocol/msg.rb +37 -12
- data/lib/mongo/protocol/query.rb +36 -0
- data/lib/mongo/query_cache.rb +272 -0
- data/lib/mongo/retryable.rb +9 -2
- data/lib/mongo/server.rb +12 -16
- data/lib/mongo/server/app_metadata.rb +52 -18
- data/lib/mongo/server/connection.rb +5 -0
- data/lib/mongo/server/connection_base.rb +16 -15
- data/lib/mongo/server/connection_common.rb +2 -2
- data/lib/mongo/server/connection_pool.rb +9 -4
- data/lib/mongo/server/description.rb +12 -1
- data/lib/mongo/server/description/features.rb +9 -8
- data/lib/mongo/server/monitor.rb +21 -2
- data/lib/mongo/server/monitor/app_metadata.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +12 -13
- data/lib/mongo/server/pending_connection.rb +26 -8
- data/lib/mongo/server/push_monitor.rb +12 -2
- data/lib/mongo/server_selector/base.rb +5 -1
- data/lib/mongo/session.rb +7 -3
- data/lib/mongo/session/session_pool.rb +4 -2
- data/lib/mongo/socket.rb +35 -8
- data/lib/mongo/socket/ocsp_cache.rb +97 -0
- data/lib/mongo/socket/ocsp_verifier.rb +368 -0
- data/lib/mongo/socket/ssl.rb +53 -24
- data/lib/mongo/srv/monitor.rb +7 -24
- data/lib/mongo/srv/resolver.rb +14 -10
- data/lib/mongo/timeout.rb +2 -0
- data/lib/mongo/uri.rb +21 -390
- data/lib/mongo/uri/options_mapper.rb +620 -0
- data/lib/mongo/uri/srv_protocol.rb +3 -2
- data/lib/mongo/utils.rb +27 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.md +87 -2
- data/spec/integration/auth_spec.rb +25 -15
- data/spec/integration/bson_symbol_spec.rb +4 -2
- data/spec/integration/bulk_write_error_message_spec.rb +41 -0
- data/spec/integration/bulk_write_spec.rb +48 -0
- data/spec/integration/change_stream_spec.rb +5 -5
- data/spec/integration/client_authentication_options_spec.rb +92 -28
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +6 -2
- data/spec/integration/command_monitoring_spec.rb +2 -2
- data/spec/integration/connection_pool_populator_spec.rb +4 -2
- data/spec/integration/connection_spec.rb +2 -0
- data/spec/integration/cursor_reaping_spec.rb +54 -18
- data/spec/integration/docs_examples_spec.rb +8 -1
- data/spec/integration/fork_reconnect_spec.rb +60 -2
- data/spec/integration/ocsp_connectivity_spec.rb +26 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
- data/spec/integration/ocsp_verifier_spec.rb +340 -0
- data/spec/integration/operation_failure_code_spec.rb +1 -1
- data/spec/integration/operation_failure_message_spec.rb +90 -0
- data/spec/integration/query_cache_spec.rb +1045 -0
- data/spec/integration/query_cache_transactions_spec.rb +190 -0
- data/spec/integration/reconnect_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -0
- data/spec/integration/sdam_error_handling_spec.rb +86 -1
- data/spec/integration/sdam_events_spec.rb +8 -7
- data/spec/integration/server_selection_spec.rb +36 -0
- data/spec/integration/size_limit_spec.rb +20 -19
- data/spec/integration/snappy_compression_spec.rb +25 -0
- data/spec/integration/srv_monitoring_spec.rb +39 -4
- data/spec/integration/srv_spec.rb +56 -0
- data/spec/integration/transactions_examples_spec.rb +23 -7
- data/spec/integration/zlib_compression_spec.rb +1 -1
- data/spec/integration/zstd_compression_spec.rb +26 -0
- data/spec/lite_spec_helper.rb +15 -5
- data/spec/mongo/address_spec.rb +16 -12
- data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
- data/spec/mongo/auth/ldap_spec.rb +5 -1
- data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/caching_cursor_spec.rb +70 -0
- data/spec/mongo/client_construction_spec.rb +273 -35
- data/spec/mongo/client_encryption_spec.rb +16 -10
- data/spec/mongo/client_spec.rb +64 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
- data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
- data/spec/mongo/cluster/topology/single_spec.rb +15 -6
- data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -1
- data/spec/mongo/cluster_spec.rb +6 -18
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
- data/spec/mongo/collection/view/explainable_spec.rb +87 -4
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
- data/spec/mongo/collection/view/readable_spec.rb +50 -0
- data/spec/mongo/collection_crud_spec.rb +4357 -0
- data/spec/mongo/collection_ddl_spec.rb +534 -0
- data/spec/mongo/collection_spec.rb +5 -4787
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/context_spec.rb +2 -7
- data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
- data/spec/mongo/crypt/binding/status_spec.rb +1 -6
- data/spec/mongo/crypt/binding/version_spec.rb +1 -6
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/status_spec.rb +1 -6
- data/spec/mongo/database_spec.rb +174 -4
- data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/error/parser_spec.rb +37 -6
- data/spec/mongo/index/view_spec.rb +8 -2
- data/spec/mongo/logger_spec.rb +13 -11
- data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
- data/spec/mongo/operation/aggregate_spec.rb +2 -1
- data/spec/mongo/operation/collections_info_spec.rb +4 -1
- data/spec/mongo/operation/command_spec.rb +6 -3
- data/spec/mongo/operation/create_index_spec.rb +6 -3
- data/spec/mongo/operation/create_user_spec.rb +6 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/delete_spec.rb +11 -7
- data/spec/mongo/operation/drop_index_spec.rb +6 -2
- data/spec/mongo/operation/find/legacy_spec.rb +3 -1
- data/spec/mongo/operation/get_more_spec.rb +3 -1
- data/spec/mongo/operation/indexes_spec.rb +5 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
- data/spec/mongo/operation/insert/command_spec.rb +2 -2
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/insert_spec.rb +15 -12
- data/spec/mongo/operation/map_reduce_spec.rb +5 -2
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/remove_user_spec.rb +6 -3
- data/spec/mongo/operation/result_spec.rb +1 -1
- data/spec/mongo/operation/update/bulk_spec.rb +9 -6
- data/spec/mongo/operation/update/command_spec.rb +2 -2
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/update_spec.rb +10 -7
- data/spec/mongo/operation/update_user_spec.rb +4 -1
- data/spec/mongo/protocol/compressed_spec.rb +26 -12
- data/spec/mongo/query_cache_middleware_spec.rb +55 -0
- data/spec/mongo/query_cache_spec.rb +280 -0
- data/spec/mongo/retryable_spec.rb +3 -2
- data/spec/mongo/server/app_metadata_shared.rb +2 -2
- data/spec/mongo/server/app_metadata_spec.rb +2 -0
- data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
- data/spec/mongo/server/connection_pool_spec.rb +8 -4
- data/spec/mongo/server/connection_spec.rb +39 -25
- data/spec/mongo/server/description_spec.rb +18 -0
- data/spec/mongo/server/monitor/connection_spec.rb +17 -7
- data/spec/mongo/server/monitor_spec.rb +9 -1
- data/spec/mongo/server_selector_spec.rb +2 -2
- data/spec/mongo/server_spec.rb +15 -2
- data/spec/mongo/socket/ssl_spec.rb +44 -4
- data/spec/mongo/socket_spec.rb +2 -2
- data/spec/mongo/tls_context_hooks_spec.rb +37 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
- data/spec/mongo/uri_option_parsing_spec.rb +11 -11
- data/spec/mongo/uri_spec.rb +68 -41
- data/spec/mongo/utils_spec.rb +39 -0
- data/spec/runners/auth.rb +3 -0
- data/spec/runners/change_streams/test.rb +1 -1
- data/spec/runners/connection_string.rb +31 -124
- data/spec/runners/crud/requirement.rb +40 -3
- data/spec/runners/crud/test_base.rb +0 -19
- data/spec/runners/crud/verifier.rb +8 -0
- data/spec/runners/server_selection.rb +1 -1
- data/spec/runners/transactions/operation.rb +13 -2
- data/spec/runners/transactions/test.rb +3 -2
- data/spec/runners/unified.rb +96 -0
- data/spec/runners/unified/assertions.rb +249 -0
- data/spec/runners/unified/change_stream_operations.rb +26 -0
- data/spec/runners/unified/crud_operations.rb +199 -0
- data/spec/runners/unified/ddl_operations.rb +96 -0
- data/spec/runners/unified/entity_map.rb +39 -0
- data/spec/runners/unified/error.rb +25 -0
- data/spec/runners/unified/event_subscriber.rb +91 -0
- data/spec/runners/unified/exceptions.rb +21 -0
- data/spec/runners/unified/grid_fs_operations.rb +55 -0
- data/spec/runners/unified/support_operations.rb +250 -0
- data/spec/runners/unified/test.rb +393 -0
- data/spec/runners/unified/test_group.rb +28 -0
- data/spec/runners/unified/using_hash.rb +31 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +218 -0
- data/spec/shared/lib/mrss/constraints.rb +346 -0
- data/spec/shared/lib/mrss/docker_runner.rb +262 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +112 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +231 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +290 -0
- data/spec/shared/shlib/set_env.sh +128 -0
- data/spec/solo/clean_exit_spec.rb +21 -0
- data/spec/spec_helper.rb +7 -2
- data/spec/spec_tests/cmap_spec.rb +7 -3
- data/spec/spec_tests/crud_unified_spec.rb +10 -0
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -1
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -2
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
- data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
- data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
- data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
- data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
- data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
- data/spec/spec_tests/unified_spec.rb +15 -0
- data/spec/spec_tests/uri_options_spec.rb +47 -33
- data/spec/spec_tests/versioned_api_spec.rb +10 -0
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
- data/spec/support/certificates/atlas-ocsp.crt +41 -0
- data/spec/support/client_registry_macros.rb +11 -2
- data/spec/support/common_shortcuts.rb +59 -0
- data/spec/support/constraints.rb +6 -253
- data/spec/support/matchers.rb +16 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/session_registry.rb +52 -0
- data/spec/support/shared/session.rb +2 -2
- data/spec/support/spec_config.rb +68 -3
- data/spec/support/spec_setup.rb +48 -38
- data/spec/support/utils.rb +102 -4
- metadata +1087 -936
- metadata.gz.sig +0 -0
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
- data/spec/support/child_process_helper.rb +0 -78
- data/spec/support/cluster_config.rb +0 -207
- data/spec/support/lite_constraints.rb +0 -141
- data/spec/support/spec_organizer.rb +0 -129
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'lite_spec_helper'
|
2
|
+
|
3
|
+
describe Mongo::Utils do
|
4
|
+
describe '#shallow_symbolize_keys' do
|
5
|
+
it 'symbolizes' do
|
6
|
+
described_class.shallow_symbolize_keys(
|
7
|
+
'foo' => 'bar',
|
8
|
+
'aKey' => 'aValue',
|
9
|
+
'a_key' => 'a_value',
|
10
|
+
key: :value,
|
11
|
+
).should == {
|
12
|
+
foo: 'bar',
|
13
|
+
aKey: 'aValue',
|
14
|
+
a_key: 'a_value',
|
15
|
+
key: :value,
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#shallow_camelize_keys' do
|
21
|
+
it 'camelizes' do
|
22
|
+
described_class.shallow_camelize_keys(
|
23
|
+
'foo' => 'bar',
|
24
|
+
'aKey' => 'aValue',
|
25
|
+
'aa_key' => 'a_value',
|
26
|
+
key: :value,
|
27
|
+
sKey: :sValue,
|
28
|
+
us_key: :us_value,
|
29
|
+
).should == {
|
30
|
+
'foo' => 'bar',
|
31
|
+
'aKey' => 'aValue',
|
32
|
+
'aaKey' => 'a_value',
|
33
|
+
'key' => :value,
|
34
|
+
'sKey' => :sValue,
|
35
|
+
'usKey' => :us_value,
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/spec/runners/auth.rb
CHANGED
@@ -70,7 +70,7 @@ module Mongo
|
|
70
70
|
if ClusterConfig.instance.server_version < '4.4' &&
|
71
71
|
global_client.cluster.servers.length > 1
|
72
72
|
then
|
73
|
-
mongos_each_direct_client do |client|
|
73
|
+
::Utils.mongos_each_direct_client do |client|
|
74
74
|
client.database.command(flushRouterConfig: 1)
|
75
75
|
end
|
76
76
|
end
|
@@ -84,20 +84,6 @@ RSpec::Matchers.define :match_auth do |test|
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
RSpec::Matchers.define :match_options do |test|
|
88
|
-
|
89
|
-
match do |client|
|
90
|
-
options = test.options
|
91
|
-
return true unless options
|
92
|
-
options.match?(client.options)
|
93
|
-
end
|
94
|
-
|
95
|
-
failure_message do |client|
|
96
|
-
"With URI: #{test.uri_string}\n" +
|
97
|
-
"Expected that test options: #{test.options.options} would match client options: #{client.options}"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
87
|
module Mongo
|
102
88
|
module ConnectionString
|
103
89
|
|
@@ -159,7 +145,7 @@ module Mongo
|
|
159
145
|
end
|
160
146
|
|
161
147
|
def options
|
162
|
-
@
|
148
|
+
@spec['options']
|
163
149
|
end
|
164
150
|
|
165
151
|
def client
|
@@ -239,115 +225,27 @@ module Mongo
|
|
239
225
|
end
|
240
226
|
end
|
241
227
|
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
'sockettimeoutms' => :socket_timeout,
|
252
|
-
'serverselectiontimeoutms' => :server_selection_timeout,
|
253
|
-
'localthresholdms' => :local_threshold,
|
254
|
-
'heartbeatfrequencyms' => :heartbeat_frequency,
|
255
|
-
'maxidletimems' => :max_idle_time,
|
256
|
-
|
257
|
-
# Write Options
|
258
|
-
'journal' => [:write_concern, 'j'],
|
259
|
-
'w' => [:write_concern, 'w'],
|
260
|
-
'wtimeoutms' => [:write_concern, 'wtimeout'],
|
261
|
-
|
262
|
-
# Read Options
|
263
|
-
'readpreference' => ['read', 'mode'],
|
264
|
-
'readpreferencetags' => ['read', 'tag_sets'],
|
265
|
-
'maxstalenessseconds' => ['read', 'max_staleness'],
|
266
|
-
|
267
|
-
# Pool Options
|
268
|
-
'minpoolsize' => :min_pool_size,
|
269
|
-
'maxpoolsize' => :max_pool_size,
|
270
|
-
|
271
|
-
# Security Options
|
272
|
-
'tls' => :ssl,
|
273
|
-
'tlsallowinvalidcertificates' => :ssl_verify_certificate,
|
274
|
-
'tlsallowinvalidhostnames' => :ssl_verify_hostname,
|
275
|
-
'tlscafile' => :ssl_ca_cert,
|
276
|
-
'tlscertificatekeyfile' => :ssl_cert,
|
277
|
-
'tlscertificatekeyfilepassword' => :ssl_key_pass_phrase,
|
278
|
-
'tlsinsecure' => :ssl_verify,
|
279
|
-
|
280
|
-
# Auth Options
|
281
|
-
'authsource' => :auth_source,
|
282
|
-
'authmechanism' => :auth_mech,
|
283
|
-
'authmechanismproperties' => :auth_mech_properties,
|
284
|
-
|
285
|
-
# Client Options
|
286
|
-
'appname' => :app_name,
|
287
|
-
'readconcernlevel' => [:read_concern, 'level'],
|
288
|
-
'retrywrites' => :retry_writes,
|
289
|
-
'zlibcompressionlevel' => :zlib_compression_level,
|
290
|
-
}
|
291
|
-
|
292
|
-
attr_reader :options
|
293
|
-
|
294
|
-
def initialize(options)
|
295
|
-
@options = options
|
296
|
-
end
|
297
|
-
|
298
|
-
def match?(opts)
|
299
|
-
@options.all? do |k, v|
|
300
|
-
k = k.downcase
|
301
|
-
|
302
|
-
expected =
|
303
|
-
case k
|
304
|
-
when 'authmechanism'
|
305
|
-
Mongo::URI::AUTH_MECH_MAP[v].downcase.to_s
|
306
|
-
when 'authmechanismproperties'
|
307
|
-
v.reduce({}) do |new_v, prop|
|
308
|
-
prop_key = prop.first.downcase
|
309
|
-
prop_val = prop.last == 'true' ? true : prop.last
|
310
|
-
new_v[prop_key] = prop_val
|
311
|
-
|
312
|
-
new_v
|
313
|
-
end
|
314
|
-
when 'compressors'
|
315
|
-
v.dup.tap do |compressors|
|
316
|
-
# The Ruby driver doesn't support snappy
|
317
|
-
compressors.delete('snappy')
|
318
|
-
end
|
319
|
-
when 'readpreference'
|
320
|
-
Mongo::URI::READ_MODE_MAP[v.downcase].to_s
|
321
|
-
when 'tlsallowinvalidcertificates', 'tlsallowinvalidhostnames', 'tlsinsecure'
|
322
|
-
!v
|
323
|
-
else
|
324
|
-
if k.end_with?('ms') && k != 'wtimeoutms'
|
325
|
-
v / 1000.0
|
326
|
-
elsif v.is_a?(String)
|
327
|
-
v.downcase
|
328
|
-
else
|
329
|
-
v
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
actual =
|
334
|
-
case MAPPINGS[k]
|
335
|
-
when nil
|
336
|
-
opts[k]
|
337
|
-
when Array
|
338
|
-
opts[MAPPINGS[k].first][MAPPINGS[k].last]
|
339
|
-
else
|
340
|
-
opts[MAPPINGS[k]]
|
341
|
-
end
|
342
|
-
|
343
|
-
if actual.is_a?(Symbol)
|
344
|
-
actual = actual.to_s
|
228
|
+
module_function def adjust_expected_mongo_client_options(options)
|
229
|
+
expected = options.dup.tap do |expected|
|
230
|
+
expected.each do |k, v|
|
231
|
+
# Ruby driver downcases auth mechanism properties when
|
232
|
+
# constructing the client.
|
233
|
+
#
|
234
|
+
# Some tests give options in all lower case.
|
235
|
+
if k.downcase == 'authmechanismproperties'
|
236
|
+
expected[k] = ::Utils.downcase_keys(v)
|
345
237
|
end
|
346
|
-
|
347
|
-
|
238
|
+
end
|
239
|
+
# We omit retryReads/retryWrites=true because some tests do not
|
240
|
+
# provide those.
|
241
|
+
%w(retryReads retryWrites).each do |k, v|
|
242
|
+
if expected[k] == true
|
243
|
+
expected.delete(k)
|
348
244
|
end
|
349
|
-
|
350
|
-
|
245
|
+
end
|
246
|
+
# Fix appName case.
|
247
|
+
if expected.key?('appname') && !expected.key?('appName')
|
248
|
+
expected['appName'] = expected.delete('appname')
|
351
249
|
end
|
352
250
|
end
|
353
251
|
end
|
@@ -406,8 +304,17 @@ def define_connection_string_spec_tests(test_paths, spec_cls = Mongo::Connection
|
|
406
304
|
expect(test.client).to match_auth(test)
|
407
305
|
end
|
408
306
|
|
409
|
-
|
410
|
-
|
307
|
+
if test.options
|
308
|
+
it 'creates a client with the correct options' do
|
309
|
+
mapped = Mongo::URI::OptionsMapper.new.ruby_to_smc(test.client.options)
|
310
|
+
# Connection string spec tests do not use canonical URI option names
|
311
|
+
actual = Utils.downcase_keys(mapped)
|
312
|
+
actual.delete('authsource')
|
313
|
+
expected = Mongo::ConnectionString.adjust_expected_mongo_client_options(
|
314
|
+
test.options,
|
315
|
+
)
|
316
|
+
actual.should == expected
|
317
|
+
end
|
411
318
|
end
|
412
319
|
|
413
320
|
if test.read_concern_expectation
|
@@ -1,18 +1,39 @@
|
|
1
1
|
module Mongo
|
2
2
|
module CRUD
|
3
3
|
class Requirement
|
4
|
-
YAML_KEYS = %w(minServerVersion maxServerVersion topology).freeze
|
4
|
+
YAML_KEYS = %w(minServerVersion maxServerVersion topology topologies serverParameters).freeze
|
5
5
|
|
6
6
|
def initialize(spec)
|
7
|
+
spec = spec.dup
|
8
|
+
# Legacy tests have the requirements mixed with other test fields
|
9
|
+
spec.delete('data')
|
10
|
+
spec.delete('tests')
|
11
|
+
|
12
|
+
unless (unhandled_keys = spec.keys - YAML_KEYS).empty?
|
13
|
+
raise "Unhandled requirement specification keys: #{unhandled_keys}"
|
14
|
+
end
|
15
|
+
|
7
16
|
@min_server_version = spec['minServerVersion']
|
8
17
|
@max_server_version = spec['maxServerVersion']
|
9
|
-
|
18
|
+
# topologies is for unified test format.
|
19
|
+
# topology is for legacy tests.
|
20
|
+
@topologies = if topologies = spec['topology'] || spec['topologies']
|
10
21
|
topologies.map do |topology|
|
11
|
-
{
|
22
|
+
{
|
23
|
+
'replicaset' => :replica_set,
|
24
|
+
'single' => :single,
|
25
|
+
'sharded' => :sharded,
|
26
|
+
'sharded-replicaset' => :sharded,
|
27
|
+
}[topology].tap do |v|
|
28
|
+
unless v
|
29
|
+
raise "Unknown topology #{topology}"
|
30
|
+
end
|
31
|
+
end
|
12
32
|
end
|
13
33
|
else
|
14
34
|
nil
|
15
35
|
end
|
36
|
+
@server_parameters = spec['serverParameters']
|
16
37
|
end
|
17
38
|
|
18
39
|
attr_reader :min_server_version
|
@@ -47,6 +68,22 @@ module Mongo
|
|
47
68
|
if topologies
|
48
69
|
ok &&= topologies.include?(cc.topology)
|
49
70
|
end
|
71
|
+
if @server_parameters
|
72
|
+
@server_parameters.each do |k, required_v|
|
73
|
+
actual_v = cc.server_parameters[k]
|
74
|
+
if actual_v.nil? && !required_v.nil?
|
75
|
+
ok = false
|
76
|
+
elsif actual_v != required_v
|
77
|
+
if Numeric === actual_v && Numeric === required_v
|
78
|
+
if actual_v.to_f != required_v.to_f
|
79
|
+
ok = false
|
80
|
+
end
|
81
|
+
else
|
82
|
+
ok = false
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
50
87
|
ok
|
51
88
|
end
|
52
89
|
|
@@ -45,25 +45,6 @@ module Mongo
|
|
45
45
|
raise "Unknown target #{operation.object}"
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
49
|
-
# If the deployment is a sharded cluster, creates a direct client
|
50
|
-
# to each of the mongos nodes and yields each in turn to the
|
51
|
-
# provided block. Does nothing in other topologies.
|
52
|
-
def mongos_each_direct_client
|
53
|
-
if ClusterConfig.instance.topology == :sharded
|
54
|
-
client = ClientRegistry.instance.global_client('basic')
|
55
|
-
client.cluster.next_primary
|
56
|
-
client.cluster.servers.each do |server|
|
57
|
-
direct_client = ClientRegistry.instance.new_local_client(
|
58
|
-
[server.address.to_s],
|
59
|
-
SpecConfig.instance.test_options.merge(
|
60
|
-
connect: :sharded
|
61
|
-
).merge(SpecConfig.instance.auth_options))
|
62
|
-
yield direct_client
|
63
|
-
direct_client.close
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
48
|
end
|
68
49
|
end
|
69
50
|
end
|
@@ -193,6 +193,14 @@ EOT
|
|
193
193
|
return
|
194
194
|
end
|
195
195
|
|
196
|
+
if k == 'updateDescription'
|
197
|
+
# Change stream result - verify subset, not exact match
|
198
|
+
expected.fetch(k).each do |sub_k, sub_v|
|
199
|
+
{sub_k => sub_v}.should == {sub_k => actual.fetch(k).fetch(sub_k)}
|
200
|
+
end
|
201
|
+
return
|
202
|
+
end
|
203
|
+
|
196
204
|
if expected[k].is_a?(Time)
|
197
205
|
expect(k => actual[k].utc.to_s).to eq(k => expected[k].utc.to_s)
|
198
206
|
else
|
@@ -191,8 +191,19 @@ module Mongo
|
|
191
191
|
|
192
192
|
def assert_event_count(client, context)
|
193
193
|
events = _select_events(context)
|
194
|
-
|
195
|
-
|
194
|
+
if %w(ServerMarkedUnknownEvent PoolClearedEvent).include?(arguments['event'])
|
195
|
+
# We publish SDAM events from both regular and push monitors.
|
196
|
+
# This means sometimes there are two ServerMarkedUnknownEvent
|
197
|
+
# events published for the same server transition.
|
198
|
+
# Allow actual event count to be at least the expected event count
|
199
|
+
# in case there are multiple transitions in a single test.
|
200
|
+
unless events.length >= arguments['count']
|
201
|
+
raise "Expected #{arguments['count']} #{arguments['event']} events, but have #{events.length}"
|
202
|
+
end
|
203
|
+
else
|
204
|
+
unless events.length == arguments['count']
|
205
|
+
raise "Expected #{arguments['count']} #{arguments['event']} events, but have #{events.length}"
|
206
|
+
end
|
196
207
|
end
|
197
208
|
end
|
198
209
|
|
@@ -224,7 +224,7 @@ module Mongo
|
|
224
224
|
end
|
225
225
|
|
226
226
|
if ClusterConfig.instance.fcv_ish >= '4.2'
|
227
|
-
mongos_each_direct_client do |direct_client|
|
227
|
+
::Utils.mongos_each_direct_client do |direct_client|
|
228
228
|
direct_client.command(configureFailPoint: 'failCommand', mode: 'off')
|
229
229
|
end
|
230
230
|
end
|
@@ -261,7 +261,7 @@ module Mongo
|
|
261
261
|
|
262
262
|
$distinct_ran ||= {}
|
263
263
|
$distinct_ran[@spec.database_name] ||= if description =~ /distinct/ || @operations.any? { |op| op.name == 'distinct' }
|
264
|
-
mongos_each_direct_client do |direct_client|
|
264
|
+
::Utils.mongos_each_direct_client do |direct_client|
|
265
265
|
direct_client.use(@spec.database_name)['test'].distinct('foo').to_a
|
266
266
|
end
|
267
267
|
end
|
@@ -289,6 +289,7 @@ module Mongo
|
|
289
289
|
client.command(configureFailPoint: fail_point_command['configureFailPoint'],
|
290
290
|
mode: 'off')
|
291
291
|
end
|
292
|
+
$disable_fail_points = nil
|
292
293
|
end
|
293
294
|
|
294
295
|
if @test_client
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'runners/unified/error'
|
2
|
+
require 'runners/unified/entity_map'
|
3
|
+
require 'runners/unified/event_subscriber'
|
4
|
+
require 'runners/unified/test'
|
5
|
+
require 'runners/unified/test_group'
|
6
|
+
require 'runners/unified/using_hash'
|
7
|
+
|
8
|
+
def define_unified_spec_tests(base_path, paths, expect_failure: false)
|
9
|
+
paths.each do |path|
|
10
|
+
basename = path[base_path.length+1...path.length]
|
11
|
+
context basename do
|
12
|
+
group = Unified::TestGroup.new(path)
|
13
|
+
|
14
|
+
if basename =~ /retryable|transaction/
|
15
|
+
require_wired_tiger
|
16
|
+
end
|
17
|
+
|
18
|
+
group.tests.each do |test|
|
19
|
+
context test.description do
|
20
|
+
|
21
|
+
if test.skip?
|
22
|
+
before do
|
23
|
+
skip test.skip_reason
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
before(:all) do
|
28
|
+
if SpecConfig.instance.retry_reads == false
|
29
|
+
skip "Tests are not applicable when legacy read retries are used"
|
30
|
+
end
|
31
|
+
if SpecConfig.instance.retry_writes == false
|
32
|
+
skip "Tests are not applicable when legacy write retries are used"
|
33
|
+
end
|
34
|
+
|
35
|
+
if ClusterConfig.instance.topology == :sharded
|
36
|
+
if test.require_multiple_mongoses? && SpecConfig.instance.addresses.length == 1
|
37
|
+
skip "Test requires multiple mongoses"
|
38
|
+
elsif test.require_single_mongos? && SpecConfig.instance.addresses.length > 1
|
39
|
+
# Many transaction spec tests that do not specifically deal with
|
40
|
+
# sharded transactions fail when run against a multi-mongos cluster
|
41
|
+
skip "Test requires single mongos"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if expect_failure
|
47
|
+
it 'fails as expected' do
|
48
|
+
if test.group_reqs
|
49
|
+
unless test.group_reqs.any? { |r| r.satisfied? }
|
50
|
+
skip "Group requirements not satisfied"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
if test.reqs
|
54
|
+
unless test.reqs.any? { |r| r.satisfied? }
|
55
|
+
skip "Requirements not satisfied"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
begin
|
59
|
+
test.create_entities
|
60
|
+
test.set_initial_data
|
61
|
+
lambda do
|
62
|
+
test.run
|
63
|
+
test.assert_outcome
|
64
|
+
test.assert_events
|
65
|
+
# HACK: other errors are possible and likely will need to
|
66
|
+
# be added here later as the tests evolve.
|
67
|
+
end.should raise_error(Mongo::Error::OperationFailure)
|
68
|
+
ensure
|
69
|
+
test.cleanup
|
70
|
+
end
|
71
|
+
end
|
72
|
+
else
|
73
|
+
it 'passes' do
|
74
|
+
if test.group_reqs
|
75
|
+
unless test.group_reqs.any? { |r| r.satisfied? }
|
76
|
+
skip "Group requirements not satisfied"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
if test.reqs
|
80
|
+
unless test.reqs.any? { |r| r.satisfied? }
|
81
|
+
skip "Requirements not satisfied"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
test.create_entities
|
85
|
+
test.set_initial_data
|
86
|
+
test.run
|
87
|
+
test.assert_outcome
|
88
|
+
test.assert_events
|
89
|
+
test.cleanup
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|