From 3e3e70158ba3a755ea66e29a696fd74546db5e25 Mon Sep 17 00:00:00 2001
From: Andres Sanchez <asanchez@nearsoft.com>
Date: Wed, 12 Dec 2018 18:33:24 -0600
Subject: [PATCH 1/5] Migrating unit/test_deserialize.py from unittest from
 pytest

---
 test/unit/test_deserialize.py | 62 ++++++++++++++++++++++-------------
 1 file changed, 39 insertions(+), 23 deletions(-)

diff --git a/test/unit/test_deserialize.py b/test/unit/test_deserialize.py
index b591159e0..386652c28 100644
--- a/test/unit/test_deserialize.py
+++ b/test/unit/test_deserialize.py
@@ -13,7 +13,6 @@
 """Unit test suite for aws_encryption_sdk.deserialize"""
 import io
 import struct
-import unittest
 
 import pytest
 import six
@@ -56,8 +55,9 @@ def test_deserialize_tag():
     assert parsed_tag == tag
 
 
-class TestDeserialize(unittest.TestCase):
-    def setUp(self):
+class TestDeserialize(object):
+    @pytest.fixture(autouse=True)
+    def apply_fixtures(self):
         self.mock_wrapping_algorithm = MagicMock()
         self.mock_wrapping_algorithm.algorithm.iv_len = VALUES["iv_len"]
 
@@ -109,29 +109,32 @@ def test_validate_header_invalid(self):
             as expected for a valid header.
         """
         self.mock_decrypt.side_effect = InvalidTag()
-        with six.assertRaisesRegex(self, SerializationError, "Header authorization failed"):
+        with pytest.raises(SerializationError) as excinfo:
             aws_encryption_sdk.internal.formatting.deserialize.validate_header(
                 header=VALUES["deserialized_header_block"],
                 header_auth=VALUES["deserialized_header_auth_block"],
                 raw_header=VALUES["header"],
                 data_key=VALUES["data_key_obj"],
             )
+        excinfo.match("Header authorization failed")
 
     def test_deserialize_header_unknown_object_type(self):
         """Validate that the deserialize_header function behaves
             as expected for an unknown object type.
         """
-        with six.assertRaisesRegex(self, NotSupportedError, "Unsupported type *"):
+        with pytest.raises(NotSupportedError) as excinfo:
             stream = io.BytesIO(VALUES["serialized_header_invalid_object_type"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
+        excinfo.match("Unsupported type *")
 
     def test_deserialize_header_unknown_version(self):
         """Validate that the deserialize_header function behaves
             as expected for an unknown message version.
         """
-        with six.assertRaisesRegex(self, NotSupportedError, "Unsupported version *"):
+        with pytest.raises(NotSupportedError) as excinfo:
             stream = io.BytesIO(VALUES["serialized_header_invalid_version"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
+        excinfo.match("Unsupported version *")
 
     @patch("aws_encryption_sdk.internal.formatting.deserialize.AlgorithmSuite.get_by_id")
     def test_deserialize_header_unsupported_data_encryption_algorithm(self, mock_algorithm_get):
@@ -141,9 +144,10 @@ def test_deserialize_header_unsupported_data_encryption_algorithm(self, mock_alg
         mock_unsupported_algorithm = MagicMock()
         mock_unsupported_algorithm.allowed = False
         mock_algorithm_get.return_value = mock_unsupported_algorithm
-        with six.assertRaisesRegex(self, NotSupportedError, "Unsupported algorithm *"):
+        with pytest.raises(NotSupportedError) as excinfo:
             stream = io.BytesIO(VALUES["serialized_header_disallowed_algorithm"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
+        excinfo.match("Unsupported algorithm *")
 
     @patch("aws_encryption_sdk.internal.formatting.deserialize.AlgorithmSuite.get_by_id")
     def test_deserialize_header_unknown_data_encryption_algorithm(self, mock_algorithm_get):
@@ -151,55 +155,59 @@ def test_deserialize_header_unknown_data_encryption_algorithm(self, mock_algorit
             as expected for an unknown algorithm.
         """
         mock_algorithm_get.side_effect = KeyError()
