chromium/chromecast/system/reboot/reboot_util.h

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMECAST_SYSTEM_REBOOT_REBOOT_UTIL_H_
#define CHROMECAST_SYSTEM_REBOOT_REBOOT_UTIL_H_

#include <string>
#include <vector>

#include "base/functional/callback.h"
#include "chromecast/public/reboot_shlib.h"

namespace chromecast {

// A wrapper util for the RebootShlib interface. This acts as a translation
// layer between cast_shell call sites (such as the setup API, process_manager,
// and crash_uploader) and the actual RebootShlib API.
// The RebootShlib interface should never need to be used directly; instead
// prefer to use the RebootUtil interface.
class RebootUtil {
 public:
  static void Initialize(const std::vector<std::string>& argv);
  static void Finalize();

  // Indicates if any RebootSources are supported for rebooting.
  static bool IsRebootSupported();

  // The RebootShlib::RebootSource uses weakly typed enums, so this
  // can be used to validate a RebootSource value is actually valid.
  static bool IsValidRebootSource(RebootShlib::RebootSource reboot_source);

  // Before calling RebootNow, the caller must check that reboot is supported
  // for the RebootSource being attempted.
  static bool IsRebootSourceSupported(RebootShlib::RebootSource reboot_source);
  static bool RebootNow(RebootShlib::RebootSource reboot_source);

  // Before calling SetFdrForNextReboot, the caller must check that fdr
  // for next reboot is supported.
  static bool IsFdrForNextRebootSupported();
  static void SetFdrForNextReboot();

  // Before calling SetOtaForNextReboot, the caller must check that ota
  // for next reboot is supported.
  static bool IsOtaForNextRebootSupported();
  static void SetOtaForNextReboot();

  // Before calling IsClearOtaForNextRebootSupported, the called must check
  // if clearing the ota is supported.
  static bool IsClearOtaForNextRebootSupported();
  static void ClearOtaForNextReboot();

  // Returns last reboot source. This value persists throughout each boot.
  static RebootShlib::RebootSource GetLastRebootSource();

  // This is used for logging/metrics purposes. In general, setting the next
  // reboot type is handled automatically by RebootUtil, so it should not
  // be necessary to set explicitly.
  // Returns true if successful.
  static bool SetNextRebootSource(RebootShlib::RebootSource reboot_source);

  using RebootCallback =
      base::RepeatingCallback<bool(RebootShlib::RebootSource)>;
  // Sets a callback that will be fired when a reboot is requested. This is
  // used by tests to ensure that in production a reboot will occur. The
  // callback returns a bool which controls the return value of RebootNow()
  static void SetRebootCallbackForTest(const RebootCallback& callback);

  // Clears any previously set reboot callbacks. Should be used to clean up
  // the test after any invocation of SetRebootCallbackForTest
  static void ClearRebootCallbackForTest();
};

}  // namespace chromecast

#endif  // CHROMECAST_SYSTEM_REBOOT_REBOOT_UTIL_H_