blob: f5e1b32bfa0084738b9eefb8b1bef0e567550d18 [file] [log] [blame]
Ken Mixter03403162010-08-18 15:23:16 -07001// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Chan7e776902014-06-18 13:19:51 -07005#include "crash-reporter/unclean_shutdown_collector.h"
6
Ken Mixter03403162010-08-18 15:23:16 -07007#include <unistd.h>
8
Ben Chanab6cc902014-09-05 08:21:06 -07009#include <base/files/file_util.h>
Ben Chan7e776902014-06-18 13:19:51 -070010#include <base/strings/string_util.h>
11#include <chromeos/syslog_logging.h>
Steve Fung6e139522015-02-05 14:54:16 -080012#include <gmock/gmock.h>
Ben Chan7e776902014-06-18 13:19:51 -070013#include <gtest/gtest.h>
Ken Mixter03403162010-08-18 15:23:16 -070014
Simon Que9f90aca2013-02-19 17:19:52 -080015using base::FilePath;
Ken Mixtera3249322011-03-03 08:47:38 -080016using ::chromeos::FindLog;
17
Daniel Eratd257ea12015-01-28 10:23:28 -070018namespace {
19
20int s_crashes = 0;
21bool s_metrics = true;
22
23const char kTestDirectory[] = "test";
24const char kTestSuspended[] = "test/suspended";
25const char kTestUnclean[] = "test/unclean";
26
Ken Mixter03403162010-08-18 15:23:16 -070027void CountCrash() {
28 ++s_crashes;
29}
30
31bool IsMetrics() {
32 return s_metrics;
33}
34
Daniel Eratd257ea12015-01-28 10:23:28 -070035} // namespace
36
Steve Fung6e139522015-02-05 14:54:16 -080037class UncleanShutdownCollectorMock : public UncleanShutdownCollector {
38 public:
39 MOCK_METHOD0(SetUpDBus, void());
40};
41
Ken Mixter03403162010-08-18 15:23:16 -070042class UncleanShutdownCollectorTest : public ::testing::Test {
43 void SetUp() {
44 s_crashes = 0;
Steve Fung6e139522015-02-05 14:54:16 -080045
46 EXPECT_CALL(collector_, SetUpDBus()).WillRepeatedly(testing::Return());
47
Ken Mixter03403162010-08-18 15:23:16 -070048 collector_.Initialize(CountCrash,
Ken Mixtera3249322011-03-03 08:47:38 -080049 IsMetrics);
Michael Krebs87a49502012-04-12 15:24:22 -070050 rmdir(kTestDirectory);
Ken Mixter03403162010-08-18 15:23:16 -070051 test_unclean_ = FilePath(kTestUnclean);
52 collector_.unclean_shutdown_file_ = kTestUnclean;
Mike Frysingera557c112014-02-05 22:55:39 -050053 base::DeleteFile(test_unclean_, true);
Daniel Erat9c9e1c42013-07-18 15:57:11 -070054 // Set up an alternate power manager state file as well
Simon Que3f7ed5d2010-11-30 17:10:54 -080055 collector_.powerd_suspended_file_ = FilePath(kTestSuspended);
Ken Mixtera3249322011-03-03 08:47:38 -080056 chromeos::ClearLog();
Ken Mixter03403162010-08-18 15:23:16 -070057 }
Steve Fung6e139522015-02-05 14:54:16 -080058
Ken Mixter03403162010-08-18 15:23:16 -070059 protected:
60 void WriteStringToFile(const FilePath &file_path,
61 const char *data) {
Ben Chanf30c6412014-05-22 23:09:01 -070062 ASSERT_EQ(strlen(data), base::WriteFile(file_path, data, strlen(data)));
Ken Mixter03403162010-08-18 15:23:16 -070063 }
64
Steve Fung6e139522015-02-05 14:54:16 -080065 UncleanShutdownCollectorMock collector_;
Ken Mixter03403162010-08-18 15:23:16 -070066 FilePath test_unclean_;
67};
68
69TEST_F(UncleanShutdownCollectorTest, EnableWithoutParent) {
70 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050071 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -070072}
73
74TEST_F(UncleanShutdownCollectorTest, EnableWithParent) {
Michael Krebs87a49502012-04-12 15:24:22 -070075 mkdir(kTestDirectory, 0777);
Ken Mixter03403162010-08-18 15:23:16 -070076 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050077 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -070078}
79
80TEST_F(UncleanShutdownCollectorTest, EnableCannotWrite) {
81 collector_.unclean_shutdown_file_ = "/bad/path";
82 ASSERT_FALSE(collector_.Enable());
Ken Mixtera3249322011-03-03 08:47:38 -080083 ASSERT_TRUE(FindLog("Unable to create shutdown check file"));
Ken Mixter03403162010-08-18 15:23:16 -070084}
85
86TEST_F(UncleanShutdownCollectorTest, CollectTrue) {
87 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050088 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -070089 ASSERT_TRUE(collector_.Collect());
Mike Frysingera557c112014-02-05 22:55:39 -050090 ASSERT_FALSE(base::PathExists(test_unclean_));
Simon Que3f7ed5d2010-11-30 17:10:54 -080091 ASSERT_EQ(1, s_crashes);
Ken Mixtera3249322011-03-03 08:47:38 -080092 ASSERT_TRUE(FindLog("Last shutdown was not clean"));
Ken Mixter03403162010-08-18 15:23:16 -070093}
94
95TEST_F(UncleanShutdownCollectorTest, CollectFalse) {
96 ASSERT_FALSE(collector_.Collect());
Simon Que3f7ed5d2010-11-30 17:10:54 -080097 ASSERT_EQ(0, s_crashes);
98}
99
Simon Que3f7ed5d2010-11-30 17:10:54 -0800100TEST_F(UncleanShutdownCollectorTest, CollectDeadBatterySuspended) {
101 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -0500102 ASSERT_TRUE(base::PathExists(test_unclean_));
Ben Chanf30c6412014-05-22 23:09:01 -0700103 base::WriteFile(collector_.powerd_suspended_file_, "", 0);
Simon Que3f7ed5d2010-11-30 17:10:54 -0800104 ASSERT_FALSE(collector_.Collect());
Mike Frysingera557c112014-02-05 22:55:39 -0500105 ASSERT_FALSE(base::PathExists(test_unclean_));
106 ASSERT_FALSE(base::PathExists(collector_.powerd_suspended_file_));
Simon Que3f7ed5d2010-11-30 17:10:54 -0800107 ASSERT_EQ(0, s_crashes);
Ken Mixtera3249322011-03-03 08:47:38 -0800108 ASSERT_TRUE(FindLog("Unclean shutdown occurred while suspended."));
Ken Mixter03403162010-08-18 15:23:16 -0700109}
110
111TEST_F(UncleanShutdownCollectorTest, Disable) {
112 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -0500113 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -0700114 ASSERT_TRUE(collector_.Disable());
Mike Frysingera557c112014-02-05 22:55:39 -0500115 ASSERT_FALSE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -0700116 ASSERT_FALSE(collector_.Collect());
117}
118
119TEST_F(UncleanShutdownCollectorTest, DisableWhenNotEnabled) {
120 ASSERT_TRUE(collector_.Disable());
121}
122
123TEST_F(UncleanShutdownCollectorTest, CantDisable) {
Michael Krebs87a49502012-04-12 15:24:22 -0700124 mkdir(kTestDirectory, 0700);
125 if (mkdir(kTestUnclean, 0700)) {
126 ASSERT_EQ(EEXIST, errno)
127 << "Error while creating directory '" << kTestUnclean
128 << "': " << strerror(errno);
129 }
Ben Chanf30c6412014-05-22 23:09:01 -0700130 ASSERT_EQ(0, base::WriteFile(test_unclean_.Append("foo"), "", 0))
Michael Krebs87a49502012-04-12 15:24:22 -0700131 << "Error while creating empty file '"
132 << test_unclean_.Append("foo").value() << "': " << strerror(errno);
Ken Mixter03403162010-08-18 15:23:16 -0700133 ASSERT_FALSE(collector_.Disable());
134 rmdir(kTestUnclean);
135}