// Copyright 2014 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 COMPONENTS_TEST_RUNNER_MOCK_WEBRTC_DATA_CHANNEL_HANDLER_H_
#define COMPONENTS_TEST_RUNNER_MOCK_WEBRTC_DATA_CHANNEL_HANDLER_H_

#include <stddef.h>

#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "third_party/WebKit/public/platform/WebRTCDataChannelHandler.h"
#include "third_party/WebKit/public/platform/WebRTCDataChannelHandlerClient.h"
#include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h"
#include "third_party/WebKit/public/platform/WebString.h"

namespace test_runner {

class WebTestDelegate;

class MockWebRTCDataChannelHandler : public blink::WebRTCDataChannelHandler {
 public:
  MockWebRTCDataChannelHandler(blink::WebString label,
                               const blink::WebRTCDataChannelInit& init,
                               WebTestDelegate* delegate);
  ~MockWebRTCDataChannelHandler() override;

  // WebRTCDataChannelHandler related methods
  void setClient(blink::WebRTCDataChannelHandlerClient* client) override;
  blink::WebString label() override;
  bool isReliable() override;
  bool ordered() const override;
  unsigned short maxRetransmitTime() const override;
  unsigned short maxRetransmits() const override;
  blink::WebString protocol() const override;
  bool negotiated() const override;
  unsigned short id() const override;
  blink::WebRTCDataChannelHandlerClient::ReadyState state() const override;
  unsigned long bufferedAmount() override;
  bool sendStringData(const blink::WebString& data) override;
  bool sendRawData(const char* data, size_t size) override;
  void close() override;

 private:
  MockWebRTCDataChannelHandler();
  void ReportOpenedState();
  void ReportClosedState();

  blink::WebRTCDataChannelHandlerClient* client_;
  blink::WebString label_;
  blink::WebRTCDataChannelInit init_;
  bool reliable_;
  WebTestDelegate* delegate_;

  base::WeakPtrFactory<MockWebRTCDataChannelHandler> weak_factory_;

  DISALLOW_COPY_AND_ASSIGN(MockWebRTCDataChannelHandler);
};

}  // namespace test_runner

#endif  // COMPONENTS_TEST_RUNNER_MOCK_WEBRTC_DATA_CHANNEL_HANDLER_H_
