[frame-builder] add Insert(), Remove() and other helper methods (#7964)

This commit adds `Insert()` and `Remove()` methods in `FrameBuilder`.
`Insert` can be used to insert new content in the frame at a given
offset moving any previously written content forward. `Remove()` can
be used to remove previously appended content from the frame moving
any content after the removed bytes backward. This commit also adds
`GetRemainingLength()` to get the remaining length (number of bytes
that can be appended) in the frame buffer, and `SetMaxLength()`. Unit
test `test_frame_builder` is also updated to validate all the newly
added methods.
This commit is contained in:
Abtin Keshavarzian
2022-08-02 12:43:51 -07:00
committed by Jonathan Hui
parent 7af484f49f
commit e3f157402c
3 changed files with 167 additions and 1 deletions
+74
View File
@@ -39,6 +39,7 @@ void TestFrameBuilder(void)
{
const uint8_t kData1[] = {0x01, 0x02, 0x03, 0x04, 0x05};
const uint8_t kData2[] = {0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa};
const uint8_t kData3[] = {0xca, 0xfe, 0xbe, 0xef};
static constexpr uint16_t kMaxBufferSize = sizeof(kData1) * 2 + sizeof(kData2);
@@ -72,12 +73,25 @@ void TestFrameBuilder(void)
VerifyOrQuit(frameBuilder.CanAppend(sizeof(buffer)));
VerifyOrQuit(!frameBuilder.CanAppend(sizeof(buffer) + 1));
frameBuilder.SetMaxLength(sizeof(kData1));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(frameBuilder.GetLength() == 0);
VerifyOrQuit(frameBuilder.GetMaxLength() == sizeof(kData1));
VerifyOrQuit(memcmp(buffer, zeroBuffer, sizeof(buffer)) == 0);
VerifyOrQuit(frameBuilder.CanAppend(sizeof(kData1)));
VerifyOrQuit(!frameBuilder.CanAppend(sizeof(kData1) + 1));
SuccessOrQuit(frameBuilder.Append(kData1));
VerifyOrQuit(frameBuilder.GetLength() == sizeof(kData1));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(memcmp(buffer, kData1, sizeof(kData1)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData1), zeroBuffer, sizeof(buffer) - sizeof(kData1)) == 0);
frameBuilder.SetMaxLength(sizeof(buffer));
VerifyOrQuit(frameBuilder.GetMaxLength() == sizeof(buffer));
VerifyOrQuit(frameBuilder.CanAppend(sizeof(buffer) - sizeof(kData1)));
VerifyOrQuit(!frameBuilder.CanAppend(sizeof(buffer) - sizeof(kData1) + 1));
SuccessOrQuit(frameBuilder.AppendUint8(0x01));
SuccessOrQuit(frameBuilder.AppendBigEndianUint16(0x0203));
SuccessOrQuit(frameBuilder.AppendLittleEndianUint16(0x0504));
@@ -135,6 +149,66 @@ void TestFrameBuilder(void)
VerifyOrQuit(memcmp(buffer + sizeof(kData1), kData2, sizeof(kData2)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData1) + sizeof(kData2), kData1, sizeof(kData1)) == 0);
frameBuilder.Init(buffer, sizeof(buffer));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(frameBuilder.GetLength() == 0);
VerifyOrQuit(frameBuilder.GetMaxLength() == sizeof(buffer));
offset = 0;
SuccessOrQuit(frameBuilder.Insert(offset, kData1));
VerifyOrQuit(frameBuilder.GetLength() == sizeof(kData1));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(memcmp(buffer, kData1, sizeof(kData1)) == 0);
offset = 0;
SuccessOrQuit(frameBuilder.Insert(offset, kData2));
VerifyOrQuit(frameBuilder.GetLength() == sizeof(kData1) + sizeof(kData2));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(memcmp(buffer, kData2, sizeof(kData2)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData2), kData1, sizeof(kData1)) == 0);
offset = sizeof(kData2);
SuccessOrQuit(frameBuilder.InsertBytes(offset, kData3, sizeof(kData3)));
VerifyOrQuit(frameBuilder.GetLength() == sizeof(kData1) + sizeof(kData2) + sizeof(kData3));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(memcmp(buffer, kData2, sizeof(kData2)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData2), kData3, sizeof(kData3)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData2) + sizeof(kData3), kData1, sizeof(kData1)) == 0);
offset = frameBuilder.GetLength();
SuccessOrQuit(frameBuilder.Insert<uint8_t>(offset, 0x77));
VerifyOrQuit(frameBuilder.GetLength() == sizeof(kData1) + sizeof(kData2) + sizeof(kData3) + sizeof(uint8_t));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(memcmp(buffer, kData2, sizeof(kData2)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData2), kData3, sizeof(kData3)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData2) + sizeof(kData3), kData1, sizeof(kData1)) == 0);
VerifyOrQuit(buffer[sizeof(kData2) + sizeof(kData3) + sizeof(kData1)] == 0x77);
offset = frameBuilder.GetLength() - 1;
frameBuilder.RemoveBytes(offset, sizeof(uint8_t));
VerifyOrQuit(frameBuilder.GetLength() == sizeof(kData1) + sizeof(kData2) + sizeof(kData3));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(memcmp(buffer, kData2, sizeof(kData2)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData2), kData3, sizeof(kData3)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData2) + sizeof(kData3), kData1, sizeof(kData1)) == 0);
offset = sizeof(kData2);
frameBuilder.RemoveBytes(offset, sizeof(kData3));
VerifyOrQuit(frameBuilder.GetLength() == sizeof(kData1) + sizeof(kData2));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(memcmp(buffer, kData2, sizeof(kData2)) == 0);
VerifyOrQuit(memcmp(buffer + sizeof(kData2), kData1, sizeof(kData1)) == 0);
offset = 0;
frameBuilder.RemoveBytes(offset, sizeof(kData2));
VerifyOrQuit(frameBuilder.GetLength() == sizeof(kData1));
VerifyOrQuit(frameBuilder.GetBytes() == buffer);
VerifyOrQuit(memcmp(buffer, kData1, sizeof(kData1)) == 0);
offset = 0;
frameBuilder.RemoveBytes(offset, sizeof(kData1));
VerifyOrQuit(frameBuilder.GetLength() == 0);
message->Free();
testFreeInstance(instance);
}