mongo 2.14.0.rc1 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -1
- data/Rakefile +39 -4
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/collection.rb +5 -0
- data/lib/mongo/collection/view/readable.rb +4 -0
- data/lib/mongo/cursor.rb +15 -3
- data/lib/mongo/database/view.rb +1 -1
- data/lib/mongo/operation/collections_info/command.rb +5 -0
- data/lib/mongo/operation/collections_info/result.rb +16 -1
- data/lib/mongo/operation/find/result.rb +10 -0
- data/lib/mongo/server/description.rb +8 -1
- data/lib/mongo/session.rb +2 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/README.md +7 -0
- data/spec/integration/bson_symbol_spec.rb +4 -2
- data/spec/integration/change_stream_spec.rb +1 -1
- data/spec/integration/connection_pool_populator_spec.rb +1 -1
- data/spec/integration/cursor_reaping_spec.rb +1 -1
- data/spec/integration/fork_reconnect_spec.rb +56 -1
- data/spec/integration/query_cache_transactions_spec.rb +29 -18
- data/spec/integration/sdam_error_handling_spec.rb +17 -0
- data/spec/integration/sdam_events_spec.rb +8 -5
- data/spec/integration/transactions_examples_spec.rb +17 -7
- data/spec/lite_spec_helper.rb +5 -3
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/client_construction_spec.rb +3 -3
- data/spec/mongo/client_encryption_spec.rb +16 -10
- data/spec/mongo/client_spec.rb +7 -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 +1 -1
- data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -1
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
- data/spec/mongo/collection/view/readable_spec.rb +36 -0
- data/spec/mongo/collection_spec.rb +12 -0
- 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/status_spec.rb +1 -6
- data/spec/mongo/database_spec.rb +64 -0
- data/spec/mongo/monitoring/event/server_closed_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/delete/op_msg_spec.rb +3 -3
- 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/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/update/command_spec.rb +2 -2
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
- data/spec/mongo/query_cache_spec.rb +1 -0
- data/spec/mongo/server/app_metadata_shared.rb +2 -2
- data/spec/mongo/server/connection_spec.rb +1 -1
- data/spec/mongo/server/description_spec.rb +18 -0
- data/spec/mongo/server_selector_spec.rb +2 -2
- data/spec/mongo/socket/ssl_spec.rb +3 -3
- data/spec/runners/change_streams/test.rb +1 -1
- data/spec/runners/crud/test_base.rb +0 -19
- data/spec/runners/server_selection.rb +1 -1
- data/spec/runners/transactions/test.rb +2 -2
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/constraints.rb +303 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/spec_helper.rb +3 -1
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
- data/spec/support/constraints.rb +0 -270
- data/spec/support/utils.rb +19 -0
- metadata +956 -952
- metadata.gz.sig +0 -0
- data/spec/support/child_process_helper.rb +0 -78
- data/spec/support/lite_constraints.rb +0 -165
- data/spec/support/spec_organizer.rb +0 -129
@@ -19,6 +19,7 @@ describe 'SDAM error handling' do
|
|
19
19
|
new_local_client(SpecConfig.instance.addresses,
|
20
20
|
SpecConfig.instance.all_test_options.merge(
|
21
21
|
socket_timeout: 3, connect_timeout: 3,
|
22
|
+
heartbeat_frequency: 100,
|
22
23
|
# Uncomment to print all events to stdout:
|
23
24
|
#sdam_proc: Utils.subscribe_all_sdam_proc(diagnostic_subscriber),
|
24
25
|
**Utils.disable_retries_client_options)
|
@@ -28,6 +29,14 @@ describe 'SDAM error handling' do
|
|
28
29
|
let(:server) { client.cluster.next_primary }
|
29
30
|
|
30
31
|
shared_examples_for 'marks server unknown' do
|
32
|
+
before do
|
33
|
+
server.monitor.stop!
|
34
|
+
end
|
35
|
+
|
36
|
+
after do
|
37
|
+
client.close
|
38
|
+
end
|
39
|
+
|
31
40
|
it 'marks server unknown' do
|
32
41
|
expect(server).not_to be_unknown
|
33
42
|
RSpec::Mocks.with_temporary_scope do
|
@@ -38,6 +47,14 @@ describe 'SDAM error handling' do
|
|
38
47
|
end
|
39
48
|
|
40
49
|
shared_examples_for 'does not mark server unknown' do
|
50
|
+
before do
|
51
|
+
server.monitor.stop!
|
52
|
+
end
|
53
|
+
|
54
|
+
after do
|
55
|
+
client.close
|
56
|
+
end
|
57
|
+
|
41
58
|
it 'does not mark server unknown' do
|
42
59
|
expect(server).not_to be_unknown
|
43
60
|
RSpec::Mocks.with_temporary_scope do
|
@@ -69,7 +69,8 @@ describe 'SDAM events' do
|
|
69
69
|
succeeded_events = subscriber.select_succeeded_events(Mongo::Monitoring::Event::ServerHeartbeatSucceeded)
|
70
70
|
# Since we gracefully close the client, we expect each heartbeat
|
71
71
|
# to complete.
|
72
|
-
started_events.length.should
|
72
|
+
started_events.length.should > 1
|
73
|
+
(succeeded_events.length-1..succeeded_events.length).should include(started_events.length)
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
@@ -105,10 +106,12 @@ describe 'SDAM events' do
|
|
105
106
|
(succeeded_awaited = events.select(&:awaited?)).should_not be_empty
|
106
107
|
(succeeded_regular = events.reject(&:awaited?)).should_not be_empty
|
107
108
|
|
108
|
-
#
|
109
|
-
#
|
110
|
-
started_awaited.length.should
|
111
|
-
|
109
|
+
# There may be in-flight ismasters that don't complete, both
|
110
|
+
# regular and awaited.
|
111
|
+
started_awaited.length.should > 1
|
112
|
+
(succeeded_awaited.length-1..succeeded_awaited.length).should include(started_awaited.length)
|
113
|
+
started_regular.length.should > 1
|
114
|
+
(succeeded_regular.length-1..succeeded_regular.length).should include(started_regular.length)
|
112
115
|
end
|
113
116
|
end
|
114
117
|
end
|
@@ -4,28 +4,42 @@ describe 'Transactions examples' do
|
|
4
4
|
require_wired_tiger
|
5
5
|
require_transaction_support
|
6
6
|
|
7
|
+
let(:client) do
|
8
|
+
authorized_client.with(read_concern: {level: :majority}, write: {w: :majority})
|
9
|
+
end
|
10
|
+
|
7
11
|
let(:hr) do
|
8
|
-
|
12
|
+
client.use(:hr).database
|
9
13
|
end
|
10
14
|
|
11
15
|
let(:reporting) do
|
12
|
-
|
16
|
+
client.use(:reporting).database
|
13
17
|
end
|
14
18
|
|
15
19
|
before(:each) do
|
16
20
|
hr[:employees].insert_one(employee: 3, status: 'Active')
|
21
|
+
|
22
|
+
# Sanity check since this test likes to fail
|
23
|
+
employee = hr[:employees].find({ employee: 3 }, limit: 1).first
|
24
|
+
expect(employee).to_not be_nil
|
25
|
+
|
17
26
|
reporting[:events].insert_one(employee: 3, status: { new: 'Active', old: nil})
|
18
27
|
end
|
19
28
|
|
20
29
|
after(:each) do
|
21
30
|
hr.drop
|
22
31
|
reporting.drop
|
32
|
+
|
33
|
+
# Work around https://jira.mongodb.org/browse/SERVER-53015
|
34
|
+
::Utils.mongos_each_direct_client do |client|
|
35
|
+
client.database.command(flushRouterConfig: 1)
|
36
|
+
end
|
23
37
|
end
|
24
38
|
|
25
39
|
context 'individual examples' do
|
26
40
|
|
27
41
|
let(:session) do
|
28
|
-
|
42
|
+
client.start_session
|
29
43
|
end
|
30
44
|
|
31
45
|
# Start Transactions Intro Example 1
|
@@ -142,10 +156,6 @@ describe 'Transactions examples' do
|
|
142
156
|
|
143
157
|
context 'Transactions Retry Example 3 (combined example)' do
|
144
158
|
|
145
|
-
let(:client) do
|
146
|
-
authorized_client
|
147
|
-
end
|
148
|
-
|
149
159
|
let(:run_transaction) do
|
150
160
|
|
151
161
|
# Start Transactions Retry Example 3
|
data/spec/lite_spec_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "shared", "lib"))
|
2
|
+
|
1
3
|
COVERAGE_MIN = 90
|
2
4
|
CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
|
3
5
|
|
@@ -67,8 +69,8 @@ unless SpecConfig.instance.client_debug?
|
|
67
69
|
end
|
68
70
|
Encoding.default_external = Encoding::UTF_8
|
69
71
|
|
72
|
+
require 'mrss/lite_constraints'
|
70
73
|
require 'support/matchers'
|
71
|
-
require 'support/lite_constraints'
|
72
74
|
require 'support/event_subscriber'
|
73
75
|
require 'support/common_shortcuts'
|
74
76
|
require 'support/client_registry'
|
@@ -89,7 +91,7 @@ end
|
|
89
91
|
RSpec.configure do |config|
|
90
92
|
config.extend(CommonShortcuts::ClassMethods)
|
91
93
|
config.include(CommonShortcuts::InstanceMethods)
|
92
|
-
config.extend(LiteConstraints)
|
94
|
+
config.extend(Mrss::LiteConstraints)
|
93
95
|
config.include(ClientRegistryMacros)
|
94
96
|
|
95
97
|
if SpecConfig.instance.ci?
|
@@ -106,7 +108,7 @@ RSpec.configure do |config|
|
|
106
108
|
end
|
107
109
|
end
|
108
110
|
|
109
|
-
if SpecConfig.instance.ci?
|
111
|
+
if SpecConfig.instance.ci? && !%w(1 true yes).include?(ENV['INTERACTIVE']&.downcase)
|
110
112
|
# Allow a max of 30 seconds per test.
|
111
113
|
# Tests should take under 10 seconds ideally but it seems
|
112
114
|
# we have some that run for more than 10 seconds in CI.
|
@@ -1335,7 +1335,7 @@ describe Mongo::BulkWrite do
|
|
1335
1335
|
context 'when the number of updates exceeds the max batch size' do
|
1336
1336
|
# Test uses doubles for server descriptions, doubles are
|
1337
1337
|
# incompatible with freezing which linting does for descriptions
|
1338
|
-
|
1338
|
+
require_no_linting
|
1339
1339
|
|
1340
1340
|
let(:batch_size) do
|
1341
1341
|
11
|
@@ -2012,7 +2012,7 @@ describe Mongo::BulkWrite do
|
|
2012
2012
|
context 'when the operations need to be split' do
|
2013
2013
|
# Test uses doubles for server descriptions, doubles are
|
2014
2014
|
# incompatible with freezing which linting does for descriptions
|
2015
|
-
|
2015
|
+
require_no_linting
|
2016
2016
|
|
2017
2017
|
let(:batch_size) do
|
2018
2018
|
11
|
@@ -845,7 +845,7 @@ describe Mongo::Client do
|
|
845
845
|
end
|
846
846
|
|
847
847
|
context 'mri' do
|
848
|
-
|
848
|
+
require_mri
|
849
849
|
|
850
850
|
let(:platform_string) do
|
851
851
|
[
|
@@ -1312,7 +1312,7 @@ describe Mongo::Client do
|
|
1312
1312
|
end
|
1313
1313
|
|
1314
1314
|
context 'when not linting' do
|
1315
|
-
|
1315
|
+
require_no_linting
|
1316
1316
|
|
1317
1317
|
it 'rejects bogus read preference as symbol' do
|
1318
1318
|
expect do
|
@@ -1359,7 +1359,7 @@ describe Mongo::Client do
|
|
1359
1359
|
end
|
1360
1360
|
|
1361
1361
|
context 'when read concern has an invalid key' do
|
1362
|
-
|
1362
|
+
require_no_linting
|
1363
1363
|
|
1364
1364
|
let(:options) do
|
1365
1365
|
{ read_concern: { hello: :local } }
|
@@ -268,7 +268,7 @@ describe Mongo::ClientEncryption do
|
|
268
268
|
it_behaves_like 'it creates a data key'
|
269
269
|
end
|
270
270
|
|
271
|
-
context 'with
|
271
|
+
context 'with https' do
|
272
272
|
let(:options) do
|
273
273
|
{
|
274
274
|
master_key: {
|
@@ -279,20 +279,26 @@ describe Mongo::ClientEncryption do
|
|
279
279
|
}
|
280
280
|
end
|
281
281
|
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
282
|
+
it_behaves_like 'it creates a data key'
|
283
|
+
end
|
284
|
+
|
285
|
+
context 'with invalid endpoint' do
|
286
|
+
let(:options) do
|
287
|
+
{
|
288
|
+
master_key: {
|
289
|
+
key: aws_arn,
|
290
|
+
region: aws_region,
|
291
|
+
endpoint: "invalid-nonsense-endpoint.com"
|
292
|
+
}
|
293
|
+
}
|
290
294
|
end
|
291
295
|
|
292
296
|
it 'raises an exception' do
|
297
|
+
# RUBY-2129: This error message could be more specific and inform the user
|
298
|
+
# that there is a problem with their KMS endpoint
|
293
299
|
expect do
|
294
300
|
data_key_id
|
295
|
-
end.to raise_error(Mongo::Error::KmsError,
|
301
|
+
end.to raise_error(Mongo::Error::KmsError, /SocketError/)
|
296
302
|
end
|
297
303
|
end
|
298
304
|
|
data/spec/mongo/client_spec.rb
CHANGED
@@ -727,6 +727,13 @@ describe Mongo::Client do
|
|
727
727
|
expect(new_id).not_to eql(old_id)
|
728
728
|
end
|
729
729
|
|
730
|
+
it 'replaces the session pool' do
|
731
|
+
old_id = client.cluster.session_pool.object_id
|
732
|
+
client.reconnect
|
733
|
+
new_id = client.cluster.session_pool.object_id
|
734
|
+
expect(new_id).not_to eql(old_id)
|
735
|
+
end
|
736
|
+
|
730
737
|
it 'returns true' do
|
731
738
|
expect(client.reconnect).to be(true)
|
732
739
|
end
|
@@ -602,6 +602,42 @@ describe Mongo::Collection::View::Readable do
|
|
602
602
|
end
|
603
603
|
end
|
604
604
|
|
605
|
+
describe "#estimated_document_count" do
|
606
|
+
|
607
|
+
let(:documents) do
|
608
|
+
(1..10).map{ |i| { field: "test#{i}" }}
|
609
|
+
end
|
610
|
+
|
611
|
+
before do
|
612
|
+
authorized_collection.delete_many
|
613
|
+
authorized_collection.insert_many(documents)
|
614
|
+
end
|
615
|
+
|
616
|
+
let(:result) do
|
617
|
+
view.estimated_document_count(options)
|
618
|
+
end
|
619
|
+
|
620
|
+
context 'when a selector is provided' do
|
621
|
+
|
622
|
+
let(:selector) do
|
623
|
+
{ field: 'test1' }
|
624
|
+
end
|
625
|
+
|
626
|
+
it 'raises an error' do
|
627
|
+
expect {
|
628
|
+
result
|
629
|
+
}.to raise_error(ArgumentError, "Cannot call estimated_document_count when querying with a filter")
|
630
|
+
end
|
631
|
+
end
|
632
|
+
|
633
|
+
context 'when no selector is provided' do
|
634
|
+
|
635
|
+
it 'returns the estimated count of matching documents' do
|
636
|
+
expect(view.estimated_document_count).to eq(10)
|
637
|
+
end
|
638
|
+
end
|
639
|
+
end
|
640
|
+
|
605
641
|
describe '#distinct' do
|
606
642
|
|
607
643
|
context 'when incorporating read concern' do
|
@@ -1845,6 +1845,18 @@ describe Mongo::Collection do
|
|
1845
1845
|
end
|
1846
1846
|
end
|
1847
1847
|
|
1848
|
+
context 'when the document is nil' do
|
1849
|
+
let(:result) do
|
1850
|
+
authorized_collection.insert_one(nil)
|
1851
|
+
end
|
1852
|
+
|
1853
|
+
it 'raises an ArgumentError' do
|
1854
|
+
expect {
|
1855
|
+
result
|
1856
|
+
}.to raise_error(ArgumentError, "Document to be inserted cannot be nil")
|
1857
|
+
end
|
1858
|
+
end
|
1859
|
+
|
1848
1860
|
context 'when the insert fails' do
|
1849
1861
|
|
1850
1862
|
let(:result) do
|
@@ -1,10 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'mongo/crypt/helpers/mongo_crypt_spec_helper'
|
4
|
-
|
5
|
-
RSpec.configure do |config|
|
6
|
-
config.extend(LiteConstraints)
|
7
|
-
end
|
1
|
+
require 'lite_spec_helper'
|
2
|
+
require_relative '../helpers/mongo_crypt_spec_helper'
|
8
3
|
|
9
4
|
shared_context 'initialized for data key creation' do
|
10
5
|
let(:master_key) { "ru\xfe\x00" * 24 }
|
@@ -1,10 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'mongo/crypt/helpers/mongo_crypt_spec_helper'
|
4
|
-
|
5
|
-
RSpec.configure do |config|
|
6
|
-
config.extend(LiteConstraints)
|
7
|
-
end
|
1
|
+
require 'lite_spec_helper'
|
2
|
+
require_relative '../helpers/mongo_crypt_spec_helper'
|
8
3
|
|
9
4
|
describe 'Mongo::Crypt::Binding' do
|
10
5
|
describe 'mongocrypt_t binding' do
|