Collect suspend and resume info from power manager

Updated the unclean shutdown collector to check and report the
modification times of trace files left by power manager to indicate that
the system was suspended and that it was running on low battery.

These files are interpreted by the unclean shutdown collector to
determine the cause of an unclean shutdown -- either the battery ran
out during suspend or the battery ran out after resuming from a low
battery-induced suspend and it continued to run on battery.

BUG=chromium-os:1472
TEST=Let the battery run below the cutoff, suspend & resume, and then
remove the battery to simulate running dry; check crash reporter
logs.  Alternatively/additionally, let it suspend and remove the battery
while suspended.  Restart and check crash reporter logs.

Signed-off-by: Simon Que <sque@chromium.org>

Change-Id: I8e6767e8457afb7abf1e7300eac020adda1ebb48

Review URL: http://codereview.chromium.org/3644007
diff --git a/crash_reporter/unclean_shutdown_collector_test.cc b/crash_reporter/unclean_shutdown_collector_test.cc
index 7be52af..2cf9fb5 100644
--- a/crash_reporter/unclean_shutdown_collector_test.cc
+++ b/crash_reporter/unclean_shutdown_collector_test.cc
@@ -12,8 +12,10 @@
 #include "gtest/gtest.h"
 
 static int s_crashes = 0;
-static bool s_metrics = false;
+static bool s_metrics = true;
 
+static const char kTestLowBattery[] = "test/low_battery";
+static const char kTestSuspended[] = "test/suspended";
 static const char kTestUnclean[] = "test/unclean";
 
 void CountCrash() {
@@ -34,6 +36,9 @@
     test_unclean_ = FilePath(kTestUnclean);
     collector_.unclean_shutdown_file_ = kTestUnclean;
     file_util::Delete(test_unclean_, true);
+    // Set up alternate power manager tracing files as well
+    collector_.powerd_suspended_file_ = FilePath(kTestSuspended);
+    collector_.powerd_low_battery_file_ = FilePath(kTestLowBattery);
   }
  protected:
   void WriteStringToFile(const FilePath &file_path,
@@ -70,12 +75,39 @@
   ASSERT_TRUE(file_util::PathExists(test_unclean_));
   ASSERT_TRUE(collector_.Collect());
   ASSERT_FALSE(file_util::PathExists(test_unclean_));
+  ASSERT_EQ(1, s_crashes);
   ASSERT_NE(std::string::npos,
             logging_.log().find("Last shutdown was not clean"));
 }
 
 TEST_F(UncleanShutdownCollectorTest, CollectFalse) {
   ASSERT_FALSE(collector_.Collect());
+  ASSERT_EQ(0, s_crashes);
+}
+
+TEST_F(UncleanShutdownCollectorTest, CollectDeadBatteryRunningLow) {
+  ASSERT_TRUE(collector_.Enable());
+  ASSERT_TRUE(file_util::PathExists(test_unclean_));
+  file_util::WriteFile(collector_.powerd_low_battery_file_, "", 0);
+  ASSERT_FALSE(collector_.Collect());
+  ASSERT_FALSE(file_util::PathExists(test_unclean_));
+  ASSERT_FALSE(file_util::PathExists(collector_.powerd_low_battery_file_));
+  ASSERT_EQ(0, s_crashes);
+  ASSERT_NE(std::string::npos,
+            logging_.log().find("Unclean shutdown occurred while running with "
+                                "battery critically low."));
+}
+
+TEST_F(UncleanShutdownCollectorTest, CollectDeadBatterySuspended) {
+  ASSERT_TRUE(collector_.Enable());
+  ASSERT_TRUE(file_util::PathExists(test_unclean_));
+  file_util::WriteFile(collector_.powerd_suspended_file_, "", 0);
+  ASSERT_FALSE(collector_.Collect());
+  ASSERT_FALSE(file_util::PathExists(test_unclean_));
+  ASSERT_FALSE(file_util::PathExists(collector_.powerd_suspended_file_));
+  ASSERT_EQ(0, s_crashes);
+  ASSERT_NE(std::string::npos,
+            logging_.log().find("Unclean shutdown occurred while suspended."));
 }
 
 TEST_F(UncleanShutdownCollectorTest, Disable) {