/*
 *  Copyright 2016 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef P2P_BASE_MOCKICETRANSPORT_H_
#define P2P_BASE_MOCKICETRANSPORT_H_

#include <memory>
#include <string>
#include <vector>

#include "p2p/base/icetransportinternal.h"
#include "rtc_base/gunit.h"
#include "test/gmock.h"

using testing::_;
using testing::Return;

namespace cricket {

// Used in Chromium/remoting/protocol/channel_socket_adapter_unittest.cc
class MockIceTransport : public IceTransportInternal {
 public:
  MockIceTransport() {
    SignalReadyToSend(this);
    SignalWritableState(this);
  }

  MOCK_METHOD4(SendPacket,
               int(const char* data,
                   size_t len,
                   const rtc::PacketOptions& options,
                   int flags));
  MOCK_METHOD2(SetOption, int(rtc::Socket::Option opt, int value));
  MOCK_METHOD0(GetError, int());
  MOCK_CONST_METHOD0(GetIceRole, cricket::IceRole());
  MOCK_METHOD2(GetStats,
               bool(cricket::ConnectionInfos* candidate_pair_stats_list,
                    cricket::CandidateStatsList* candidate_stats_list));

  IceTransportState GetState() const override {
    return IceTransportState::STATE_INIT;
  }
  const std::string& transport_name() const override { return transport_name_; }
  int component() const override { return 0; }
  void SetIceRole(IceRole role) override {}
  void SetIceTiebreaker(uint64_t tiebreaker) override {}
  // The ufrag and pwd in |ice_params| must be set
  // before candidate gathering can start.
  void SetIceParameters(const IceParameters& ice_params) override {}
  void SetRemoteIceParameters(const IceParameters& ice_params) override {}
  void SetRemoteIceMode(IceMode mode) override {}
  void SetIceConfig(const IceConfig& config) override {}
  rtc::Optional<int> GetRttEstimate() override { return rtc::nullopt; }
  void MaybeStartGathering() override {}
  void SetMetricsObserver(webrtc::MetricsObserverInterface* observer) override {
  }
  void AddRemoteCandidate(const Candidate& candidate) override {}
  void RemoveRemoteCandidate(const Candidate& candidate) override {}
  IceGatheringState gathering_state() const override {
    return IceGatheringState::kIceGatheringComplete;
  }

  bool receiving() const override { return true; }
  bool writable() const override { return true; }

 private:
  std::string transport_name_;
};

}  // namespace cricket

#endif  // P2P_BASE_MOCKICETRANSPORT_H_
