// 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.

#include "components/test_runner/mock_webrtc_data_channel_handler.h"

#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/logging.h"
#include "components/test_runner/web_task.h"
#include "components/test_runner/web_test_delegate.h"
#include "third_party/WebKit/public/platform/WebRTCDataChannelHandlerClient.h"

using namespace blink;

namespace test_runner {

MockWebRTCDataChannelHandler::MockWebRTCDataChannelHandler(
    WebString label,
    const WebRTCDataChannelInit& init,
    WebTestDelegate* delegate)
    : client_(0),
      label_(label),
      init_(init),
      delegate_(delegate),
      weak_factory_(this) {
  reliable_ = (init.ordered && init.maxRetransmits == -1 &&
               init.maxRetransmitTime == -1);
}

MockWebRTCDataChannelHandler::~MockWebRTCDataChannelHandler() {}

void MockWebRTCDataChannelHandler::setClient(
    WebRTCDataChannelHandlerClient* client) {
  client_ = client;
  if (client_)
    delegate_->PostTask(new WebCallbackTask(
        base::Bind(&MockWebRTCDataChannelHandler::ReportOpenedState,
                   weak_factory_.GetWeakPtr())));
}

blink::WebString MockWebRTCDataChannelHandler::label() {
  return label_;
}

bool MockWebRTCDataChannelHandler::isReliable() {
  return reliable_;
}

bool MockWebRTCDataChannelHandler::ordered() const {
  return init_.ordered;
}

unsigned short MockWebRTCDataChannelHandler::maxRetransmitTime() const {
  return init_.maxRetransmitTime;
}

unsigned short MockWebRTCDataChannelHandler::maxRetransmits() const {
  return init_.maxRetransmits;
}

WebString MockWebRTCDataChannelHandler::protocol() const {
  return init_.protocol;
}

bool MockWebRTCDataChannelHandler::negotiated() const {
  return init_.negotiated;
}

unsigned short MockWebRTCDataChannelHandler::id() const {
  return init_.id;
}

blink::WebRTCDataChannelHandlerClient::ReadyState
    MockWebRTCDataChannelHandler::state() const {
  return blink::WebRTCDataChannelHandlerClient::ReadyStateConnecting;
}

unsigned long MockWebRTCDataChannelHandler::bufferedAmount() {
  return 0;
}

bool MockWebRTCDataChannelHandler::sendStringData(const WebString& data) {
  DCHECK(client_);
  client_->didReceiveStringData(data);
  return true;
}

bool MockWebRTCDataChannelHandler::sendRawData(const char* data, size_t size) {
  DCHECK(client_);
  client_->didReceiveRawData(data, size);
  return true;
}

void MockWebRTCDataChannelHandler::close() {
  DCHECK(client_);
  delegate_->PostTask(new WebCallbackTask(
      base::Bind(&MockWebRTCDataChannelHandler::ReportClosedState,
                 weak_factory_.GetWeakPtr())));
}

void MockWebRTCDataChannelHandler::ReportOpenedState() {
  client_->didChangeReadyState(WebRTCDataChannelHandlerClient::ReadyStateOpen);
}

void MockWebRTCDataChannelHandler::ReportClosedState() {
  client_->didChangeReadyState(
      WebRTCDataChannelHandlerClient::ReadyStateClosed);
}

}  // namespace test_runner
