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

#ifndef UPDATE_ENGINE_PAYLOAD_STATE_INTERFACE_H_
#define UPDATE_ENGINE_PAYLOAD_STATE_INTERFACE_H_

#include <string>

#include "update_engine/action_processor.h"
#include "update_engine/constants.h"
#include "update_engine/omaha_response.h"

namespace chromeos_update_engine {

// Describes the methods that need to be implemented by the PayloadState class.
// This interface has been carved out to support mocking of the PayloadState
// object.
class PayloadStateInterface {
 public:
  // Sets the internal payload state based on the given Omaha response. This
  // response could be the same or different from the one for which we've stored
  // the internal state. If it's different, then this method resets all the
  // internal state corresponding to the old response. Since the Omaha response
  // has a lot of fields that are not related to payload state, it uses only
  // a subset of the fields in the Omaha response to compare equality.
  virtual void SetResponse(const OmahaResponse& response) = 0;

  // This method should be called whenever we have completed downloading all
  // the bytes of a payload and have verified that its size and hash match the
  // expected values. We use this notificaiton to increment the payload attempt
  // number so that the throttle the next attempt to download the same payload
  // (in case there's an error in subsequent steps such as post-install)
  // appropriately.
  virtual void DownloadComplete() = 0;

  // This method should be called whenever we receive new bytes from the
  // network for the current payload. We use this notification to reset the
  // failure count for a given URL since receipt of some bytes means we are
  // able to make forward progress with the current URL.
  virtual void DownloadProgress(size_t count) = 0;

  // This method should be called every time we resume an update attempt.
  virtual void UpdateResumed() = 0;

  // This method should be called every time we begin a new update. This method
  // should not be called when we resume an update from the previously
  // downloaded point. This is used to reset the metrics for each new update.
  virtual void UpdateRestarted() = 0;

  // This method should be called once after an update attempt succeeds. This
  // is when the relevant UMA metrics that are tracked on a per-update-basis
  // are uploaded to the UMA server.
  virtual void UpdateSucceeded() = 0;

  // This method should be called whenever an update attempt fails with the
  // given error code. We use this notification to update the payload state
  // depending on the type of the error that happened.
  virtual void UpdateFailed(ErrorCode error) = 0;

  // This method should be called whenever a succeeded update is canceled, and
  // thus can only be called after UpdateSucceeded(). This is currently used
  // only for manual testing using the update_engine_client.
  virtual void ResetUpdateStatus() = 0;

  // This method should be called every time we initiate a Rollback.
  virtual void Rollback() = 0;

  // Sets the expectations to boot into the new version in the next reboot.
  // This function is called every time a new update is marked as ready by
  // UpdateSuccess(). |target_version_uid| is an unique identifier of the
  // applied payload. It can be any string, as long as the same string is used
  // for the same payload.
  virtual void ExpectRebootInNewVersion(
      const std::string& target_version_uid) = 0;

  // Sets whether p2p is being used to download the update payload. This
  // is used to keep track download sources being used and should be called
  // before the transfer begins.
  virtual void SetUsingP2PForDownloading(bool value) = 0;

  // Returns true if we should backoff the current download attempt.
  // False otherwise.
  virtual bool ShouldBackoffDownload() = 0;

  // Returns the currently stored response "signature". The signature  is a
  // subset of fields that are of interest to the PayloadState behavior.
  virtual std::string GetResponseSignature() = 0;

  // Returns the payload attempt number.
  virtual int GetPayloadAttemptNumber() = 0;

  // Returns the payload attempt number of the attempted full payload. Returns
  // 0 for delta payloads.
  virtual int GetFullPayloadAttemptNumber() = 0;

  // Returns the current URL. Returns an empty string if there's no valid URL.
  virtual std::string GetCurrentUrl() = 0;

  // Returns the current URL's failure count.
  virtual uint32_t GetUrlFailureCount() = 0;

  // Returns the total number of times a new URL has been switched to
  // for the current response.
  virtual uint32_t GetUrlSwitchCount() = 0;

  // Returns the total number of different responses seen since the
  // last successful update.
  virtual int GetNumResponsesSeen() = 0;

  // Returns the expiry time for the current backoff period.
  virtual base::Time GetBackoffExpiryTime() = 0;

  // Returns the elapsed time used for this update, including time
  // where the device is powered off and sleeping. If the
  // update has not completed, returns the time spent so far.
  virtual base::TimeDelta GetUpdateDuration() = 0;

  // Returns the time used for this update not including time when
  // the device is powered off or sleeping. If the update has not
  // completed, returns the time spent so far.
  virtual base::TimeDelta GetUpdateDurationUptime() = 0;

  // Returns the number of bytes that have been downloaded for each source for
  // each new update attempt. If we resume an update, we'll continue from the
  // previous value, but if we get a new response or if the previous attempt
  // failed, we'll reset this to 0 to start afresh.
  virtual uint64_t GetCurrentBytesDownloaded(DownloadSource source) = 0;

  // Returns the total number of bytes that have been downloaded for each
  // source since the the last successful update. This is used to compute the
  // overhead we incur.
  virtual uint64_t GetTotalBytesDownloaded(DownloadSource source) = 0;

  // Returns the reboot count for this update attempt.
  virtual uint32_t GetNumReboots() = 0;

  // Called at update_engine startup to do various house-keeping.
  virtual void UpdateEngineStarted() = 0;

  // Returns the version from before a rollback if our last update was a
  // rollback.
  virtual std::string GetRollbackVersion() = 0;

  // Returns the value of number of attempts we've attempted to
  // download the payload via p2p.
  virtual int GetP2PNumAttempts() = 0;

  // Returns the value of timestamp of the first time we've attempted
  // to download the payload via p2p.
  virtual base::Time GetP2PFirstAttemptTimestamp() = 0;

  // Should be called every time we decide to use p2p for an update
  // attempt. This is used to increase the p2p attempt counter and
  // set the timestamp for first attempt.
  virtual void P2PNewAttempt() = 0;

  // Returns |true| if we are allowed to continue using p2p for
  // downloading and |false| otherwise. This is done by recording
  // and examining how many attempts have been done already as well
  // as when the first attempt was.
  virtual bool P2PAttemptAllowed() = 0;

  // Gets the value previously set with SetUsingP2PForDownloading().
  virtual bool GetUsingP2PForDownloading() = 0;

  // Returns the current (persisted) scattering wallclock-based wait period.
  virtual base::TimeDelta GetScatteringWaitPeriod() = 0;

  // Sets and persists the scattering wallclock-based wait period.
  virtual void SetScatteringWaitPeriod(base::TimeDelta wait_period) = 0;
};

}  // namespace chromeos_update_engine

#endif  // UPDATE_ENGINE_PAYLOAD_STATE_INTERFACE_H_
