cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
527 lines
23 KiB
C++
527 lines
23 KiB
C++
//===-- DataEncoderTest.cpp -----------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "gtest/gtest.h"
|
|
|
|
#include "lldb/Utility/DataEncoder.h"
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include <vector>
|
|
using namespace lldb_private;
|
|
using namespace llvm;
|
|
|
|
TEST(DataEncoderTest, PutU8) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
|
|
uint32_t offset = 0;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderLittle,
|
|
addr_size);
|
|
offset = encoder.PutU8(offset, 11);
|
|
ASSERT_EQ(offset, 1U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 2, 3, 4, 5, 6, 7, 8}));
|
|
offset = encoder.PutU8(offset, 12);
|
|
ASSERT_EQ(offset, 2U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 12, 3, 4, 5, 6, 7, 8}));
|
|
offset = encoder.PutU8(offset, 13);
|
|
ASSERT_EQ(offset, 3U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 12, 13, 4, 5, 6, 7, 8}));
|
|
offset = encoder.PutU8(offset, 14);
|
|
ASSERT_EQ(offset, 4U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 12, 13, 14, 5, 6, 7, 8}));
|
|
// Check that putting a number to an invalid offset doesn't work and returns
|
|
// an error offset and doesn't modify the buffer.
|
|
ASSERT_EQ(encoder.PutU8(init.size(), 15), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 12, 13, 14, 5, 6, 7, 8}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, AppendUnsignedLittle) {
|
|
const uint32_t addr_size = 4;
|
|
DataEncoder encoder(lldb::eByteOrderLittle, addr_size);
|
|
encoder.AppendU8(0x11);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x11}));
|
|
encoder.AppendU16(0x2233);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x11, 0x33, 0x22}));
|
|
encoder.AppendU32(0x44556677);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x33, 0x22, 0x77, 0x66, 0x55, 0x44}));
|
|
encoder.AppendU64(0x8899AABBCCDDEEFF);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x33, 0x22, 0x77, 0x66, 0x55, 0x44,
|
|
0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88}));
|
|
encoder.AppendU64(0x8899AABBCCDDEEFF);
|
|
}
|
|
|
|
TEST(DataEncoderTest, AppendUnsignedBig) {
|
|
const uint32_t addr_size = 4;
|
|
DataEncoder encoder(lldb::eByteOrderBig, addr_size);
|
|
encoder.AppendU8(0x11);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x11}));
|
|
encoder.AppendU16(0x2233);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x11, 0x22, 0x33}));
|
|
encoder.AppendU32(0x44556677);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}));
|
|
encoder.AppendU64(0x8899AABBCCDDEEFF);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
|
|
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, AppendAddress4Little) {
|
|
const uint32_t addr_size = 4;
|
|
DataEncoder encoder(lldb::eByteOrderLittle, addr_size);
|
|
encoder.AppendAddress(0x11223344);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11}));
|
|
encoder.AppendAddress(0x55);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x55, 0x00, 0x00, 0x00}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, AppendAddress4Big) {
|
|
const uint32_t addr_size = 4;
|
|
DataEncoder encoder(lldb::eByteOrderBig, addr_size);
|
|
encoder.AppendAddress(0x11223344);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44}));
|
|
encoder.AppendAddress(0x55);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x00, 0x00, 0x00, 0x55}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, AppendAddress8Little) {
|
|
const uint32_t addr_size = 8;
|
|
DataEncoder encoder(lldb::eByteOrderLittle, addr_size);
|
|
encoder.AppendAddress(0x11223344);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
encoder.AppendAddress(0x5566778899AABBCC);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00,
|
|
0xCC, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, AppendAddress8Big) {
|
|
const uint32_t addr_size = 8;
|
|
DataEncoder encoder(lldb::eByteOrderBig, addr_size);
|
|
encoder.AppendAddress(0x11223344);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x33, 0x44}));
|
|
encoder.AppendAddress(0x5566778899AABBCC);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x33, 0x44,
|
|
0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, AppendData) {
|
|
const uint32_t addr_size = 4;
|
|
DataEncoder encoder(lldb::eByteOrderBig, addr_size);
|
|
// Make sure default constructed StringRef appends nothing
|
|
encoder.AppendData(StringRef());
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({}));
|
|
// Make sure empty StringRef appends nothing
|
|
encoder.AppendData(StringRef(""));
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({}));
|
|
// Append some bytes that contains a NULL character
|
|
encoder.AppendData(StringRef("\x11\x00\x22", 3));
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x11, 0x00, 0x22}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, AppendCString) {
|
|
const uint32_t addr_size = 4;
|
|
DataEncoder encoder(lldb::eByteOrderBig, addr_size);
|
|
// Make sure default constructed StringRef appends nothing
|
|
encoder.AppendCString(StringRef());
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({}));
|
|
// Make sure empty StringRef appends a NULL character since the StringRef
|
|
// doesn't contain a NULL in the referenced string.
|
|
encoder.AppendCString(StringRef(""));
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x00}));
|
|
// Make sure empty StringRef appends only one NULL character if StringRef
|
|
// does contain a NULL in the referenced string.
|
|
encoder.AppendCString(StringRef("\0", 1));
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x00, 0x00}));
|
|
// Append a string where the StringRef doesn't contain a NULL termination
|
|
// and verify the NULL terminate gets added
|
|
encoder.AppendCString(StringRef("hello"));
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x00, 0x00, 'h', 'e', 'l', 'l', 'o', 0x00}));
|
|
// Append a string where the StringRef does contain a NULL termination and
|
|
// verify only one NULL is added
|
|
encoder.AppendCString(StringRef("world", 6));
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x00, 0x00, 'h', 'e', 'l', 'l', 'o', 0x00,
|
|
'w', 'o', 'r', 'l', 'd', '\0'}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutU16Little) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
uint32_t offset = 0;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderLittle,
|
|
addr_size);
|
|
offset = encoder.PutU16(offset, 11);
|
|
ASSERT_EQ(offset, 2U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 3, 4, 5, 6, 7, 8}));
|
|
offset = encoder.PutU16(offset, 12);
|
|
ASSERT_EQ(offset, 4U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 12, 0, 5, 6, 7, 8}));
|
|
offset = encoder.PutU16(offset, 13);
|
|
ASSERT_EQ(offset, 6U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 12, 0, 13, 0, 7, 8}));
|
|
offset = encoder.PutU16(offset, 14);
|
|
ASSERT_EQ(offset, 8U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 12, 0, 13, 0, 14, 0}));
|
|
// Check that putting a number to an invalid offset doesn't work and returns
|
|
// an error offset and doesn't modify the buffer.
|
|
ASSERT_EQ(encoder.PutU16(init.size(), 15), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 12, 0, 13, 0, 14, 0}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutU16Big) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
uint32_t offset = 0;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderBig,
|
|
addr_size);
|
|
offset = encoder.PutU16(offset, 11);
|
|
ASSERT_EQ(offset, 2U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 11, 3, 4, 5, 6, 7, 8}));
|
|
offset = encoder.PutU16(offset, 12);
|
|
ASSERT_EQ(offset, 4U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 11, 0, 12, 5, 6, 7, 8}));
|
|
offset = encoder.PutU16(offset, 13);
|
|
ASSERT_EQ(offset, 6U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 11, 0, 12, 0, 13, 7, 8}));
|
|
offset = encoder.PutU16(offset, 14);
|
|
ASSERT_EQ(offset, 8U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 11, 0, 12, 0, 13, 0, 14}));
|
|
// Check that putting a number to an invalid offset doesn't work and returns
|
|
// an error offset and doesn't modify the buffer.
|
|
ASSERT_EQ(encoder.PutU16(init.size(), 15), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 11, 0, 12, 0, 13, 0, 14}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutU32Little) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
|
|
uint32_t offset = 0;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderLittle,
|
|
addr_size);
|
|
offset = encoder.PutU32(offset, 11);
|
|
ASSERT_EQ(offset, 4U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 0, 0, 5, 6, 7, 8}));
|
|
offset = encoder.PutU32(offset, 12);
|
|
ASSERT_EQ(offset, 8u);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 0, 0, 12, 0, 0, 0}));
|
|
// Check that putting a number to an invalid offset doesn't work and returns
|
|
// an error offset and doesn't modify the buffer.
|
|
ASSERT_EQ(encoder.PutU32(init.size(), 15), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 0, 0, 12, 0, 0, 0}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutU32Big) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
|
|
uint32_t offset = 0;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderBig,
|
|
addr_size);
|
|
offset = encoder.PutU32(offset, 11);
|
|
ASSERT_EQ(offset, 4U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 0, 0, 11, 5, 6, 7, 8}));
|
|
offset = encoder.PutU32(offset, 12);
|
|
ASSERT_EQ(offset, 8U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 0, 0, 11, 0, 0, 0, 12}));
|
|
// Check that putting a number to an invalid offset doesn't work and returns
|
|
// an error offset and doesn't modify the buffer.
|
|
ASSERT_EQ(encoder.PutU32(init.size(), 15), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 0, 0, 11, 0, 0, 0, 12}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutU64Little) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
uint32_t offset = 0;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderLittle,
|
|
addr_size);
|
|
offset = encoder.PutU64(offset, 11);
|
|
ASSERT_EQ(offset, 8U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 0, 0, 0, 0, 0, 0}));
|
|
// Check that putting a number to an invalid offset doesn't work and returns
|
|
// an error offset and doesn't modify the buffer.
|
|
ASSERT_EQ(encoder.PutU64(init.size(), 15), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 0, 0, 0, 0, 0, 0, 0}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutU64Big) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
uint32_t offset = 0;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderBig,
|
|
addr_size);
|
|
offset = encoder.PutU64(offset, 11);
|
|
ASSERT_EQ(offset, 8U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 0, 0, 0, 0, 0, 0, 11}));
|
|
// Check that putting a number to an invalid offset doesn't work and returns
|
|
// an error offset and doesn't modify the buffer.
|
|
ASSERT_EQ(encoder.PutU64(init.size(), 15), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0, 0, 0, 0, 0, 0, 0, 11}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutUnsignedLittle) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
uint32_t offset = 0;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderLittle,
|
|
addr_size);
|
|
// Put only the least significant byte from the uint64_t into the encoder
|
|
offset = encoder.PutUnsigned(0, 1, 0x1122334455667788ULL);
|
|
ASSERT_EQ(offset, 1U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({0x88, 2, 3, 4, 5, 6, 7, 8}));
|
|
|
|
// Put only the least significant 2 byte2 from the uint64_t into the encoder
|
|
offset = encoder.PutUnsigned(0, 2, 0x1122334455667788ULL);
|
|
ASSERT_EQ(offset, 2U);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x88, 0x77, 3, 4, 5, 6, 7, 8}));
|
|
|
|
// Put only the least significant 4 bytes from the uint64_t into the encoder
|
|
offset = encoder.PutUnsigned(0, 4, 0x1122334455667788ULL);
|
|
ASSERT_EQ(offset, 4U);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x88, 0x77, 0x66, 0x55, 5, 6, 7, 8}));
|
|
|
|
// Put the full uint64_t value into the encoder
|
|
offset = encoder.PutUnsigned(0, 8, 0x1122334455667788ULL);
|
|
ASSERT_EQ(offset, 8U);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutUnsignedBig) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
uint32_t offset = 0;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderBig,
|
|
addr_size);
|
|
// Put only the least significant byte from the uint64_t into the encoder
|
|
offset = encoder.PutUnsigned(0, 1, 0x1122334455667788ULL);
|
|
ASSERT_EQ(offset, 1U);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x88, 2, 3, 4, 5, 6, 7, 8}));
|
|
|
|
// Put only the least significant 2 byte2 from the uint64_t into the encoder
|
|
offset = encoder.PutUnsigned(0, 2, 0x1122334455667788ULL);
|
|
ASSERT_EQ(offset, 2U);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x77, 0x88, 3, 4, 5, 6, 7, 8}));
|
|
|
|
// Put only the least significant 4 bytes from the uint64_t into the encoder
|
|
offset = encoder.PutUnsigned(0, 4, 0x1122334455667788ULL);
|
|
ASSERT_EQ(offset, 4U);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x55, 0x66, 0x77, 0x88, 5, 6, 7, 8}));
|
|
|
|
// Put the full uint64_t value into the encoder
|
|
offset = encoder.PutUnsigned(0, 8, 0x1122334455667788ULL);
|
|
ASSERT_EQ(offset, 8U);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutData) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
char one_byte[] = {11};
|
|
char two_bytes[] = {12, 13};
|
|
char to_many_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderLittle,
|
|
addr_size);
|
|
uint32_t offset = 0;
|
|
// Test putting zero bytes from a invalid array (NULL)
|
|
offset = encoder.PutData(offset, nullptr, 0);
|
|
ASSERT_EQ(offset, 0U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>(init));
|
|
// Test putting zero bytes from a valid array
|
|
offset = encoder.PutData(offset, one_byte, 0);
|
|
ASSERT_EQ(offset, 0U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>(init));
|
|
// Test putting one byte from a valid array
|
|
offset = encoder.PutData(offset, one_byte, sizeof(one_byte));
|
|
ASSERT_EQ(offset, 1U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 2, 3, 4, 5, 6, 7, 8}));
|
|
offset = encoder.PutData(offset, two_bytes, sizeof(two_bytes));
|
|
ASSERT_EQ(offset, 3U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 12, 13, 4, 5, 6, 7, 8}));
|
|
offset = encoder.PutData(0, to_many_bytes, sizeof(to_many_bytes));
|
|
ASSERT_EQ(offset, UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({11, 12, 13, 4, 5, 6, 7, 8}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutCString) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderLittle,
|
|
addr_size);
|
|
// Test putting invalid string pointer
|
|
ASSERT_EQ(encoder.PutCString(0, nullptr), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>(init));
|
|
// Test putting an empty string
|
|
uint32_t offset = 0;
|
|
offset = encoder.PutCString(offset, "");
|
|
ASSERT_EQ(offset, 1U);
|
|
ASSERT_EQ(encoder.GetData(), ArrayRef<uint8_t>({'\0', 2, 3, 4, 5, 6, 7, 8}));
|
|
// Test putting valid C string
|
|
offset = encoder.PutCString(offset, "hello");
|
|
ASSERT_EQ(offset, 7U);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({'\0', 'h', 'e', 'l', 'l', 'o', '\0', 8}));
|
|
// Test putting valid C string but where it won't fit in existing data and
|
|
// make sure data stay unchanged.
|
|
offset = encoder.PutCString(offset, "world");
|
|
ASSERT_EQ(offset, UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({'\0', 'h', 'e', 'l', 'l', 'o', '\0', 8}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutAddressLittle4) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderLittle,
|
|
addr_size);
|
|
uint32_t offset = 0;
|
|
offset = encoder.PutAddress(offset, 0x11223344);
|
|
ASSERT_EQ(offset, addr_size);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 5, 6, 7, 8}));
|
|
offset = encoder.PutAddress(offset, 0x55667788);
|
|
ASSERT_EQ(offset, addr_size*2);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x88, 0x77, 0x66, 0x55}));
|
|
// Make sure we can put an address when it won't fit in the existing buffer
|
|
// and that the buffer doesn't get modified.
|
|
ASSERT_EQ(encoder.PutAddress(addr_size+1, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x88, 0x77, 0x66, 0x55}));
|
|
ASSERT_EQ(encoder.PutAddress(addr_size+2, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x88, 0x77, 0x66, 0x55}));
|
|
ASSERT_EQ(encoder.PutAddress(addr_size+3, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x88, 0x77, 0x66, 0x55}));
|
|
ASSERT_EQ(encoder.PutAddress(addr_size+4, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x88, 0x77, 0x66, 0x55}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutAddressBig4) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 4;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderBig,
|
|
addr_size);
|
|
uint32_t offset = 0;
|
|
offset = encoder.PutAddress(offset, 0x11223344);
|
|
ASSERT_EQ(offset, addr_size);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 5, 6, 7, 8}));
|
|
offset = encoder.PutAddress(offset, 0x55667788);
|
|
ASSERT_EQ(offset, addr_size*2);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
// Make sure we can put an address when it won't fit in the existing buffer
|
|
// and that the buffer doesn't get modified.
|
|
ASSERT_EQ(encoder.PutAddress(addr_size+1, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(addr_size+2, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(addr_size+3, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(addr_size+4, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutAddressLittle8) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 8;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderLittle,
|
|
addr_size);
|
|
uint32_t offset = 0;
|
|
offset = encoder.PutAddress(offset, 0x11223344);
|
|
ASSERT_EQ(offset, addr_size);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
// Make sure we can put an address when it won't fit in the existing buffer
|
|
// and that the buffer doesn't get modified.
|
|
ASSERT_EQ(encoder.PutAddress(1, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
ASSERT_EQ(encoder.PutAddress(2, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
ASSERT_EQ(encoder.PutAddress(3, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
ASSERT_EQ(encoder.PutAddress(4, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
ASSERT_EQ(encoder.PutAddress(5, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
ASSERT_EQ(encoder.PutAddress(6, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
ASSERT_EQ(encoder.PutAddress(7, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
ASSERT_EQ(encoder.PutAddress(8, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00}));
|
|
}
|
|
|
|
TEST(DataEncoderTest, PutAddressBig8) {
|
|
const std::vector<uint8_t> init = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
const uint32_t addr_size = 8;
|
|
DataEncoder encoder(init.data(), init.size(), lldb::eByteOrderBig,
|
|
addr_size);
|
|
uint32_t offset = 0;
|
|
offset = encoder.PutAddress(offset, 0x1122334455667788);
|
|
ASSERT_EQ(offset, addr_size);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
// Make sure we can put an address when it won't fit in the existing buffer
|
|
// and that the buffer doesn't get modified.
|
|
ASSERT_EQ(encoder.PutAddress(1, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(2, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(3, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(4, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(5, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(6, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(7, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
ASSERT_EQ(encoder.PutAddress(8, 0x10203040), UINT32_MAX);
|
|
ASSERT_EQ(encoder.GetData(),
|
|
ArrayRef<uint8_t>({0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}));
|
|
}
|