|
86 | 86 | EncryptedCollectionError,
|
87 | 87 | EncryptionError,
|
88 | 88 | InvalidOperation,
|
| 89 | + NetworkTimeout, |
89 | 90 | OperationFailure,
|
90 | 91 | ServerSelectionTimeoutError,
|
91 | 92 | WriteError,
|
@@ -3133,5 +3134,107 @@ async def test_explicit_session_errors_when_unsupported(self):
|
3133 | 3134 | await self.mongocryptd_client.db.test.insert_one({"x": 1}, session=s)
|
3134 | 3135 |
|
3135 | 3136 |
|
| 3137 | +# https://github.com/mongodb/specifications/blob/master/source/client-side-operations-timeout/tests/README.md#3-clientencryption |
| 3138 | +class TestCSOTProse(AsyncEncryptionIntegrationTest): |
| 3139 | + mongocryptd_client: AsyncMongoClient |
| 3140 | + MONGOCRYPTD_PORT = 27020 |
| 3141 | + LOCAL_MASTERKEY = Binary( |
| 3142 | + base64.b64decode( |
| 3143 | + b"Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" |
| 3144 | + ), |
| 3145 | + UUID_SUBTYPE, |
| 3146 | + ) |
| 3147 | + |
| 3148 | + async def asyncSetUp(self) -> None: |
| 3149 | + self.listener = OvertCommandListener() |
| 3150 | + self.client = await self.async_single_client( |
| 3151 | + read_preference=ReadPreference.PRIMARY_PREFERRED, event_listeners=[self.listener] |
| 3152 | + ) |
| 3153 | + await self.client.keyvault.datakeys.drop() |
| 3154 | + self.key_vault_client = await self.async_rs_or_single_client( |
| 3155 | + timeoutMS=50, event_listeners=[self.listener] |
| 3156 | + ) |
| 3157 | + self.client_encryption = self.create_client_encryption( |
| 3158 | + key_vault_namespace="keyvault.datakeys", |
| 3159 | + kms_providers={"local": {"key": self.LOCAL_MASTERKEY}}, |
| 3160 | + key_vault_client=self.key_vault_client, |
| 3161 | + codec_options=OPTS, |
| 3162 | + ) |
| 3163 | + |
| 3164 | + # https://github.com/mongodb/specifications/blob/master/source/client-side-operations-timeout/tests/README.md#createdatakey |
| 3165 | + async def test_01_create_data_key(self): |
| 3166 | + async with self.fail_point( |
| 3167 | + { |
| 3168 | + "mode": {"times": 1}, |
| 3169 | + "data": {"failCommands": ["insert"], "blockConnection": True, "blockTimeMS": 100}, |
| 3170 | + } |
| 3171 | + ): |
| 3172 | + self.listener.reset() |
| 3173 | + with self.assertRaisesRegex(EncryptionError, "timed out"): |
| 3174 | + await self.client_encryption.create_data_key("local") |
| 3175 | + |
| 3176 | + events = self.listener.started_events |
| 3177 | + self.assertEqual(1, len(events)) |
| 3178 | + self.assertEqual("insert", events[0].command_name) |
| 3179 | + |
| 3180 | + # https://github.com/mongodb/specifications/blob/master/source/client-side-operations-timeout/tests/README.md#encrypt |
| 3181 | + async def test_02_encrypt(self): |
| 3182 | + data_key_id = await self.client_encryption.create_data_key("local") |
| 3183 | + self.assertEqual(4, data_key_id.subtype) |
| 3184 | + async with self.fail_point( |
| 3185 | + { |
| 3186 | + "mode": {"times": 1}, |
| 3187 | + "data": {"failCommands": ["find"], "blockConnection": True, "blockTimeMS": 100}, |
| 3188 | + } |
| 3189 | + ): |
| 3190 | + self.listener.reset() |
| 3191 | + with self.assertRaisesRegex(EncryptionError, "timed out"): |
| 3192 | + await self.client_encryption.encrypt( |
| 3193 | + "hello", |
| 3194 | + Algorithm.AEAD_AES_256_CBC_HMAC_SHA_512_Deterministic, |
| 3195 | + key_id=data_key_id, |
| 3196 | + ) |
| 3197 | + |
| 3198 | + events = self.listener.started_events |
| 3199 | + self.assertEqual(1, len(events)) |
| 3200 | + self.assertEqual("find", events[0].command_name) |
| 3201 | + |
| 3202 | + # https://github.com/mongodb/specifications/blob/master/source/client-side-operations-timeout/tests/README.md#decrypt |
| 3203 | + async def test_03_decrypt(self): |
| 3204 | + data_key_id = await self.client_encryption.create_data_key("local") |
| 3205 | + self.assertEqual(4, data_key_id.subtype) |
| 3206 | + |
| 3207 | + encrypted = await self.client_encryption.encrypt( |
| 3208 | + "hello", Algorithm.AEAD_AES_256_CBC_HMAC_SHA_512_Deterministic, key_id=data_key_id |
| 3209 | + ) |
| 3210 | + self.assertEqual(6, encrypted.subtype) |
| 3211 | + |
| 3212 | + await self.key_vault_client.close() |
| 3213 | + self.key_vault_client = await self.async_rs_or_single_client( |
| 3214 | + timeoutMS=50, event_listeners=[self.listener] |
| 3215 | + ) |
| 3216 | + await self.client_encryption.close() |
| 3217 | + self.client_encryption = self.create_client_encryption( |
| 3218 | + key_vault_namespace="keyvault.datakeys", |
| 3219 | + kms_providers={"local": {"key": self.LOCAL_MASTERKEY}}, |
| 3220 | + key_vault_client=self.key_vault_client, |
| 3221 | + codec_options=OPTS, |
| 3222 | + ) |
| 3223 | + |
| 3224 | + async with self.fail_point( |
| 3225 | + { |
| 3226 | + "mode": {"times": 1}, |
| 3227 | + "data": {"failCommands": ["find"], "blockConnection": True, "blockTimeMS": 100}, |
| 3228 | + } |
| 3229 | + ): |
| 3230 | + self.listener.reset() |
| 3231 | + with self.assertRaisesRegex(EncryptionError, "timed out"): |
| 3232 | + await self.client_encryption.decrypt(encrypted) |
| 3233 | + |
| 3234 | + events = self.listener.started_events |
| 3235 | + self.assertEqual(1, len(events)) |
| 3236 | + self.assertEqual("find", events[0].command_name) |
| 3237 | + |
| 3238 | + |
3136 | 3239 | if __name__ == "__main__":
|
3137 | 3240 | unittest.main()
|
0 commit comments