foreign/csharp/Iggy_SDK_Tests/MapperTests/BinaryMapper.cs (290 lines of code) (raw):
using Iggy_SDK.Contracts.Http;
using Iggy_SDK_Tests.Utils;
using Iggy_SDK_Tests.Utils.DummyObj;
using Iggy_SDK_Tests.Utils.Groups;
using Iggy_SDK_Tests.Utils.Messages;
using Iggy_SDK_Tests.Utils.Stats;
using Iggy_SDK_Tests.Utils.Topics;
using Iggy_SDK.Extensions;
using System.Buffers.Binary;
using System.Text;
using StreamFactory = Iggy_SDK_Tests.Utils.Streams.StreamFactory;
namespace Iggy_SDK_Tests.MapperTests;
public sealed class BinaryMapper
{
[Fact]
public void MapPersonalAccessTokens_ReturnsValidPersonalAccessTokenResponse()
{
// Arrange
string name = "test";
uint expiry = 69420;
var assertExpiry = DateTimeOffsetUtils.FromUnixTimeMicroSeconds(expiry).LocalDateTime;
var payload = BinaryFactory.CreatePersonalAccessTokensPayload(name, expiry);
// Act
var response = Iggy_SDK.Mappers.BinaryMapper.MapPersonalAccessTokens(payload);
// Assert
Assert.NotNull(response);
Assert.Equal(name, response[0].Name);
Assert.Equal(assertExpiry, response[0].ExpiryAt);
}
[Fact]
public void MapOffsets_ReturnsValidOffsetResponse()
{
// Arrange
var partitionId = Random.Shared.Next(1, 19);
var currentOffset = (ulong)Random.Shared.Next(420, 69420);
var storedOffset = (ulong)Random.Shared.Next(69, 420);
byte[] payload = BinaryFactory.CreateOffsetPayload(partitionId, currentOffset, storedOffset);
// Act
OffsetResponse response = Iggy_SDK.Mappers.BinaryMapper.MapOffsets(payload);
// Assert
Assert.NotNull(response);
Assert.Equal(partitionId, response.PartitionId);
Assert.Equal(currentOffset, response.CurrentOffset);
Assert.Equal(storedOffset, response.StoredOffset);
}
[Fact]
public void MapMessagesTMessage_NoHeaders_ReturnsValidMessageResponse()
{
//Arrange
Func<byte[], DummyMessage> deserializer = bytes =>
{
int id = BinaryPrimitives.ReadInt32LittleEndian(bytes);
int textLength = BinaryPrimitives.ReadInt32LittleEndian(bytes[4..8]);
string text = Encoding.UTF8.GetString(bytes[8..(8 + textLength)]);
return new DummyMessage { Id = id, Text = text };
};
var (offset, timestamp, guid, headersLength, checkSum, payload) = MessageFactory.CreateMessageResponseFieldsTMessage();
byte[] msgOnePayload = BinaryFactory.CreateMessagePayload(offset, timestamp, 0, checkSum,
guid, payload);
var (offset1, timestamp1, guid1, headersLength1, checkSum2, payload1) = MessageFactory.CreateMessageResponseFieldsTMessage();
byte[] msgTwoPayload = BinaryFactory.CreateMessagePayload(offset1, timestamp1, 0, checkSum2,
guid1, payload1);
byte[] combinedPayload = new byte[16 + msgOnePayload.Length + msgTwoPayload.Length];
for (int i = 16; i < msgOnePayload.Length + 16; i++)
{
combinedPayload[i] = msgOnePayload[i - 16];
}
for (int i = 0; i < msgTwoPayload.Length; i++)
{
combinedPayload[16 + msgOnePayload.Length + i] = msgTwoPayload[i];
}
//Act
var response = Iggy_SDK.Mappers.BinaryMapper.MapMessages<DummyMessage>(combinedPayload, bytes =>
{
var id = BitConverter.ToInt32(bytes[..4]);
var txtLength = BitConverter.ToInt32(bytes[4..8]);
var text = Encoding.UTF8.GetString(bytes[txtLength..]);
return new DummyMessage
{
Id = id,
Text = text
};
});
//Assert
Assert.NotEmpty(response.Messages);
Assert.Equal(2, response.Messages.Count);
Assert.Equal(response.Messages[0].Id, guid);
Assert.Equal(response.Messages[0].Offset, offset);
Assert.Equal(response.Messages[0].Timestamp, timestamp);
Assert.Equal(response.Messages[1].Id, guid1);
Assert.Equal(response.Messages[1].Offset, offset1);
Assert.Equal(response.Messages[1].Timestamp, timestamp1);
Assert.Equal(response.Messages[0].Message.Id, deserializer(payload).Id);
}
[Fact]
public void MapMessages_NoHeaders_ReturnsValidMessageResponses()
{
// Arrange
var (offset, timestamp, guid, headersLength, checkSum, payload) = MessageFactory.CreateMessageResponseFields();
byte[] msgOnePayload = BinaryFactory.CreateMessagePayload(offset, timestamp, 0, checkSum,
guid, payload);
var (offset1, timestamp1, guid1, headersLength2, checkSum2, payload1) = MessageFactory.CreateMessageResponseFields();
byte[] msgTwoPayload = BinaryFactory.CreateMessagePayload(offset1, timestamp1, 0, checkSum2,
guid1, payload1);
byte[] combinedPayload = new byte[16 + msgOnePayload.Length + msgTwoPayload.Length];
for (int i = 16; i < msgOnePayload.Length + 16; i++)
{
combinedPayload[i] = msgOnePayload[i - 16];
}
for (int i = 0; i < msgTwoPayload.Length; i++)
{
combinedPayload[16 + msgOnePayload.Length + i] = msgTwoPayload[i];
}
// Act
var responses = Iggy_SDK.Mappers.BinaryMapper.MapMessages(combinedPayload);
// Assert
Assert.NotNull(responses);
Assert.Equal(2, responses.Messages.Count());
MessageResponse response1 = responses.Messages.ElementAt(0);
Assert.Equal(offset, response1.Offset);
Assert.Equal(timestamp, response1.Timestamp);
Assert.Equal(guid, response1.Id);
Assert.Equal(payload, response1.Payload);
MessageResponse response2 = responses.Messages.ElementAt(1);
Assert.Equal(offset1, response2.Offset);
Assert.Equal(timestamp1, response2.Timestamp);
Assert.Equal(guid1, response2.Id);
Assert.Equal(payload1, response2.Payload);
}
[Fact]
public void MapStreams_ReturnsValidStreamsResponses()
{
// Arrange
var (id1, topicsCount1, sizeBytes, messagesCount, name1, createdAt) = StreamFactory.CreateStreamsResponseFields();
byte[] payload1 = BinaryFactory.CreateStreamPayload(id1, topicsCount1, name1, sizeBytes, messagesCount, createdAt);
var (id2, topicsCount2, sizeBytes2, messagesCount2, name2, createdAt2) = StreamFactory.CreateStreamsResponseFields();
byte[] payload2 = BinaryFactory.CreateStreamPayload(id2, topicsCount2, name2, sizeBytes2, messagesCount2, createdAt2);
byte[] combinedPayload = new byte[payload1.Length + payload2.Length];
payload1.CopyTo(combinedPayload.AsSpan());
payload2.CopyTo(combinedPayload.AsSpan(payload1.Length));
// Act
IEnumerable<StreamResponse> responses = Iggy_SDK.Mappers.BinaryMapper.MapStreams(combinedPayload).ToList();
// Assert
Assert.NotNull(responses);
Assert.Equal(2, responses.Count());
var response1 = responses.ElementAt(0);
Assert.Equal(id1, response1.Id);
Assert.Equal(topicsCount1, response1.TopicsCount);
Assert.Equal(sizeBytes, response1.Size);
Assert.Equal(messagesCount, response1.MessagesCount);
Assert.Equal(name1, response1.Name);
var response2 = responses.ElementAt(1);
Assert.Equal(id2, response2.Id);
Assert.Equal(topicsCount2, response2.TopicsCount);
Assert.Equal(sizeBytes2, response2.Size);
Assert.Equal(messagesCount2, response2.MessagesCount);
Assert.Equal(name2, response2.Name);
}
[Fact]
public void MapStream_ReturnsValidStreamResponse()
{
// Arrange
var (id, topicsCount, sizeBytes, messagesCount, name, createdAt) = StreamFactory.CreateStreamsResponseFields();
byte[] streamPayload = BinaryFactory.CreateStreamPayload(id, topicsCount, name, sizeBytes, messagesCount, createdAt);
var (topicId1, partitionsCount1, topicName1, messageExpiry1, topicSizeBytes1, messagesCountTopic1, createdAtTopic, replicationFactor, maxTopicSize) =
TopicFactory.CreateTopicResponseFields();
byte[] topicPayload1 = BinaryFactory.CreateTopicPayload(topicId1,
partitionsCount1,
messageExpiry1,
topicName1,
topicSizeBytes1,
messagesCountTopic1, createdAt, replicationFactor, maxTopicSize);
byte[] topicCombinedPayload = new byte[topicPayload1.Length];
topicPayload1.CopyTo(topicCombinedPayload.AsSpan());
byte[] streamCombinedPayload = new byte[streamPayload.Length + topicCombinedPayload.Length];
streamPayload.CopyTo(streamCombinedPayload.AsSpan());
topicCombinedPayload.CopyTo(streamCombinedPayload.AsSpan(streamPayload.Length));
// Act
var response = Iggy_SDK.Mappers.BinaryMapper.MapStream(streamCombinedPayload);
// Assert
Assert.NotNull(response);
Assert.Equal(id, response.Id);
Assert.Equal(topicsCount, response.TopicsCount);
Assert.Equal(name, response.Name);
Assert.Equal(sizeBytes, response.Size);
Assert.Equal(messagesCount, response.MessagesCount);
Assert.NotNull(response.Topics);
Assert.Single(response.Topics.ToList());
var topicResponse = response.Topics.First();
Assert.Equal(topicId1, topicResponse.Id);
Assert.Equal(partitionsCount1, topicResponse.PartitionsCount);
Assert.Equal(messagesCountTopic1, topicResponse.MessagesCount);
Assert.Equal(topicName1, topicResponse.Name);
}
[Fact]
public void MapTopics_ReturnsValidTopicsResponses()
{
// Arrange
var (id1, partitionsCount1, name1, messageExpiry1, sizeBytesTopic1, messagesCountTopic1, createdAt,
replicationFactor1, maxTopicSize1) =
TopicFactory.CreateTopicResponseFields();
byte[] payload1 = BinaryFactory.CreateTopicPayload(id1, partitionsCount1, messageExpiry1, name1,
sizeBytesTopic1, messagesCountTopic1, createdAt, replicationFactor1, maxTopicSize1);
var (id2, partitionsCount2, name2, messageExpiry2, sizeBytesTopic2, messagesCountTopic2, createdAt2,
replicationFactor2, maxTopicSize2) =
TopicFactory.CreateTopicResponseFields();
byte[] payload2 = BinaryFactory.CreateTopicPayload(id2, partitionsCount2, messageExpiry2, name2,
sizeBytesTopic2, messagesCountTopic2, createdAt2, replicationFactor2, maxTopicSize2);
byte[] combinedPayload = new byte[payload1.Length + payload2.Length];
payload1.CopyTo(combinedPayload.AsSpan());
payload2.CopyTo(combinedPayload.AsSpan(payload1.Length));
// Act
var responses = Iggy_SDK.Mappers.BinaryMapper.MapTopics(combinedPayload);
// Assert
Assert.NotNull(responses);
Assert.Equal(2, responses.Count());
var response1 = responses.ElementAt(0);
Assert.Equal(id1, response1.Id);
Assert.Equal(partitionsCount1, response1.PartitionsCount);
Assert.Equal(sizeBytesTopic1, response1.Size);
Assert.Equal(messagesCountTopic1, response1.MessagesCount);
Assert.Equal(name1, response1.Name);
var response2 = responses.ElementAt(1);
Assert.Equal(id2, response2.Id);
Assert.Equal(sizeBytesTopic2, response2.Size);
Assert.Equal(messagesCountTopic2, response2.MessagesCount);
Assert.Equal(partitionsCount2, response2.PartitionsCount);
Assert.Equal(name2, response2.Name);
}
[Fact]
public void MapTopic_ReturnsValidTopicResponse()
{
// Arrange
var (topicId, partitionsCount, topicName, messageExpiry, sizeBytes, messagesCount, createdAt2, replicationFactor, maxTopicSize) = TopicFactory.CreateTopicResponseFields();
byte[] topicPayload = BinaryFactory.CreateTopicPayload(topicId, partitionsCount, messageExpiry, topicName, sizeBytes, messagesCount, createdAt2, replicationFactor, maxTopicSize);
byte[] combinedPayload = new byte[topicPayload.Length];
topicPayload.CopyTo(combinedPayload.AsSpan());
// Act
TopicResponse response = Iggy_SDK.Mappers.BinaryMapper.MapTopic(combinedPayload);
// Assert
Assert.NotNull(response);
Assert.Equal(messagesCount, response.MessagesCount);
Assert.Equal(partitionsCount, response.PartitionsCount);
Assert.Equal(sizeBytes, response.Size);
Assert.Equal(topicId, response.Id);
Assert.Equal(topicName, response.Name);
}
[Fact]
public void MapConsumerGroups_ReturnsValidConsumerGroupsResponses()
{
// Arrange
var (id1, membersCount1, partitionsCount1, name) = ConsumerGroupFactory.CreateConsumerGroupResponseFields();
byte[] payload1 = BinaryFactory.CreateGroupPayload(id1, membersCount1, partitionsCount1, name);
var (id2, membersCount2, partitionsCount2, name2) = ConsumerGroupFactory.CreateConsumerGroupResponseFields();
byte[] payload2 = BinaryFactory.CreateGroupPayload(id2, membersCount2, partitionsCount2, name2);
byte[] combinedPayload = new byte[payload1.Length + payload2.Length];
payload1.CopyTo(combinedPayload.AsSpan());
payload2.CopyTo(combinedPayload.AsSpan(payload1.Length));
// Act
List<ConsumerGroupResponse> responses = Iggy_SDK.Mappers.BinaryMapper.MapConsumerGroups(combinedPayload);
// Assert
Assert.NotNull(responses);
Assert.Equal(2, responses.Count);
ConsumerGroupResponse response1 = responses[0];
Assert.Equal(id1, response1.Id);
Assert.Equal(membersCount1, response1.MembersCount);
Assert.Equal(partitionsCount1, response1.PartitionsCount);
ConsumerGroupResponse response2 = responses[1];
Assert.Equal(id2, response2.Id);
Assert.Equal(membersCount2, response2.MembersCount);
Assert.Equal(partitionsCount2, response2.PartitionsCount);
}
[Fact]
public void MapConsumerGroup_ReturnsValidConsumerGroupResponse()
{
// Arrange
var (groupId, membersCount, partitionsCount, name) = ConsumerGroupFactory.CreateConsumerGroupResponseFields();
var memberPartitions = Enumerable.Range(0, partitionsCount).ToList();
byte[] groupPayload = BinaryFactory.CreateGroupPayload(groupId, membersCount, partitionsCount, name, memberPartitions);
// Act
ConsumerGroupResponse response = Iggy_SDK.Mappers.BinaryMapper.MapConsumerGroup(groupPayload);
// Assert
Assert.NotNull(response);
Assert.Equal(groupId, response.Id);
Assert.Equal(membersCount, response.MembersCount);
Assert.Equal(partitionsCount, response.PartitionsCount);
Assert.Equal(memberPartitions.Count, partitionsCount);
Assert.Equal(response.Members.Count, 1);
}
[Fact]
public void MapStats_ReturnsValidStatsResponse()
{
//Arrange
var stats = StatsFactory.CreateFakeStatsObject();
var payload = BinaryFactory.CreateStatsPayload(stats);
//Act
var response = Iggy_SDK.Mappers.BinaryMapper.MapStats(payload);
//Assert
Assert.Equal(stats.ProcessId, response.ProcessId);
Assert.Equal(stats.MessagesCount, response.MessagesCount);
Assert.Equal(stats.ConsumerGroupsCount, response.ConsumerGroupsCount);
Assert.Equal(stats.TopicsCount, response.TopicsCount);
Assert.Equal(stats.StreamsCount, response.StreamsCount);
Assert.Equal(stats.PartitionsCount, response.PartitionsCount);
Assert.Equal(stats.SegmentsCount, response.SegmentsCount);
Assert.Equal(stats.MessagesSizeBytes, response.MessagesSizeBytes);
Assert.Equal(stats.CpuUsage, response.CpuUsage);
Assert.Equal(stats.TotalCpuUsage, response.TotalCpuUsage);
Assert.Equal(stats.TotalMemory, response.TotalMemory);
Assert.Equal(stats.AvailableMemory, response.AvailableMemory);
Assert.Equal(stats.MemoryUsage, response.MemoryUsage);
Assert.Equal(stats.RunTime, response.RunTime);
Assert.Equal(stats.StartTime, response.StartTime);
Assert.Equal(stats.ReadBytes, response.ReadBytes);
Assert.Equal(stats.WrittenBytes, stats.WrittenBytes);
Assert.Equal(stats.ClientsCount, response.ClientsCount);
Assert.Equal(stats.ConsumerGroupsCount, response.ConsumerGroupsCount);
Assert.Equal(stats.Hostname, response.Hostname);
Assert.Equal(stats.OsName, response.OsName);
Assert.Equal(stats.OsVersion, stats.OsVersion);
Assert.Equal(stats.KernelVersion, response.KernelVersion);
}
}