def test_none_compression(self): codecs = compression.registry.compressors self.assertIn(None, codecs) # check exception is raised when bytes are not passed in with self.assertRaises(Exception) as cm: compression.compress({}) self.assertIn("Can only compress bytes", str(cm.exception)) # perform roundtrip check content_type, payload = compression.compress(TEST_DATA) self.assertIsNone(content_type) self.assertEqual(TEST_DATA, payload) content_type, d = compression.decompress(payload) self.assertIsNone(content_type) self.assertEqual(d, TEST_DATA)
def test_snappy_compression(self): convenience_name = "snappy" mime_type = compression.COMPRESSION_SNAPPY # check exception is raised when bytes are not passed in with self.assertRaises(Exception) as cm: compression.compress({}, mime_type) self.assertIn("Can only compress bytes", str(cm.exception)) # perform roundtrip check for c_name in (convenience_name, mime_type): with self.subTest(f"Check snappy compression roundtrip using {c_name}"): content_type, payload = compression.compress(TEST_DATA, c_name) self.assertEqual(content_type, mime_type) self.assertNotEqual(TEST_DATA, payload) content_type, d = compression.decompress(payload, content_type) self.assertEqual(content_type, mime_type) self.assertEqual(d, TEST_DATA)
def test_compression_roundtrip(self): codecs = compression.registry.compressors for name, _settings in codecs.items(): with self.subTest(f"Check {name} compression roundtrip"): convenience_name = name mime_type = compression.registry.name_to_type[name] # The convenience name or the content_type can be used when # specifying compression method. Check both. for c_label in (convenience_name, mime_type): content_type, payload = compression.compress(TEST_DATA, c_label) self.assertEqual(content_type, mime_type) if c_label is None: self.assertEqual(TEST_DATA, payload) else: self.assertNotEqual(TEST_DATA, payload) content_type, d = compression.decompress(payload, content_type) self.assertEqual(content_type, mime_type) self.assertEqual(d, TEST_DATA)
def decode_payload( data: bytes, compression: Optional[str] = None, content_type: Optional[str] = None, content_encoding: Optional[str] = None, type_identifier: Optional[int] = None, ) -> Any: """ Decode a message payload :param data: The message payload data to decode. :param content_type: A string specifying the message content type. By default the value is None. :param compression: An optional string specifying a compression mime-type. :param type_identifier: An integer that uniquely identifies a registered message. """ if compression: try: _mime_type, data = decompress(data, compression) except Exception as exc: raise Exception( f"Error decompressing payload using {compression}: {exc}" ) from None try: payload = loads(data, content_type, content_encoding, type_identifier=type_identifier) except Exception as exc: raise Exception( f"Error decoding payload with content-type={content_type}: {exc}" ) from None return payload
def test_decompress_with_invalid_name_or_type(self): with self.assertRaises(Exception) as cm: compression.decompress(b"a", "invalid") self.assertIn("Invalid compressor", str(cm.exception))