blob: f3ec21c0940823d7dc830c5bee3ea4aaf064a041 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <lib/backtrace.h>
#include <lib/unittest/unittest.h>
#include <string-file.h>
#include <kernel/thread.h>
#include <ktl/span.h>
#include <ktl/enforce.h>
static bool VectorOpsTest() {
BEGIN_TEST;
Backtrace bt;
ASSERT_EQ(0u, bt.size());
bt.reset();
ASSERT_EQ(0u, bt.size());
for (size_t x = 0; x < Backtrace::kMaxSize; ++x) {
bt.push_back(x);
ASSERT_EQ(x, bt.size() - 1);
}
bt.reset();
ASSERT_EQ(0u, bt.size());
ASSERT_EQ(0u, bt.size());
END_TEST;
}
static bool PrintTest() {
BEGIN_TEST;
Backtrace bt;
bt.push_back(0xffffffff76543210);
bt.push_back(0xffffffff76543214);
bt.push_back(0xffffffff76543218);
char buffer[1024];
// All frames are return addresses.
{
StringFile file(ktl::span(buffer, sizeof(buffer)));
bt.Print(&file);
EXPECT_NE(ktl::string_view::npos, file.as_string_view().find("zx_system_get_version_string"));
EXPECT_NE(ktl::string_view::npos, file.as_string_view().find("{{{bt:0:0xffffffff76543210:ra}"));
EXPECT_NE(ktl::string_view::npos, file.as_string_view().find("{{{bt:1:0xffffffff76543214:ra}"));
EXPECT_NE(ktl::string_view::npos, file.as_string_view().find("{{{bt:2:0xffffffff76543218:ra}"));
}
memset(buffer, 0, sizeof(buffer));
// And now with the first frame as a precise location.
{
StringFile file(ktl::span(buffer, sizeof(buffer)));
bt.set_first_frame_type(Backtrace::FrameType::PreciseLocation);
bt.Print(&file);
EXPECT_NE(ktl::string_view::npos, file.as_string_view().find("zx_system_get_version_string"));
EXPECT_NE(ktl::string_view::npos, file.as_string_view().find("{{{bt:0:0xffffffff76543210:pc}"));
EXPECT_NE(ktl::string_view::npos, file.as_string_view().find("{{{bt:1:0xffffffff76543214:ra}"));
EXPECT_NE(ktl::string_view::npos, file.as_string_view().find("{{{bt:2:0xffffffff76543218:ra}"));
}
END_TEST;
}
static bool PrintWithoutVersionTest() {
BEGIN_TEST;
Backtrace bt;
bt.push_back(0xffffffff76543210);
char buffer[1024];
StringFile file(ktl::span(buffer, sizeof(buffer)));
bt.PrintWithoutVersion(&file);
EXPECT_EQ(ktl::string_view::npos, file.as_string_view().find("zx_system_get_version_string"));
END_TEST;
}
UNITTEST_START_TESTCASE(backtrace_tests)
UNITTEST("VectorOps", VectorOpsTest)
UNITTEST("Print", PrintTest)
UNITTEST("PrintWithoutVersion", PrintWithoutVersionTest)
UNITTEST_END_TESTCASE(backtrace_tests, "backtrace", "backtrace tests")