blob: a0eec1cc2aff7194e59e9aeafcfe4abdef0d7ff7 [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
5#include <unistd.h>
6
7#include "base/file_util.h"
Mike Frysingera557c112014-02-05 22:55:39 -05008#include "base/strings/string_util.h"
Ken Mixtera3249322011-03-03 08:47:38 -08009#include "chromeos/syslog_logging.h"
10#include "chromeos/test_helpers.h"
Ken Mixter03403162010-08-18 15:23:16 -070011#include "crash-reporter/unclean_shutdown_collector.h"
Ken Mixter03403162010-08-18 15:23:16 -070012#include "gtest/gtest.h"
13
14static int s_crashes = 0;
Simon Que3f7ed5d2010-11-30 17:10:54 -080015static bool s_metrics = true;
Ken Mixter03403162010-08-18 15:23:16 -070016
Michael Krebs87a49502012-04-12 15:24:22 -070017static const char kTestDirectory[] = "test";
Simon Que3f7ed5d2010-11-30 17:10:54 -080018static const char kTestSuspended[] = "test/suspended";
Ken Mixter03403162010-08-18 15:23:16 -070019static const char kTestUnclean[] = "test/unclean";
20
Simon Que9f90aca2013-02-19 17:19:52 -080021using base::FilePath;
Ken Mixtera3249322011-03-03 08:47:38 -080022using ::chromeos::FindLog;
23
Ken Mixter03403162010-08-18 15:23:16 -070024void CountCrash() {
25 ++s_crashes;
26}
27
28bool IsMetrics() {
29 return s_metrics;
30}
31
32class UncleanShutdownCollectorTest : public ::testing::Test {
33 void SetUp() {
34 s_crashes = 0;
35 collector_.Initialize(CountCrash,
Ken Mixtera3249322011-03-03 08:47:38 -080036 IsMetrics);
Michael Krebs87a49502012-04-12 15:24:22 -070037 rmdir(kTestDirectory);
Ken Mixter03403162010-08-18 15:23:16 -070038 test_unclean_ = FilePath(kTestUnclean);
39 collector_.unclean_shutdown_file_ = kTestUnclean;
Mike Frysingera557c112014-02-05 22:55:39 -050040 base::DeleteFile(test_unclean_, true);
Daniel Erat9c9e1c42013-07-18 15:57:11 -070041 // Set up an alternate power manager state file as well
Simon Que3f7ed5d2010-11-30 17:10:54 -080042 collector_.powerd_suspended_file_ = FilePath(kTestSuspended);
Ken Mixtera3249322011-03-03 08:47:38 -080043 chromeos::ClearLog();
Ken Mixter03403162010-08-18 15:23:16 -070044 }
45 protected:
46 void WriteStringToFile(const FilePath &file_path,
47 const char *data) {
Ben Chanf30c6412014-05-22 23:09:01 -070048 ASSERT_EQ(strlen(data), base::WriteFile(file_path, data, strlen(data)));
Ken Mixter03403162010-08-18 15:23:16 -070049 }
50
Ken Mixter03403162010-08-18 15:23:16 -070051 UncleanShutdownCollector collector_;
52 FilePath test_unclean_;
53};
54
55TEST_F(UncleanShutdownCollectorTest, EnableWithoutParent) {
56 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050057 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -070058}
59
60TEST_F(UncleanShutdownCollectorTest, EnableWithParent) {
Michael Krebs87a49502012-04-12 15:24:22 -070061 mkdir(kTestDirectory, 0777);
Ken Mixter03403162010-08-18 15:23:16 -070062 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050063 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -070064}
65
66TEST_F(UncleanShutdownCollectorTest, EnableCannotWrite) {
67 collector_.unclean_shutdown_file_ = "/bad/path";
68 ASSERT_FALSE(collector_.Enable());
Ken Mixtera3249322011-03-03 08:47:38 -080069 ASSERT_TRUE(FindLog("Unable to create shutdown check file"));
Ken Mixter03403162010-08-18 15:23:16 -070070}
71
72TEST_F(UncleanShutdownCollectorTest, CollectTrue) {
73 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050074 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -070075 ASSERT_TRUE(collector_.Collect());
Mike Frysingera557c112014-02-05 22:55:39 -050076 ASSERT_FALSE(base::PathExists(test_unclean_));
Simon Que3f7ed5d2010-11-30 17:10:54 -080077 ASSERT_EQ(1, s_crashes);
Ken Mixtera3249322011-03-03 08:47:38 -080078 ASSERT_TRUE(FindLog("Last shutdown was not clean"));
Ken Mixter03403162010-08-18 15:23:16 -070079}
80
81TEST_F(UncleanShutdownCollectorTest, CollectFalse) {
82 ASSERT_FALSE(collector_.Collect());
Simon Que3f7ed5d2010-11-30 17:10:54 -080083 ASSERT_EQ(0, s_crashes);
84}
85
Simon Que3f7ed5d2010-11-30 17:10:54 -080086TEST_F(UncleanShutdownCollectorTest, CollectDeadBatterySuspended) {
87 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050088 ASSERT_TRUE(base::PathExists(test_unclean_));
Ben Chanf30c6412014-05-22 23:09:01 -070089 base::WriteFile(collector_.powerd_suspended_file_, "", 0);
Simon Que3f7ed5d2010-11-30 17:10:54 -080090 ASSERT_FALSE(collector_.Collect());
Mike Frysingera557c112014-02-05 22:55:39 -050091 ASSERT_FALSE(base::PathExists(test_unclean_));
92 ASSERT_FALSE(base::PathExists(collector_.powerd_suspended_file_));
Simon Que3f7ed5d2010-11-30 17:10:54 -080093 ASSERT_EQ(0, s_crashes);
Ken Mixtera3249322011-03-03 08:47:38 -080094 ASSERT_TRUE(FindLog("Unclean shutdown occurred while suspended."));
Ken Mixter03403162010-08-18 15:23:16 -070095}
96
97TEST_F(UncleanShutdownCollectorTest, Disable) {
98 ASSERT_TRUE(collector_.Enable());
Mike Frysingera557c112014-02-05 22:55:39 -050099 ASSERT_TRUE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -0700100 ASSERT_TRUE(collector_.Disable());
Mike Frysingera557c112014-02-05 22:55:39 -0500101 ASSERT_FALSE(base::PathExists(test_unclean_));
Ken Mixter03403162010-08-18 15:23:16 -0700102 ASSERT_FALSE(collector_.Collect());
103}
104
105TEST_F(UncleanShutdownCollectorTest, DisableWhenNotEnabled) {
106 ASSERT_TRUE(collector_.Disable());
107}
108
109TEST_F(UncleanShutdownCollectorTest, CantDisable) {
Michael Krebs87a49502012-04-12 15:24:22 -0700110 mkdir(kTestDirectory, 0700);
111 if (mkdir(kTestUnclean, 0700)) {
112 ASSERT_EQ(EEXIST, errno)
113 << "Error while creating directory '" << kTestUnclean
114 << "': " << strerror(errno);
115 }
Ben Chanf30c6412014-05-22 23:09:01 -0700116 ASSERT_EQ(0, base::WriteFile(test_unclean_.Append("foo"), "", 0))
Michael Krebs87a49502012-04-12 15:24:22 -0700117 << "Error while creating empty file '"
118 << test_unclean_.Append("foo").value() << "': " << strerror(errno);
Ken Mixter03403162010-08-18 15:23:16 -0700119 ASSERT_FALSE(collector_.Disable());
120 rmdir(kTestUnclean);
121}
122
123int main(int argc, char **argv) {
Ken Mixtera3249322011-03-03 08:47:38 -0800124 SetUpTests(&argc, argv, false);
Ken Mixter03403162010-08-18 15:23:16 -0700125 return RUN_ALL_TESTS();
126}