| // Copyright 2019 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/crash_reporter_failure_collector.h" |
| |
| #include <string> |
| |
| #include <base/files/file_util.h> |
| #include <base/files/scoped_temp_dir.h> |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "crash-reporter/test_util.h" |
| |
| using base::FilePath; |
| |
| namespace { |
| |
| bool s_metrics = false; |
| |
| constexpr char kLogConfigFileName[] = "crash_reporter_logs.conf"; |
| constexpr char kTestFilename[] = "test-crash-reporter-failure"; |
| constexpr char kTestCrashDirectory[] = "test-crash-directory"; |
| |
| constexpr char kTestCrashReporterFailureMessageContent[] = |
| "upload_var_collector=crash-reporter-failure-collector"; |
| constexpr char kTestCrashReporterFailureMessagePayload[] = |
| "payload=crash_reporter_failure"; |
| constexpr char kTestCrashReporterFailureLogMessages[] = |
| "===/var/log/messages==="; |
| |
| bool IsMetrics() { |
| return s_metrics; |
| } |
| |
| } // namespace |
| |
| class CrashReporterFailureCollectorMock : public CrashReporterFailureCollector { |
| public: |
| MOCK_METHOD(void, SetUpDBus, (), (override)); |
| }; |
| |
| class CrashReporterFailureCollectorTest : public ::testing::Test { |
| void SetUp() { |
| s_metrics = true; |
| |
| EXPECT_CALL(collector_, SetUpDBus()).WillRepeatedly(testing::Return()); |
| |
| collector_.Initialize(IsMetrics, false); |
| |
| ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); |
| test_path_ = scoped_temp_dir_.GetPath().Append(kTestFilename); |
| test_crash_directory_ = |
| scoped_temp_dir_.GetPath().Append(kTestCrashDirectory); |
| CreateDirectory(test_crash_directory_); |
| |
| collector_.set_crash_directory_for_test(test_crash_directory_); |
| collector_.set_log_config_path( |
| test_util::GetTestDataPath(kLogConfigFileName).value()); |
| } |
| |
| protected: |
| CrashReporterFailureCollectorMock collector_; |
| base::ScopedTempDir scoped_temp_dir_; |
| FilePath test_path_; |
| FilePath test_crash_directory_; |
| }; |
| |
| TEST_F(CrashReporterFailureCollectorTest, CollectOK) { |
| collector_.Collect(); |
| EXPECT_FALSE(IsDirectoryEmpty(test_crash_directory_)); |
| FilePath file_path; |
| EXPECT_TRUE(test_util::DirectoryHasFileWithPattern( |
| test_crash_directory_, "crash_reporter_failure.*.meta", &file_path)); |
| std::string content; |
| base::ReadFileToString(file_path, &content); |
| EXPECT_FALSE((content.find(kTestCrashReporterFailureMessageContent) == |
| std::string::npos)); |
| EXPECT_FALSE((content.find(kTestCrashReporterFailureMessagePayload) == |
| std::string::npos)); |
| } |
| |
| TEST_F(CrashReporterFailureCollectorTest, CollectLog) { |
| collector_.Collect(); |
| EXPECT_FALSE(IsDirectoryEmpty(test_crash_directory_)); |
| FilePath log_path; |
| EXPECT_TRUE(test_util::DirectoryHasFileWithPattern( |
| test_crash_directory_, "crash_reporter_failure.*.log", &log_path)); |
| std::string log_content; |
| base::ReadFileToString(log_path, &log_content); |
| EXPECT_FALSE((log_content.find(kTestCrashReporterFailureLogMessages) == |
| std::string::npos)); |
| |
| FilePath meta_path; |
| EXPECT_TRUE(test_util::DirectoryHasFileWithPattern( |
| test_crash_directory_, "crash_reporter_failure.*.meta", &meta_path)); |
| std::string meta_content; |
| base::ReadFileToString(meta_path, &meta_content); |
| EXPECT_FALSE((meta_content.find("payload=" + log_path.BaseName().value()) == |
| std::string::npos)); |
| } |
| |
| TEST_F(CrashReporterFailureCollectorTest, FeedbackNotAllowed) { |
| // Feedback not allowed. |
| s_metrics = false; |
| collector_.Collect(); |
| EXPECT_TRUE(IsDirectoryEmpty(test_crash_directory_)); |
| } |