blob: f23174c108f96241b75ec2eca10353de5c13df9c [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>
12#include <chromeos/test_helpers.h>
13#include <gtest/gtest.h>
Ken Mixter03403162010-08-18 15:23:16 -070014
15static int s_crashes = 0;
Simon Que3f7ed5d2010-11-30 17:10:54 -080016static bool s_metrics = true;
Ken Mixter03403162010-08-18 15:23:16 -070017
Michael Krebs87a49502012-04-12 15:24:22 -070018static const char kTestDirectory[] = "test";
Simon Que3f7ed5d2010-11-30 17:10:54 -080019static const char kTestSuspended[] = "test/suspended";
Ken Mixter03403162010-08-18 15:23:16 -070020static const char kTestUnclean[] = "test/unclean";
21
Simon Que9f90aca2013-02-19 17:19:52 -080022using base::FilePath;
Ken Mixtera3249322011-03-03 08:47:38 -080023using ::chromeos::FindLog;
24
Ken Mixter03403162010-08-18 15:23:16 -070025void CountCrash() {
26 ++s_crashes;
27}
28
29bool IsMetrics() {
30 return s_metrics;
31}
32
33class UncleanShutdownCollectorTest : public ::testing::Test {
34 void SetUp() {
35 s_crashes = 0;
36 collector_.Initialize(CountCrash,
Ken Mixtera3249322011-03-03 08:47:38 -080037 IsMetrics);
Michael Krebs87a49502012-04-12 15:24:22 -070038 rmdir(kTestDirectory);
Ken Mixter03403162010-08-18 15:23:16 -070039 test_unclean_ = FilePath(kTestUnclean);
40 collector_.unclean_shutdown_file_ = kTestUnclean;
Mike Frysingera557c112014-02-05 22:55:39 -050041 base::DeleteFile(test_unclean_, true);
Daniel Erat9c9e1c42013-07-18 15:57:11 -070042 // Set up an alternate power manager state file as well
Simon Que3f7ed5d2010-11-30 17:10:54 -080043 collector_.powerd_suspended_file_ = FilePath(kTestSuspended);
Ken Mixtera3249322011-03-03 08:47:38 -080044 chromeos::ClearLog();
Ken Mixter03403162010-08-18 15:23:16 -070045 }
46 protected:
47 void WriteStringToFile(const FilePath &file_path,
48 const char *data) {
Ben Chanf30c6412014-05-22 23:09:01 -070049 ASSERT_EQ(strlen(data), base::WriteFile(file_path, data, strlen(data)));
Ken Mixter03403162010-08-18 15:23:16 -070050 }
51
Ken Mixter03403162010-08-18 15:23:16 -070052 UncleanShutdownCollector collector_;
53 FilePath test_unclean_;
54};
55
56TEST_F(UncleanShutdownCollectorTest, EnableWithoutParent) {
57 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050058 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -070059}
60
61TEST_F(UncleanShutdownCollectorTest, EnableWithParent) {
Michael Krebs87a49502012-04-12 15:24:22 -070062 mkdir(kTestDirectory, 0777);
Ken Mixter03403162010-08-18 15:23:16 -070063 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050064 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -070065}
66
67TEST_F(UncleanShutdownCollectorTest, EnableCannotWrite) {
68 collector_.unclean_shutdown_file_ = "/bad/path";
69 ASSERT_FALSE(collector_.Enable());
Ken Mixtera3249322011-03-03 08:47:38 -080070 ASSERT_TRUE(FindLog("Unable to create shutdown check file"));
Ken Mixter03403162010-08-18 15:23:16 -070071}
72
73TEST_F(UncleanShutdownCollectorTest, CollectTrue) {
74 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050075 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -070076 ASSERT_TRUE(collector_.Collect());
Mike Frysingera557c112014-02-05 22:55:39 -050077 ASSERT_FALSE(base::PathExists(test_unclean_));
Simon Que3f7ed5d2010-11-30 17:10:54 -080078 ASSERT_EQ(1, s_crashes);
Ken Mixtera3249322011-03-03 08:47:38 -080079 ASSERT_TRUE(FindLog("Last shutdown was not clean"));
Ken Mixter03403162010-08-18 15:23:16 -070080}
81
82TEST_F(UncleanShutdownCollectorTest, CollectFalse) {
83 ASSERT_FALSE(collector_.Collect());
Simon Que3f7ed5d2010-11-30 17:10:54 -080084 ASSERT_EQ(0, s_crashes);
85}
86
Simon Que3f7ed5d2010-11-30 17:10:54 -080087TEST_F(UncleanShutdownCollectorTest, CollectDeadBatterySuspended) {
88 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050089 ASSERT_TRUE(base::PathExists(test_unclean_));
Ben Chanf30c6412014-05-22 23:09:01 -070090 base::WriteFile(collector_.powerd_suspended_file_, "", 0);
Simon Que3f7ed5d2010-11-30 17:10:54 -080091 ASSERT_FALSE(collector_.Collect());
Mike Frysingera557c112014-02-05 22:55:39 -050092 ASSERT_FALSE(base::PathExists(test_unclean_));
93 ASSERT_FALSE(base::PathExists(collector_.powerd_suspended_file_));
Simon Que3f7ed5d2010-11-30 17:10:54 -080094 ASSERT_EQ(0, s_crashes);
Ken Mixtera3249322011-03-03 08:47:38 -080095 ASSERT_TRUE(FindLog("Unclean shutdown occurred while suspended."));
Ken Mixter03403162010-08-18 15:23:16 -070096}
97
98TEST_F(UncleanShutdownCollectorTest, Disable) {
99 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -0500100 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -0700101 ASSERT_TRUE(collector_.Disable());
Mike Frysingera557c112014-02-05 22:55:39 -0500102 ASSERT_FALSE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -0700103 ASSERT_FALSE(collector_.Collect());
104}
105
106TEST_F(UncleanShutdownCollectorTest, DisableWhenNotEnabled) {
107 ASSERT_TRUE(collector_.Disable());
108}
109
110TEST_F(UncleanShutdownCollectorTest, CantDisable) {
Michael Krebs87a49502012-04-12 15:24:22 -0700111 mkdir(kTestDirectory, 0700);
112 if (mkdir(kTestUnclean, 0700)) {
113 ASSERT_EQ(EEXIST, errno)
114 << "Error while creating directory '" << kTestUnclean
115 << "': " << strerror(errno);
116 }
Ben Chanf30c6412014-05-22 23:09:01 -0700117 ASSERT_EQ(0, base::WriteFile(test_unclean_.Append("foo"), "", 0))
Michael Krebs87a49502012-04-12 15:24:22 -0700118 << "Error while creating empty file '"
119 << test_unclean_.Append("foo").value() << "': " << strerror(errno);
Ken Mixter03403162010-08-18 15:23:16 -0700120 ASSERT_FALSE(collector_.Disable());
121 rmdir(kTestUnclean);
122}
123
124int main(int argc, char **argv) {
Ken Mixtera3249322011-03-03 08:47:38 -0800125 SetUpTests(&argc, argv, false);
Ken Mixter03403162010-08-18 15:23:16 -0700126 return RUN_ALL_TESTS();
127}