blob: 2b3024f05bdd274222288a813aaed15004c3ea53 [file] [log] [blame]
// Copyright 2022 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 <lib/zbi-format/zbi.h>
#include <lib/zbitl/items/debugdata.h>
#include <cstdint>
#include <cstring>
#include <gtest/gtest.h>
namespace {
constexpr uint8_t kGoodPayload[] = {
1, 2, 3, 4, 5, // contents
'a', 'b', 'c', // sink name
'd', 'e', 'f', // VMO name
'l', 'o', 'g', // log text
0, 0, // alignment padding
5, 0, 0, 0, // content_size
3, 0, 0, 0, // sink_name_size
3, 0, 0, 0, // vmo_name_size
3, 0, 0, 0, // log_size
};
constexpr uint8_t kBadTrailer[] = {1, 2, 3, 4, 5, 6, 7, 8};
constexpr uint8_t kBadContents[] = {
1, 2, 3, 4, 5, // contents
'a', 'b', 'c', // sink name
'd', 'e', 'f', // VMO name
'l', 'o', 'g', // log text
0, 0, // alignment padding
99, 0, 0, 0, // content_size too big
3, 0, 0, 0, // sink_name_size
3, 0, 0, 0, // vmo_name_size
3, 0, 0, 0, // log_size
};
constexpr uint8_t kBadSink[] = {
1, 2, 3, 4, 5, // contents
'a', 'b', 'c', // sink name
'd', 'e', 'f', // VMO name
'l', 'o', 'g', // log text
0, 0, // alignment padding
3, 0, 0, 0, // content_size
99, 0, 0, 0, // sink_name_size too big
3, 0, 0, 0, // vmo_name_size
3, 0, 0, 0, // log_size
};
constexpr uint8_t kBadVmo[] = {
1, 2, 3, 4, 5, // contents
'a', 'b', 'c', // sink name
'd', 'e', 'f', // VMO name
'l', 'o', 'g', // log text
0, 0, // alignment padding
3, 0, 0, 0, // content_size
3, 0, 0, 0, // sink_name_size
99, 0, 0, 0, // vmo_name_size too big
3, 0, 0, 0, // log_size
};
constexpr uint8_t kBadLog[] = {
1, 2, 3, 4, 5, // contents
'a', 'b', 'c', // sink name
'd', 'e', 'f', // VMO name
'l', 'o', 'g', // log text
0, 0, // alignment padding
3, 0, 0, 0, // content_size
3, 0, 0, 0, // sink_name_size
3, 0, 0, 0, // vmo_name_size
99, 0, 0, 0, // log_size too big
};
constexpr uint8_t kBadAlign[] = {
1, 2, 3, 4, 5, // contents
'a', 'b', 'c', // sink name
'd', 'e', 'f', // VMO name
'l', 'o', 'g', // log text
// missing alignment padding
3, 0, 0, 0, // content_size
3, 0, 0, 0, // sink_name_size
3, 0, 0, 0, // vmo_name_size
3, 0, 0, 0, // log_size too big
};
constexpr uint8_t kBadSize[] = {
1, 2, 3, 4, 5, // contents
'a', 'b', 'c', // sink name
'd', 'e', 'f', // VMO name
'l', 'o', 'g', // log text
0, 0, // alignment padding
0, 0, 0, 0, 0, 0, 0, 0, // excess padding
3, 0, 0, 0, // content_size
3, 0, 0, 0, // sink_name_size
3, 0, 0, 0, // vmo_name_size
3, 0, 0, 0, // log_size too big
};
TEST(ZbitlDebugdataTests, Good) {
zbitl::Debugdata debugdata;
auto result = debugdata.Init(cpp20::as_bytes(cpp20::span(kGoodPayload)));
EXPECT_TRUE(result.is_ok()) << result.error_value();
EXPECT_EQ(debugdata.sink_name(), "abc");
EXPECT_EQ(debugdata.vmo_name(), "def");
EXPECT_EQ(debugdata.log(), "log");
ASSERT_EQ(debugdata.contents().size(), 5u);
EXPECT_EQ(0, memcmp(debugdata.contents().data(), kGoodPayload, 5));
}
TEST(ZbitlDebugdataTests, MutableContents) {
std::array<uint8_t, sizeof(kGoodPayload)> buffer;
memcpy(buffer.data(), kGoodPayload, buffer.size());
zbitl::Debugdata debugdata;
auto result = debugdata.Init(cpp20::as_bytes(cpp20::span(buffer)));
EXPECT_TRUE(result.is_ok()) << result.error_value();
ASSERT_EQ(debugdata.contents().size(), 5u);
EXPECT_EQ(0, memcmp(debugdata.contents().data(), kGoodPayload, 5));
EXPECT_EQ(debugdata.mutable_contents().data(), debugdata.contents().data());
constexpr uint8_t kNewContents[] = {6, 7, 8, 9};
ASSERT_EQ(debugdata.mutable_contents().size(), 5u);
memcpy(debugdata.mutable_contents().data(), kNewContents, sizeof(kNewContents));
EXPECT_EQ(0, memcmp(buffer.data(), kNewContents, sizeof(kNewContents)));
}
TEST(ZbitlDebugdataTests, BadTrailer) {
zbitl::Debugdata debugdata;
auto result = debugdata.Init(cpp20::as_bytes(cpp20::span(kBadTrailer)));
ASSERT_TRUE(result.is_error());
EXPECT_EQ(result.error_value(), "ZBI_TYPE_DEBUGDATA item too small for debugdata trailer");
}
TEST(ZbitlDebugdataTests, BadContents) {
zbitl::Debugdata debugdata;
auto result = debugdata.Init(cpp20::as_bytes(cpp20::span(kBadContents)));
ASSERT_TRUE(result.is_error());
EXPECT_EQ(result.error_value(), "ZBI_TYPE_DEBUGDATA item too small for content size");
}
TEST(ZbitlDebugdataTests, BadSink) {
zbitl::Debugdata debugdata;
auto result = debugdata.Init(cpp20::as_bytes(cpp20::span(kBadSink)));
ASSERT_TRUE(result.is_error());
EXPECT_EQ(result.error_value(), "ZBI_TYPE_DEBUGDATA item too small for data-sink name");
}
TEST(ZbitlDebugdataTests, BadVmo) {
zbitl::Debugdata debugdata;
auto result = debugdata.Init(cpp20::as_bytes(cpp20::span(kBadVmo)));
ASSERT_TRUE(result.is_error());
EXPECT_EQ(result.error_value(), "ZBI_TYPE_DEBUGDATA item too small for VMO name");
}
TEST(ZbitlDebugdataTests, BadLog) {
zbitl::Debugdata debugdata;
auto result = debugdata.Init(cpp20::as_bytes(cpp20::span(kBadLog)));
ASSERT_TRUE(result.is_error());
EXPECT_EQ(result.error_value(), "ZBI_TYPE_DEBUGDATA item too small for log text");
}
TEST(ZbitlDebugdataTests, BadAlign) {
zbitl::Debugdata debugdata;
auto result = debugdata.Init(cpp20::as_bytes(cpp20::span(kBadAlign)));
ASSERT_TRUE(result.is_error());
EXPECT_EQ(result.error_value(), "ZBI_TYPE_DEBUGDATA item size not aligned");
}
TEST(ZbitlDebugdataTests, BadSize) {
zbitl::Debugdata debugdata;
auto result = debugdata.Init(cpp20::as_bytes(cpp20::span(kBadSize)));
ASSERT_TRUE(result.is_error());
EXPECT_EQ(result.error_value(), "ZBI_TYPE_DEBUGDATA item too large for encoded sizes");
}
} // namespace