blob: 1ca0592b54c6e0d3bedfe2e49ba22d18b1b1f511 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "util.h"
#include <string>
#include "gtest/gtest.h"
namespace debugger_utils {
namespace {
const char kInvalidInput1[] = "1G";
const char kInvalidInput2[] = "G1";
const char kInvalidInput3[] = "1g";
const char kInvalidInput4[] = "g1";
const char kByteStr1[] = "01";
const char kByteStr2[] = "0B";
const char kByteStr3[] = "0F";
const char kByteStr4[] = "A0";
const char kByteStr5[] = "A9";
const char kByteStr6[] = "FF";
const char kByteStr7[] = "0b";
const char kByteStr8[] = "0f";
const char kByteStr9[] = "a0";
const char kByteStr10[] = "a9";
const char kByteStr11[] = "ff";
const uint8_t kByte1 = 0x01;
const uint8_t kByte2 = 0x0b;
const uint8_t kByte3 = 0x0f;
const uint8_t kByte4 = 0xa0;
const uint8_t kByte5 = 0xa9;
const uint8_t kByte6 = 0xff;
TEST(UtilTest, DecodeByteString) {
uint8_t result;
EXPECT_FALSE(DecodeByteString(kInvalidInput1, &result));
EXPECT_FALSE(DecodeByteString(kInvalidInput2, &result));
EXPECT_FALSE(DecodeByteString(kInvalidInput3, &result));
EXPECT_FALSE(DecodeByteString(kInvalidInput4, &result));
struct {
const char* str;
const uint8_t byte;
} kTestCases[] = {
{kByteStr1, kByte1}, {kByteStr2, kByte2}, {kByteStr3, kByte3},
{kByteStr4, kByte4}, {kByteStr5, kByte5}, {kByteStr6, kByte6},
{kByteStr7, kByte2}, {kByteStr8, kByte3}, {kByteStr9, kByte4},
{kByteStr10, kByte5}, {kByteStr11, kByte6}, {}};
for (int i = 0; kTestCases[i].str; ++i) {
EXPECT_TRUE(DecodeByteString(kTestCases[i].str, &result));
EXPECT_EQ(kTestCases[i].byte, result);
}
}
TEST(UtilTest, EncodeByteString) {
struct {
const char* str;
const uint8_t byte;
} kTestCases[] = {{kByteStr1, kByte1},
{kByteStr7, kByte2},
{kByteStr8, kByte3},
{kByteStr9, kByte4},
{kByteStr10, kByte5},
{kByteStr11, kByte6},
{}};
for (int i = 0; kTestCases[i].str; ++i) {
char result[2];
EncodeByteString(kTestCases[i].byte, result);
EXPECT_EQ(kTestCases[i].str[0], result[0]);
EXPECT_EQ(kTestCases[i].str[1], result[1]);
}
}
TEST(UtilTest, EncodeByteArrayString) {
std::vector<uint8_t> data;
EXPECT_EQ("", EncodeByteArrayString(data.data(), data.size()));
data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 127, 255};
EXPECT_EQ("0102030405060708090a0b0c0d0e0f107fff",
EncodeByteArrayString(data.data(), data.size()));
}
TEST(UtilTest, DecodeByteArrayString) {
EXPECT_EQ(std::vector<uint8_t>{}, DecodeByteArrayString(""));
EXPECT_EQ(std::vector<uint8_t>{}, DecodeByteArrayString("0102030"));
EXPECT_EQ(std::vector<uint8_t>{}, DecodeByteArrayString("01020:04"));
EXPECT_EQ((std::vector<uint8_t>{10, 11, 12, 13, 14, 15, 16, 127, 255}),
DecodeByteArrayString("0a0b0c0d0e0f107fff"));
}
TEST(UtilTest, DecodeString) {
EXPECT_EQ(std::string(""), DecodeString(""));
EXPECT_EQ(std::string("\x0a"
"bc"
"\xff"),
DecodeString("0a6263ff"));
}
TEST(UtilTest, EscapeNonPrintableString) {
const char kPrintableChars[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ";
const char kSomeNonPrintableChars[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
// 32 is "space", which is printable.
};
EXPECT_EQ(kPrintableChars, EscapeNonPrintableString(kPrintableChars));
EXPECT_EQ(
"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d"
"\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b"
"\\x1c\\x1d\\x1e\\x1f ",
EscapeNonPrintableString(fxl::StringView(
kSomeNonPrintableChars, sizeof(kSomeNonPrintableChars))));
}
TEST(UtilTest, JoinStrings) {
constexpr char kEntry1[] = "an entry";
constexpr char kEntry2[] = "another entry";
constexpr char kEntry3[] = "banana";
// Allocate a buffer that's just large enough to join all three entries above
// (including 2 commas).
const size_t kBufferSize =
std::strlen(kEntry1) + std::strlen(kEntry2) + std::strlen(kEntry3) + 2;
char buffer[kBufferSize];
std::deque<std::string> strings;
EXPECT_EQ(0u, JoinStrings(strings, ',', buffer, kBufferSize));
strings.push_back(kEntry1);
size_t result_size = JoinStrings(strings, ',', buffer, kBufferSize);
EXPECT_EQ(std::strlen(kEntry1), result_size);
EXPECT_EQ(kEntry1, fxl::StringView(buffer, result_size));
strings.push_back(kEntry2);
result_size = JoinStrings(strings, ',', buffer, kBufferSize);
EXPECT_EQ(std::strlen(kEntry1) + std::strlen(kEntry2) + 1, result_size);
EXPECT_EQ("an entry,another entry", fxl::StringView(buffer, result_size));
strings.push_back(kEntry3);
result_size = JoinStrings(strings, ',', buffer, kBufferSize);
EXPECT_EQ(kBufferSize, result_size);
EXPECT_EQ("an entry,another entry,banana",
fxl::StringView(buffer, result_size));
}
} // namespace
} // namespace debugger_utils