mongo 2.9.2 → 2.10.0.rc0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongo.rb +1 -0
- data/lib/mongo/auth/user/view.rb +4 -4
- data/lib/mongo/bulk_write.rb +14 -8
- data/lib/mongo/bulk_write/result.rb +1 -1
- data/lib/mongo/bulk_write/result_combiner.rb +2 -2
- data/lib/mongo/bulk_write/transformable.rb +17 -9
- data/lib/mongo/client.rb +107 -16
- data/lib/mongo/cluster.rb +47 -25
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
- data/lib/mongo/cluster_time.rb +139 -0
- data/lib/mongo/collection.rb +84 -25
- data/lib/mongo/collection/view.rb +7 -3
- data/lib/mongo/collection/view/aggregation.rb +4 -4
- data/lib/mongo/collection/view/builder/aggregation.rb +31 -6
- data/lib/mongo/collection/view/builder/find_command.rb +4 -1
- data/lib/mongo/collection/view/builder/map_reduce.rb +4 -1
- data/lib/mongo/collection/view/change_stream.rb +54 -66
- data/lib/mongo/collection/view/iterable.rb +2 -2
- data/lib/mongo/collection/view/map_reduce.rb +6 -4
- data/lib/mongo/collection/view/readable.rb +36 -16
- data/lib/mongo/collection/view/writable.rb +68 -22
- data/lib/mongo/cursor.rb +87 -20
- data/lib/mongo/database.rb +47 -43
- data/lib/mongo/database/view.rb +54 -11
- data/lib/mongo/error.rb +13 -4
- data/lib/mongo/error/invalid_write_concern.rb +2 -2
- data/lib/mongo/error/operation_failure.rb +65 -11
- data/lib/mongo/error/parser.rb +41 -8
- data/lib/mongo/grid/fs_bucket.rb +26 -6
- data/lib/mongo/grid/stream/read.rb +9 -2
- data/lib/mongo/grid/stream/write.rb +21 -5
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/lint.rb +10 -3
- data/lib/mongo/operation.rb +2 -0
- data/lib/mongo/operation/aggregate/result.rb +19 -6
- data/lib/mongo/operation/collections_info.rb +1 -1
- data/lib/mongo/operation/get_more/result.rb +9 -0
- data/lib/mongo/operation/list_collections/command.rb +1 -3
- data/lib/mongo/operation/list_collections/op_msg.rb +1 -2
- data/lib/mongo/operation/parallel_scan/command.rb +4 -1
- data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -1
- data/lib/mongo/operation/result.rb +27 -4
- data/lib/mongo/operation/shared/executable.rb +19 -5
- data/lib/mongo/operation/shared/executable_no_validate.rb +1 -2
- data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -9
- data/lib/mongo/operation/shared/polymorphic_result.rb +9 -1
- data/lib/mongo/operation/shared/result/aggregatable.rb +2 -2
- data/lib/mongo/operation/shared/sessions_supported.rb +42 -32
- data/lib/mongo/operation/shared/specifiable.rb +40 -0
- data/lib/mongo/operation/shared/unpinnable.rb +39 -0
- data/lib/mongo/operation/shared/write.rb +1 -1
- data/lib/mongo/protocol/update.rb +6 -2
- data/lib/mongo/retryable.rb +79 -39
- data/lib/mongo/server/connection.rb +10 -3
- data/lib/mongo/server/description.rb +25 -1
- data/lib/mongo/server/monitor/connection.rb +1 -1
- data/lib/mongo/server_selector.rb +10 -0
- data/lib/mongo/server_selector/selectable.rb +172 -32
- data/lib/mongo/session.rb +654 -581
- data/lib/mongo/session/session_pool.rb +1 -1
- data/lib/mongo/socket.rb +7 -28
- data/lib/mongo/socket/ssl.rb +26 -1
- data/lib/mongo/socket/tcp.rb +3 -0
- data/lib/mongo/socket/unix.rb +3 -0
- data/lib/mongo/uri.rb +112 -265
- data/lib/mongo/uri/srv_protocol.rb +4 -1
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern.rb +10 -29
- data/lib/mongo/write_concern/acknowledged.rb +12 -0
- data/lib/mongo/write_concern/base.rb +17 -13
- data/lib/mongo/write_concern/unacknowledged.rb +12 -0
- data/spec/atlas/atlas_connectivity_spec.rb +7 -37
- data/spec/atlas/operations_spec.rb +25 -0
- data/spec/integration/change_stream_examples_spec.rb +45 -31
- data/spec/integration/change_stream_spec.rb +305 -5
- data/spec/integration/client_spec.rb +44 -0
- data/spec/integration/command_monitoring_spec.rb +1 -0
- data/spec/integration/command_spec.rb +7 -1
- data/spec/integration/mmapv1_spec.rb +28 -0
- data/spec/integration/mongos_pinning_spec.rb +34 -0
- data/spec/integration/operation_failure_code_spec.rb +2 -2
- data/spec/integration/{read_concern.rb → read_concern_spec.rb} +7 -1
- data/spec/integration/read_preference_spec.rb +485 -0
- data/spec/integration/retryable_writes_spec.rb +8 -19
- data/spec/integration/sdam_error_handling_spec.rb +1 -1
- data/spec/integration/sdam_events_spec.rb +2 -2
- data/spec/integration/server_description_spec.rb +14 -17
- data/spec/integration/server_selector_spec.rb +7 -3
- data/spec/integration/server_spec.rb +48 -0
- data/spec/integration/ssl_uri_options_spec.rb +1 -1
- data/spec/integration/step_down_spec.rb +10 -4
- data/spec/integration/transactions_examples_spec.rb +11 -10
- data/spec/lite_spec_helper.rb +19 -16
- data/spec/mongo/auth/scram/negotiation_spec.rb +11 -8
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +6 -6
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +4 -4
- data/spec/mongo/bulk_write_spec.rb +12 -2
- data/spec/mongo/client_construction_spec.rb +160 -8
- data/spec/mongo/client_spec.rb +5 -4
- data/spec/mongo/cluster_spec.rb +6 -6
- data/spec/mongo/cluster_time_spec.rb +148 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +34 -15
- data/spec/mongo/collection/view/change_stream_spec.rb +62 -3
- data/spec/mongo/collection/view/map_reduce_spec.rb +7 -5
- data/spec/mongo/collection/view/readable_spec.rb +4 -4
- data/spec/mongo/collection_spec.rb +331 -14
- data/spec/mongo/cursor_spec.rb +117 -5
- data/spec/mongo/database_spec.rb +240 -8
- data/spec/mongo/error/operation_failure_spec.rb +47 -1
- data/spec/mongo/error/parser_spec.rb +160 -23
- data/spec/mongo/operation/insert/bulk_spec.rb +2 -1
- data/spec/mongo/operation/result_spec.rb +27 -0
- data/spec/mongo/operation/update/bulk_spec.rb +1 -0
- data/spec/mongo/retryable_spec.rb +2 -0
- data/spec/mongo/server/app_metadata_spec.rb +2 -2
- data/spec/mongo/server/connection_spec.rb +13 -17
- data/spec/mongo/server/monitor/connection_spec.rb +13 -10
- data/spec/mongo/server_selector_spec.rb +34 -2
- data/spec/mongo/session/session_pool_spec.rb +14 -3
- data/spec/mongo/session_spec.rb +3 -3
- data/spec/mongo/session_transaction_spec.rb +4 -3
- data/spec/mongo/socket/ssl_spec.rb +19 -5
- data/spec/mongo/socket_spec.rb +1 -62
- data/spec/mongo/uri/srv_protocol_spec.rb +14 -20
- data/spec/mongo/uri_option_parsing_spec.rb +94 -8
- data/spec/mongo/uri_spec.rb +23 -10
- data/spec/mongo/write_concern_spec.rb +56 -3
- data/spec/spec_tests/change_streams_spec.rb +2 -1
- data/spec/spec_tests/cmap_spec.rb +1 -1
- data/spec/spec_tests/crud_spec.rb +12 -2
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +24 -1
- data/spec/spec_tests/data/change_streams/change-streams.yml +172 -3
- data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +1 -1
- data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -2
- data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -5
- data/spec/spec_tests/data/crud/read/aggregate-out.yml +0 -6
- data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
- data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +1 -0
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +101 -0
- data/spec/spec_tests/data/crud/write/bulkWrite.yml +401 -0
- data/spec/spec_tests/data/crud/write/insertMany.yml +58 -2
- data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +3 -0
- data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +6 -1
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
- data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +110 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +81 -0
- data/spec/spec_tests/data/crud_v2/db-aggregate.yml +38 -0
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +92 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +2 -2
- data/spec/spec_tests/data/transactions/abort.yml +3 -0
- data/spec/spec_tests/data/transactions/bulk.yml +3 -8
- data/spec/spec_tests/data/transactions/causal-consistency.yml +3 -8
- data/spec/spec_tests/data/transactions/commit.yml +3 -1
- data/spec/spec_tests/data/transactions/count.yml +3 -0
- data/spec/spec_tests/data/transactions/delete.yml +3 -0
- data/spec/spec_tests/data/transactions/error-labels.yml +4 -1
- data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
- data/spec/spec_tests/data/transactions/errors.yml +3 -0
- data/spec/spec_tests/data/transactions/findOneAndDelete.yml +3 -0
- data/spec/spec_tests/data/transactions/findOneAndReplace.yml +3 -0
- data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +3 -0
- data/spec/spec_tests/data/transactions/insert.yml +3 -0
- data/spec/spec_tests/data/transactions/isolation.yml +3 -0
- data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1671 -0
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +347 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +557 -0
- data/spec/spec_tests/data/transactions/read-concern.yml +3 -0
- data/spec/spec_tests/data/transactions/read-pref.yml +3 -0
- data/spec/spec_tests/data/transactions/reads.yml +3 -0
- data/spec/spec_tests/data/transactions/retryable-abort.yml +5 -2
- data/spec/spec_tests/data/transactions/retryable-commit.yml +4 -1
- data/spec/spec_tests/data/transactions/retryable-writes.yml +3 -0
- data/spec/spec_tests/data/transactions/run-command.yml +3 -0
- data/spec/spec_tests/data/transactions/transaction-options.yml +6 -0
- data/spec/spec_tests/data/transactions/update.yml +3 -8
- data/spec/spec_tests/data/transactions/write-concern.yml +348 -38
- data/spec/spec_tests/data/transactions_api/callback-aborts.yml +6 -0
- data/spec/spec_tests/data/transactions_api/callback-commits.yml +5 -0
- data/spec/spec_tests/data/transactions_api/callback-retry.yml +7 -2
- data/spec/spec_tests/data/transactions_api/commit-retry.yml +70 -15
- data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +3 -0
- data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +3 -0
- data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +59 -109
- data/spec/spec_tests/data/transactions_api/commit.yml +5 -0
- data/spec/spec_tests/data/transactions_api/transaction-options.yml +10 -0
- data/spec/spec_tests/retryable_reads_spec.rb +5 -2
- data/spec/spec_tests/retryable_writes_spec.rb +5 -2
- data/spec/spec_tests/sdam_monitoring_spec.rb +3 -3
- data/spec/spec_tests/sdam_spec.rb +2 -2
- data/spec/spec_tests/transactions_api_spec.rb +1 -67
- data/spec/spec_tests/transactions_spec.rb +2 -66
- data/spec/support/authorization.rb +4 -0
- data/spec/support/change_streams.rb +30 -10
- data/spec/support/change_streams/operation.rb +27 -0
- data/spec/support/client_registry.rb +44 -25
- data/spec/support/cluster_config.rb +25 -14
- data/spec/support/cluster_tools.rb +32 -10
- data/spec/support/command_monitoring.rb +1 -1
- data/spec/support/common_shortcuts.rb +30 -0
- data/spec/support/connection_string.rb +8 -3
- data/spec/support/constraints.rb +34 -0
- data/spec/support/crud.rb +31 -16
- data/spec/support/crud/context.rb +23 -0
- data/spec/support/crud/operation.rb +311 -14
- data/spec/support/crud/spec.rb +2 -1
- data/spec/support/crud/test.rb +24 -27
- data/spec/support/crud/test_base.rb +22 -0
- data/spec/support/crud/verifier.rb +15 -1
- data/spec/support/event_subscriber.rb +12 -0
- data/spec/support/sdam_formatter_integration.rb +12 -6
- data/spec/support/shared/server_selector.rb +10 -0
- data/spec/support/shared/session.rb +13 -12
- data/spec/support/spec_config.rb +32 -22
- data/spec/support/spec_setup.rb +2 -2
- data/spec/support/transactions.rb +87 -0
- data/spec/support/transactions/context.rb +33 -0
- data/spec/support/transactions/operation.rb +99 -349
- data/spec/support/transactions/spec.rb +1 -3
- data/spec/support/transactions/test.rb +110 -49
- data/spec/support/utils.rb +74 -1
- metadata +52 -10
- metadata.gz.sig +0 -0
- data/spec/support/crud/read.rb +0 -265
- data/spec/support/crud/write.rb +0 -284
@@ -2,6 +2,9 @@ runOn:
|
|
2
2
|
-
|
3
3
|
minServerVersion: "4.0"
|
4
4
|
topology: ["replicaset"]
|
5
|
+
-
|
6
|
+
minServerVersion: "4.1.8"
|
7
|
+
topology: ["sharded"]
|
5
8
|
|
6
9
|
database_name: &database_name "withTransaction-tests"
|
7
10
|
collection_name: &collection_name "test"
|
@@ -11,6 +14,7 @@ data: []
|
|
11
14
|
tests:
|
12
15
|
-
|
13
16
|
description: withTransaction commits after callback returns
|
17
|
+
useMultipleMongoses: true
|
14
18
|
operations:
|
15
19
|
-
|
16
20
|
name: withTransaction
|
@@ -91,6 +95,7 @@ tests:
|
|
91
95
|
# withTransaction only examines the session's state, it should commit that
|
92
96
|
# second transaction after the callback returns.
|
93
97
|
description: withTransaction commits after callback returns (second transaction)
|
98
|
+
useMultipleMongoses: true
|
94
99
|
operations:
|
95
100
|
-
|
96
101
|
name: withTransaction
|
@@ -2,6 +2,10 @@ runOn:
|
|
2
2
|
-
|
3
3
|
minServerVersion: "4.0"
|
4
4
|
topology: ["replicaset"]
|
5
|
+
# Disabled due to https://jira.mongodb.org/browse/SERVER-41532
|
6
|
+
#-
|
7
|
+
# minServerVersion: "4.1.8"
|
8
|
+
# topology: ["sharded"]
|
5
9
|
|
6
10
|
database_name: &database_name "withTransaction-tests"
|
7
11
|
collection_name: &collection_name "test"
|
@@ -11,6 +15,7 @@ data: []
|
|
11
15
|
tests:
|
12
16
|
-
|
13
17
|
description: withTransaction and no transaction options set
|
18
|
+
useMultipleMongoses: true
|
14
19
|
operations: &operations
|
15
20
|
-
|
16
21
|
name: withTransaction
|
@@ -62,6 +67,7 @@ tests:
|
|
62
67
|
- { _id: 1 }
|
63
68
|
-
|
64
69
|
description: withTransaction inherits transaction options from client
|
70
|
+
useMultipleMongoses: true
|
65
71
|
clientOptions:
|
66
72
|
readConcernLevel: local
|
67
73
|
w: 1
|
@@ -99,6 +105,7 @@ tests:
|
|
99
105
|
outcome: *outcome
|
100
106
|
-
|
101
107
|
description: withTransaction inherits transaction options from defaultTransactionOptions
|
108
|
+
useMultipleMongoses: true
|
102
109
|
sessionOptions:
|
103
110
|
session0:
|
104
111
|
defaultTransactionOptions:
|
@@ -138,6 +145,7 @@ tests:
|
|
138
145
|
outcome: *outcome
|
139
146
|
-
|
140
147
|
description: withTransaction explicit transaction options
|
148
|
+
useMultipleMongoses: true
|
141
149
|
operations: &operations_explicit_transactionOptions
|
142
150
|
-
|
143
151
|
name: withTransaction
|
@@ -189,6 +197,7 @@ tests:
|
|
189
197
|
outcome: *outcome
|
190
198
|
-
|
191
199
|
description: withTransaction explicit transaction options override defaultTransactionOptions
|
200
|
+
useMultipleMongoses: true
|
192
201
|
sessionOptions:
|
193
202
|
session0:
|
194
203
|
defaultTransactionOptions:
|
@@ -228,6 +237,7 @@ tests:
|
|
228
237
|
outcome: *outcome
|
229
238
|
-
|
230
239
|
description: withTransaction explicit transaction options override client options
|
240
|
+
useMultipleMongoses: true
|
231
241
|
clientOptions:
|
232
242
|
readConcernLevel: majority
|
233
243
|
w: majority
|
@@ -1,7 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe do
|
4
|
-
|
3
|
+
describe 'Retryable reads spec tests' do
|
4
|
+
require_wired_tiger
|
5
|
+
require_no_multi_shard
|
6
|
+
|
7
|
+
define_crud_spec_tests(RETRYABLE_READS_TESTS) do |spec, req, test|
|
5
8
|
let(:client) do
|
6
9
|
root_authorized_client.with({max_read_retries: 0}.update(test.client_options)).tap do |client|
|
7
10
|
client.subscribe(Mongo::Monitoring::COMMAND, event_subscriber)
|
@@ -1,7 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe do
|
4
|
-
|
3
|
+
describe 'Retryable writes spec tests' do
|
4
|
+
require_wired_tiger
|
5
|
+
require_no_multi_shard
|
6
|
+
|
7
|
+
define_crud_spec_tests(RETRYABLE_WRITES_TESTS) do |spec, req, test|
|
5
8
|
let(:client) do
|
6
9
|
authorized_client_with_retry_writes
|
7
10
|
end
|
@@ -18,8 +18,8 @@ describe 'SDAM Monitoring' do
|
|
18
18
|
client.subscribe(Mongo::Monitoring::TOPOLOGY_OPENING, @subscriber)
|
19
19
|
client.subscribe(Mongo::Monitoring::TOPOLOGY_CHANGED, @subscriber)
|
20
20
|
end
|
21
|
-
@client =
|
22
|
-
sdam_proc: sdam_proc,
|
21
|
+
@client = new_local_client_nmio(spec.uri_string,
|
22
|
+
sdam_proc: sdam_proc,
|
23
23
|
heartbeat_frequency: 100, connect_timeout: 0.1)
|
24
24
|
# We do not want to create servers when an event referencing them
|
25
25
|
# is processed, because this may result in server duplication
|
@@ -33,7 +33,7 @@ describe 'SDAM Monitoring' do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
after(:all) do
|
36
|
-
@client.close
|
36
|
+
@client.close(true)
|
37
37
|
end
|
38
38
|
|
39
39
|
spec.phases.each_with_index do |phase, phase_index|
|
@@ -36,7 +36,7 @@ describe 'Server Discovery and Monitoring' do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
after(:all) do
|
39
|
-
@client && @client.close
|
39
|
+
@client && @client.close(true)
|
40
40
|
end
|
41
41
|
|
42
42
|
spec.phases.each_with_index do |phase, index|
|
@@ -160,7 +160,7 @@ describe 'Server Discovery and Monitoring' do
|
|
160
160
|
|
161
161
|
it 'raises an UnsupportedFeatures error' do
|
162
162
|
expect {
|
163
|
-
p = Mongo::ServerSelector.
|
163
|
+
p = Mongo::ServerSelector.primary.select_server(@client.cluster)
|
164
164
|
s = Mongo::ServerSelector.get(mode: :secondary).select_server(@client.cluster)
|
165
165
|
raise "UnsupportedFeatures not raised but we got #{p.inspect} as primary and #{s.inspect} as secondary"
|
166
166
|
}.to raise_exception(Mongo::Error::UnsupportedFeatures)
|
@@ -1,71 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'Transactions API' do
|
4
|
-
|
5
|
-
TRANSACTIONS_API_TESTS.sort.each do |file|
|
6
|
-
|
7
|
-
spec = Mongo::Transactions::Spec.new(file)
|
8
|
-
|
9
|
-
context(spec.description) do
|
10
|
-
define_spec_tests_with_requirements(spec) do |req|
|
11
|
-
spec.tests.each do |test_factory|
|
12
|
-
test_instance = test_factory.call
|
13
|
-
|
14
|
-
context(test_instance.description) do
|
15
|
-
|
16
|
-
let(:test) { test_factory.call }
|
17
|
-
|
18
|
-
if test_instance.skip_reason
|
19
|
-
before do
|
20
|
-
skip test_instance.skip_reason
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
before(:each) do
|
25
|
-
if req.satisfied?
|
26
|
-
test.setup_test
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
after(:each) do
|
31
|
-
if req.satisfied?
|
32
|
-
test.teardown_test
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
let(:results) do
|
37
|
-
test.run
|
38
|
-
end
|
39
|
-
|
40
|
-
let(:verifier) { Mongo::CRUD::Verifier.new(test) }
|
41
|
-
|
42
|
-
it 'returns the correct result' do
|
43
|
-
verifier.verify_operation_result(test_instance.expected_results, results[:results])
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'has the correct data in the collection', if: test_instance.outcome.collection_data? do
|
47
|
-
results
|
48
|
-
verifier.verify_collection_data(
|
49
|
-
test_instance.outcome.collection_data,
|
50
|
-
results[:contents])
|
51
|
-
end
|
52
|
-
|
53
|
-
if test_instance.expectations
|
54
|
-
it 'has the correct number of command_started events' do
|
55
|
-
verifier.verify_command_started_event_count(
|
56
|
-
test_instance.expectations, results[:events])
|
57
|
-
end
|
58
|
-
|
59
|
-
test_instance.expectations.each_with_index do |expectation, i|
|
60
|
-
it "has the correct command_started event #{i}" do
|
61
|
-
verifier.verify_command_started_event(
|
62
|
-
test_instance.expectations, results[:events], i)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
4
|
+
define_transactions_spec_tests(TRANSACTIONS_API_TESTS)
|
71
5
|
end
|
@@ -1,71 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'Transactions' do
|
4
|
+
clean_slate_on_evergreen
|
4
5
|
|
5
|
-
TRANSACTIONS_TESTS
|
6
|
-
|
7
|
-
spec = Mongo::Transactions::Spec.new(file)
|
8
|
-
|
9
|
-
context(spec.description) do
|
10
|
-
define_spec_tests_with_requirements(spec) do |req|
|
11
|
-
spec.tests.each do |test_factory|
|
12
|
-
test_instance = test_factory.call
|
13
|
-
|
14
|
-
context(test_instance.description) do
|
15
|
-
|
16
|
-
let(:test) { test_factory.call }
|
17
|
-
|
18
|
-
if test_instance.skip_reason
|
19
|
-
before do
|
20
|
-
skip test_instance.skip_reason
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
before(:each) do
|
25
|
-
if req.satisfied?
|
26
|
-
test.setup_test
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
after(:each) do
|
31
|
-
if req.satisfied?
|
32
|
-
test.teardown_test
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
let(:results) do
|
37
|
-
test.run
|
38
|
-
end
|
39
|
-
|
40
|
-
let(:verifier) { Mongo::CRUD::Verifier.new(test) }
|
41
|
-
|
42
|
-
it 'returns the correct result' do
|
43
|
-
verifier.verify_operation_result(test_instance.expected_results, results[:results])
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'has the correct data in the collection', if: test_instance.outcome && test_instance.outcome.collection_data? do
|
47
|
-
results
|
48
|
-
verifier.verify_collection_data(
|
49
|
-
test_instance.outcome.collection_data,
|
50
|
-
results[:contents])
|
51
|
-
end
|
52
|
-
|
53
|
-
if test_instance.expectations
|
54
|
-
it 'has the correct number of command_started events' do
|
55
|
-
verifier.verify_command_started_event_count(
|
56
|
-
test_instance.expectations, results[:events])
|
57
|
-
end
|
58
|
-
|
59
|
-
test_instance.expectations.each_with_index do |expectation, i|
|
60
|
-
it "has the correct command_started event #{i}" do
|
61
|
-
verifier.verify_command_started_event(
|
62
|
-
test_instance.expectations, results[:events], i)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
6
|
+
define_transactions_spec_tests(TRANSACTIONS_TESTS)
|
71
7
|
end
|
@@ -111,6 +111,10 @@ module Authorization
|
|
111
111
|
# @since 2.0.0
|
112
112
|
context.let(:root_authorized_client) { ClientRegistry.instance.global_client('root_authorized') }
|
113
113
|
|
114
|
+
context.let(:root_authorized_admin_client) do
|
115
|
+
ClientRegistry.instance.global_client('root_authorized').use(:admin)
|
116
|
+
end
|
117
|
+
|
114
118
|
# Gets the default test collection from the authorized client.
|
115
119
|
#
|
116
120
|
# @since 2.0.0
|
@@ -77,6 +77,11 @@ module Mongo
|
|
77
77
|
# @since 2.0.0
|
78
78
|
attr_reader :description
|
79
79
|
|
80
|
+
# Optional list of command-started events in Extended JSON format
|
81
|
+
#
|
82
|
+
# @return [ Array<Hash> ] The list of command-started events
|
83
|
+
attr_reader :expectations
|
84
|
+
|
80
85
|
def initialize(test, coll1, coll2, db1, db2)
|
81
86
|
@description = test['description']
|
82
87
|
@min_server_version = test['minServerVersion']
|
@@ -132,22 +137,36 @@ module Mongo
|
|
132
137
|
}
|
133
138
|
end
|
134
139
|
|
140
|
+
# JRuby must iterate the same object, not switch from
|
141
|
+
# enum to change stream
|
142
|
+
enum = change_stream.to_enum
|
143
|
+
|
135
144
|
@operations.each do |op|
|
136
145
|
op.execute(@db1, @db2)
|
137
146
|
end
|
138
147
|
|
139
|
-
changes = []
|
140
|
-
next unless @result['success']
|
148
|
+
changes = []
|
141
149
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
150
|
+
# attempt first next call (catch NonResumableChangeStreamError errors)
|
151
|
+
begin
|
152
|
+
change = enum.next
|
153
|
+
changes << change
|
154
|
+
rescue Mongo::Error::OperationFailure => e
|
155
|
+
return {
|
156
|
+
result: { 'error' => { 'code' => e.code, 'errorLabels' => e.labels} },
|
157
|
+
events: events
|
158
|
+
}
|
159
|
+
end
|
160
|
+
|
161
|
+
# continue until changeStream has received as many changes as there
|
162
|
+
# are in result.success
|
163
|
+
if @result['success'] && changes.length < @result['success'].length
|
164
|
+
while changes.length < @result['success'].length
|
165
|
+
changes << enum.next
|
166
|
+
end
|
167
|
+
end
|
148
168
|
|
149
|
-
|
150
|
-
end
|
169
|
+
change_stream.close
|
151
170
|
|
152
171
|
{
|
153
172
|
result: { 'success' => changes },
|
@@ -204,6 +223,7 @@ module Mongo
|
|
204
223
|
|
205
224
|
def match_array?(expected, actual)
|
206
225
|
return false unless actual.is_a?(Array)
|
226
|
+
return false unless expected.length == actual.length
|
207
227
|
|
208
228
|
expected.each_with_index.all? do |e, i|
|
209
229
|
actual[i] && match?(e, actual[i])
|
@@ -50,6 +50,29 @@ module Mongo
|
|
50
50
|
coll.insert_one(document)
|
51
51
|
end
|
52
52
|
|
53
|
+
def update_one(coll)
|
54
|
+
coll.update_one(filter, arguments['update'])
|
55
|
+
end
|
56
|
+
|
57
|
+
def replace_one(coll)
|
58
|
+
coll.replace_one(filter, arguments['replacement'])
|
59
|
+
end
|
60
|
+
|
61
|
+
def delete_one(coll)
|
62
|
+
coll.delete_one(filter)
|
63
|
+
end
|
64
|
+
|
65
|
+
def drop(coll)
|
66
|
+
coll.drop
|
67
|
+
end
|
68
|
+
|
69
|
+
def rename(coll)
|
70
|
+
coll.client.use(:admin).command({
|
71
|
+
renameCollection: "#{coll.database.name}.#{coll.name}",
|
72
|
+
to: "#{coll.database.name}.#{arguments['to']}"
|
73
|
+
})
|
74
|
+
end
|
75
|
+
|
53
76
|
def arguments
|
54
77
|
@spec['arguments']
|
55
78
|
end
|
@@ -57,6 +80,10 @@ module Mongo
|
|
57
80
|
def document
|
58
81
|
arguments['document']
|
59
82
|
end
|
83
|
+
|
84
|
+
def filter
|
85
|
+
arguments['filter']
|
86
|
+
end
|
60
87
|
end
|
61
88
|
end
|
62
89
|
end
|
@@ -45,24 +45,38 @@ class ClientRegistry
|
|
45
45
|
# clients global to the test suite, should not be closed in an after hooks
|
46
46
|
# but their monitoring may need to be suspended/resumed
|
47
47
|
@global_clients = {}
|
48
|
+
|
49
|
+
# JRuby appears to somehow manage to access client registry concurrently
|
50
|
+
@lock = Mutex.new
|
48
51
|
end
|
49
52
|
|
50
|
-
|
51
|
-
|
53
|
+
class << self
|
54
|
+
def client_perished?(client)
|
52
55
|
if !client.cluster.connected?
|
53
|
-
|
56
|
+
true
|
54
57
|
else
|
55
|
-
|
58
|
+
perished = false
|
56
59
|
client.cluster.servers_list.each do |server|
|
57
60
|
thread = server.monitor.instance_variable_get('@thread')
|
58
61
|
if thread.nil? || !thread.alive?
|
59
|
-
|
62
|
+
perished = true
|
60
63
|
end
|
61
64
|
end
|
65
|
+
perished
|
62
66
|
end
|
63
|
-
|
67
|
+
end
|
68
|
+
private :client_perished?
|
69
|
+
|
70
|
+
def reconnect_client_if_perished(client)
|
71
|
+
if client_perished?(client)
|
64
72
|
client.reconnect
|
65
73
|
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def global_client(name)
|
78
|
+
if client = @global_clients[name]
|
79
|
+
self.class.reconnect_client_if_perished(client)
|
66
80
|
return client
|
67
81
|
end
|
68
82
|
|
@@ -122,6 +136,15 @@ class ClientRegistry
|
|
122
136
|
).tap do |client|
|
123
137
|
client.subscribe(Mongo::Monitoring::COMMAND, EventSubscriber)
|
124
138
|
end
|
139
|
+
# Provides an authorized mongo client that does not retry writes
|
140
|
+
# using either modern or legacy mechanisms.
|
141
|
+
when 'authorized_without_any_retry_writes'
|
142
|
+
global_client('authorized').with(
|
143
|
+
retry_writes: false, max_write_retries: 0,
|
144
|
+
server_selection_timeout: 4.99,
|
145
|
+
).tap do |client|
|
146
|
+
client.subscribe(Mongo::Monitoring::COMMAND, EventSubscriber)
|
147
|
+
end
|
125
148
|
# Provides an authorized mongo client that does not retry reads or writes
|
126
149
|
# at all.
|
127
150
|
when 'authorized_without_any_retries'
|
@@ -152,19 +175,6 @@ class ClientRegistry
|
|
152
175
|
monitoring: false
|
153
176
|
),
|
154
177
|
)
|
155
|
-
# Get an authorized client on the admin database logged in as the admin
|
156
|
-
# root user.
|
157
|
-
when 'root_authorized_admin'
|
158
|
-
Mongo::Client.new(
|
159
|
-
SpecConfig.instance.addresses,
|
160
|
-
SpecConfig.instance.test_options.merge(
|
161
|
-
user: SpecConfig.instance.root_user.name,
|
162
|
-
password: SpecConfig.instance.root_user.password,
|
163
|
-
database: 'admin',
|
164
|
-
auth_source: SpecConfig.instance.auth_source || Mongo::Database::ADMIN,
|
165
|
-
monitoring: false
|
166
|
-
),
|
167
|
-
)
|
168
178
|
# A client that has an event subscriber for commands.
|
169
179
|
when 'subscribed'
|
170
180
|
Mongo::Client.new(
|
@@ -184,24 +194,33 @@ class ClientRegistry
|
|
184
194
|
|
185
195
|
def new_local_client(*args)
|
186
196
|
Mongo::Client.new(*args).tap do |client|
|
187
|
-
@
|
197
|
+
@lock.synchronize do
|
198
|
+
@local_clients << client
|
199
|
+
end
|
188
200
|
end
|
189
201
|
end
|
190
202
|
|
191
203
|
def register_local_client(client)
|
192
|
-
@
|
204
|
+
@lock.synchronize do
|
205
|
+
@local_clients << client
|
206
|
+
end
|
193
207
|
client
|
194
208
|
end
|
195
209
|
|
196
210
|
def close_local_clients
|
197
|
-
@
|
198
|
-
|
211
|
+
@lock.synchronize do
|
212
|
+
@local_clients.map(&:close)
|
213
|
+
@local_clients = []
|
214
|
+
end
|
199
215
|
end
|
200
216
|
|
201
217
|
def close_all_clients
|
218
|
+
ClusterTools.instance.close_clients
|
202
219
|
close_local_clients
|
203
|
-
@
|
204
|
-
client
|
220
|
+
@lock.synchronize do
|
221
|
+
@global_clients.each do |name, client|
|
222
|
+
client.close(true)
|
223
|
+
end
|
205
224
|
end
|
206
225
|
end
|
207
226
|
end
|