blob: 15abaafe1fb848f03d0fdcb26b14865a35cad1bf [file] [log] [blame]
// Copyright 2020 The Chromium OS 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 "crash-reporter/arcvm_native_collector.h"
#include <fcntl.h>
#include <memory>
#include <utility>
#include <base/files/file_util.h>
#include <base/files/scoped_file.h>
#include <base/files/scoped_temp_dir.h>
#include <base/strings/stringprintf.h>
#include <gtest/gtest.h>
#include "crash-reporter/arc_util.h"
#include "crash-reporter/test_util.h"
namespace {
constexpr char kDevice[] = "Device";
constexpr char kBoard[] = "Board";
constexpr char kCpuAbi[] = "CPUABI";
constexpr char kFingerprint[] = "Fingerprint";
// 1546300800 is unixtime of 2019-01-01 00:00:00
constexpr time_t kTime = 1546300800;
constexpr pid_t kPid = 1234;
constexpr char kExecName[] = "execname";
constexpr char kTestCrashDirectory[] = "test-crash-directory";
constexpr char kBasenameWithoutExt[] = "execname.20190101.000000.*.1234";
constexpr char kMinidumpSampleContent[] = "*minidump*";
arc_util::BuildProperty GetBuildProperty() {
return {.device = kDevice,
.board = kBoard,
.cpu_abi = kCpuAbi,
.fingerprint = kFingerprint};
}
ArcvmNativeCollector::CrashInfo GetCrashInfo() {
return {.time = kTime, .pid = kPid, .exec_name = kExecName};
}
} // namespace
class TestArcvmNativeCollector : public ArcvmNativeCollector {
public:
explicit TestArcvmNativeCollector(const base::FilePath& crash_directory) {
Initialize(false /* early */);
set_crash_directory_for_test(crash_directory);
}
~TestArcvmNativeCollector() override = default;
bool HasMetaData(const std::string& key, const std::string& value) const {
const std::string metadata =
base::StringPrintf("%s=%s\n", key.c_str(), value.c_str());
return extra_metadata_.find(metadata) != std::string::npos;
}
private:
void SetUpDBus() override {}
};
class ArcvmNativeCollectorTest : public ::testing::Test {
public:
~ArcvmNativeCollectorTest() override = default;
void SetUp() override {
ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
base::FilePath minidump_path =
scoped_temp_dir_.GetPath().Append("minidump.dmp");
ASSERT_TRUE(test_util::CreateFile(minidump_path, kMinidumpSampleContent));
minidump_fd_ = base::ScopedFD(
HANDLE_EINTR(open(minidump_path.value().c_str(), O_RDONLY)));
ASSERT_NE(minidump_fd_, -1);
test_crash_directory_ =
scoped_temp_dir_.GetPath().Append(kTestCrashDirectory);
ASSERT_TRUE(base::CreateDirectory(test_crash_directory_));
collector_ =
std::make_unique<TestArcvmNativeCollector>(test_crash_directory_);
}
protected:
std::unique_ptr<TestArcvmNativeCollector> collector_;
base::ScopedTempDir scoped_temp_dir_;
base::FilePath test_crash_directory_;
base::ScopedFD minidump_fd_;
};
TEST_F(ArcvmNativeCollectorTest, HandleCrashWithMinidumpFD) {
ASSERT_TRUE(collector_->HandleCrashWithMinidumpFD(
GetBuildProperty(), GetCrashInfo(), std::move(minidump_fd_)));
EXPECT_TRUE(test_util::DirectoryHasFileWithPattern(
test_crash_directory_, std::string(kBasenameWithoutExt) + ".meta",
nullptr));
base::FilePath minidump_path;
ASSERT_TRUE(test_util::DirectoryHasFileWithPattern(
test_crash_directory_, std::string(kBasenameWithoutExt) + ".dmp",
&minidump_path));
std::string minidump_content;
EXPECT_TRUE(base::ReadFileToString(minidump_path, &minidump_content));
EXPECT_EQ(minidump_content, kMinidumpSampleContent);
}
TEST_F(ArcvmNativeCollectorTest, AddArcMetadata) {
collector_->AddArcMetadata(GetBuildProperty(), GetCrashInfo());
EXPECT_TRUE(collector_->HasMetaData(arc_util::kProcessField, kExecName));
EXPECT_TRUE(
collector_->HasMetaData(arc_util::kArcVersionField, kFingerprint));
EXPECT_TRUE(collector_->HasMetaData(arc_util::kDeviceField, kDevice));
EXPECT_TRUE(collector_->HasMetaData(arc_util::kBoardField, kBoard));
EXPECT_TRUE(collector_->HasMetaData(arc_util::kCpuAbiField, kCpuAbi));
}