mongo 2.18.0.beta1 → 2.18.0
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/lib/mongo/bulk_write.rb +8 -2
- data/lib/mongo/client.rb +19 -5
- data/lib/mongo/client_encryption.rb +86 -4
- data/lib/mongo/cluster.rb +6 -4
- data/lib/mongo/collection/view/aggregation.rb +3 -0
- data/lib/mongo/collection/view/change_stream.rb +9 -0
- data/lib/mongo/collection/view/iterable.rb +1 -0
- data/lib/mongo/collection/view/readable.rb +11 -3
- data/lib/mongo/collection.rb +9 -1
- data/lib/mongo/config.rb +11 -0
- data/lib/mongo/crypt/auto_encrypter.rb +49 -21
- data/lib/mongo/crypt/binding.rb +73 -48
- data/lib/mongo/crypt/data_key_context.rb +6 -1
- data/lib/mongo/crypt/encryption_io.rb +66 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +116 -5
- data/lib/mongo/crypt/explicit_encryption_context.rb +3 -8
- data/lib/mongo/crypt/handle.rb +26 -8
- data/lib/mongo/crypt/kms/aws.rb +11 -3
- data/lib/mongo/crypt/kms/azure.rb +14 -6
- data/lib/mongo/crypt/kms/gcp.rb +12 -5
- data/lib/mongo/crypt/kms/kmip.rb +15 -9
- data/lib/mongo/crypt/kms/local.rb +9 -1
- data/lib/mongo/crypt/kms/master_key_document.rb +1 -1
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
- data/lib/mongo/crypt/status.rb +8 -2
- data/lib/mongo/crypt.rb +2 -0
- data/lib/mongo/database.rb +10 -27
- data/lib/mongo/error/missing_file_chunk.rb +8 -2
- data/lib/mongo/grid/stream/read.rb +6 -0
- data/lib/mongo/index/view.rb +1 -0
- data/lib/mongo/operation/create/op_msg.rb +1 -13
- data/lib/mongo/operation/distinct/op_msg.rb +4 -1
- data/lib/mongo/protocol/msg.rb +0 -16
- data/lib/mongo/server/connection_pool.rb +5 -4
- data/lib/mongo/server/monitor/connection.rb +10 -4
- data/lib/mongo/server/monitor.rb +4 -0
- data/lib/mongo/server/push_monitor.rb +4 -0
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +2 -0
- data/spec/README.md +14 -0
- data/spec/integration/change_stream_spec.rb +1 -1
- data/spec/integration/client_construction_spec.rb +73 -7
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +165 -164
- data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +158 -0
- data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +5 -5
- data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +50 -8
- data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +85 -0
- data/spec/integration/ocsp_verifier_spec.rb +1 -1
- data/spec/integration/reconnect_spec.rb +2 -0
- data/spec/integration/sdam_events_spec.rb +40 -0
- data/spec/integration/srv_monitoring_spec.rb +1 -0
- data/spec/integration/srv_spec.rb +1 -0
- data/spec/lite_spec_helper.rb +5 -4
- data/spec/mongo/bulk_write_spec.rb +13 -0
- data/spec/mongo/client_construction_spec.rb +45 -2
- data/spec/mongo/client_encryption_spec.rb +0 -12
- data/spec/mongo/client_spec.rb +1 -1
- data/spec/mongo/collection/view/aggregation_spec.rb +119 -0
- data/spec/mongo/collection/view/readable_spec.rb +630 -5
- data/spec/mongo/collection_spec.rb +32 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +110 -0
- data/spec/mongo/crypt/binding/context_spec.rb +3 -35
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +8 -3
- data/spec/mongo/crypt/handle_spec.rb +39 -3
- data/spec/mongo/crypt/kms/credentials_spec.rb +0 -47
- data/spec/mongo/index/view_spec.rb +56 -0
- data/spec/mongo/operation/create/op_msg_spec.rb +0 -42
- data/spec/mongo/server/connection_pool_spec.rb +26 -4
- data/spec/mongo/socket/ssl_spec.rb +3 -3
- data/spec/runners/crud/requirement.rb +6 -1
- data/spec/runners/crud/test.rb +1 -1
- data/spec/runners/transactions/spec.rb +2 -2
- data/spec/runners/transactions/test.rb +4 -20
- data/spec/runners/transactions.rb +2 -2
- data/spec/runners/unified/assertions.rb +32 -2
- data/spec/runners/unified/change_stream_operations.rb +3 -0
- data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
- data/spec/runners/unified/crud_operations.rb +17 -2
- data/spec/runners/unified/ddl_operations.rb +27 -2
- data/spec/runners/unified/grid_fs_operations.rb +21 -0
- data/spec/runners/unified/test.rb +59 -1
- data/spec/shared/lib/mrss/docker_runner.rb +2 -0
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
- data/spec/shared/shlib/set_env.sh +3 -0
- data/spec/solo/clean_exit_spec.rb +5 -0
- data/spec/spec_tests/client_side_encryption_spec.rb +1 -1
- data/spec/spec_tests/client_side_encryption_unified_spec.rb +16 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +298 -0
- data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +1 -1
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +1 -1
- data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +2 -2
- data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +1 -1
- data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +2 -2
- data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
- data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
- data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
- data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
- data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
- data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
- data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
- data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
- data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
- data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
- data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
- data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
- data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
- data/spec/stress/connection_pool_timing_spec.rb +2 -2
- data/spec/support/background_thread_registry.rb +3 -13
- data/spec/support/certificates/atlas-ocsp-ca.crt +40 -47
- data/spec/support/certificates/atlas-ocsp.crt +101 -106
- data/spec/support/crypt.rb +57 -13
- data/spec/support/macros.rb +10 -0
- data/spec/support/spec_config.rb +4 -0
- data.tar.gz.sig +0 -0
- metadata +1271 -1219
- metadata.gz.sig +0 -0
- data/spec/spec_tests/command_monitoring_spec.rb +0 -71
- data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
- data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
- data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
- data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
- data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
- data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
- data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
@@ -800,5 +800,37 @@ describe Mongo::Collection do
|
|
800
800
|
end
|
801
801
|
end
|
802
802
|
end
|
803
|
+
|
804
|
+
context 'when the change stream is empty' do
|
805
|
+
require_wired_tiger
|
806
|
+
min_server_fcv '3.6'
|
807
|
+
require_topology :replica_set
|
808
|
+
|
809
|
+
context 'when setting the max_await_time_ms' do
|
810
|
+
|
811
|
+
let(:change_stream) do
|
812
|
+
authorized_collection.watch([], max_await_time_ms: 3000)
|
813
|
+
end
|
814
|
+
|
815
|
+
let(:enum) { change_stream.to_enum }
|
816
|
+
|
817
|
+
it 'sets the option correctly' do
|
818
|
+
expect(change_stream.instance_variable_get(:@cursor)).to receive(:get_more_operation).once.and_wrap_original do |m, *args, &block|
|
819
|
+
m.call(*args).tap do |op|
|
820
|
+
expect(op.max_time_ms).to eq(3000)
|
821
|
+
end
|
822
|
+
end
|
823
|
+
enum.next
|
824
|
+
end
|
825
|
+
|
826
|
+
it "waits the appropriate amount of time" do
|
827
|
+
start_time = Time.now
|
828
|
+
enum.try_next
|
829
|
+
end_time = Time.now
|
830
|
+
|
831
|
+
expect(end_time-start_time).to be >= 3
|
832
|
+
end
|
833
|
+
end
|
834
|
+
end
|
803
835
|
end
|
804
836
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
4
|
require 'spec_helper'
|
5
|
+
require 'tempfile'
|
5
6
|
|
6
7
|
describe Mongo::Crypt::AutoEncrypter do
|
7
8
|
require_libmongocrypt
|
@@ -98,6 +99,62 @@ describe Mongo::Crypt::AutoEncrypter do
|
|
98
99
|
auto_encrypter.close
|
99
100
|
end
|
100
101
|
|
102
|
+
describe '#initialize' do
|
103
|
+
include_context 'with local kms_providers'
|
104
|
+
|
105
|
+
let(:auto_encryption_options) do
|
106
|
+
{
|
107
|
+
kms_providers: local_kms_providers,
|
108
|
+
key_vault_namespace: key_vault_namespace,
|
109
|
+
schema_map: { "#{db_name}.#{collection_name}": schema_map },
|
110
|
+
}
|
111
|
+
end
|
112
|
+
|
113
|
+
let(:auto_encrypter) do
|
114
|
+
described_class.new(
|
115
|
+
auto_encryption_options.merge(
|
116
|
+
client: client,
|
117
|
+
# Spawn mongocryptd on non-default port for sharded cluster tests
|
118
|
+
extra_options: extra_options
|
119
|
+
)
|
120
|
+
)
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'when client has an unlimited pool' do
|
124
|
+
let(:client) do
|
125
|
+
new_local_client_nmio(
|
126
|
+
SpecConfig.instance.addresses,
|
127
|
+
SpecConfig.instance.test_options.merge(
|
128
|
+
max_pool_size: 0,
|
129
|
+
database: 'auto_encryption'
|
130
|
+
),
|
131
|
+
)
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'reuses the client as key_vault_client and metadata_client' do
|
135
|
+
expect(auto_encrypter.key_vault_client).to eq(client)
|
136
|
+
expect(auto_encrypter.metadata_client).to eq(client)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context 'when client has a limited pool' do
|
141
|
+
let(:client) do
|
142
|
+
new_local_client_nmio(
|
143
|
+
SpecConfig.instance.addresses,
|
144
|
+
SpecConfig.instance.test_options.merge(
|
145
|
+
max_pool_size: 20,
|
146
|
+
database: 'auto_encryption'
|
147
|
+
),
|
148
|
+
)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'creates new client for key_vault_client and metadata_client' do
|
152
|
+
expect(auto_encrypter.key_vault_client).not_to eq(client)
|
153
|
+
expect(auto_encrypter.metadata_client).not_to eq(client)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
101
158
|
context 'with schema map in auto encryption commands' do
|
102
159
|
include_context 'without jsonSchema validator'
|
103
160
|
|
@@ -136,6 +193,59 @@ describe Mongo::Crypt::AutoEncrypter do
|
|
136
193
|
end
|
137
194
|
end
|
138
195
|
|
196
|
+
context 'with schema map file in auto encryption commands' do
|
197
|
+
include_context 'without jsonSchema validator'
|
198
|
+
|
199
|
+
let(:schema_map_file) do
|
200
|
+
file = Tempfile.new('schema_map.json')
|
201
|
+
file.write(JSON.dump(
|
202
|
+
{
|
203
|
+
"#{db_name}.#{collection_name}" => schema_map
|
204
|
+
}
|
205
|
+
))
|
206
|
+
file.flush
|
207
|
+
file
|
208
|
+
end
|
209
|
+
|
210
|
+
after do
|
211
|
+
schema_map_file.close
|
212
|
+
end
|
213
|
+
|
214
|
+
let(:auto_encryption_options) do
|
215
|
+
{
|
216
|
+
kms_providers: kms_providers,
|
217
|
+
kms_tls_options: kms_tls_options,
|
218
|
+
key_vault_namespace: key_vault_namespace,
|
219
|
+
schema_map_path: schema_map_file.path
|
220
|
+
}
|
221
|
+
end
|
222
|
+
|
223
|
+
context 'with AWS KMS providers' do
|
224
|
+
include_context 'with AWS kms_providers'
|
225
|
+
it_behaves_like 'a functioning auto encrypter'
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'with Azure KMS providers' do
|
229
|
+
include_context 'with Azure kms_providers'
|
230
|
+
it_behaves_like 'a functioning auto encrypter'
|
231
|
+
end
|
232
|
+
|
233
|
+
context 'with GCP KMS providers' do
|
234
|
+
include_context 'with GCP kms_providers'
|
235
|
+
it_behaves_like 'a functioning auto encrypter'
|
236
|
+
end
|
237
|
+
|
238
|
+
context 'with KMIP KMS providers' do
|
239
|
+
include_context 'with KMIP kms_providers'
|
240
|
+
it_behaves_like 'a functioning auto encrypter'
|
241
|
+
end
|
242
|
+
|
243
|
+
context 'with local KMS providers' do
|
244
|
+
include_context 'with local kms_providers'
|
245
|
+
it_behaves_like 'a functioning auto encrypter'
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
139
249
|
context 'with schema map collection validator' do
|
140
250
|
include_context 'with jsonSchema validator'
|
141
251
|
|
@@ -255,44 +255,12 @@ describe 'Mongo::Crypt::Binding' do
|
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
258
|
-
describe '#mongocrypt_ctx_setopt_index_type' do
|
259
|
-
let(:result) do
|
260
|
-
Mongo::Crypt::Binding.mongocrypt_ctx_setopt_index_type(
|
261
|
-
context,
|
262
|
-
index_type
|
263
|
-
)
|
264
|
-
end
|
265
|
-
|
266
|
-
before do
|
267
|
-
Mongo::Crypt::Binding.mongocrypt_init(mongocrypt)
|
268
|
-
end
|
269
|
-
|
270
|
-
context 'with equality index type' do
|
271
|
-
let(:index_type) do
|
272
|
-
:equality
|
273
|
-
end
|
274
|
-
|
275
|
-
it 'returns true' do
|
276
|
-
expect(result).to be true
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
context 'with none index type' do
|
281
|
-
let(:index_type) do
|
282
|
-
:none
|
283
|
-
end
|
284
|
-
|
285
|
-
it 'returns true' do
|
286
|
-
expect(result).to be true
|
287
|
-
end
|
288
|
-
end
|
289
|
-
end
|
290
|
-
|
291
258
|
describe '#mongocrypt_ctx_setopt_query_type' do
|
292
259
|
let(:result) do
|
293
260
|
Mongo::Crypt::Binding.mongocrypt_ctx_setopt_query_type(
|
294
261
|
context,
|
295
|
-
query_type
|
262
|
+
query_type,
|
263
|
+
-1
|
296
264
|
)
|
297
265
|
end
|
298
266
|
|
@@ -302,7 +270,7 @@ describe 'Mongo::Crypt::Binding' do
|
|
302
270
|
|
303
271
|
context 'with equality query type' do
|
304
272
|
let(:query_type) do
|
305
|
-
|
273
|
+
"equality"
|
306
274
|
end
|
307
275
|
|
308
276
|
it 'returns true' do
|
@@ -23,7 +23,7 @@ describe Mongo::Crypt::DataKeyContext do
|
|
23
23
|
|
24
24
|
let(:key_alt_names) { [] }
|
25
25
|
|
26
|
-
let(:context) { described_class.new(mongocrypt, io, key_document, key_alt_names) }
|
26
|
+
let(:context) { described_class.new(mongocrypt, io, key_document, key_alt_names, nil) }
|
27
27
|
|
28
28
|
describe '#initialize' do
|
29
29
|
shared_examples 'it properly sets key_alt_names' do
|
@@ -137,7 +137,7 @@ describe Mongo::Crypt::ExplicitEncryptionContext do
|
|
137
137
|
mongocrypt,
|
138
138
|
io,
|
139
139
|
value,
|
140
|
-
options.merge(query_type:
|
140
|
+
options.merge(query_type: "equality")
|
141
141
|
)
|
142
142
|
end.to raise_error(ArgumentError, /query_type is allowed only for "Indexed" algorithm/)
|
143
143
|
end
|
@@ -169,7 +169,12 @@ describe Mongo::Crypt::ExplicitEncryptionContext do
|
|
169
169
|
|
170
170
|
it 'initializes context' do
|
171
171
|
expect do
|
172
|
-
|
172
|
+
described_class.new(
|
173
|
+
mongocrypt,
|
174
|
+
io,
|
175
|
+
value,
|
176
|
+
options.merge(contention_factor: 0)
|
177
|
+
)
|
173
178
|
end.not_to raise_error
|
174
179
|
end
|
175
180
|
|
@@ -180,7 +185,7 @@ describe Mongo::Crypt::ExplicitEncryptionContext do
|
|
180
185
|
mongocrypt,
|
181
186
|
io,
|
182
187
|
value,
|
183
|
-
options.merge(query_type: :
|
188
|
+
options.merge(query_type: "equality", contention_factor: 0)
|
184
189
|
)
|
185
190
|
end.not_to raise_error
|
186
191
|
end
|
@@ -12,8 +12,22 @@ describe Mongo::Crypt::Handle do
|
|
12
12
|
describe '#initialize' do
|
13
13
|
let(:credentials) { Mongo::Crypt::KMS::Credentials.new(kms_providers) }
|
14
14
|
let(:kms_tls_options) { {} }
|
15
|
-
let(:handle)
|
16
|
-
|
15
|
+
let(:handle) do
|
16
|
+
described_class.new(
|
17
|
+
credentials,
|
18
|
+
kms_tls_options,
|
19
|
+
schema_map: schema_map,
|
20
|
+
schema_map_path: schema_map_path,
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:schema_map) do
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:schema_map_path) do
|
29
|
+
nil
|
30
|
+
end
|
17
31
|
|
18
32
|
shared_examples 'a functioning Mongo::Crypt::Handle' do
|
19
33
|
context 'with valid schema map' do
|
@@ -22,11 +36,33 @@ describe Mongo::Crypt::Handle do
|
|
22
36
|
end
|
23
37
|
end
|
24
38
|
|
39
|
+
context 'with valid schema map in a file' do
|
40
|
+
let(:schema_map_path) do
|
41
|
+
schema_map_file_path
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'without schema_map set' do
|
45
|
+
let(:schema_map) do
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'does not raise an exception' do
|
50
|
+
expect { handle }.not_to raise_error
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'with schema_map set' do
|
55
|
+
it 'raises an exception' do
|
56
|
+
expect { handle }.to raise_error(ArgumentError, /Cannot set both schema_map and schema_map_path options/)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
25
61
|
context 'with invalid schema map' do
|
26
62
|
let(:schema_map) { '' }
|
27
63
|
|
28
64
|
it 'raises an exception' do
|
29
|
-
expect { handle }.to raise_error(ArgumentError, /schema_map must be a Hash or nil/)
|
65
|
+
expect { handle }.to raise_error(ArgumentError, /invalid schema_map; schema_map must be a Hash or nil/)
|
30
66
|
end
|
31
67
|
end
|
32
68
|
|
@@ -13,17 +13,6 @@ describe Mongo::Crypt::KMS::Credentials do
|
|
13
13
|
Mongo::Crypt::KMS::AWS::Credentials.new(kms_provider)
|
14
14
|
end
|
15
15
|
|
16
|
-
context 'with empty AWS kms_provider' do
|
17
|
-
let(:kms_provider) do
|
18
|
-
{}
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'raises an exception' do
|
22
|
-
expect do
|
23
|
-
params
|
24
|
-
end.to raise_error(ArgumentError, /The specified KMS provider options are invalid: {}. AWS KMS provider options must be in the format: { access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' }/)
|
25
|
-
end
|
26
|
-
end
|
27
16
|
|
28
17
|
%i(access_key_id secret_access_key).each do |key|
|
29
18
|
context "with nil AWS #{key}" do
|
@@ -96,18 +85,6 @@ describe Mongo::Crypt::KMS::Credentials do
|
|
96
85
|
Mongo::Crypt::KMS::Azure::Credentials.new(kms_provider)
|
97
86
|
end
|
98
87
|
|
99
|
-
context 'with empty Azure kms_provider' do
|
100
|
-
let(:kms_provider) do
|
101
|
-
{}
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'raises an exception' do
|
105
|
-
expect do
|
106
|
-
params
|
107
|
-
end.to raise_error(ArgumentError, /The specified KMS provider options are invalid: {}. Azure KMS provider options must be in the format: { tenant_id: 'TENANT-ID', client_id: 'TENANT_ID', client_secret: 'CLIENT_SECRET' }/)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
88
|
%i(tenant_id client_id client_secret).each do |param|
|
112
89
|
|
113
90
|
context "with nil azure #{param}" do
|
@@ -219,18 +196,6 @@ describe Mongo::Crypt::KMS::Credentials do
|
|
219
196
|
Mongo::Crypt::KMS::GCP::Credentials.new(kms_provider)
|
220
197
|
end
|
221
198
|
|
222
|
-
context 'with empty GCP kms_provider' do
|
223
|
-
let(:kms_provider) do
|
224
|
-
{}
|
225
|
-
end
|
226
|
-
|
227
|
-
it 'raises an exception' do
|
228
|
-
expect do
|
229
|
-
params
|
230
|
-
end.to raise_error(ArgumentError, /The specified KMS provider options are invalid: {}. GCP KMS provider options must be in the format: { email: 'EMAIL', private_key: 'PRIVATE-KEY' }/)
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
199
|
%i(email private_key).each do |key|
|
235
200
|
context "with nil GCP #{key}" do
|
236
201
|
let(:kms_provider) do
|
@@ -331,18 +296,6 @@ describe Mongo::Crypt::KMS::Credentials do
|
|
331
296
|
Mongo::Crypt::KMS::KMIP::Credentials.new(kms_provider)
|
332
297
|
end
|
333
298
|
|
334
|
-
context 'with empty KMIP kms_provider' do
|
335
|
-
let(:kms_provider) do
|
336
|
-
{}
|
337
|
-
end
|
338
|
-
|
339
|
-
it 'raises an exception' do
|
340
|
-
expect do
|
341
|
-
params
|
342
|
-
end.to raise_error(ArgumentError, /The specified KMS provider options are invalid: {}. KMIP KMS provider options must be in the format: { endpoint: 'ENDPOINT' }/)
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
299
|
context "with nil KMIP endpoint" do
|
347
300
|
let(:kms_provider) do
|
348
301
|
{
|
@@ -909,6 +909,62 @@ describe Mongo::Index::View do
|
|
909
909
|
end
|
910
910
|
end
|
911
911
|
|
912
|
+
context 'when providing an invalid wildcard projection expression' do
|
913
|
+
min_server_fcv '4.2'
|
914
|
+
|
915
|
+
it 'raises an exception' do
|
916
|
+
expect {
|
917
|
+
view.create_one({ '$**' => 1 }, wildcard_projection: 5)
|
918
|
+
}.to raise_error(Mongo::Error::OperationFailure, /Error in specification.*wildcardProjection|wildcardProjection.*must be a non-empty object/)
|
919
|
+
end
|
920
|
+
end
|
921
|
+
|
922
|
+
context 'when providing a wildcard projection to an invalid base index' do
|
923
|
+
min_server_fcv '4.2'
|
924
|
+
|
925
|
+
it 'raises an exception' do
|
926
|
+
expect {
|
927
|
+
view.create_one({ 'x' => 1 }, wildcard_projection: { rating: 1 })
|
928
|
+
}.to raise_error(Mongo::Error::OperationFailure, /Error in specification.*wildcardProjection|wildcardProjection.*is only allowed/)
|
929
|
+
end
|
930
|
+
end
|
931
|
+
|
932
|
+
context 'when providing a valid wildcard projection' do
|
933
|
+
min_server_fcv '4.2'
|
934
|
+
|
935
|
+
let!(:result) do
|
936
|
+
view.create_one({ '$**' => 1 }, wildcard_projection: { 'rating' => 1 })
|
937
|
+
end
|
938
|
+
|
939
|
+
let(:indexes) do
|
940
|
+
authorized_collection.indexes.get('$**_1')
|
941
|
+
end
|
942
|
+
|
943
|
+
it 'returns ok' do
|
944
|
+
expect(result).to be_successful
|
945
|
+
end
|
946
|
+
|
947
|
+
it 'creates an index' do
|
948
|
+
expect(indexes).to_not be_nil
|
949
|
+
end
|
950
|
+
|
951
|
+
context 'on server versions <= 4.4' do
|
952
|
+
max_server_fcv '4.4'
|
953
|
+
|
954
|
+
it 'passes wildcardProjection correctly' do
|
955
|
+
expect(indexes[:wildcardProjection]).to eq({ 'rating' => 1 })
|
956
|
+
end
|
957
|
+
end
|
958
|
+
|
959
|
+
context 'on server versions >= 5.0' do
|
960
|
+
min_server_fcv '5.0'
|
961
|
+
|
962
|
+
it 'passes wildcardProjection correctly' do
|
963
|
+
expect(indexes[:wildcardProjection]).to eq({ '_id' => false, 'rating' => true })
|
964
|
+
end
|
965
|
+
end
|
966
|
+
end
|
967
|
+
|
912
968
|
context 'when providing hidden option' do
|
913
969
|
let(:index) { view.get('with_hidden_1') }
|
914
970
|
|
@@ -81,48 +81,6 @@ describe Mongo::Operation::Create::OpMsg do
|
|
81
81
|
described_class.new(user_input).send(:selector, connection)
|
82
82
|
end.not_to raise_error
|
83
83
|
end
|
84
|
-
|
85
|
-
context 'with encryptedFields' do
|
86
|
-
let(:spec) do
|
87
|
-
{
|
88
|
-
:selector => { :create => authorized_collection.name },
|
89
|
-
:db_name => authorized_collection.database.name,
|
90
|
-
:write_concern => write_concern,
|
91
|
-
:session => session,
|
92
|
-
:encrypted_fields => {
|
93
|
-
'fields' => [
|
94
|
-
{
|
95
|
-
'path' => "name",
|
96
|
-
'bsonType' => "string",
|
97
|
-
'queries' => {
|
98
|
-
'queryType' => "equality",
|
99
|
-
'contention' => 10
|
100
|
-
}
|
101
|
-
}
|
102
|
-
]
|
103
|
-
}
|
104
|
-
}
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'converts contention values to BSON::Int64' do
|
108
|
-
selector = op.send(:selector, connection)
|
109
|
-
expect(selector).to eq({
|
110
|
-
:create => authorized_collection.name,
|
111
|
-
:encryptedFields => {
|
112
|
-
'fields' => [
|
113
|
-
{
|
114
|
-
'path' => "name",
|
115
|
-
'bsonType' => "string",
|
116
|
-
'queries' => {
|
117
|
-
'queryType' => "equality",
|
118
|
-
'contention' => BSON::Int64.new(10)
|
119
|
-
}
|
120
|
-
}
|
121
|
-
]
|
122
|
-
}
|
123
|
-
})
|
124
|
-
end
|
125
|
-
end
|
126
84
|
end
|
127
85
|
|
128
86
|
describe '#message' do
|
@@ -83,11 +83,21 @@ describe Mongo::Server::ConnectionPool do
|
|
83
83
|
|
84
84
|
context 'when min size exceeds default max size' do
|
85
85
|
let (:options) do
|
86
|
-
{ min_pool_size:
|
86
|
+
{ min_pool_size: 50 }
|
87
87
|
end
|
88
88
|
|
89
89
|
it 'sets max size to equal provided min size' do
|
90
|
-
expect(pool.max_size).to eq(
|
90
|
+
expect(pool.max_size).to eq(50)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'when min size is provided and max size is zero (unlimited)' do
|
95
|
+
let (:options) do
|
96
|
+
{ min_size: 10, max_size: 0 }
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'sets max size to zero (unlimited)' do
|
100
|
+
expect(pool.max_size).to eq(0)
|
91
101
|
end
|
92
102
|
end
|
93
103
|
|
@@ -155,7 +165,7 @@ describe Mongo::Server::ConnectionPool do
|
|
155
165
|
|
156
166
|
context 'when no pool size option is provided' do
|
157
167
|
it 'returns the default size' do
|
158
|
-
expect(pool.max_size).to eq(
|
168
|
+
expect(pool.max_size).to eq(20)
|
159
169
|
end
|
160
170
|
end
|
161
171
|
|
@@ -165,7 +175,7 @@ describe Mongo::Server::ConnectionPool do
|
|
165
175
|
end
|
166
176
|
|
167
177
|
it 'returns max size' do
|
168
|
-
expect(pool.max_size).to eq(
|
178
|
+
expect(pool.max_size).to eq(20)
|
169
179
|
end
|
170
180
|
end
|
171
181
|
end
|
@@ -460,6 +470,18 @@ describe Mongo::Server::ConnectionPool do
|
|
460
470
|
server.pool
|
461
471
|
end
|
462
472
|
|
473
|
+
context 'when max_size is zero (unlimited)' do
|
474
|
+
let(:options) do
|
475
|
+
{ max_size: 0 }
|
476
|
+
end
|
477
|
+
|
478
|
+
it 'checks out a connection' do
|
479
|
+
expect do
|
480
|
+
pool.check_out
|
481
|
+
end.not_to raise_error
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
463
485
|
context 'when a connection is checked out on a different thread' do
|
464
486
|
|
465
487
|
let!(:connection) do
|
@@ -376,7 +376,7 @@ describe Mongo::Socket::SSL do
|
|
376
376
|
|
377
377
|
let(:ssl_options) do
|
378
378
|
super().merge(
|
379
|
-
:ssl_cert =>
|
379
|
+
:ssl_cert => CRUD_TESTS.first,
|
380
380
|
:ssl_key => nil,
|
381
381
|
)
|
382
382
|
end
|
@@ -394,7 +394,7 @@ describe Mongo::Socket::SSL do
|
|
394
394
|
let(:ssl_options) do
|
395
395
|
super().merge(
|
396
396
|
:ssl_cert => nil,
|
397
|
-
:ssl_key =>
|
397
|
+
:ssl_key => CRUD_TESTS.first,
|
398
398
|
)
|
399
399
|
end
|
400
400
|
|
@@ -412,7 +412,7 @@ describe Mongo::Socket::SSL do
|
|
412
412
|
|
413
413
|
let(:ssl_options) do
|
414
414
|
super().merge(
|
415
|
-
:ssl_cert =>
|
415
|
+
:ssl_cert => CRUD_TESTS.first,
|
416
416
|
:ssl_key => nil,
|
417
417
|
)
|
418
418
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
module Mongo
|
5
5
|
module CRUD
|
6
6
|
class Requirement
|
7
|
-
YAML_KEYS = %w(auth minServerVersion maxServerVersion topology topologies serverParameters serverless).freeze
|
7
|
+
YAML_KEYS = %w(auth minServerVersion maxServerVersion topology topologies serverParameters serverless csfle).freeze
|
8
8
|
|
9
9
|
def initialize(spec)
|
10
10
|
spec = spec.dup
|
@@ -49,6 +49,7 @@ module Mongo
|
|
49
49
|
nil
|
50
50
|
end
|
51
51
|
@auth = spec['auth']
|
52
|
+
@csfle = !!spec['csfle'] if spec['csfle']
|
52
53
|
end
|
53
54
|
|
54
55
|
attr_reader :min_server_version
|
@@ -112,6 +113,10 @@ module Mongo
|
|
112
113
|
elsif @auth == false
|
113
114
|
ok &&= !cc.auth_enabled?
|
114
115
|
end
|
116
|
+
if @csfle
|
117
|
+
ok &&= !!(ENV['LIBMONGOCRYPT_PATH'] || ENV['FLE'])
|
118
|
+
ok &&= Gem::Version.new(cc.fcv_ish) >= Gem::Version.new('4.2.0')
|
119
|
+
end
|
115
120
|
ok
|
116
121
|
end
|
117
122
|
|
data/spec/runners/crud/test.rb
CHANGED
@@ -96,7 +96,7 @@ module Mongo
|
|
96
96
|
elsif @data.is_a?(Array)
|
97
97
|
collection = client[spec.collection_name, write_concern: {w: :majority}]
|
98
98
|
collection.delete_many
|
99
|
-
collection.insert_many(@data)
|
99
|
+
collection.insert_many(@data) unless @data.empty?
|
100
100
|
elsif @data.is_a?(Hash)
|
101
101
|
converter = DataConverter.new
|
102
102
|
@data.each do |collection_name, data|
|
@@ -19,9 +19,9 @@ module Mongo
|
|
19
19
|
module Transactions
|
20
20
|
|
21
21
|
class Spec < Mongo::CRUD::Spec
|
22
|
-
def tests
|
22
|
+
def tests(expectations_bson_types: true)
|
23
23
|
@tests.map do |test|
|
24
|
-
Mongo::Transactions::TransactionsTest.new(self, @data, test)
|
24
|
+
Mongo::Transactions::TransactionsTest.new(self, @data, test, expectations_bson_types: expectations_bson_types)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|