// Copyright (c) 2012 The Chromium 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 CONTENT_RENDERER_MEDIA_MOCK_WEB_RTC_PEER_CONNECTION_HANDLER_CLIENT_H_
#define CONTENT_RENDERER_MEDIA_MOCK_WEB_RTC_PEER_CONNECTION_HANDLER_CLIENT_H_

#include <string>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/WebKit/public/platform/WebMediaStream.h"
#include "third_party/WebKit/public/platform/WebRTCICECandidate.h"
#include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h"

namespace content {

class MockWebRTCPeerConnectionHandlerClient
    : public blink::WebRTCPeerConnectionHandlerClient {
 public:
  MockWebRTCPeerConnectionHandlerClient();
  virtual ~MockWebRTCPeerConnectionHandlerClient();

  // WebRTCPeerConnectionHandlerClient implementation.
  MOCK_METHOD0(negotiationNeeded, void());
  MOCK_METHOD1(didGenerateICECandidate,
               void(const blink::WebRTCICECandidate& candidate));
  MOCK_METHOD1(didChangeSignalingState, void(SignalingState state));
  MOCK_METHOD1(didChangeICEGatheringState, void(ICEGatheringState state));
  MOCK_METHOD1(didChangeICEConnectionState, void(ICEConnectionState state));
  MOCK_METHOD1(didAddRemoteStream,
               void(const blink::WebMediaStream& stream_descriptor));
  MOCK_METHOD1(didRemoveRemoteStream,
               void(const blink::WebMediaStream& stream_descriptor));
  MOCK_METHOD1(didAddRemoteDataChannel,
               void(blink::WebRTCDataChannelHandler*));
  MOCK_METHOD0(releasePeerConnectionHandler, void());

  void didGenerateICECandidateWorker(
      const blink::WebRTCICECandidate& candidate);
  void didAddRemoteStreamWorker(
      const blink::WebMediaStream& stream_descriptor);
  void didRemoveRemoteStreamWorker(
      const blink::WebMediaStream& stream_descriptor);

  const std::string& candidate_sdp() const { return candidate_sdp_; }
  int candidate_mlineindex() const {
    return candidate_mline_index_;
  }
  const std::string& candidate_mid() const { return candidate_mid_ ; }
  const blink::WebMediaStream& remote_stream() const { return remote_steam_;}

 private:
  blink::WebMediaStream remote_steam_;
  std::string candidate_sdp_;
  int candidate_mline_index_;
  std::string candidate_mid_;

  DISALLOW_COPY_AND_ASSIGN(MockWebRTCPeerConnectionHandlerClient);
};

}  // namespace content

#endif  // CONTENT_RENDERER_MEDIA_MOCK_WEB_RTC_PEER_CONNECTION_HANDLER_CLIENT_H_