-        with six.assertRaisesRegex(self, UnknownIdentityError, "Unknown algorithm *"):
+        with pytest.raises(UnknownIdentityError) as excinfo:
             stream = io.BytesIO(VALUES["serialized_header_invalid_algorithm"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
+        excinfo.match("Unknown algorithm *")
 
     def test_deserialize_header_unknown_content_type(self):
         """Validate that the deserialize_header function behaves
             as expected for an unknown content type.
         """
-        with six.assertRaisesRegex(self, UnknownIdentityError, "Unknown content type *"):
+        with pytest.raises(UnknownIdentityError) as excinfo:
             stream = io.BytesIO(VALUES["serialized_header_unknown_content_type"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
+        excinfo.match("Unknown content type *")
 
     def test_deserialize_header_invalid_reserved_space(self):
         """Validate that the deserialize_header function behaves
             as expected for an invalid value in the reserved
             space (formerly content AAD).
         """
-        with six.assertRaisesRegex(
-            self, SerializationError, "Content AAD length field is currently unused, its value must be always 0"
-        ):
+        with pytest.raises(SerializationError) as excinfo:
             stream = io.BytesIO(VALUES["serialized_header_bad_reserved_space"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
+        excinfo.match("Content AAD length field is currently unused, its value must be always 0")
 
     def test_deserialize_header_bad_iv_len(self):
         """Validate that the deserialize_header function behaves
             as expected for bad IV length (incompatible with
             specified algorithm).
         """
-        with six.assertRaisesRegex(self, SerializationError, "Specified IV length *"):
+        with pytest.raises(SerializationError) as excinfo:
             stream = io.BytesIO(VALUES["serialized_header_bad_iv_len"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
+        excinfo.match("Specified IV length *")
 
     def test_deserialize_header_framed_bad_frame_length(self):
         """Validate that the deserialize_header function behaves
             as expected for bad frame length values (greater than
             the default maximum).
         """
-        with six.assertRaisesRegex(self, SerializationError, "Specified frame length larger than allowed maximum: *"):
+        with pytest.raises(SerializationError) as excinfo:
             stream = io.BytesIO(VALUES["serialized_header_bad_frame_len"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
+        excinfo.match("Specified frame length larger than allowed maximum: *")
 
     def test_deserialize_header_non_framed_bad_frame_length(self):
         """Validate that the deserialize_header function behaves
             as expected for bad frame length values for non-framed
             messages (non-zero).
         """
-        with six.assertRaisesRegex(self, SerializationError, "Non-zero frame length found for non-framed message"):
+        with pytest.raises(SerializationError) as excinfo:
             stream = io.BytesIO(VALUES["serialized_non_framed_header_bad_frame_len"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
+        excinfo.match("Non-zero frame length found for non-framed message")
 
     def test_deserialize_header_valid(self):
         """Validate that the deserialize_header function behaves
@@ -247,10 +255,11 @@ def test_deserialize_body_frame_final_invalid_final_frame_length(self):
             behaves as expected for a valid final body frame.
         """
         stream = io.BytesIO(VALUES["serialized_final_frame_bad_length"])
-        with six.assertRaisesRegex(self, SerializationError, "Invalid final frame length: *"):
+        with pytest.raises(SerializationError) as excinfo:
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_frame(
                 stream=stream, header=VALUES["deserialized_header_frame"]
             )
+        excinfo.match("Invalid final frame length: *")
 
     def test_deserialize_footer_no_verifier(self):
         """Vaidate that the deserialize_footer function behaves
@@ -275,8 +284,9 @@ def test_deserialize_footer_verifier_no_footer(self):
             with no footer.
         """
         stream = io.BytesIO(b"")
-        with six.assertRaisesRegex(self, SerializationError, "No signature found in message"):
+        with pytest.raises(SerializationError) as excinfo:
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_footer(stream, self.mock_verifier)
+        excinfo.match("No signature found in message")
 
     @patch("aws_encryption_sdk.internal.formatting.deserialize.struct")
     def test_unpack_values(self, mock_struct):
@@ -328,15 +338,16 @@ def test_deserialize_wrapped_key_symmetric(self):
         )
 
     def test_deserialize_wrapped_key_symmetric_wrapping_key_mismatch(self):
-        with six.assertRaisesRegex(self, SerializationError, "Master Key mismatch for wrapped data key"):
+        with pytest.raises(SerializationError) as excinfo:
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=b"asifuhasjaskldjfhlsakdfj",
                 wrapped_encrypted_key=VALUES["wrapped_keys"]["structures"]["wrapped_encrypted_data_key_asymmetric"],
             )
+        excinfo.match("Master Key mismatch for wrapped data key")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_info(self):
-        with six.assertRaisesRegex(self, SerializationError, "Malformed key info: key info missing data"):
+        with pytest.raises(SerializationError) as excinfo:
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -344,9 +355,10 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_info(se
                     "wrapped_encrypted_data_key_symmetric_incomplete_info"
                 ],
             )
+        excinfo.match("Malformed key info: key info missing data")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_iv_len_mismatch(self):
-        with six.assertRaisesRegex(self, SerializationError, "Wrapping AlgorithmSuite mismatch for wrapped data key"):
+        with pytest.raises(SerializationError) as excinfo:
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -354,9 +366,10 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_iv_len_mismatch(se
                     "wrapped_encrypted_data_key_symmetric_bad_iv_len"
                 ],
             )
+        excinfo.match("Wrapping AlgorithmSuite mismatch for wrapped data key")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_iv(self):
-        with six.assertRaisesRegex(self, SerializationError, "Malformed key info: incomplete iv"):
+        with pytest.raises(SerializationError) as excinfo:
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -364,9 +377,10 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_iv(self
                     "wrapped_encrypted_data_key_symmetric_incomplete_iv"
                 ],
             )
+        excinfo.match("Malformed key info: incomplete iv")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag(self):
-        with six.assertRaisesRegex(self, SerializationError, "Malformed key info: incomplete ciphertext or tag"):
+        with pytest.raises(SerializationError) as excinfo:
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -374,9 +388,10 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag(sel
                     "wrapped_encrypted_data_key_symmetric_incomplete_tag"
                 ],
             )
+        excinfo.match("Malformed key info: incomplete ciphertext or tag")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag2(self):
-        with six.assertRaisesRegex(self, SerializationError, "Malformed key info: incomplete ciphertext or tag"):
+        with pytest.raises(SerializationError) as excinfo:
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -384,3 +399,4 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag2(se
                     "wrapped_encrypted_data_key_symmetric_incomplete_tag2"
                 ],
             )
+        excinfo.match("Malformed key info: incomplete ciphertext or tag")

From a070cb6536565943db3960da4dbf2782f0f2144c Mon Sep 17 00:00:00 2001
From: Andres Sanchez <asanchez@nearsoft.com>
Date: Wed, 12 Dec 2018 18:49:08 -0600
Subject: [PATCH 2/5] Migrate unit/test_provides_kms_master_key.py from
 unittest to pytest

---
 test/unit/test_providers_kms_master_key.py | 27 +++++++++++++---------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/test/unit/test_providers_kms_master_key.py b/test/unit/test_providers_kms_master_key.py
index ec0cef167..406fd134e 100644
--- a/test/unit/test_providers_kms_master_key.py
+++ b/test/unit/test_providers_kms_master_key.py
@@ -11,11 +11,9 @@
 # ANY KIND, either express or implied. See the License for the specific
 # language governing permissions and limitations under the License.
 """Unit test suite for aws_encryption_sdk.key_providers.kms.KMSMasterKey"""
-import unittest
-
 import botocore.client
 import pytest
-import six
+
 from botocore.exceptions import ClientError
 from mock import MagicMock, patch, sentinel
 
@@ -30,8 +28,9 @@
 pytestmark = [pytest.mark.unit, pytest.mark.local]
 
 
-class TestKMSMasterKey(unittest.TestCase):
-    def setUp(self):
+class TestKMSMasterKey(object):
+    @pytest.fixture(autouse=True)
+    def apply_fixture(self):
         self.mock_client = MagicMock()
         self.mock_client.__class__ = botocore.client.BaseClient
         self.mock_client.generate_data_key.return_value = {
@@ -111,14 +110,16 @@ def test_generate_data_key_with_grant_tokens(self):
     def test_generate_data_key_unsuccessful_clienterror(self):
         self.mock_client.generate_data_key.side_effect = ClientError({"Error": {}}, "This is an error!")
         test = KMSMasterKey(config=self.mock_kms_mkc_3)
-        with six.assertRaisesRegex(self, GenerateKeyError, "Master Key .* unable to generate data key"):
+        with pytest.raises(GenerateKeyError) as excinfo:
             test._generate_data_key(self.mock_algorithm)
+        excinfo.match("Master Key .* unable to generate data key")
 
     def test_generate_data_key_unsuccessful_keyerror(self):
         self.mock_client.generate_data_key.side_effect = KeyError
         test = KMSMasterKey(config=self.mock_kms_mkc_3)
-        with six.assertRaisesRegex(self, GenerateKeyError, "Master Key .* unable to generate data key"):
+        with pytest.raises(GenerateKeyError) as excinfo:
             test._generate_data_key(self.mock_algorithm)
+        excinfo.match("Master Key .* unable to generate data key")
 
     def test_encrypt_data_key(self):
         test = KMSMasterKey(config=self.mock_kms_mkc_3)
@@ -146,14 +147,16 @@ def test_encrypt_data_key_with_grant_tokens(self):
     def test_encrypt_data_key_unsuccessful_clienterror(self):
         self.mock_client.encrypt.side_effect = ClientError({"Error": {}}, "This is an error!")
         test = KMSMasterKey(config=self.mock_kms_mkc_3)
-        with six.assertRaisesRegex(self, EncryptKeyError, "Master Key .* unable to encrypt data key"):
+        with pytest.raises(EncryptKeyError) as excinfo:
             test._encrypt_data_key(self.mock_data_key, self.mock_algorithm)
+        excinfo.match("Master Key .* unable to encrypt data key")
 
     def test_encrypt_data_key_unsuccessful_keyerror(self):
         self.mock_client.encrypt.side_effect = KeyError
         test = KMSMasterKey(config=self.mock_kms_mkc_3)
-        with six.assertRaisesRegex(self, EncryptKeyError, "Master Key .* unable to encrypt data key"):
+        with pytest.raises(EncryptKeyError) as excinfo:
             test._encrypt_data_key(self.mock_data_key, self.mock_algorithm)
+        excinfo.match("Master Key .* unable to encrypt data key")
 
     def test_decrypt_data_key(self):
         test = KMSMasterKey(config=self.mock_kms_mkc_1)
@@ -186,11 +189,13 @@ def test_decrypt_data_key_with_grant_tokens(self):
     def test_decrypt_data_key_unsuccessful_clienterror(self):
         self.mock_client.decrypt.side_effect = ClientError({"Error": {}}, "This is an error!")
         test = KMSMasterKey(config=self.mock_kms_mkc_3)
-        with six.assertRaisesRegex(self, DecryptKeyError, "Master Key .* unable to decrypt data key"):
+        with pytest.raises(DecryptKeyError) as excinfo:
             test._decrypt_data_key(encrypted_data_key=self.mock_encrypted_data_key, algorithm=sentinel.algorithm)
+        excinfo.match("Master Key .* unable to decrypt data key")
 
     def test_decrypt_data_key_unsuccessful_keyerror(self):
         self.mock_client.decrypt.side_effect = KeyError
         test = KMSMasterKey(config=self.mock_kms_mkc_3)
-        with six.assertRaisesRegex(self, DecryptKeyError, "Master Key .* unable to decrypt data key"):
+        with pytest.raises(DecryptKeyError) as excinfo:
             test._decrypt_data_key(encrypted_data_key=self.mock_encrypted_data_key, algorithm=sentinel.algorithm)
+        excinfo.match("Master Key .* unable to decrypt data key")

From 91a1f092849db120d25a5b77f41e09fc94b68177 Mon Sep 17 00:00:00 2001
From: Andres Sanchez <asanchez@nearsoft.com>
Date: Thu, 13 Dec 2018 11:59:27 -0600
Subject: [PATCH 3/5] Removed unit test not corresponding to this branch

---
 test/unit/test_deserialize.py | 62 +++++++++++++----------------------
 1 file changed, 23 insertions(+), 39 deletions(-)

diff --git a/test/unit/test_deserialize.py b/test/unit/test_deserialize.py
index 386652c28..b591159e0 100644
--- a/test/unit/test_deserialize.py
+++ b/test/unit/test_deserialize.py
@@ -13,6 +13,7 @@
 """Unit test suite for aws_encryption_sdk.deserialize"""
 import io
 import struct
+import unittest
 
 import pytest
 import six
@@ -55,9 +56,8 @@ def test_deserialize_tag():
     assert parsed_tag == tag
 
 
-class TestDeserialize(object):
-    @pytest.fixture(autouse=True)
-    def apply_fixtures(self):
+class TestDeserialize(unittest.TestCase):
+    def setUp(self):
         self.mock_wrapping_algorithm = MagicMock()
         self.mock_wrapping_algorithm.algorithm.iv_len = VALUES["iv_len"]
 
@@ -109,32 +109,29 @@ def test_validate_header_invalid(self):
             as expected for a valid header.
         """
         self.mock_decrypt.side_effect = InvalidTag()
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Header authorization failed"):
             aws_encryption_sdk.internal.formatting.deserialize.validate_header(
                 header=VALUES["deserialized_header_block"],
                 header_auth=VALUES["deserialized_header_auth_block"],
                 raw_header=VALUES["header"],
                 data_key=VALUES["data_key_obj"],
             )
-        excinfo.match("Header authorization failed")
 
     def test_deserialize_header_unknown_object_type(self):
         """Validate that the deserialize_header function behaves
             as expected for an unknown object type.
         """
-        with pytest.raises(NotSupportedError) as excinfo:
+        with six.assertRaisesRegex(self, NotSupportedError, "Unsupported type *"):
             stream = io.BytesIO(VALUES["serialized_header_invalid_object_type"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
-        excinfo.match("Unsupported type *")
 
     def test_deserialize_header_unknown_version(self):
         """Validate that the deserialize_header function behaves
             as expected for an unknown message version.
         """
-        with pytest.raises(NotSupportedError) as excinfo:
+        with six.assertRaisesRegex(self, NotSupportedError, "Unsupported version *"):
             stream = io.BytesIO(VALUES["serialized_header_invalid_version"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
-        excinfo.match("Unsupported version *")
 
     @patch("aws_encryption_sdk.internal.formatting.deserialize.AlgorithmSuite.get_by_id")
     def test_deserialize_header_unsupported_data_encryption_algorithm(self, mock_algorithm_get):
@@ -144,10 +141,9 @@ def test_deserialize_header_unsupported_data_encryption_algorithm(self, mock_alg
         mock_unsupported_algorithm = MagicMock()
         mock_unsupported_algorithm.allowed = False
         mock_algorithm_get.return_value = mock_unsupported_algorithm
-        with pytest.raises(NotSupportedError) as excinfo:
+        with six.assertRaisesRegex(self, NotSupportedError, "Unsupported algorithm *"):
             stream = io.BytesIO(VALUES["serialized_header_disallowed_algorithm"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
-        excinfo.match("Unsupported algorithm *")
 
     @patch("aws_encryption_sdk.internal.formatting.deserialize.AlgorithmSuite.get_by_id")
     def test_deserialize_header_unknown_data_encryption_algorithm(self, mock_algorithm_get):
@@ -155,59 +151,55 @@ def test_deserialize_header_unknown_data_encryption_algorithm(self, mock_algorit
             as expected for an unknown algorithm.
         """
         mock_algorithm_get.side_effect = KeyError()
-        with pytest.raises(UnknownIdentityError) as excinfo:
+        with six.assertRaisesRegex(self, UnknownIdentityError, "Unknown algorithm *"):
             stream = io.BytesIO(VALUES["serialized_header_invalid_algorithm"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
-        excinfo.match("Unknown algorithm *")
 
     def test_deserialize_header_unknown_content_type(self):
         """Validate that the deserialize_header function behaves
             as expected for an unknown content type.
         """
-        with pytest.raises(UnknownIdentityError) as excinfo:
+        with six.assertRaisesRegex(self, UnknownIdentityError, "Unknown content type *"):
             stream = io.BytesIO(VALUES["serialized_header_unknown_content_type"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
-        excinfo.match("Unknown content type *")
 
     def test_deserialize_header_invalid_reserved_space(self):
         """Validate that the deserialize_header function behaves
             as expected for an invalid value in the reserved
             space (formerly content AAD).
         """
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(
+            self, SerializationError, "Content AAD length field is currently unused, its value must be always 0"
+        ):
             stream = io.BytesIO(VALUES["serialized_header_bad_reserved_space"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
-        excinfo.match("Content AAD length field is currently unused, its value must be always 0")
 
     def test_deserialize_header_bad_iv_len(self):
         """Validate that the deserialize_header function behaves
             as expected for bad IV length (incompatible with
             specified algorithm).
         """
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Specified IV length *"):
             stream = io.BytesIO(VALUES["serialized_header_bad_iv_len"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
-        excinfo.match("Specified IV length *")
 
     def test_deserialize_header_framed_bad_frame_length(self):
         """Validate that the deserialize_header function behaves
             as expected for bad frame length values (greater than
             the default maximum).
         """
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Specified frame length larger than allowed maximum: *"):
             stream = io.BytesIO(VALUES["serialized_header_bad_frame_len"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
-        excinfo.match("Specified frame length larger than allowed maximum: *")
 
     def test_deserialize_header_non_framed_bad_frame_length(self):
         """Validate that the deserialize_header function behaves
             as expected for bad frame length values for non-framed
             messages (non-zero).
         """
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Non-zero frame length found for non-framed message"):
             stream = io.BytesIO(VALUES["serialized_non_framed_header_bad_frame_len"])
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_header(stream)
-        excinfo.match("Non-zero frame length found for non-framed message")
 
     def test_deserialize_header_valid(self):
         """Validate that the deserialize_header function behaves
@@ -255,11 +247,10 @@ def test_deserialize_body_frame_final_invalid_final_frame_length(self):
             behaves as expected for a valid final body frame.
         """
         stream = io.BytesIO(VALUES["serialized_final_frame_bad_length"])
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Invalid final frame length: *"):
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_frame(
                 stream=stream, header=VALUES["deserialized_header_frame"]
             )
-        excinfo.match("Invalid final frame length: *")
 
     def test_deserialize_footer_no_verifier(self):
         """Vaidate that the deserialize_footer function behaves
@@ -284,9 +275,8 @@ def test_deserialize_footer_verifier_no_footer(self):
             with no footer.
         """
         stream = io.BytesIO(b"")
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "No signature found in message"):
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_footer(stream, self.mock_verifier)
-        excinfo.match("No signature found in message")
 
     @patch("aws_encryption_sdk.internal.formatting.deserialize.struct")
     def test_unpack_values(self, mock_struct):
@@ -338,16 +328,15 @@ def test_deserialize_wrapped_key_symmetric(self):
         )
 
     def test_deserialize_wrapped_key_symmetric_wrapping_key_mismatch(self):
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Master Key mismatch for wrapped data key"):
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=b"asifuhasjaskldjfhlsakdfj",
                 wrapped_encrypted_key=VALUES["wrapped_keys"]["structures"]["wrapped_encrypted_data_key_asymmetric"],
             )
-        excinfo.match("Master Key mismatch for wrapped data key")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_info(self):
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Malformed key info: key info missing data"):
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -355,10 +344,9 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_info(se
                     "wrapped_encrypted_data_key_symmetric_incomplete_info"
                 ],
             )
-        excinfo.match("Malformed key info: key info missing data")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_iv_len_mismatch(self):
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Wrapping AlgorithmSuite mismatch for wrapped data key"):
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -366,10 +354,9 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_iv_len_mismatch(se
                     "wrapped_encrypted_data_key_symmetric_bad_iv_len"
                 ],
             )
-        excinfo.match("Wrapping AlgorithmSuite mismatch for wrapped data key")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_iv(self):
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Malformed key info: incomplete iv"):
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -377,10 +364,9 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_iv(self
                     "wrapped_encrypted_data_key_symmetric_incomplete_iv"
                 ],
             )
-        excinfo.match("Malformed key info: incomplete iv")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag(self):
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Malformed key info: incomplete ciphertext or tag"):
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -388,10 +374,9 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag(sel
                     "wrapped_encrypted_data_key_symmetric_incomplete_tag"
                 ],
             )
-        excinfo.match("Malformed key info: incomplete ciphertext or tag")
 
     def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag2(self):
-        with pytest.raises(SerializationError) as excinfo:
+        with six.assertRaisesRegex(self, SerializationError, "Malformed key info: incomplete ciphertext or tag"):
             aws_encryption_sdk.internal.formatting.deserialize.deserialize_wrapped_key(
                 wrapping_algorithm=self.mock_wrapping_algorithm,
                 wrapping_key_id=VALUES["wrapped_keys"]["raw"]["key_info"],
@@ -399,4 +384,3 @@ def test_deserialize_wrapped_key_symmetric_wrapping_algorithm_incomplete_tag2(se
                     "wrapped_encrypted_data_key_symmetric_incomplete_tag2"
                 ],
             )
-        excinfo.match("Malformed key info: incomplete ciphertext or tag")

From 41aeda302957ab42e31681af5d6dea3a06897073 Mon Sep 17 00:00:00 2001
From: Andres Sanchez <asanchez@nearsoft.com>
Date: Mon, 17 Dec 2018 13:51:19 -0600
Subject: [PATCH 4/5] Added yield and tearDown to apply_fixtures function

---
 test/unit/test_providers_kms_master_key.py | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/test/unit/test_providers_kms_master_key.py b/test/unit/test_providers_kms_master_key.py
index 406fd134e..8a5a7ce3b 100644
--- a/test/unit/test_providers_kms_master_key.py
+++ b/test/unit/test_providers_kms_master_key.py
@@ -58,13 +58,14 @@ def apply_fixture(self):
             key_id=VALUES["arn"], client=self.mock_client, grant_tokens=self.mock_grant_tokens
         )
         self.mock_kms_mkc_3 = KMSMasterKeyConfig(key_id="ex_key_info", client=self.mock_client)
+        yield
+        # Run tearDown
+        self.mock_data_key_len_check_patcher.stop()
+
 
     def test_parent(self):
         assert issubclass(KMSMasterKey, MasterKey)
 
-    def tearDown(self):
-        self.mock_data_key_len_check_patcher.stop()
-
     def test_config_bare(self):
         test = KMSMasterKeyConfig(key_id=VALUES["arn"], client=self.mock_client)
         assert test.client is self.mock_client

From d0b136384f49dc8bf60eb2b46f7eca568618b411 Mon Sep 17 00:00:00 2001
From: Andres Sanchez <asanchez@nearsoft.com>
Date: Mon, 17 Dec 2018 16:37:19 -0600
Subject: [PATCH 5/5] Lintering issues, fixed with tox -re autoformat

---
 test/unit/test_providers_kms_master_key.py | 2 --
 1 file changed, 2 deletions(-)

diff --git a/test/unit/test_providers_kms_master_key.py b/test/unit/test_providers_kms_master_key.py
index 8a5a7ce3b..c0ab9a968 100644
--- a/test/unit/test_providers_kms_master_key.py
+++ b/test/unit/test_providers_kms_master_key.py
@@ -13,7 +13,6 @@
 """Unit test suite for aws_encryption_sdk.key_providers.kms.KMSMasterKey"""
 import botocore.client
 import pytest
-
 from botocore.exceptions import ClientError
 from mock import MagicMock, patch, sentinel
 
@@ -62,7 +61,6 @@ def apply_fixture(self):
         # Run tearDown
         self.mock_data_key_len_check_patcher.stop()
 
-
     def test_parent(self):
         assert issubclass(KMSMasterKey, MasterKey)