def test_compression(self): # test that we can add compressed chunks compressor = snappy.StreamCompressor() data = b"\0" * 50 compressed_data = snappy.compress(data) crc = struct.pack("<L", snappy._masked_crc32c(data)) self.assertEqual(crc, b"\x8f)H\xbd") self.assertEqual(len(compressed_data), 6) self.assertEqual(compressor.add_chunk(data, compress=True), b"\xff\x06\x00\x00sNaPpY" b"\x00\x0a\x00\x00" + crc + compressed_data) # test that we can add uncompressed chunks data = b"\x01" * 50 crc = struct.pack("<L", snappy._masked_crc32c(data)) self.assertEqual(crc, b"\xb2\x14)\x8a") self.assertEqual(compressor.add_chunk(data, compress=False), b"\x01\x36\x00\x00" + crc + data) # test that we can add more data than will fit in one chunk data = b"\x01" * (snappy._CHUNK_MAX * 2 - 5) crc1 = struct.pack("<L", snappy._masked_crc32c(data[:snappy._CHUNK_MAX])) self.assertEqual(crc1, b"h#6\x8e") crc2 = struct.pack("<L", snappy._masked_crc32c(data[snappy._CHUNK_MAX:])) self.assertEqual(crc2, b"q\x8foE") self.assertEqual(compressor.add_chunk(data, compress=False), b"\x01\x04\x00\x01" + crc1 + data[:snappy._CHUNK_MAX] + b"\x01\xff\xff\x00" + crc2 + data[snappy._CHUNK_MAX:])
def test_decompression(self): # test that we check for the initial stream identifier data = b"\x01" * 50 self.assertRaises(snappy.UncompressError, snappy.StreamDecompressor().decompress, b"\x01\x36\x00\00" + struct.pack("<L", snappy._masked_crc32c(data)) + data) self.assertEqual( snappy.StreamDecompressor().decompress( b"\xff\x06\x00\x00sNaPpY" b"\x01\x36\x00\x00" + struct.pack("<L", snappy._masked_crc32c(data)) + data), data) decompressor = snappy.StreamDecompressor() decompressor.decompress(b"\xff\x06\x00\x00sNaPpY") self.assertEqual( decompressor.copy().decompress( b"\x01\x36\x00\x00" + struct.pack("<L", snappy._masked_crc32c(data)) + data), data) # test that we throw errors for unknown unskippable chunks self.assertRaises(snappy.UncompressError, decompressor.copy().decompress, b"\x03\x01\x00\x00") # test that we skip unknown skippable chunks self.assertEqual(b"", decompressor.copy().decompress(b"\xfe\x01\x00\x00")) # test that we check CRCs compressed_data = snappy.compress(data) real_crc = struct.pack("<L", snappy._masked_crc32c(data)) fake_crc = os.urandom(4) self.assertRaises(snappy.UncompressError, decompressor.copy().decompress, b"\x00\x0a\x00\x00" + fake_crc + compressed_data) self.assertEqual( decompressor.copy().decompress( b"\x00\x0a\x00\x00" + real_crc + compressed_data), data) # test that we buffer when we don't have enough uncompressed_data = os.urandom(100) compressor = snappy.StreamCompressor() compressed_data = (compressor.compress(uncompressed_data[:50]) + compressor.compress(uncompressed_data[50:])) for split1 in range(len(compressed_data) - 1): for split2 in range(split1, len(compressed_data)): decompressor = snappy.StreamDecompressor() self.assertEqual( (decompressor.decompress(compressed_data[:split1]) + decompressor.decompress(compressed_data[split1:split2]) + decompressor.decompress(compressed_data[split2:])), uncompressed_data)