blob: bfa1a79990a0f86d2a96d7c5172c8d6841474ce4 [file] [log] [blame]
// Copyright 2021 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 "src/developer/debug/zxdb/common/tagged_data.h"
#include <gtest/gtest.h>
#include "src/developer/debug/zxdb/common/tagged_data_builder.h"
namespace zxdb {
TEST(TaggedData, AllValid) {
// Empty range.
TaggedData empty;
EXPECT_TRUE(empty.empty());
EXPECT_EQ(0u, empty.size());
EXPECT_TRUE(empty.all_valid());
EXPECT_EQ("", empty.ToString());
EXPECT_TRUE(empty.RangeIsEntirely(0, 0, TaggedData::kValid));
EXPECT_TRUE(empty.RangeContains(0, 0, TaggedData::kValid));
EXPECT_FALSE(empty.RangeIsEntirely(0, 0, TaggedData::kUnknown));
EXPECT_FALSE(empty.RangeContains(0, 0, TaggedData::kUnknown));
// Nonempty range.
std::vector<uint8_t> d{0, 1, 2, 3};
TaggedData full(d);
EXPECT_FALSE(full.empty());
EXPECT_EQ(4u, full.size());
EXPECT_EQ(d, full.bytes());
EXPECT_TRUE(full.all_valid());
EXPECT_EQ("00 01 02 03\n", full.ToString());
EXPECT_TRUE(full.RangeIsEntirely(0, 4, TaggedData::kValid));
EXPECT_TRUE(full.RangeContains(0, 4, TaggedData::kValid));
EXPECT_FALSE(full.RangeIsEntirely(0, 4, TaggedData::kUnknown));
EXPECT_FALSE(full.RangeContains(0, 4, TaggedData::kUnknown));
// Test some valid extractions.
std::optional<TaggedData> extracted = empty.Extract(0, 0);
ASSERT_TRUE(extracted);
EXPECT_TRUE(extracted->empty());
EXPECT_TRUE(extracted->all_valid());
extracted = full.Extract(1, 2);
ASSERT_TRUE(extracted);
EXPECT_EQ(2u, extracted->size());
EXPECT_TRUE(extracted->all_valid());
EXPECT_EQ(1, extracted->bytes()[0]);
EXPECT_EQ(2, extracted->bytes()[1]);
extracted = full.Extract(3, 1);
ASSERT_TRUE(extracted);
EXPECT_EQ(1u, extracted->size());
EXPECT_EQ(3, extracted->bytes()[0]);
// Out-of-bound extraction.
EXPECT_FALSE(empty.Extract(1, 0));
EXPECT_FALSE(empty.Extract(1, 1));
EXPECT_FALSE(full.Extract(0, 5));
EXPECT_FALSE(full.Extract(4, 1));
}
TEST(TaggedData, AllValidBuilder) {
TaggedDataBuilder builder;
EXPECT_TRUE(builder.TakeData().empty());
std::vector<uint8_t> extra{10, 11, 12, 13};
builder.Append({0, 1, 2, 3});
builder.Append({});
builder.Append(extra);
TaggedData data = builder.TakeData();
ASSERT_EQ(8u, data.size());
std::vector<uint8_t> expected{0, 1, 2, 3, 10, 11, 12, 13};
EXPECT_EQ(expected, data.bytes());
}
TEST(TaggedData, SomeInvalid) {
TaggedDataBuilder builder;
// Entirely invalid.
builder.AppendUnknown(4);
TaggedData data = builder.TakeData();
EXPECT_EQ(4u, data.size());
EXPECT_FALSE(data.all_valid());
// Partially valid.
builder.AppendUnknown(2);
builder.Append({1, 2});
builder.Append({});
builder.AppendUnknown(0);
builder.AppendUnknown(2);
data = builder.TakeData();
EXPECT_EQ(6u, data.size());
EXPECT_FALSE(data.all_valid());
// Unknown bytes are 0's in the data buffer.
std::vector<uint8_t> expected_full{0, 0, 1, 2, 0, 0};
EXPECT_EQ(expected_full, data.bytes());
EXPECT_EQ("?? ?? 01 02 ?? ??\n", data.ToString());
EXPECT_TRUE(data.RangeContains(0, 6, TaggedData::kValid));
EXPECT_TRUE(data.RangeContains(0, 6, TaggedData::kUnknown));
EXPECT_FALSE(data.RangeIsEntirely(0, 6, TaggedData::kValid));
EXPECT_FALSE(data.RangeIsEntirely(0, 6, TaggedData::kUnknown));
EXPECT_FALSE(data.RangeContains(2, 2, TaggedData::kUnknown));
EXPECT_FALSE(data.RangeIsEntirely(2, 2, TaggedData::kUnknown));
EXPECT_TRUE(data.RangeContains(2, 2, TaggedData::kValid));
EXPECT_TRUE(data.RangeIsEntirely(2, 2, TaggedData::kValid));
// Extracted regions.
std::optional<TaggedData> extracted = data.Extract(1, 3);
ASSERT_TRUE(extracted);
EXPECT_FALSE(extracted->all_valid());
// This sub-region is entirely valid.
extracted = data.Extract(2, 2);
ASSERT_TRUE(extracted);
EXPECT_TRUE(extracted->all_valid());
}
// ToString was tested in a few places above, this tests the multiline case.
TEST(TaggedData, ToString) {
TaggedDataBuilder builder;
builder.Append({0x10, 0x11, 0x12, 0x13, 0x14, 0x15});
builder.AppendUnknown(16);
builder.Append({0xf0, 0xf1, 0xf2});
EXPECT_EQ(builder.TakeData().ToString(),
"10 11 12 13 14 15 ?? ?? ?? ?? ?? ?? ?? ?? ?? ??\n"
"?? ?? ?? ?? ?? ?? f0 f1 f2\n");
}
} // namespace zxdb