13
13
"""Unit test suite for aws_encryption_sdk.deserialize"""
14
14
import io
15
15
import struct
16
- import unittest
17
16
18
17
import pytest
19
- import six
20
18
from cryptography .exceptions import InvalidTag
21
19
from mock import MagicMock , patch , sentinel
22
20
@@ -56,8 +54,9 @@ def test_deserialize_tag():
56
54
assert parsed_tag == tag
57
55
58
56
59
- class TestDeserialize (unittest .TestCase ):
60
- def setUp (self ):
57
+ class TestDeserialize (object ):
58
+ @pytest .fixture (autouse = True )
59
+ def apply_fixtures (self ):
61
60
self .mock_wrapping_algorithm = MagicMock ()
62
61
self .mock_wrapping_algorithm .algorithm .iv_len = VALUES ["iv_len" ]
63
62
@@ -80,8 +79,8 @@ def setUp(self):
80
79
# Set up mock verifier
81
80
self .mock_verifier = MagicMock ()
82
81
self .mock_verifier .update .return_value = None
83
-
84
- def tearDown ( self ):
82
+ yield
83
+ # Run tearDown
85
84
self .mock_decrypt_patcher .stop ()
86
85
self .mock_deserialize_ec_patcher .stop ()
87
86
@@ -109,29 +108,32 @@ def test_validate_header_invalid(self):
109
108
as expected for a valid header.
110
109
"""
111
110
self .mock_decrypt .side_effect = InvalidTag ()
112
- with six . assertRaisesRegex ( self , SerializationError , "Header authorization failed" ) :
111
+ with pytest . raises ( SerializationError ) as excinfo :
113
112
aws_encryption_sdk .internal .formatting .deserialize .validate_header (
114
113
header = VALUES ["deserialized_header_block" ],
115
114
header_auth = VALUES ["deserialized_header_auth_block" ],
116
115
raw_header = VALUES ["header" ],
117
116
data_key = VALUES ["data_key_obj" ],
118
117
)
118
+ excinfo .match ("Header authorization failed" )
119
119
120
120
def test_deserialize_header_unknown_object_type (self ):
121
121
"""Validate that the deserialize_header function behaves
122
122
as expected for an unknown object type.
123
123
"""
124
- with six . assertRaisesRegex ( self , NotSupportedError , "Unsupported type *" ) :
124
+ with pytest . raises ( NotSupportedError ) as excinfo :
125
125
stream = io .BytesIO (VALUES ["serialized_header_invalid_object_type" ])
126
126
aws_encryption_sdk .internal .formatting .deserialize .deserialize_header (stream )
127
+ excinfo .match ("Unsupported type *" )
127
128
128
129
def test_deserialize_header_unknown_version (self ):
129
130
"""Validate that the deserialize_header function behaves
130
131
as expected for an unknown message version.
131
132
"""
132
- with six . assertRaisesRegex ( self , NotSupportedError , "Unsupported version *" ) :
133
+ with pytest . raises ( NotSupportedError ) as excinfo :
133
134
stream = io .BytesIO (VALUES ["serialized_header_invalid_version" ])
134
135
aws_encryption_sdk .internal .formatting .deserialize .deserialize_header (stream )
136
+ excinfo .match ("Unsupported version *" )
135
137
136
138
@patch ("aws_encryption_sdk.internal.formatting.deserialize.AlgorithmSuite.get_by_id" )
137
139
def test_deserialize_header_unsupported_data_encryption_algorithm (self , mock_algorithm_get ):
@@ -141,65 +143,70 @@ def test_deserialize_header_unsupported_data_encryption_algorithm(self, mock_alg
141
143
mock_unsupported_algorithm = MagicMock ()
142
144
mock_unsupported_algorithm .allowed = False
143
145
mock_algorithm_get .return_value = mock_unsupported_algorithm
144
- with six . assertRaisesRegex ( self , NotSupportedError , "Unsupported algorithm *" ) :
146
+ with pytest . raises ( NotSupportedError ) as excinfo :
145
147
stream = io .BytesIO (VALUES ["serialized_header_disallowed_algorithm" ])
146
148
aws_encryption_sdk .internal .formatting .deserialize .deserialize_header (stream )
149
+ excinfo .match ("Unsupported algorithm *" )
147
150
148
151
@patch ("aws_encryption_sdk.internal.formatting.deserialize.AlgorithmSuite.get_by_id" )
149
152
def test_deserialize_header_unknown_data_encryption_algorithm (self , mock_algorithm_get ):
150
153
"""Validate that the deserialize_header function behaves
151
154
as expected for an unknown algorithm.
152
155
"""
153
156
mock_algorithm_get .side_effect = KeyError ()
154
- with six . assertRaisesRegex ( self , UnknownIdentityError , "Unknown algorithm *" ) :
157
+ with pytest . raises ( UnknownIdentityError ) as excinfo :
155
158
stream = io .BytesIO (VALUES ["serialized_header_invalid_algorithm" ])
156
159
aws_encryption_sdk .internal .formatting .deserialize .deserialize_header (stream )
160
+ excinfo .match ("Unknown algorithm *" )
157
161
158
162
def test_deserialize_header_unknown_content_type (self ):
159
163
"""Validate that the deserialize_header function behaves
160
164
as expected for an unknown content type.
161
165
"""
162
- with six . assertRaisesRegex ( self , UnknownIdentityError , "Unknown content type *" ) :
166
+ with pytest . raises ( UnknownIdentityError ) as excinfo :
163
167
stream = io .BytesIO (VALUES ["serialized_header_unknown_content_type" ])
164
168
aws_encryption_sdk .internal .formatting .deserialize .deserialize_header (stream )
169
+ excinfo .match ("Unknown content type *" )
165
170
166
171
def test_deserialize_header_invalid_reserved_space (self ):
167
172
"""Validate that the deserialize_header function behaves
168
173
as expected for an invalid value in the reserved
169
174
space (formerly content AAD).
170
175
"""
171
- with six .assertRaisesRegex (
172
- self , SerializationError , "Content AAD length field is currently unused, its value must be always 0"
173
- ):
176
+ with pytest .raises (SerializationError ) as excinfo :
174
177
stream = io .BytesIO (VALUES ["serialized_header_bad_reserved_space" ])
175
178
aws_encryption_sdk .internal .formatting .deserialize .deserialize_header (stream )
179
+ excinfo .match ("Content AAD length field is currently unused, its value must be always 0" )
176
180
177
181
def test_deserialize_header_bad_iv_len (self ):
178
182
"""Validate that the deserialize_header function behaves
179
183
as expected for bad IV length (incompatible with
180
184
specified algorithm).
181
185
"""
182
- with six . assertRaisesRegex ( self , SerializationError , "Specified IV length *" ) :
186
+ with pytest . raises ( SerializationError ) as excinfo :
183
187
stream = io .BytesIO (VALUES ["serialized_header_bad_iv_len" ])
184
188
aws_encryption_sdk .internal .formatting .deserialize .deserialize_header (stream )
189
+ excinfo .match ("Specified IV length *" )
185
190
186
191
def test_deserialize_header_framed_bad_frame_length (self ):
187
192
"""Validate that the deserialize_header function behaves
188
193
as expected for bad frame length values (greater than
189
194
the default maximum).
190
195
"""
191
- with six . assertRaisesRegex ( self , SerializationError , "Specified frame length larger than allowed maximum: *" ) :
196
+ with pytest . raises ( SerializationError ) as excinfo :
192
197
stream = io .BytesIO (VALUES ["serialized_header_bad_frame_len" ])
193
198
aws_encryption_sdk .internal .formatting .deserialize .deserialize_header (stream )
199
+ excinfo .match ("Specified frame length larger than allowed maximum: *" )
194
200
195
201
def test_deserialize_header_non_framed_bad_frame_length (self ):
196
202
"""Validate that the deserialize_header function behaves
197
203
as expected for bad frame length values for non-framed
198
204
messages (non-zero).
199
205
"""
200
- with six . assertRaisesRegex ( self , SerializationError , "Non-zero frame length found for non-framed message" ) :
206
+ with pytest . raises ( SerializationError ) as excinfo :
201
207
stream = io .BytesIO (VALUES ["serialized_non_framed_header_bad_frame_len" ])
202
208
aws_encryption_sdk .internal .formatting .deserialize .deserialize_header (stream )
209
+ excinfo .match ("Non-zero frame length found for non-framed message" )
203
210
204
211
def test_deserialize_header_valid (self ):
205
212
"""Validate that the deserialize_header function behaves
@@ -247,10 +254,11 @@ def test_deserialize_body_frame_final_invalid_final_frame_length(self):
247
254
behaves as expected for a valid final body frame.
248
255
"""
249
256
stream = io .BytesIO (VALUES ["serialized_final_frame_bad_length" ])
250
- with six . assertRaisesRegex ( self , SerializationError , "Invalid final frame length: *" ) :
257
+ with pytest . raises ( SerializationError ) as excinfo :
251
258
aws_encryption_sdk .internal .formatting .deserialize .deserialize_frame (
252
259
stream = stream , header = VALUES ["deserialized_header_frame" ]
253
260
)
261
+ excinfo .match ("Invalid final frame length: *" )
254
262
255
263
def test_deserialize_footer_no_verifier (self ):
256
264
"""Vaidate that the deserialize_footer function behaves
@@ -275,8 +283,9 @@ def test_deserialize_footer_verifier_no_footer(self):
275
283
with no footer.
276
284
"""
277
285
stream = io .BytesIO (b"" )
278
- with six . assertRaisesRegex ( self , SerializationError , "No signature found in message" ) :
286
+ with pytest . raises ( SerializationError ) as excinfo :
279
287
aws_encryption_sdk .internal .formatting .deserialize .deserialize_footer (stream , self .mock_verifier )
288
+ excinfo .match ("No signature found in message" )
280
289
281
290
@patch ("aws_encryption_sdk.internal.formatting.deserialize.struct" )
282
291
def test_unpack_values (self , mock_struct ):
@@ -328,59 +337,65 @@ def test_deserialize_wrapped_key_symmetric(self):
328
337
)
329
338
330
339
def test_deserialize_wrapped_key_symmetric_wrapping_key_mismatch (self ):
331
- with six . assertRaisesRegex ( self , SerializationError , "Master Key mismatch for wrapped data key" ) :
340
+ with pytest . raises ( SerializationError ) as excinfo :
332
341
aws_encryption_sdk .internal .formatting .deserialize .deserialize_wrapped_key (
333
342
wrapping_algorithm = self .mock_wrapping_algorithm ,
334
343
wrapping_key_id = b"asifuhasjaskldjfhlsakdfj" ,
335
344
wrapped_encrypted_key = VALUES ["wrapped_keys" ]["structures" ]["wrapped_encrypted_data_key_asymmetric" ],
336
345
)
346
+ excinfo .match ("Master Key mismatch for wrapped data key" )
337
347
338
348
def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_info (self ):
339
- with six . assertRaisesRegex ( self , SerializationError , "Malformed key info: key info missing data" ) :
349
+ with pytest . raises ( SerializationError ) as excinfo :
340
350
aws_encryption_sdk .internal .formatting .deserialize .deserialize_wrapped_key (
341
351
wrapping_algorithm = self .mock_wrapping_algorithm ,
342
352
wrapping_key_id = VALUES ["wrapped_keys" ]["raw" ]["key_info" ],
343
353
wrapped_encrypted_key = VALUES ["wrapped_keys" ]["structures" ][
344
354
"wrapped_encrypted_data_key_symmetric_incomplete_info"
345
355
],
346
356
)
357
+ excinfo .match ("Malformed key info: key info missing data" )
347
358
348
359
def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_iv_len_mismatch (self ):
349
- with six . assertRaisesRegex ( self , SerializationError , "Wrapping AlgorithmSuite mismatch for wrapped data key" ) :
360
+ with pytest . raises ( SerializationError ) as excinfo :
350
361
aws_encryption_sdk .internal .formatting .deserialize .deserialize_wrapped_key (
351
362
wrapping_algorithm = self .mock_wrapping_algorithm ,
352
363
wrapping_key_id = VALUES ["wrapped_keys" ]["raw" ]["key_info" ],
353
364
wrapped_encrypted_key = VALUES ["wrapped_keys" ]["structures" ][
354
365
"wrapped_encrypted_data_key_symmetric_bad_iv_len"
355
366
],
356
367
)
368
+ excinfo .match ("Wrapping AlgorithmSuite mismatch for wrapped data key" )
357
369
358
370
def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_iv (self ):
359
- with six . assertRaisesRegex ( self , SerializationError , "Malformed key info: incomplete iv" ) :
371
+ with pytest . raises ( SerializationError ) as excinfo :
360
372
aws_encryption_sdk .internal .formatting .deserialize .deserialize_wrapped_key (
361
373
wrapping_algorithm = self .mock_wrapping_algorithm ,
362
374
wrapping_key_id = VALUES ["wrapped_keys" ]["raw" ]["key_info" ],
363
375
wrapped_encrypted_key = VALUES ["wrapped_keys" ]["structures" ][
364
376
"wrapped_encrypted_data_key_symmetric_incomplete_iv"
365
377
],
366
378
)
379
+ excinfo .match ("Malformed key info: incomplete iv" )
367
380
368
381
def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag (self ):
369
- with six . assertRaisesRegex ( self , SerializationError , "Malformed key info: incomplete ciphertext or tag" ) :
382
+ with pytest . raises ( SerializationError ) as excinfo :
370
383
aws_encryption_sdk .internal .formatting .deserialize .deserialize_wrapped_key (
371
384
wrapping_algorithm = self .mock_wrapping_algorithm ,
372
385
wrapping_key_id = VALUES ["wrapped_keys" ]["raw" ]["key_info" ],
373
386
wrapped_encrypted_key = VALUES ["wrapped_keys" ]["structures" ][
374
387
"wrapped_encrypted_data_key_symmetric_incomplete_tag"
375
388
],
376
389
)
390
+ excinfo .match ("Malformed key info: incomplete ciphertext or tag" )
377
391
378
392
def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag2 (self ):
379
- with six . assertRaisesRegex ( self , SerializationError , "Malformed key info: incomplete ciphertext or tag" ) :
393
+ with pytest . raises ( SerializationError ) as excinfo :
380
394
aws_encryption_sdk .internal .formatting .deserialize .deserialize_wrapped_key (
381
395
wrapping_algorithm = self .mock_wrapping_algorithm ,
382
396
wrapping_key_id = VALUES ["wrapped_keys" ]["raw" ]["key_info" ],
383
397
wrapped_encrypted_key = VALUES ["wrapped_keys" ]["structures" ][
384
398
"wrapped_encrypted_data_key_symmetric_incomplete_tag2"
385
399
],
386
400
)
401
+ excinfo .match ("Malformed key info: incomplete ciphertext or tag" )
0 commit comments