blob: a80b7a028f53b9db716312e46c52a3775055c534 [file] [log] [blame]
// Copyright 2015 The Chromium 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 "chromecast/crash/linux/minidump_writer.h"
#include <fstream>
#include <memory>
#include "base/base_paths.h"
#include "base/bind.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/macros.h"
#include "base/test/scoped_path_override.h"
#include "chromecast/base/scoped_temp_file.h"
#include "chromecast/crash/linux/crash_testing_utils.h"
#include "chromecast/crash/linux/dump_info.h"
#include "chromecast/crash/linux/minidump_generator.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromecast {
namespace {
const char kDumplogFile[] = "dumplog";
const char kLockfileName[] = "lockfile";
const char kMetadataName[] = "metadata";
const char kMinidumpSubdir[] = "minidumps";
class FakeMinidumpGenerator : public MinidumpGenerator {
public:
FakeMinidumpGenerator() {}
~FakeMinidumpGenerator() override {}
// MinidumpGenerator implementation:
bool Generate(const std::string& minidump_path) override { return true; }
};
int FakeDumpState(const std::string& minidump_path) {
return 0;
}
} // namespace
class MinidumpWriterTest : public testing::Test {
protected:
MinidumpWriterTest() {}
~MinidumpWriterTest() override {}
void SetUp() override {
// Set up a temporary directory which will be used as our fake home dir.
ASSERT_TRUE(fake_home_dir_.CreateUniqueTempDir());
home_.reset(
new base::ScopedPathOverride(base::DIR_HOME, fake_home_dir_.GetPath()));
minidump_dir_ = fake_home_dir_.GetPath().Append(kMinidumpSubdir);
dumplog_file_ = minidump_dir_.Append(kDumplogFile);
lockfile_path_ = minidump_dir_.Append(kLockfileName);
metadata_path_ = minidump_dir_.Append(kMetadataName);
// Create the minidump directory
ASSERT_TRUE(base::CreateDirectory(minidump_dir_));
// Lockfile will be automatically created by AppendLockFile
}
bool AppendLockFile(const DumpInfo& dump) {
return chromecast::AppendLockFile(
lockfile_path_.value(), metadata_path_.value(), dump);
}
FakeMinidumpGenerator fake_generator_;
base::FilePath minidump_dir_;
base::FilePath dumplog_file_;
base::FilePath lockfile_path_;
base::FilePath metadata_path_;
private:
base::ScopedTempDir fake_home_dir_;
std::unique_ptr<base::ScopedPathOverride> home_;
DISALLOW_COPY_AND_ASSIGN(MinidumpWriterTest);
};
TEST_F(MinidumpWriterTest, Write_FailsWithIncorrectMinidumpPath) {
MinidumpWriter writer(&fake_generator_,
"/path/to/wrong/dir",
MinidumpParams(),
base::Bind(&FakeDumpState));
ASSERT_EQ(-1, writer.Write());
}
TEST_F(MinidumpWriterTest, Write_FailsWithMultiLevelRelativeMinidumpPath) {
MinidumpWriter writer(&fake_generator_,
"subdir/dumplog",
MinidumpParams(),
base::Bind(&FakeDumpState));
ASSERT_EQ(-1, writer.Write());
}
TEST_F(MinidumpWriterTest, Write_SucceedsWithSimpleFilename) {
MinidumpWriter writer(&fake_generator_,
"dumplog",
MinidumpParams(),
base::Bind(&FakeDumpState));
ASSERT_EQ(0, writer.Write());
}
TEST_F(MinidumpWriterTest, Write_SucceedsWithCorrectMinidumpPath) {
MinidumpWriter writer(&fake_generator_,
dumplog_file_.value(),
MinidumpParams(),
base::Bind(&FakeDumpState));
ASSERT_EQ(0, writer.Write());
}
TEST_F(MinidumpWriterTest, Write_FailsWithSubdirInCorrectPath) {
MinidumpWriter writer(&fake_generator_,
dumplog_file_.Append("subdir/logfile").value(),
MinidumpParams(),
base::Bind(&FakeDumpState));
ASSERT_EQ(-1, writer.Write());
}
} // namespace chromecast