public void TestBadCompression() { using (var serialized = Pool.Reserve()) { var set = new PartitionData { Partition = 42, CompressionCodec = CompressionCodec.Gzip, Messages = new[] { new Message { Key = Key, Value = Value } } }; set.Serialize(serialized, SerializationConfig.ByteArraySerializers); // corrupt compressed data serialized[37] = 8; // recompute crc var crc = (int)Crc32.Compute(serialized, 24, serialized.Length - 24); serialized.Position = 20; BigEndianConverter.Write(serialized, crc); // go serialized.Position = 4; Assert.That(() => FetchPartitionResponse.DeserializeMessageSet(serialized, SerializationConfig.ByteArrayDeserializers), Throws.InstanceOf <UncompressException>()); } }
public void TestDeserializeMessageSet(CompressionCodec codec) { using (var serialized = Pool.Reserve()) { var set = new PartitionData { Partition = 42, CompressionCodec = codec, Messages = new[] { new Message { Key = Key, Value = Value }, new Message { Key = Key, Value = Value } } }; set.Serialize(serialized, SerializationConfig.ByteArraySerializers); serialized.Position = 4; var deserialized = FetchPartitionResponse.DeserializeMessageSet(serialized, SerializationConfig.ByteArrayDeserializers); Assert.AreEqual(2, deserialized.Count); foreach (var msg in deserialized) { Assert.AreEqual(0, msg.Offset); CollectionAssert.AreEqual(Key, msg.Message.Key as byte[]); CollectionAssert.AreEqual(Value, msg.Message.Value as byte[]); } } }
public void TestSerializeMessageSet() { using (var serialized = new ReusableMemoryStream(null)) { var set = new PartitionData { Partition = 42, CompressionCodec = CompressionCodec.None, Messages = new[] { new Message { Key = Key, Value = Value }, new Message { Key = Key, Value = Value } } }; set.Serialize(serialized, SerializationConfig.ByteArraySerializers); serialized.Position = 0; Assert.AreEqual(42, BigEndianConverter.ReadInt32(serialized)); // Partition Assert.AreEqual(serialized.Length - 4 - 4, BigEndianConverter.ReadInt32(serialized)); // MessageSet size Assert.AreEqual(0, BigEndianConverter.ReadInt64(serialized)); // First message offset int firstMsgSize = BigEndianConverter.ReadInt32(serialized); serialized.Position += firstMsgSize; Assert.AreEqual(0, BigEndianConverter.ReadInt64(serialized)); // First message offset int secondMsgSize = BigEndianConverter.ReadInt32(serialized); serialized.Position += secondMsgSize; Assert.AreEqual(serialized.Length, serialized.Position); } }
public void TestBadCrc() { using (var serialized = new ReusableMemoryStream(null)) { var set = new PartitionData { Partition = 42, CompressionCodec = CompressionCodec.None, Messages = new[] { new Message { Key = Key, Value = Value } } }; set.Serialize(serialized, SerializationConfig.ByteArraySerializers); serialized[20] = 8; // change crc serialized.Position = 4; Assert.That(() => FetchPartitionResponse.DeserializeMessageSet(serialized, SerializationConfig.ByteArrayDeserializers), Throws.InstanceOf <CrcException>()); } }
public void TestUnsupportedMagicByte() { using (var serialized = new ReusableMemoryStream(null)) { var set = new PartitionData { Partition = 42, CompressionCodec = CompressionCodec.None, Messages = new[] { new Message { Key = Key, Value = Value } } }; set.Serialize(serialized, SerializationConfig.ByteArraySerializers); serialized[24] = 8; // set non supported magic byte serialized.Position = 4; Assert.That(() => FetchPartitionResponse.DeserializeMessageSet(serialized, SerializationConfig.ByteArrayDeserializers), Throws.InstanceOf <UnsupportedMagicByteVersion>()); } }
public void TestSerializeMessageSetCompressed(CompressionCodec codec, byte attr) { using (var serialized = Pool.Reserve()) { var set = new PartitionData { Partition = 42, CompressionCodec = codec, Messages = new[] { new Message { Key = Key, Value = Value }, new Message { Key = Key, Value = Value } } }; set.Serialize(serialized, SerializationConfig.ByteArraySerializers); serialized.Position = 0; Assert.AreEqual(42, BigEndianConverter.ReadInt32(serialized)); // Partition Assert.AreEqual(serialized.Length - 4 - 4, BigEndianConverter.ReadInt32(serialized)); // MessageSet size Assert.AreEqual(0, BigEndianConverter.ReadInt64(serialized)); // First message offset int firstMsgSize = BigEndianConverter.ReadInt32(serialized); serialized.Position += firstMsgSize; Assert.AreEqual(serialized.Length, serialized.Position); int msgPos = 4 + 4 + 8 + 4; // partition, msgset size, offset, msg size int valuePos = msgPos + 4 + 1 + 1 + 4 + 4; // + crc, magic, attr, key size, value size serialized.Position = msgPos; serialized.Position += 5; Assert.AreEqual(attr, serialized.ReadByte()); // attributes Assert.AreEqual(-1, BigEndianConverter.ReadInt32(serialized)); // No key => size = -1 Assert.AreEqual(serialized.Length - valuePos, BigEndianConverter.ReadInt32(serialized)); // check rest of message length match } }