15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/fake_session.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_list.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestJid[] = "host1@gmail.com/chromoting123";
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeSocket::FakeSocket()
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : async_write_(false),
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_pending_(false),
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_limit_(0),
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_write_error_(net::OK),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_read_error_(net::OK),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_pending_(false),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_buffer_size_(0),
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input_pos_(0),
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      message_loop_(base::MessageLoop::current()),
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeSocket::~FakeSocket() {
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSocket::AppendInputData(const std::vector<char>& data) {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_data_.insert(input_data_.end(), data.begin(), data.end());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Complete pending read if any.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_pending_) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_pending_ = false;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = std::min(read_buffer_size_,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          static_cast<int>(input_data_.size() - input_pos_));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(result > 0);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(read_buffer_->data(),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           &(*input_data_.begin()) + input_pos_, result);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_pos_ += result;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_buffer_ = NULL;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_callback_.Run(result);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSocket::PairWith(FakeSocket* peer_socket) {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  peer_socket_ = peer_socket->weak_factory_.GetWeakPtr();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  peer_socket->peer_socket_ = weak_factory_.GetWeakPtr();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FakeSocket::Read(net::IOBuffer* buf, int buf_len,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const net::CompletionCallback& callback) {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (next_read_error_ != net::OK) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int r = next_read_error_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_read_error_ = net::OK;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return r;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (input_pos_ < static_cast<int>(input_data_.size())) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = std::min(buf_len,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          static_cast<int>(input_data_.size()) - input_pos_);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(buf->data(), &(*input_data_.begin()) + input_pos_, result);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_pos_ += result;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_pending_ = true;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_buffer_ = buf;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_buffer_size_ = buf_len;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_callback_ = callback;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return net::ERR_IO_PENDING;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FakeSocket::Write(net::IOBuffer* buf, int buf_len,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const net::CompletionCallback& callback) {
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(write_pending_);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (write_limit_ > 0)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf_len = std::min(write_limit_, buf_len);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (async_write_) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->PostTask(FROM_HERE, base::Bind(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &FakeSocket::DoAsyncWrite, weak_factory_.GetWeakPtr(),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_refptr<net::IOBuffer>(buf), buf_len, callback));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    write_pending_ = true;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return net::ERR_IO_PENDING;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (next_write_error_ != net::OK) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int r = next_write_error_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_write_error_ = net::OK;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return r;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoWrite(buf, buf_len);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return buf_len;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSocket::DoAsyncWrite(scoped_refptr<net::IOBuffer> buf, int buf_len,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const net::CompletionCallback& callback) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  write_pending_ = false;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (next_write_error_ != net::OK) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int r = next_write_error_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_write_error_ = net::OK;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(r);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DoWrite(buf.get(), buf_len);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(buf_len);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSocket::DoWrite(net::IOBuffer* buf, int buf_len) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  written_data_.insert(written_data_.end(),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       buf->data(), buf->data() + buf_len);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (peer_socket_.get()) {
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    message_loop_->PostTask(
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        FROM_HERE,
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::Bind(&FakeSocket::AppendInputData,
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   peer_socket_,
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   std::vector<char>(buf->data(), buf->data() + buf_len)));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeSocket::SetReceiveBufferSize(int32 size) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeSocket::SetSendBufferSize(int32 size) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FakeSocket::Connect(const net::CompletionCallback& callback) {
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::OK;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSocket::Disconnect() {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  peer_socket_.reset();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeSocket::IsConnected() const {
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeSocket::IsConnectedAndIdle() const {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FakeSocket::GetPeerAddress(net::IPEndPoint* address) const {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::IPAddressNumber ip(net::kIPv4AddressSize);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *address = net::IPEndPoint(ip, 0);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::OK;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FakeSocket::GetLocalAddress(net::IPEndPoint* address) const {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::ERR_FAILED;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::BoundNetLog& FakeSocket::NetLog() const {
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net_log_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSocket::SetSubresourceSpeculation() {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSocket::SetOmniboxSpeculation() {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeSocket::WasEverUsed() const {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeSocket::UsingTCPFastOpen() const {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeSocket::WasNpnNegotiated() const {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::NextProto FakeSocket::GetNegotiatedProtocol() const {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::kProtoUnknown;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeSocket::GetSSLInfo(net::SSLInfo* ssl_info) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeUdpSocket::FakeUdpSocket()
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : read_pending_(false),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input_pos_(0),
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      message_loop_(base::MessageLoop::current()) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeUdpSocket::~FakeUdpSocket() {
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeUdpSocket::AppendInputPacket(const char* data, int data_size) {
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_packets_.push_back(std::string());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_packets_.back().assign(data, data + data_size);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Complete pending read if any.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_pending_) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_pending_ = false;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = std::min(data_size, read_buffer_size_);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(read_buffer_->data(), data, result);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_pos_ = input_packets_.size();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_callback_.Run(result);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_buffer_ = NULL;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FakeUdpSocket::Read(net::IOBuffer* buf, int buf_len,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const net::CompletionCallback& callback) {
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (input_pos_ < static_cast<int>(input_packets_.size())) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = std::min(
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buf_len, static_cast<int>(input_packets_[input_pos_].size()));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(buf->data(), &(*input_packets_[input_pos_].begin()), result);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++input_pos_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_pending_ = true;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_buffer_ = buf;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_buffer_size_ = buf_len;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_callback_ = callback;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return net::ERR_IO_PENDING;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FakeUdpSocket::Write(net::IOBuffer* buf, int buf_len,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const net::CompletionCallback& callback) {
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(message_loop_, base::MessageLoop::current());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  written_packets_.push_back(std::string());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  written_packets_.back().assign(buf->data(), buf->data() + buf_len);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return buf_len;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeUdpSocket::SetReceiveBufferSize(int32 size) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeUdpSocket::SetSendBufferSize(int32 size) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeSession::FakeSession()
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : event_handler_(NULL),
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      candidate_config_(CandidateSessionConfig::CreateDefault()),
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      config_(SessionConfig::ForTest()),
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      message_loop_(base::MessageLoop::current()),
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      async_creation_(false),
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jid_(kTestJid),
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_(OK),
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      closed_(false),
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeSession::~FakeSession() { }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeSocket* FakeSession::GetStreamChannel(const std::string& name) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return stream_channels_[name];
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeUdpSocket* FakeSession::GetDatagramChannel(const std::string& name) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return datagram_channels_[name];
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSession::SetEventHandler(EventHandler* event_handler) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_handler_ = event_handler;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorCode FakeSession::error() {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error_;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& FakeSession::jid() {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return jid_;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const CandidateSessionConfig* FakeSession::candidate_config() {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return candidate_config_.get();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SessionConfig& FakeSession::config() {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return config_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSession::set_config(const SessionConfig& config) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_ = config;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChannelFactory* FakeSession::GetTransportChannelFactory() {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChannelFactory* FakeSession::GetMultiplexedChannelFactory() {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSession::Close() {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  closed_ = true;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSession::CreateStreamChannel(
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StreamChannelCallback& callback) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FakeSocket> channel;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are in the error state then we put NULL in the channels list, so that
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NotifyStreamChannelCallback() still calls the callback.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error_ == OK)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel.reset(new FakeSocket());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stream_channels_[name] = channel.release();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (async_creation_) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->PostTask(FROM_HERE, base::Bind(
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &FakeSession::NotifyStreamChannelCallback, weak_factory_.GetWeakPtr(),
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name, callback));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyStreamChannelCallback(name, callback);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSession::NotifyStreamChannelCallback(
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StreamChannelCallback& callback) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stream_channels_.find(name) != stream_channels_.end())
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(scoped_ptr<net::StreamSocket>(stream_channels_[name]));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSession::CreateDatagramChannel(
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DatagramChannelCallback& callback) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FakeUdpSocket> channel;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are in the error state then we put NULL in the channels list, so that
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NotifyStreamChannelCallback() still calls the callback.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error_ == OK)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel.reset(new FakeUdpSocket());
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  datagram_channels_[name] = channel.release();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (async_creation_) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->PostTask(FROM_HERE, base::Bind(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &FakeSession::NotifyDatagramChannelCallback, weak_factory_.GetWeakPtr(),
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name, callback));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyDatagramChannelCallback(name, callback);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSession::NotifyDatagramChannelCallback(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DatagramChannelCallback& callback) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (datagram_channels_.find(name) != datagram_channels_.end())
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(scoped_ptr<net::Socket>(datagram_channels_[name]));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeSession::CancelChannelCreation(const std::string& name) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stream_channels_.erase(name);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  datagram_channels_.erase(name);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protocol
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
392