// Copyright (c) 2010 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.

// The unclean shutdown collector runs on boot (invoked by crash-boot-collect)
// and checks for the existence of a file
// (/var/lib/crash_reporter/pending_clean_shutdown). If it exists, the machine
// was not shut down properly and we increment an UMA metric.
//
// In the normal shutdown flow, the system deletes that file, so its presence in
// early boot indicates that the shutdown was abnormal in some way. This could
// be as simple as the battery dying, which is why we only count occurrences of
// this event rather than collecting logs.

#ifndef CRASH_REPORTER_UNCLEAN_SHUTDOWN_COLLECTOR_H_
#define CRASH_REPORTER_UNCLEAN_SHUTDOWN_COLLECTOR_H_

#include <base/files/file_path.h>
#include <base/macros.h>
#include <gtest/gtest_prod.h>  // for FRIEND_TEST

#include "crash-reporter/crash_collector.h"

// Unclean shutdown collector.
class UncleanShutdownCollector : public CrashCollector {
 public:
  UncleanShutdownCollector();
  UncleanShutdownCollector(const UncleanShutdownCollector&) = delete;
  UncleanShutdownCollector& operator=(const UncleanShutdownCollector&) = delete;

  ~UncleanShutdownCollector() override;

  void set_os_release_for_test(const base::FilePath& os_release) {
    os_release_path_ = os_release;
  }

  // Enable collection - signal that a boot has started.
  bool Enable();

  // Collect if there is was an unclean shutdown. Returns true if
  // there was, false otherwise.
  bool Collect();

  // Disable collection - signal that the system has been shutdown cleanly.
  bool Disable();

  // Save version data from the running OS for collection after an unclean
  // shutdown or kernel crash.
  bool SaveVersionData();

 private:
  friend class UncleanShutdownCollectorTest;
  FRIEND_TEST(UncleanShutdownCollectorTest, EnableCannotWrite);
  FRIEND_TEST(UncleanShutdownCollectorTest, CollectDeadBatterySuspended);

  bool DeleteUncleanShutdownFiles();

  // Check for unclean shutdown due to battery running out by analyzing powerd
  // trace files.
  bool DeadBatteryCausedUncleanShutdown();

  const char* unclean_shutdown_file_;
  base::FilePath powerd_trace_path_;
  base::FilePath powerd_suspended_file_;
  base::FilePath os_release_path_;
};

#endif  // CRASH_REPORTER_UNCLEAN_SHUTDOWN_COLLECTOR_H_
