mongo 2.20.1 → 2.21.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
- data/README.md +3 -0
- data/Rakefile +2 -2
- data/lib/mongo/address.rb +22 -3
- data/lib/mongo/auth/aws/credentials_retriever.rb +70 -17
- data/lib/mongo/auth/base.rb +1 -1
- data/lib/mongo/bulk_write.rb +35 -2
- data/lib/mongo/client.rb +38 -6
- data/lib/mongo/client_encryption.rb +6 -3
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -1
- data/lib/mongo/cluster/sdam_flow.rb +20 -7
- data/lib/mongo/cluster.rb +14 -4
- data/lib/mongo/collection/helpers.rb +1 -1
- data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
- data/lib/mongo/collection/view/aggregation.rb +33 -99
- data/lib/mongo/collection/view/builder/aggregation.rb +1 -7
- data/lib/mongo/collection/view/change_stream.rb +80 -27
- data/lib/mongo/collection/view/iterable.rb +76 -60
- data/lib/mongo/collection/view/map_reduce.rb +25 -8
- data/lib/mongo/collection/view/readable.rb +79 -30
- data/lib/mongo/collection/view/writable.rb +109 -48
- data/lib/mongo/collection/view.rb +43 -3
- data/lib/mongo/collection.rb +158 -23
- data/lib/mongo/crypt/auto_encrypter.rb +4 -6
- data/lib/mongo/crypt/binding.rb +4 -4
- data/lib/mongo/crypt/context.rb +20 -14
- data/lib/mongo/crypt/encryption_io.rb +56 -26
- data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
- data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
- data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
- data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
- data/lib/mongo/csot_timeout_holder.rb +119 -0
- data/lib/mongo/cursor/kill_spec.rb +5 -2
- data/lib/mongo/cursor/nontailable.rb +27 -0
- data/lib/mongo/cursor.rb +86 -24
- data/lib/mongo/cursor_host.rb +82 -0
- data/lib/mongo/database/view.rb +81 -14
- data/lib/mongo/database.rb +88 -18
- data/lib/mongo/error/operation_failure.rb +209 -204
- data/lib/mongo/error/server_timeout_error.rb +12 -0
- data/lib/mongo/error/socket_timeout_error.rb +3 -1
- data/lib/mongo/error/timeout_error.rb +23 -0
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/grid/fs_bucket.rb +45 -12
- data/lib/mongo/grid/stream/read.rb +15 -1
- data/lib/mongo/grid/stream/write.rb +21 -4
- data/lib/mongo/index/view.rb +77 -16
- data/lib/mongo/operation/context.rb +40 -2
- data/lib/mongo/operation/create_search_indexes/op_msg.rb +2 -2
- data/lib/mongo/operation/delete/op_msg.rb +2 -1
- data/lib/mongo/operation/drop_search_index/op_msg.rb +2 -2
- data/lib/mongo/operation/find/op_msg.rb +45 -0
- data/lib/mongo/operation/get_more/op_msg.rb +33 -0
- data/lib/mongo/operation/insert/op_msg.rb +3 -2
- data/lib/mongo/operation/insert/result.rb +4 -2
- data/lib/mongo/operation/list_collections/result.rb +1 -1
- data/lib/mongo/operation/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/op_msg_base.rb +3 -1
- data/lib/mongo/operation/result.rb +26 -5
- data/lib/mongo/operation/shared/executable.rb +12 -1
- data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
- data/lib/mongo/operation/shared/response_handling.rb +3 -3
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
- data/lib/mongo/operation/shared/timed.rb +52 -0
- data/lib/mongo/operation/shared/write.rb +4 -1
- data/lib/mongo/operation/update/op_msg.rb +2 -1
- data/lib/mongo/operation/update_search_index/op_msg.rb +2 -2
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/protocol/message.rb +1 -4
- data/lib/mongo/protocol/msg.rb +2 -2
- data/lib/mongo/retryable/read_worker.rb +69 -29
- data/lib/mongo/retryable/write_worker.rb +49 -18
- data/lib/mongo/retryable.rb +8 -2
- data/lib/mongo/server/connection.rb +11 -5
- data/lib/mongo/server/connection_base.rb +22 -2
- data/lib/mongo/server/connection_pool.rb +32 -14
- data/lib/mongo/server/description/features.rb +1 -1
- data/lib/mongo/server/description.rb +18 -5
- data/lib/mongo/server/monitor.rb +7 -4
- data/lib/mongo/server/pending_connection.rb +7 -3
- data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
- data/lib/mongo/server.rb +11 -6
- data/lib/mongo/server_selector/base.rb +25 -9
- data/lib/mongo/session.rb +78 -9
- data/lib/mongo/socket/ssl.rb +109 -17
- data/lib/mongo/socket/tcp.rb +40 -6
- data/lib/mongo/socket.rb +154 -25
- data/lib/mongo/uri/options_mapper.rb +1 -0
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +1 -0
- data/spec/atlas/atlas_connectivity_spec.rb +4 -0
- data/spec/atlas/operations_spec.rb +4 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
- data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
- data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +66 -22
- data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
- data/spec/integration/connection_pool_populator_spec.rb +2 -0
- data/spec/integration/cursor_pinning_spec.rb +15 -60
- data/spec/integration/cursor_reaping_spec.rb +1 -1
- data/spec/integration/docs_examples_spec.rb +1 -1
- data/spec/integration/operation_failure_code_spec.rb +1 -1
- data/spec/integration/operation_failure_message_spec.rb +3 -3
- data/spec/integration/retryable_errors_spec.rb +2 -2
- data/spec/integration/sdam_error_handling_spec.rb +2 -1
- data/spec/integration/search_indexes_prose_spec.rb +4 -0
- data/spec/integration/server_spec.rb +4 -3
- data/spec/integration/transactions_api_examples_spec.rb +2 -0
- data/spec/kerberos/kerberos_spec.rb +4 -0
- data/spec/lite_spec_helper.rb +3 -1
- data/spec/mongo/auth/user/view_spec.rb +1 -1
- data/spec/mongo/caching_cursor_spec.rb +1 -1
- data/spec/mongo/client_encryption_spec.rb +1 -0
- data/spec/mongo/client_spec.rb +158 -4
- data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
- data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
- data/spec/mongo/collection_spec.rb +5 -6
- data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
- data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
- data/spec/mongo/crypt/handle_spec.rb +1 -1
- data/spec/mongo/cursor_spec.rb +26 -9
- data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
- data/spec/mongo/operation/context_spec.rb +79 -0
- data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
- data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
- data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
- data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
- data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
- data/spec/mongo/operation/shared/csot/examples.rb +113 -0
- data/spec/mongo/query_cache_spec.rb +243 -225
- data/spec/mongo/retryable_spec.rb +1 -0
- data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
- data/spec/mongo/socket/ssl_spec.rb +0 -10
- data/spec/runners/change_streams/test.rb +2 -2
- data/spec/runners/crud/operation.rb +1 -1
- data/spec/runners/crud/verifier.rb +3 -1
- data/spec/runners/transactions/operation.rb +4 -6
- data/spec/runners/unified/ambiguous_operations.rb +13 -0
- data/spec/runners/unified/assertions.rb +4 -0
- data/spec/runners/unified/change_stream_operations.rb +14 -24
- data/spec/runners/unified/crud_operations.rb +82 -59
- data/spec/runners/unified/ddl_operations.rb +38 -7
- data/spec/runners/unified/grid_fs_operations.rb +37 -2
- data/spec/runners/unified/support_operations.rb +43 -4
- data/spec/runners/unified/test.rb +22 -10
- data/spec/runners/unified.rb +1 -1
- data/spec/solo/clean_exit_spec.rb +2 -0
- data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
- data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
- data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
- data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
- data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
- data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
- data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
- data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
- data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
- data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
- data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
- data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
- data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
- data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
- data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
- data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
- data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
- data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
- data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
- data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
- data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
- data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
- data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +4 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +4 -0
- data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
- data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
- data/spec/support/certificates/atlas-ocsp-ca.crt +81 -83
- data/spec/support/certificates/atlas-ocsp.crt +107 -107
- data/spec/support/cluster_tools.rb +3 -3
- data/spec/support/common_shortcuts.rb +2 -2
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
- data/spec/support/shared/session.rb +2 -2
- data/spec/support/spec_setup.rb +2 -2
- data/spec/support/utils.rb +3 -1
- metadata +78 -91
- data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -242
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -423
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -183
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -240
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -236
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -253
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1688
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -294
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -906
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1685
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1681
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1698
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -330
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -425
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -227
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -328
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -320
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -337
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -914
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -293
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -519
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -912
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -908
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -925
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -326
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -425
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -225
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -324
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -320
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -339
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -242
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -424
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -183
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -240
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -236
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -255
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -242
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -423
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -183
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -240
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -236
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -255
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -44
@@ -2,6 +2,7 @@
|
|
2
2
|
# rubocop:todo all
|
3
3
|
|
4
4
|
require 'runners/crud/requirement'
|
5
|
+
require 'runners/unified/ambiguous_operations'
|
5
6
|
require 'runners/unified/client_side_encryption_operations'
|
6
7
|
require 'runners/unified/crud_operations'
|
7
8
|
require 'runners/unified/grid_fs_operations'
|
@@ -17,6 +18,7 @@ require 'support/crypt'
|
|
17
18
|
module Unified
|
18
19
|
|
19
20
|
class Test
|
21
|
+
include AmbiguousOperations
|
20
22
|
include ClientSideEncryptionOperations
|
21
23
|
include CrudOperations
|
22
24
|
include GridFsOperations
|
@@ -42,12 +44,14 @@ module Unified
|
|
42
44
|
if req = @spec['group_runOnRequirements']
|
43
45
|
@group_reqs = req.map { |r| Mongo::CRUD::Requirement.new(r) }
|
44
46
|
end
|
45
|
-
|
46
|
-
spec['
|
47
|
-
|
48
|
-
spec
|
49
|
-
|
50
|
-
|
47
|
+
if @spec['createEntities']
|
48
|
+
mongoses = @spec['createEntities'].select do |spec|
|
49
|
+
spec['client']
|
50
|
+
end.map do |spec|
|
51
|
+
spec['client']['useMultipleMongoses']
|
52
|
+
end.compact.uniq
|
53
|
+
@multiple_mongoses = mongoses.any? { |v| v }
|
54
|
+
end
|
51
55
|
@test_spec.freeze
|
52
56
|
@subscribers = {}
|
53
57
|
@observe_sensitive = {}
|
@@ -85,6 +89,8 @@ module Unified
|
|
85
89
|
end
|
86
90
|
|
87
91
|
def generate_entities(es)
|
92
|
+
return if es.nil?
|
93
|
+
|
88
94
|
es.each do |entity_spec|
|
89
95
|
unless entity_spec.keys.length == 1
|
90
96
|
raise NotImplementedError, "Entity must have exactly one key"
|
@@ -329,7 +335,7 @@ module Unified
|
|
329
335
|
begin
|
330
336
|
collection.create(create_options)
|
331
337
|
rescue Mongo::Error => e
|
332
|
-
if Mongo::Error::OperationFailure === e && (
|
338
|
+
if Mongo::Error::OperationFailure::Family === e && (
|
333
339
|
e.code == 48 || e.message =~ /collection already exists/
|
334
340
|
)
|
335
341
|
# Already exists
|
@@ -411,10 +417,16 @@ module Unified
|
|
411
417
|
|
412
418
|
public_send(method_name, op)
|
413
419
|
rescue Mongo::Error, bson_error, Mongo::Auth::Unauthorized, ArgumentError => e
|
420
|
+
if expected_error.use('isTimeoutError')
|
421
|
+
unless Mongo::Error::TimeoutError === e
|
422
|
+
raise e
|
423
|
+
raise Error::ErrorMismatch, %Q,Expected TimeoutError ("isTimeoutError") but got #{e},
|
424
|
+
end
|
425
|
+
end
|
414
426
|
if expected_error.use('isClientError')
|
415
427
|
# isClientError doesn't actually mean a client error.
|
416
428
|
# It means anything other than OperationFailure. DRIVERS-1799
|
417
|
-
if Mongo::Error::OperationFailure === e
|
429
|
+
if Mongo::Error::OperationFailure::Family === e
|
418
430
|
raise Error::ErrorMismatch, %Q,Expected not OperationFailure ("isClientError") but got #{e},
|
419
431
|
end
|
420
432
|
end
|
@@ -482,7 +494,7 @@ module Unified
|
|
482
494
|
if result.nil? && expected_result.keys == ["$$unsetOrMatches"]
|
483
495
|
return
|
484
496
|
elsif result.nil? && !expected_result.empty?
|
485
|
-
raise Error::ResultMismatch, "
|
497
|
+
raise Error::ResultMismatch, "expected #{expected_result} but got nil"
|
486
498
|
elsif Array === expected_result
|
487
499
|
assert_documents_match(result, expected_result)
|
488
500
|
else
|
@@ -536,7 +548,7 @@ module Unified
|
|
536
548
|
root_authorized_client.command(
|
537
549
|
killAllSessions: [],
|
538
550
|
)
|
539
|
-
rescue Mongo::Error::OperationFailure => e
|
551
|
+
rescue Mongo::Error::OperationFailure::Family => e
|
540
552
|
if e.code == 11601
|
541
553
|
# operation was interrupted, ignore. SERVER-38335
|
542
554
|
elsif e.code == 13
|
data/spec/runners/unified.rb
CHANGED
@@ -72,7 +72,7 @@ def define_unified_spec_tests(base_path, paths, expect_failure: false)
|
|
72
72
|
test.assert_events
|
73
73
|
# HACK: other errors are possible and likely will need to
|
74
74
|
# be added here later as the tests evolve.
|
75
|
-
rescue Mongo::Error::OperationFailure, Unified::Error::UnsupportedOperation, UsingHash::UsingHashKeyError, Unified::Error::EntityMissing
|
75
|
+
rescue Mongo::Error::OperationFailure::Family, Unified::Error::UnsupportedOperation, UsingHash::UsingHashKeyError, Unified::Error::EntityMissing
|
76
76
|
rescue => e
|
77
77
|
fail "Expected to raise Mongo::Error::OperationFailure or Unified::Error::UnsupportedOperation or UsingHash::UsingHashKeyError or Unified::Error::EntityMissing, got #{e.class}: #{e}"
|
78
78
|
else
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'runners/unified'
|
5
|
+
|
6
|
+
base = "#{CURRENT_PATH}/spec_tests/data/client_side_operations_timeout"
|
7
|
+
CSOT_TESTS = Dir.glob("#{base}/**/*.yml").sort
|
8
|
+
|
9
|
+
describe 'CSOT unified spec tests' do
|
10
|
+
if [ 1, '1', 'yes', 'true' ].include?(ENV['CSOT_SPEC_TESTS'])
|
11
|
+
define_unified_spec_tests(base, CSOT_TESTS)
|
12
|
+
else
|
13
|
+
skip 'CSOT spec tests are disabled. To enable them set env variable CSOT_SPEC_TESTS to 1'
|
14
|
+
end
|
15
|
+
end
|
@@ -15,7 +15,9 @@ createEntities:
|
|
15
15
|
|
16
16
|
runOnRequirements:
|
17
17
|
- minServerVersion: "4.0.0"
|
18
|
-
|
18
|
+
# TODO(DRIVERS-2323): Run all possible tests against sharded clusters once we know the
|
19
|
+
# cause of unexpected command monitoring events.
|
20
|
+
topologies: [ replicaset ]
|
19
21
|
serverless: forbid
|
20
22
|
|
21
23
|
initialData:
|
@@ -15,7 +15,9 @@ createEntities:
|
|
15
15
|
|
16
16
|
runOnRequirements:
|
17
17
|
- minServerVersion: "6.1.0"
|
18
|
-
|
18
|
+
# TODO(DRIVERS-2323): Run all possible tests against sharded clusters once we know the
|
19
|
+
# cause of unexpected command monitoring events.
|
20
|
+
topologies: [ replicaset ]
|
19
21
|
serverless: forbid
|
20
22
|
|
21
23
|
initialData:
|
@@ -3,7 +3,9 @@ description: "change-streams-errors"
|
|
3
3
|
schemaVersion: "1.7"
|
4
4
|
|
5
5
|
runOnRequirements:
|
6
|
-
|
6
|
+
# TODO(DRIVERS-2323): Run all possible tests against sharded clusters once we know the
|
7
|
+
# cause of unexpected command monitoring events.
|
8
|
+
- topologies: [ replicaset ]
|
7
9
|
|
8
10
|
createEntities:
|
9
11
|
- client:
|
@@ -1,5 +1,6 @@
|
|
1
1
|
runOn:
|
2
2
|
- minServerVersion: "4.1.10"
|
3
|
+
topology: [ "replicaset", "sharded" ]
|
3
4
|
database_name: &database_name "default"
|
4
5
|
collection_name: &collection_name "default"
|
5
6
|
|
@@ -533,4 +534,4 @@ tests:
|
|
533
534
|
filter: {}
|
534
535
|
fieldName: "encrypted_w_altname"
|
535
536
|
result:
|
536
|
-
errorContains: "The distinct key is not allowed to be marked for encryption with a non-UUID keyId"
|
537
|
+
errorContains: "The distinct key is not allowed to be marked for encryption with a non-UUID keyId"
|
@@ -0,0 +1,67 @@
|
|
1
|
+
runOn:
|
2
|
+
- minServerVersion: "4.4"
|
3
|
+
database_name: &database_name "cse-timeouts-db"
|
4
|
+
collection_name: &collection_name "cse-timeouts-coll"
|
5
|
+
|
6
|
+
data: []
|
7
|
+
json_schema: {'properties': {'encrypted_w_altname': {'encrypt': {'keyId': '/altname', 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Random'}}, 'encrypted_string': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'}}, 'random': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Random'}}, 'encrypted_string_equivalent': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'}}}, 'bsonType': 'object'}
|
8
|
+
key_vault_data: [{'status': 1, '_id': {'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}, 'masterKey': {'provider': 'aws', 'key': 'arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0', 'region': 'us-east-1'}, 'updateDate': {'$date': {'$numberLong': '1552949630483'}}, 'keyMaterial': {'$binary': {'base64': 'AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1552949630483'}}, 'keyAltNames': ['altname', 'another_altname']}]
|
9
|
+
|
10
|
+
tests:
|
11
|
+
- description: "timeoutMS applied to listCollections to get collection schema"
|
12
|
+
failPoint:
|
13
|
+
configureFailPoint: failCommand
|
14
|
+
mode: { times: 1 }
|
15
|
+
data:
|
16
|
+
failCommands: ["listCollections"]
|
17
|
+
blockConnection: true
|
18
|
+
blockTimeMS: 60
|
19
|
+
clientOptions:
|
20
|
+
autoEncryptOpts:
|
21
|
+
kmsProviders:
|
22
|
+
aws: {} # Credentials filled in from environment.
|
23
|
+
timeoutMS: 50
|
24
|
+
operations:
|
25
|
+
- name: insertOne
|
26
|
+
arguments:
|
27
|
+
document: &doc0 { _id: 1, encrypted_string: "string0", random: "abc" }
|
28
|
+
result:
|
29
|
+
isTimeoutError: true
|
30
|
+
expectations:
|
31
|
+
# Auto encryption will request the collection info.
|
32
|
+
- command_started_event:
|
33
|
+
command:
|
34
|
+
listCollections: 1
|
35
|
+
filter:
|
36
|
+
name: *collection_name
|
37
|
+
maxTimeMS: { $$type: ["int", "long"] }
|
38
|
+
command_name: listCollections
|
39
|
+
|
40
|
+
# Test that timeoutMS applies to the sum of all operations done for client-side encryption. This is done by blocking
|
41
|
+
# listCollections and find for 30ms each and running an insertOne with timeoutMS=50. There should be one
|
42
|
+
# listCollections command and one "find" command, so the sum should take more than timeoutMS. A second listCollections
|
43
|
+
# event doesn't occur due to the internal MongoClient lacking configured auto encryption, plus libmongocrypt holds the
|
44
|
+
# collection schema in cache for a minute.
|
45
|
+
#
|
46
|
+
# This test does not include command monitoring expectations because the exact command sequence is dependent on the
|
47
|
+
# amount of time taken by mongocryptd communication. In slow runs, mongocryptd communication can breach the timeout
|
48
|
+
# and result in the final "find" not being sent.
|
49
|
+
- description: "remaining timeoutMS applied to find to get keyvault data"
|
50
|
+
failPoint:
|
51
|
+
configureFailPoint: failCommand
|
52
|
+
mode: { times: 2 }
|
53
|
+
data:
|
54
|
+
failCommands: ["listCollections", "find"]
|
55
|
+
blockConnection: true
|
56
|
+
blockTimeMS: 30
|
57
|
+
clientOptions:
|
58
|
+
autoEncryptOpts:
|
59
|
+
kmsProviders:
|
60
|
+
aws: {} # Credentials filled in from environment.
|
61
|
+
timeoutMS: 50
|
62
|
+
operations:
|
63
|
+
- name: insertOne
|
64
|
+
arguments:
|
65
|
+
document: *doc0
|
66
|
+
result:
|
67
|
+
isTimeoutError: true
|
@@ -0,0 +1,87 @@
|
|
1
|
+
description: "timeoutMS behaves correctly for bulkWrite operations"
|
2
|
+
|
3
|
+
schemaVersion: "1.9"
|
4
|
+
|
5
|
+
runOnRequirements:
|
6
|
+
- minServerVersion: "4.4"
|
7
|
+
|
8
|
+
createEntities:
|
9
|
+
- client:
|
10
|
+
id: &failPointClient failPointClient
|
11
|
+
useMultipleMongoses: false
|
12
|
+
- client:
|
13
|
+
id: &client client
|
14
|
+
useMultipleMongoses: false
|
15
|
+
observeEvents:
|
16
|
+
- commandStartedEvent
|
17
|
+
uriOptions:
|
18
|
+
# Used to speed up the test
|
19
|
+
w: 1
|
20
|
+
- database:
|
21
|
+
id: &database database
|
22
|
+
client: *client
|
23
|
+
databaseName: &databaseName test
|
24
|
+
- collection:
|
25
|
+
id: &collection collection
|
26
|
+
database: *database
|
27
|
+
collectionName: &collectionName coll
|
28
|
+
|
29
|
+
initialData:
|
30
|
+
- collectionName: *collectionName
|
31
|
+
databaseName: *databaseName
|
32
|
+
documents: []
|
33
|
+
|
34
|
+
tests:
|
35
|
+
# Test that drivers do not refresh timeoutMS between commands. This is done by running a bulkWrite that will require
|
36
|
+
# two commands with timeoutMS=200 and blocking each command for 120ms. The server should take over 200ms total, so the
|
37
|
+
# bulkWrite should fail with a timeout error.
|
38
|
+
- description: "timeoutMS applied to entire bulkWrite, not individual commands"
|
39
|
+
operations:
|
40
|
+
# Do an operation without a timeout to ensure the servers are discovered.
|
41
|
+
- name: insertOne
|
42
|
+
object: *collection
|
43
|
+
arguments:
|
44
|
+
document: {}
|
45
|
+
- name: failPoint
|
46
|
+
object: testRunner
|
47
|
+
arguments:
|
48
|
+
client: *failPointClient
|
49
|
+
failPoint:
|
50
|
+
configureFailPoint: failCommand
|
51
|
+
mode: { times: 2 }
|
52
|
+
data:
|
53
|
+
failCommands: ["insert", "update"]
|
54
|
+
blockConnection: true
|
55
|
+
blockTimeMS: 120
|
56
|
+
- name: bulkWrite
|
57
|
+
object: *collection
|
58
|
+
arguments:
|
59
|
+
requests:
|
60
|
+
- insertOne:
|
61
|
+
document: { _id: 1 }
|
62
|
+
- replaceOne:
|
63
|
+
filter: { _id: 1 }
|
64
|
+
replacement: { x: 1 }
|
65
|
+
timeoutMS: 200
|
66
|
+
expectError:
|
67
|
+
isTimeoutError: true
|
68
|
+
expectEvents:
|
69
|
+
- client: *client
|
70
|
+
events:
|
71
|
+
- commandStartedEvent:
|
72
|
+
commandName: insert
|
73
|
+
databaseName: *databaseName
|
74
|
+
command:
|
75
|
+
insert: *collectionName
|
76
|
+
- commandStartedEvent:
|
77
|
+
commandName: insert
|
78
|
+
databaseName: *databaseName
|
79
|
+
command:
|
80
|
+
insert: *collectionName
|
81
|
+
maxTimeMS: { $$type: ["int", "long"] }
|
82
|
+
- commandStartedEvent:
|
83
|
+
commandName: update
|
84
|
+
databaseName: *databaseName
|
85
|
+
command:
|
86
|
+
update: *collectionName
|
87
|
+
maxTimeMS: { $$type: ["int", "long"] }
|