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