//
// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#ifndef UPDATE_ENGINE_FAKE_P2P_MANAGER_H_
#define UPDATE_ENGINE_FAKE_P2P_MANAGER_H_

#include <string>

#include "update_engine/p2p_manager.h"

namespace chromeos_update_engine {

// A fake implementation of P2PManager.
class FakeP2PManager : public P2PManager {
 public:
  FakeP2PManager() :
    is_p2p_enabled_(false),
    ensure_p2p_running_result_(false),
    ensure_p2p_not_running_result_(false),
    perform_housekeeping_result_(false),
    count_shared_files_result_(0) {}

  // P2PManager overrides.
  void SetDevicePolicy(const policy::DevicePolicy* device_policy) override {}

  bool IsP2PEnabled() override {
    return is_p2p_enabled_;
  }

  bool EnsureP2PRunning() override {
    return ensure_p2p_running_result_;
  }

  bool EnsureP2PNotRunning() override {
    return ensure_p2p_not_running_result_;
  }

  bool PerformHousekeeping() override {
    return perform_housekeeping_result_;
  }

  void LookupUrlForFile(const std::string& file_id,
                        size_t minimum_size,
                        base::TimeDelta max_time_to_wait,
                        LookupCallback callback) override {
    callback.Run(lookup_url_for_file_result_);
  }

  bool FileShare(const std::string& file_id,
                 size_t expected_size) override {
    return false;
  }

  base::FilePath FileGetPath(const std::string& file_id) override {
    return base::FilePath();
  }

  ssize_t FileGetSize(const std::string& file_id) override {
    return -1;
  }

  ssize_t FileGetExpectedSize(const std::string& file_id) override {
    return -1;
  }

  bool FileGetVisible(const std::string& file_id,
                      bool *out_result) override {
    return false;
  }

  bool FileMakeVisible(const std::string& file_id) override {
    return false;
  }

  int CountSharedFiles() override {
    return count_shared_files_result_;
  }

  // Methods for controlling what the fake returns and how it acts.
  void SetP2PEnabled(bool is_p2p_enabled) {
    is_p2p_enabled_ = is_p2p_enabled;
  }

  void SetEnsureP2PRunningResult(bool ensure_p2p_running_result) {
    ensure_p2p_running_result_ = ensure_p2p_running_result;
  }

  void SetEnsureP2PNotRunningResult(bool ensure_p2p_not_running_result) {
    ensure_p2p_not_running_result_ = ensure_p2p_not_running_result;
  }

  void SetPerformHousekeepingResult(bool perform_housekeeping_result) {
    perform_housekeeping_result_ = perform_housekeeping_result;
  }

  void SetCountSharedFilesResult(int count_shared_files_result) {
    count_shared_files_result_ = count_shared_files_result;
  }

  void SetLookupUrlForFileResult(const std::string& url) {
    lookup_url_for_file_result_ = url;
  }

 private:
  bool is_p2p_enabled_;
  bool ensure_p2p_running_result_;
  bool ensure_p2p_not_running_result_;
  bool perform_housekeeping_result_;
  int count_shared_files_result_;
  std::string lookup_url_for_file_result_;

  DISALLOW_COPY_AND_ASSIGN(FakeP2PManager);
};

}  // namespace chromeos_update_engine

#endif  // UPDATE_ENGINE_FAKE_P2P_MANAGER_H_
