mongo 2.11.6 → 2.12.0.rc0
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 +2 -2
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +1 -1
- data/lib/mongo.rb +3 -0
- data/lib/mongo/address.rb +13 -2
- data/lib/mongo/auth.rb +1 -0
- data/lib/mongo/auth/credential_cache.rb +51 -0
- data/lib/mongo/auth/scram/conversation.rb +20 -16
- data/lib/mongo/auth/user.rb +0 -8
- data/lib/mongo/auth/user/view.rb +4 -4
- data/lib/mongo/background_thread.rb +1 -1
- data/lib/mongo/bulk_write.rb +5 -5
- data/lib/mongo/client.rb +126 -11
- data/lib/mongo/client_encryption.rb +103 -0
- data/lib/mongo/cluster.rb +2 -2
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
- data/lib/mongo/cluster/sdam_flow.rb +54 -58
- data/lib/mongo/cluster/srv_monitor.rb +1 -1
- data/lib/mongo/collection.rb +3 -3
- data/lib/mongo/collection/view.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +12 -3
- data/lib/mongo/collection/view/iterable.rb +14 -5
- data/lib/mongo/collection/view/map_reduce.rb +2 -2
- data/lib/mongo/collection/view/readable.rb +7 -9
- data/lib/mongo/collection/view/writable.rb +7 -7
- data/lib/mongo/crypt.rb +33 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +42 -0
- data/lib/mongo/crypt/auto_encrypter.rb +169 -0
- data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
- data/lib/mongo/crypt/binary.rb +155 -0
- data/lib/mongo/crypt/binding.rb +1162 -0
- data/lib/mongo/crypt/context.rb +135 -0
- data/lib/mongo/crypt/data_key_context.rb +162 -0
- data/lib/mongo/crypt/encryption_io.rb +283 -0
- data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
- data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
- data/lib/mongo/crypt/handle.rb +293 -0
- data/lib/mongo/crypt/hooks.rb +90 -0
- data/lib/mongo/crypt/kms_context.rb +67 -0
- data/lib/mongo/crypt/status.rb +131 -0
- data/lib/mongo/cursor.rb +64 -32
- data/lib/mongo/database.rb +13 -6
- data/lib/mongo/database/view.rb +13 -4
- data/lib/mongo/dbref.rb +9 -2
- data/lib/mongo/error.rb +5 -1
- data/lib/mongo/error/crypt_error.rb +31 -0
- data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
- data/lib/mongo/error/kms_error.rb +22 -0
- data/lib/mongo/error/max_bson_size.rb +14 -3
- data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
- data/lib/mongo/error/no_server_available.rb +8 -3
- data/lib/mongo/error/operation_failure.rb +1 -0
- data/lib/mongo/grid/file.rb +0 -5
- data/lib/mongo/grid/file/chunk.rb +0 -2
- data/lib/mongo/grid/file/info.rb +2 -1
- data/lib/mongo/grid/fs_bucket.rb +13 -15
- data/lib/mongo/grid/stream/write.rb +3 -9
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/monitoring/event/command_started.rb +6 -1
- data/lib/mongo/operation/collections_info.rb +6 -3
- data/lib/mongo/operation/delete/op_msg.rb +1 -1
- data/lib/mongo/operation/find/op_msg.rb +4 -1
- data/lib/mongo/operation/get_more/op_msg.rb +4 -1
- data/lib/mongo/operation/insert/command.rb +2 -2
- data/lib/mongo/operation/insert/legacy.rb +2 -2
- data/lib/mongo/operation/insert/op_msg.rb +3 -3
- data/lib/mongo/operation/result.rb +36 -27
- data/lib/mongo/operation/shared/executable.rb +10 -8
- data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
- data/lib/mongo/operation/shared/write.rb +17 -10
- data/lib/mongo/operation/update/op_msg.rb +1 -1
- data/lib/mongo/protocol/compressed.rb +6 -5
- data/lib/mongo/protocol/insert.rb +3 -1
- data/lib/mongo/protocol/message.rb +72 -8
- data/lib/mongo/protocol/msg.rb +191 -37
- data/lib/mongo/protocol/query.rb +7 -9
- data/lib/mongo/protocol/serializers.rb +6 -2
- data/lib/mongo/server.rb +10 -4
- data/lib/mongo/server/connection.rb +20 -9
- data/lib/mongo/server/connection_base.rb +81 -12
- data/lib/mongo/server/connection_common.rb +61 -0
- data/lib/mongo/server/connection_pool.rb +37 -1
- data/lib/mongo/server/description.rb +9 -11
- data/lib/mongo/server/monitor.rb +2 -0
- data/lib/mongo/server/monitor/connection.rb +3 -18
- data/lib/mongo/server/pending_connection.rb +2 -1
- data/lib/mongo/session.rb +2 -2
- data/lib/mongo/session/session_pool.rb +8 -3
- data/lib/mongo/socket.rb +29 -16
- data/lib/mongo/socket/ssl.rb +23 -8
- data/lib/mongo/socket/tcp.rb +12 -3
- data/lib/mongo/timeout.rb +49 -0
- data/lib/mongo/uri.rb +30 -1
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/README.md +134 -7
- data/spec/integration/auth_spec.rb +53 -0
- data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
- data/spec/integration/client_construction_spec.rb +76 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +351 -0
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +301 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +71 -0
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +76 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +216 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +600 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +183 -0
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +74 -0
- data/spec/integration/client_side_encryption/client_close_spec.rb +59 -0
- data/spec/integration/client_side_encryption/corpus_spec.rb +228 -0
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
- data/spec/integration/client_side_encryption/data_key_spec.rb +163 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +137 -0
- data/spec/integration/client_side_encryption/views_spec.rb +42 -0
- data/spec/integration/client_update_spec.rb +120 -0
- data/spec/integration/command_monitoring_spec.rb +3 -1
- data/spec/integration/command_spec.rb +44 -10
- data/spec/integration/connection_spec.rb +57 -0
- data/spec/integration/reconnect_spec.rb +7 -6
- data/spec/integration/size_limit_spec.rb +94 -0
- data/spec/integration/srv_monitoring_spec.rb +14 -6
- data/spec/lite_spec_helper.rb +31 -22
- data/spec/mongo/auth/cr_spec.rb +8 -0
- data/spec/mongo/auth/ldap_spec.rb +5 -1
- data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
- data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
- data/spec/mongo/auth/scram_spec.rb +45 -35
- data/spec/mongo/auth/x509_spec.rb +5 -1
- data/spec/mongo/client_construction_spec.rb +206 -3
- data/spec/mongo/client_encryption_spec.rb +408 -0
- data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
- data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
- data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
- data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
- data/spec/mongo/collection/view_spec.rb +1 -1
- data/spec/mongo/collection_spec.rb +4 -33
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +182 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
- data/spec/mongo/crypt/binary_spec.rb +115 -0
- data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
- data/spec/mongo/crypt/binding/context_spec.rb +257 -0
- data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
- data/spec/mongo/crypt/binding/status_spec.rb +99 -0
- data/spec/mongo/crypt/binding/version_spec.rb +22 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
- data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
- data/spec/mongo/crypt/handle_spec.rb +198 -0
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
- data/spec/mongo/crypt/status_spec.rb +152 -0
- data/spec/mongo/cursor_spec.rb +24 -4
- data/spec/mongo/database_spec.rb +20 -0
- data/spec/mongo/error/crypt_error_spec.rb +26 -0
- data/spec/mongo/error/max_bson_size_spec.rb +35 -0
- data/spec/mongo/error/no_server_available_spec.rb +11 -1
- data/spec/mongo/error/operation_failure_spec.rb +6 -6
- data/spec/mongo/operation/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/command_spec.rb +3 -3
- data/spec/mongo/operation/create_index_spec.rb +3 -3
- data/spec/mongo/operation/create_user_spec.rb +3 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
- data/spec/mongo/operation/delete_spec.rb +7 -7
- data/spec/mongo/operation/drop_index_spec.rb +2 -2
- data/spec/mongo/operation/find/legacy_spec.rb +1 -1
- data/spec/mongo/operation/get_more_spec.rb +1 -1
- data/spec/mongo/operation/indexes_spec.rb +1 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/insert_spec.rb +12 -12
- data/spec/mongo/operation/map_reduce_spec.rb +2 -2
- data/spec/mongo/operation/remove_user_spec.rb +3 -3
- data/spec/mongo/operation/update/bulk_spec.rb +6 -6
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/update_spec.rb +7 -7
- data/spec/mongo/operation/update_user_spec.rb +1 -1
- data/spec/mongo/protocol/compressed_spec.rb +2 -3
- data/spec/mongo/protocol/delete_spec.rb +9 -8
- data/spec/mongo/protocol/get_more_spec.rb +9 -8
- data/spec/mongo/protocol/insert_spec.rb +9 -8
- data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
- data/spec/mongo/protocol/msg_spec.rb +57 -53
- data/spec/mongo/protocol/query_spec.rb +12 -12
- data/spec/mongo/protocol/registry_spec.rb +1 -1
- data/spec/mongo/protocol/reply_spec.rb +1 -1
- data/spec/mongo/protocol/update_spec.rb +10 -9
- data/spec/mongo/server/connection_pool_spec.rb +1 -1
- data/spec/mongo/server/connection_spec.rb +28 -7
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/timeout_spec.rb +85 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
- data/spec/mongo/uri_spec.rb +52 -5
- data/spec/mongo/write_concern_spec.rb +13 -1
- data/spec/{support → runners}/auth.rb +14 -1
- data/spec/{support → runners}/change_streams.rb +1 -1
- data/spec/{support → runners}/change_streams/operation.rb +0 -0
- data/spec/{support → runners}/cmap.rb +1 -1
- data/spec/{support → runners}/cmap/verifier.rb +0 -0
- data/spec/{support → runners}/command_monitoring.rb +0 -0
- data/spec/runners/connection_string.rb +358 -4
- data/spec/{support → runners}/crud.rb +9 -9
- data/spec/{support → runners}/crud/context.rb +0 -0
- data/spec/{support → runners}/crud/operation.rb +7 -3
- data/spec/{support → runners}/crud/outcome.rb +0 -0
- data/spec/{support → runners}/crud/requirement.rb +1 -1
- data/spec/{support → runners}/crud/spec.rb +12 -1
- data/spec/{support → runners}/crud/test.rb +0 -0
- data/spec/{support → runners}/crud/test_base.rb +0 -0
- data/spec/{support → runners}/crud/verifier.rb +10 -12
- data/spec/{support → runners}/gridfs.rb +0 -0
- data/spec/{support → runners}/sdam_monitoring.rb +0 -0
- data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
- data/spec/{support → runners}/server_selection.rb +0 -0
- data/spec/{support → runners}/server_selection_rtt.rb +0 -0
- data/spec/{support → runners}/transactions.rb +4 -4
- data/spec/{support → runners}/transactions/context.rb +0 -0
- data/spec/{support → runners}/transactions/operation.rb +0 -0
- data/spec/{support → runners}/transactions/spec.rb +0 -0
- data/spec/{support → runners}/transactions/test.rb +37 -5
- data/spec/spec_helper.rb +0 -5
- data/spec/spec_tests/auth_spec.rb +3 -3
- data/spec/spec_tests/client_side_encryption_spec.rb +13 -0
- data/spec/spec_tests/connection_string_spec.rb +1 -1
- data/spec/spec_tests/data/auth/connection-string.yml +13 -0
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
- data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +85 -0
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
- data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
- data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
- data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +168 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
- data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
- data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
- data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
- data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
- data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
- data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
- data/spec/spec_tests/uri_options_spec.rb +6 -8
- data/spec/stress/connection_pool_timing_spec.rb +6 -3
- data/spec/support/certificates/README.md +4 -0
- data/spec/support/certificates/server-second-level-bundle.pem +77 -77
- data/spec/support/certificates/server-second-level.crt +52 -52
- data/spec/support/certificates/server-second-level.key +25 -25
- data/spec/support/certificates/server-second-level.pem +77 -77
- data/spec/support/client_registry.rb +19 -3
- data/spec/support/cluster_config.rb +9 -1
- data/spec/support/common_shortcuts.rb +12 -0
- data/spec/support/constraints.rb +16 -0
- data/spec/support/crypt.rb +140 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
- data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
- data/spec/support/crypt/corpus/corpus.json +3657 -0
- data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
- data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
- data/spec/support/crypt/data_keys/key_document_local.json +31 -0
- data/spec/support/crypt/external/external-key.json +31 -0
- data/spec/support/crypt/external/external-schema.json +19 -0
- data/spec/support/crypt/limits/limits-doc.json +102 -0
- data/spec/support/crypt/limits/limits-key.json +31 -0
- data/spec/support/crypt/limits/limits-schema.json +1405 -0
- data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
- data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/lite_constraints.rb +17 -1
- data/spec/support/matchers.rb +19 -0
- data/spec/support/shared/protocol.rb +2 -0
- data/spec/support/spec_config.rb +43 -13
- data/spec/support/utils.rb +132 -10
- metadata +277 -81
- metadata.gz.sig +0 -0
- data/spec/integration/grid_fs_bucket_spec.rb +0 -48
- data/spec/integration/zlib_compression_spec.rb +0 -25
- data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
- data/spec/support/connection_string.rb +0 -354
@@ -0,0 +1,301 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Auto Encryption' do
|
4
|
+
require_libmongocrypt
|
5
|
+
require_enterprise
|
6
|
+
min_server_fcv '4.2'
|
7
|
+
|
8
|
+
# Diagnostics of leaked background threads only, these tests do not
|
9
|
+
# actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
|
10
|
+
clean_slate
|
11
|
+
|
12
|
+
include_context 'define shared FLE helpers'
|
13
|
+
include_context 'with local kms_providers'
|
14
|
+
|
15
|
+
let(:subscriber) { EventSubscriber.new }
|
16
|
+
let(:db_name) { 'auto_encryption' }
|
17
|
+
|
18
|
+
let(:encryption_client) do
|
19
|
+
new_local_client(
|
20
|
+
SpecConfig.instance.addresses,
|
21
|
+
SpecConfig.instance.test_options.merge(
|
22
|
+
auto_encryption_options: {
|
23
|
+
kms_providers: kms_providers,
|
24
|
+
key_vault_namespace: key_vault_namespace,
|
25
|
+
schema_map: { "auto_encryption.users" => schema_map },
|
26
|
+
},
|
27
|
+
database: db_name
|
28
|
+
),
|
29
|
+
).tap do |client|
|
30
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
before(:each) do
|
35
|
+
authorized_client.use(key_vault_db)[key_vault_coll].drop
|
36
|
+
authorized_client.use(key_vault_db)[key_vault_coll].insert_one(data_key)
|
37
|
+
|
38
|
+
encryption_client[:users].drop
|
39
|
+
result = encryption_client[:users].insert_one(ssn: ssn, age: 23)
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:started_event) do
|
43
|
+
subscriber.started_events.find do |event|
|
44
|
+
event.command_name == command_name && event.database_name == db_name
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
let(:succeeded_event) do
|
49
|
+
subscriber.succeeded_events.find do |event|
|
50
|
+
event.command_name == command_name && event.database_name == db_name
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
let(:key_vault_list_collections_event) do
|
55
|
+
subscriber.started_events.find do |event|
|
56
|
+
event.command_name == 'listCollections' && event.database_name == key_vault_db
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
shared_examples 'it has an encrypted key_vault_client' do
|
61
|
+
it 'registers a listCollections event on the key vault client' do
|
62
|
+
expect(key_vault_list_collections_event).not_to be_nil
|
63
|
+
expect(key_vault_list_collections_event.command['$db']).to eq(key_vault_db)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#aggregate' do
|
68
|
+
let(:command_name) { 'aggregate' }
|
69
|
+
|
70
|
+
before do
|
71
|
+
encryption_client[:users].aggregate([{ '$match' => { 'ssn' => ssn } }]).first
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'has encrypted data in command monitoring' do
|
75
|
+
# Command started event occurs after ssn is encrypted
|
76
|
+
expect(
|
77
|
+
started_event.command["pipeline"].first["$match"]["ssn"]["$eq"]
|
78
|
+
).to be_ciphertext
|
79
|
+
|
80
|
+
# Command succeeded event occurs before ssn is decrypted
|
81
|
+
expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
|
82
|
+
end
|
83
|
+
|
84
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '#count' do
|
88
|
+
let(:command_name) { 'count' }
|
89
|
+
|
90
|
+
before do
|
91
|
+
encryption_client[:users].count(ssn: ssn)
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'has encrypted data in command monitoring' do
|
95
|
+
# Command started event occurs after ssn is encrypted
|
96
|
+
# Command succeeded event does not contain any data to be decrypted
|
97
|
+
expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
|
98
|
+
end
|
99
|
+
|
100
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
101
|
+
end
|
102
|
+
|
103
|
+
describe '#distinct' do
|
104
|
+
let(:command_name) { 'distinct' }
|
105
|
+
|
106
|
+
before do
|
107
|
+
encryption_client[:users].distinct(:ssn)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'has encrypted data in command monitoring' do
|
111
|
+
# Command started event does not contain any data to be encrypted
|
112
|
+
# Command succeeded event occurs before ssn is decrypted
|
113
|
+
expect(succeeded_event.reply["values"].first).to be_ciphertext
|
114
|
+
end
|
115
|
+
|
116
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#delete_one' do
|
120
|
+
let(:command_name) { 'delete' }
|
121
|
+
|
122
|
+
before do
|
123
|
+
encryption_client[:users].delete_one(ssn: ssn)
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'has encrypted data in command monitoring' do
|
127
|
+
# Command started event occurs after ssn is encrypted
|
128
|
+
# Command succeeded event does not contain any data to be decrypted
|
129
|
+
expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
130
|
+
end
|
131
|
+
|
132
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
133
|
+
end
|
134
|
+
|
135
|
+
describe '#delete_many' do
|
136
|
+
let(:command_name) { 'delete' }
|
137
|
+
|
138
|
+
before do
|
139
|
+
encryption_client[:users].delete_many(ssn: ssn)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'has encrypted data in command monitoring' do
|
143
|
+
# Command started event occurs after ssn is encrypted
|
144
|
+
# Command succeeded event does not contain any data to be decrypted
|
145
|
+
expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
146
|
+
end
|
147
|
+
|
148
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
149
|
+
end
|
150
|
+
|
151
|
+
describe '#find' do
|
152
|
+
let(:command_name) { 'find' }
|
153
|
+
|
154
|
+
before do
|
155
|
+
encryption_client[:users].find(ssn: ssn).first
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'has encrypted data in command monitoring' do
|
159
|
+
# Command started event occurs after ssn is encrypted
|
160
|
+
expect(started_event.command["filter"]["ssn"]["$eq"]).to be_ciphertext
|
161
|
+
|
162
|
+
# Command succeeded event occurs before ssn is decrypted
|
163
|
+
expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
|
164
|
+
end
|
165
|
+
|
166
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
167
|
+
end
|
168
|
+
|
169
|
+
describe '#find_one_and_delete' do
|
170
|
+
let(:command_name) { 'findAndModify' }
|
171
|
+
|
172
|
+
before do
|
173
|
+
encryption_client[:users].find_one_and_delete(ssn: ssn)
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'has encrypted data in command monitoring' do
|
177
|
+
# Command started event occurs after ssn is encrypted
|
178
|
+
expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
|
179
|
+
|
180
|
+
# Command succeeded event occurs before ssn is decrypted
|
181
|
+
expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
|
182
|
+
end
|
183
|
+
|
184
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
185
|
+
end
|
186
|
+
|
187
|
+
describe '#find_one_and_replace' do
|
188
|
+
let(:command_name) { 'findAndModify' }
|
189
|
+
|
190
|
+
before do
|
191
|
+
encryption_client[:users].find_one_and_replace(
|
192
|
+
{ ssn: ssn },
|
193
|
+
{ ssn: '555-555-5555' }
|
194
|
+
)
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'has encrypted data in command monitoring' do
|
198
|
+
# Command started event occurs after ssn is encrypted
|
199
|
+
expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
|
200
|
+
expect(started_event.command["update"]["ssn"]).to be_ciphertext
|
201
|
+
|
202
|
+
# Command succeeded event occurs before ssn is decrypted
|
203
|
+
expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
|
204
|
+
end
|
205
|
+
|
206
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
207
|
+
end
|
208
|
+
|
209
|
+
describe '#find_one_and_update' do
|
210
|
+
let(:command_name) { 'findAndModify' }
|
211
|
+
|
212
|
+
before do
|
213
|
+
encryption_client[:users].find_one_and_update(
|
214
|
+
{ ssn: ssn },
|
215
|
+
{ ssn: '555-555-5555' }
|
216
|
+
)
|
217
|
+
end
|
218
|
+
|
219
|
+
it 'has encrypted data in command monitoring' do
|
220
|
+
|
221
|
+
# Command started event occurs after ssn is encrypted
|
222
|
+
expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
|
223
|
+
expect(started_event.command["update"]["ssn"]).to be_ciphertext
|
224
|
+
|
225
|
+
# Command succeeded event occurs before ssn is decrypted
|
226
|
+
expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
|
227
|
+
end
|
228
|
+
|
229
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
230
|
+
end
|
231
|
+
|
232
|
+
describe '#insert_one' do
|
233
|
+
let(:command_name) { 'insert' }
|
234
|
+
|
235
|
+
before do
|
236
|
+
encryption_client[:users].insert_one(ssn: ssn)
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'has encrypted data in command monitoring' do
|
240
|
+
# Command started event occurs after ssn is encrypted
|
241
|
+
# Command succeeded event does not contain any data to be decrypted
|
242
|
+
expect(started_event.command["documents"].first["ssn"]).to be_ciphertext
|
243
|
+
end
|
244
|
+
|
245
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
246
|
+
end
|
247
|
+
|
248
|
+
describe '#replace_one' do
|
249
|
+
let(:command_name) { 'update' }
|
250
|
+
|
251
|
+
before do
|
252
|
+
encryption_client[:users].replace_one(
|
253
|
+
{ ssn: ssn },
|
254
|
+
{ ssn: '555-555-5555' }
|
255
|
+
)
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'has encrypted data in command monitoring' do
|
259
|
+
# Command started event occurs after ssn is encrypted
|
260
|
+
# Command succeeded event does not contain any data to be decrypted
|
261
|
+
expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
262
|
+
expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
|
263
|
+
end
|
264
|
+
|
265
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
266
|
+
end
|
267
|
+
|
268
|
+
describe '#update_one' do
|
269
|
+
let(:command_name) { 'update' }
|
270
|
+
|
271
|
+
before do
|
272
|
+
encryption_client[:users].update_one({ ssn: ssn }, { ssn: '555-555-5555' })
|
273
|
+
end
|
274
|
+
|
275
|
+
it 'has encrypted data in command monitoring' do
|
276
|
+
# Command started event occurs after ssn is encrypted
|
277
|
+
# Command succeeded event does not contain any data to be decrypted
|
278
|
+
expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
279
|
+
expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
|
280
|
+
end
|
281
|
+
|
282
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
283
|
+
end
|
284
|
+
|
285
|
+
describe '#update_many' do
|
286
|
+
let(:command_name) { 'update' }
|
287
|
+
|
288
|
+
before do
|
289
|
+
# update_many does not support replacement-style updates
|
290
|
+
encryption_client[:users].update_many({ ssn: ssn }, { "$inc" => { :age => 1 } })
|
291
|
+
end
|
292
|
+
|
293
|
+
it 'has encrypted data in command monitoring' do
|
294
|
+
# Command started event occurs after ssn is encrypted
|
295
|
+
# Command succeeded event does not contain any data to be decrypted
|
296
|
+
expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
297
|
+
end
|
298
|
+
|
299
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
300
|
+
end
|
301
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Auto Encryption' do
|
4
|
+
require_libmongocrypt
|
5
|
+
min_server_fcv '4.2'
|
6
|
+
require_enterprise
|
7
|
+
|
8
|
+
include_context 'define shared FLE helpers'
|
9
|
+
include_context 'with local kms_providers'
|
10
|
+
|
11
|
+
context 'with an invalid mongocryptd spawn path' do
|
12
|
+
let(:client) do
|
13
|
+
new_local_client(
|
14
|
+
SpecConfig.instance.addresses,
|
15
|
+
SpecConfig.instance.test_options.merge(
|
16
|
+
auto_encryption_options: {
|
17
|
+
kms_providers: kms_providers,
|
18
|
+
key_vault_namespace: key_vault_namespace,
|
19
|
+
schema_map: { 'auto_encryption.users' => schema_map },
|
20
|
+
extra_options: {
|
21
|
+
mongocryptd_spawn_path: 'echo hello world',
|
22
|
+
mongocryptd_spawn_args: []
|
23
|
+
}
|
24
|
+
},
|
25
|
+
database: 'auto_encryption'
|
26
|
+
),
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:server_selector) { double("ServerSelector") }
|
31
|
+
let(:cluster) { double("Cluster") }
|
32
|
+
|
33
|
+
before do
|
34
|
+
authorized_client.use(:admin)[:datakeys].drop
|
35
|
+
authorized_client.use(:admin)[:datakeys].insert_one(data_key)
|
36
|
+
|
37
|
+
allow(server_selector).to receive(:name)
|
38
|
+
allow(server_selector).to receive(:server_selection_timeout)
|
39
|
+
allow(server_selector).to receive(:local_threshold)
|
40
|
+
allow(cluster).to receive(:summary)
|
41
|
+
|
42
|
+
# Raise a server selection error on intent-to-encrypt commands to mock
|
43
|
+
# what would happen if mongocryptd hadn't already been spawned. It is
|
44
|
+
# necessary to mock this behavior because it is likely that another test
|
45
|
+
# will have already spawned mongocryptd, causing this test to fail.
|
46
|
+
allow_any_instance_of(Mongo::Database)
|
47
|
+
.to receive(:command)
|
48
|
+
.with(
|
49
|
+
hash_including(
|
50
|
+
'insert' => 'users',
|
51
|
+
'$db' => 'auto_encryption',
|
52
|
+
'ordered' => true,
|
53
|
+
'lsid' => kind_of(Hash),
|
54
|
+
'documents' => kind_of(Array),
|
55
|
+
'jsonSchema' => kind_of(Hash),
|
56
|
+
'isRemoteSchema' => false,
|
57
|
+
)
|
58
|
+
)
|
59
|
+
.and_raise(Mongo::Error::NoServerAvailable.new(server_selector, cluster))
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'raises an exception when trying to perform auto encryption' do
|
63
|
+
expect do
|
64
|
+
client[:users].insert_one(ssn: ssn)
|
65
|
+
end.to raise_error(
|
66
|
+
Mongo::Error::MongocryptdSpawnError,
|
67
|
+
/Failed to spawn mongocryptd at the path "echo hello world" with arguments/
|
68
|
+
)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Auto Encryption' do
|
4
|
+
require_libmongocrypt
|
5
|
+
max_server_version '4.0'
|
6
|
+
|
7
|
+
# Diagnostics of leaked background threads only, these tests do not
|
8
|
+
# actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
|
9
|
+
clean_slate
|
10
|
+
|
11
|
+
include_context 'define shared FLE helpers'
|
12
|
+
|
13
|
+
let(:encryption_client) do
|
14
|
+
new_local_client(
|
15
|
+
SpecConfig.instance.addresses,
|
16
|
+
SpecConfig.instance.test_options.merge(
|
17
|
+
auto_encryption_options: {
|
18
|
+
kms_providers: kms_providers,
|
19
|
+
key_vault_namespace: key_vault_namespace,
|
20
|
+
# Must use local schema map because server versions older than 4.2
|
21
|
+
# do not support jsonSchema collection validator.
|
22
|
+
schema_map: { 'auto_encryption.users' => schema_map },
|
23
|
+
bypass_auto_encryption: bypass_auto_encryption
|
24
|
+
},
|
25
|
+
database: 'auto_encryption'
|
26
|
+
),
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:bypass_auto_encryption) { false }
|
31
|
+
let(:client) { authorized_client.use(:auto_encryption) }
|
32
|
+
|
33
|
+
let(:encrypted_ssn_binary) do
|
34
|
+
BSON::Binary.new(Base64.decode64(encrypted_ssn), :ciphertext)
|
35
|
+
end
|
36
|
+
|
37
|
+
shared_examples 'it decrypts but does not encrypt on wire version < 8' do
|
38
|
+
before do
|
39
|
+
client[:users].insert_one(ssn: encrypted_ssn_binary)
|
40
|
+
|
41
|
+
authorized_client.use(:admin)[:datakeys].drop
|
42
|
+
authorized_client.use(:admin)[:datakeys].insert_one(data_key)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'raises an exception when trying to encrypt' do
|
46
|
+
expect do
|
47
|
+
encryption_client[:users].find(ssn: ssn).first
|
48
|
+
end.to raise_error(Mongo::Error::CryptError, /Auto-encryption requires a minimum MongoDB version of 4.2/)
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'with bypass_auto_encryption=true' do
|
52
|
+
let(:bypass_auto_encryption) { true }
|
53
|
+
|
54
|
+
it 'does not raise an exception but doesn\'t encrypt' do
|
55
|
+
document = encryption_client[:users].find(ssn: ssn).first
|
56
|
+
expect(document).to be_nil
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'still decrypts' do
|
60
|
+
document = encryption_client[:users].find(ssn: encrypted_ssn_binary).first
|
61
|
+
# ssn field is still decrypted
|
62
|
+
expect(document['ssn']).to eq(ssn)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'with AWS kms provider' do
|
68
|
+
include_context 'with AWS kms_providers'
|
69
|
+
it_behaves_like 'it decrypts but does not encrypt on wire version < 8'
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'with local kms provider' do
|
73
|
+
include_context 'with local kms_providers'
|
74
|
+
it_behaves_like 'it decrypts but does not encrypt on wire version < 8'
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,216 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Client with auto encryption #reconnect' do
|
4
|
+
require_libmongocrypt
|
5
|
+
min_server_fcv '4.2'
|
6
|
+
require_enterprise
|
7
|
+
|
8
|
+
# Diagnostics of leaked background threads only, these tests do not
|
9
|
+
# actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
|
10
|
+
clean_slate
|
11
|
+
|
12
|
+
include_context 'define shared FLE helpers'
|
13
|
+
|
14
|
+
let(:client) do
|
15
|
+
new_local_client(
|
16
|
+
SpecConfig.instance.addresses,
|
17
|
+
SpecConfig.instance.test_options.merge(
|
18
|
+
{
|
19
|
+
auto_encryption_options: {
|
20
|
+
kms_providers: kms_providers,
|
21
|
+
key_vault_namespace: key_vault_namespace,
|
22
|
+
key_vault_client: key_vault_client_option,
|
23
|
+
schema_map: { 'auto_encryption.users': schema_map }
|
24
|
+
},
|
25
|
+
database: 'auto_encryption'
|
26
|
+
}
|
27
|
+
)
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
let(:unencrypted_client) { authorized_client.use(:auto_encryption) }
|
32
|
+
|
33
|
+
let(:mongocryptd_client) { client.encrypter.mongocryptd_client }
|
34
|
+
let(:key_vault_client) { client.encrypter.key_vault_client }
|
35
|
+
let(:data_key_id) { data_key['_id'] }
|
36
|
+
|
37
|
+
shared_examples 'a functioning client' do
|
38
|
+
it 'can perform an encrypted find command' do
|
39
|
+
doc = client[:users].find(ssn: ssn).first
|
40
|
+
expect(doc).not_to be_nil
|
41
|
+
expect(doc['ssn']).to eq(ssn)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
shared_examples 'a functioning mongocryptd client' do
|
46
|
+
it 'can perform a schemaRequiresEncryption command' do
|
47
|
+
# A schemaRequiresEncryption command; mongocryptd should respond that
|
48
|
+
# this command requires encryption.
|
49
|
+
response = mongocryptd_client.database.command(
|
50
|
+
insert: 'users',
|
51
|
+
ordered: true,
|
52
|
+
lsid: { id: BSON::Binary.new("\x00" * 16, :uuid) },
|
53
|
+
documents: [{
|
54
|
+
ssn: '123-456-7890',
|
55
|
+
_id: BSON::ObjectId.new,
|
56
|
+
}],
|
57
|
+
jsonSchema: schema_map,
|
58
|
+
isRemoteSchema: false
|
59
|
+
)
|
60
|
+
|
61
|
+
expect(response).to be_ok
|
62
|
+
expect(response.documents.first['schemaRequiresEncryption']).to be true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
shared_examples 'a functioning key vault client' do
|
67
|
+
it 'can perform a find command' do
|
68
|
+
doc = key_vault_client.use(key_vault_db)[key_vault_coll].find(_id: data_key_id).first
|
69
|
+
expect(doc).not_to be_nil
|
70
|
+
expect(doc['_id']).to eq(data_key_id)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
shared_examples 'an auto-encryption client that reconnects properly' do
|
75
|
+
before do
|
76
|
+
authorized_client.use(:admin)[:datakeys].drop
|
77
|
+
authorized_client.use(:admin)[:datakeys].insert_one(data_key)
|
78
|
+
|
79
|
+
unencrypted_client[:users].drop
|
80
|
+
# Use a client without auto_encryption_options to insert an
|
81
|
+
# encrypted document into the collection; this ensures that the
|
82
|
+
# client with auto_encryption_options must perform decryption
|
83
|
+
# to properly read the document.
|
84
|
+
unencrypted_client[:users].insert_one(
|
85
|
+
ssn: BSON::Binary.new(Base64.decode64(encrypted_ssn), :ciphertext)
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'after reconnecting without closing main client' do
|
90
|
+
before do
|
91
|
+
client.reconnect
|
92
|
+
end
|
93
|
+
|
94
|
+
it_behaves_like 'a functioning client'
|
95
|
+
it_behaves_like 'a functioning mongocryptd client'
|
96
|
+
it_behaves_like 'a functioning key vault client'
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'after closing and reconnecting main client' do
|
100
|
+
before do
|
101
|
+
client.close
|
102
|
+
client.reconnect
|
103
|
+
end
|
104
|
+
|
105
|
+
it_behaves_like 'a functioning client'
|
106
|
+
it_behaves_like 'a functioning mongocryptd client'
|
107
|
+
it_behaves_like 'a functioning key vault client'
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'after killing client monitor thread' do
|
111
|
+
before do
|
112
|
+
thread = client.cluster.servers.first.monitor.instance_variable_get('@thread')
|
113
|
+
expect(thread).to be_alive
|
114
|
+
|
115
|
+
thread.kill
|
116
|
+
|
117
|
+
sleep 0.1
|
118
|
+
expect(thread).not_to be_alive
|
119
|
+
|
120
|
+
client.reconnect
|
121
|
+
end
|
122
|
+
|
123
|
+
it_behaves_like 'a functioning client'
|
124
|
+
it_behaves_like 'a functioning mongocryptd client'
|
125
|
+
it_behaves_like 'a functioning key vault client'
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'after closing mongocryptd client and reconnecting' do
|
129
|
+
before do
|
130
|
+
mongocryptd_client.close
|
131
|
+
client.reconnect
|
132
|
+
end
|
133
|
+
|
134
|
+
it_behaves_like 'a functioning client'
|
135
|
+
it_behaves_like 'a functioning mongocryptd client'
|
136
|
+
it_behaves_like 'a functioning key vault client'
|
137
|
+
end
|
138
|
+
|
139
|
+
context 'after killing mongocryptd client monitor thread and reconnecting' do
|
140
|
+
before do
|
141
|
+
thread = mongocryptd_client.cluster.servers.first.monitor.instance_variable_get('@thread')
|
142
|
+
expect(thread).to be_alive
|
143
|
+
|
144
|
+
thread.kill
|
145
|
+
|
146
|
+
sleep 0.1
|
147
|
+
expect(thread).not_to be_alive
|
148
|
+
|
149
|
+
client.reconnect
|
150
|
+
end
|
151
|
+
|
152
|
+
it_behaves_like 'a functioning client'
|
153
|
+
it_behaves_like 'a functioning mongocryptd client'
|
154
|
+
it_behaves_like 'a functioning key vault client'
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'after closing key_vault_client and reconnecting' do
|
158
|
+
before do
|
159
|
+
key_vault_client.close
|
160
|
+
client.reconnect
|
161
|
+
end
|
162
|
+
|
163
|
+
it_behaves_like 'a functioning client'
|
164
|
+
it_behaves_like 'a functioning mongocryptd client'
|
165
|
+
it_behaves_like 'a functioning key vault client'
|
166
|
+
end
|
167
|
+
|
168
|
+
context 'after killing key_vault_client monitor thread and reconnecting' do
|
169
|
+
before do
|
170
|
+
thread = key_vault_client.cluster.servers.first.monitor.instance_variable_get('@thread')
|
171
|
+
expect(thread).to be_alive
|
172
|
+
|
173
|
+
thread.kill
|
174
|
+
|
175
|
+
sleep 0.1
|
176
|
+
expect(thread).not_to be_alive
|
177
|
+
|
178
|
+
client.reconnect
|
179
|
+
end
|
180
|
+
|
181
|
+
it_behaves_like 'a functioning client'
|
182
|
+
it_behaves_like 'a functioning mongocryptd client'
|
183
|
+
it_behaves_like 'a functioning key vault client'
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context 'with default key vault client option' do
|
188
|
+
let(:key_vault_client_option) { nil }
|
189
|
+
|
190
|
+
context 'with AWS KMS providers' do
|
191
|
+
include_context 'with AWS kms_providers'
|
192
|
+
it_behaves_like 'an auto-encryption client that reconnects properly'
|
193
|
+
end
|
194
|
+
|
195
|
+
context 'with local KMS providers' do
|
196
|
+
include_context 'with local kms_providers'
|
197
|
+
it_behaves_like 'an auto-encryption client that reconnects properly'
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context 'with custom key vault client option' do
|
202
|
+
let(:key_vault_client_option) do
|
203
|
+
Mongo::Client.new(SpecConfig.instance.addresses).use(:test)
|
204
|
+
end
|
205
|
+
|
206
|
+
context 'with AWS KMS providers' do
|
207
|
+
include_context 'with AWS kms_providers'
|
208
|
+
it_behaves_like 'an auto-encryption client that reconnects properly'
|
209
|
+
end
|
210
|
+
|
211
|
+
context 'with local KMS providers' do
|
212
|
+
include_context 'with local kms_providers'
|
213
|
+
it_behaves_like 'an auto-encryption client that reconnects properly'
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|