1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/renderer_host/p2p/socket_host_test_utils.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/sys_byteorder.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/thread_task_runner_handle.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/base/completion_callback.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/base/io_buffer.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const int kStunHeaderSize = 20; 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const uint16 kStunBindingRequest = 0x0001; 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const uint16 kStunBindingResponse = 0x0102; 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const uint16 kStunBindingError = 0x0111; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const uint32 kStunMagicCookie = 0x2112A442; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MockIPCSender::MockIPCSender() { } 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MockIPCSender::~MockIPCSender() { } 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)FakeSocket::FakeSocket(std::string* written_data) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : read_pending_(false), 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) input_pos_(0), 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) written_data_(written_data), 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) async_write_(false), 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) write_pending_(false) { 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)FakeSocket::~FakeSocket() { } 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FakeSocket::AppendInputData(const char* data, int data_size) { 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) input_data_.insert(input_data_.end(), data, data + data_size); 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Complete pending read if any. 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (read_pending_) { 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) read_pending_ = false; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int result = std::min(read_buffer_size_, 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<int>(input_data_.size() - input_pos_)); 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(result > 0); 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) memcpy(read_buffer_->data(), &input_data_[0] + input_pos_, result); 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) input_pos_ += result; 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) read_buffer_ = NULL; 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::CompletionCallback cb = read_callback_; 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) read_callback_.Reset(); 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cb.Run(result); 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FakeSocket::SetPeerAddress(const net::IPEndPoint& peer_address) { 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) peer_address_ = peer_address; 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FakeSocket::SetLocalAddress(const net::IPEndPoint& local_address) { 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) local_address_ = local_address; 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int FakeSocket::Read(net::IOBuffer* buf, int buf_len, 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const net::CompletionCallback& callback) { 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(buf); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (input_pos_ < static_cast<int>(input_data_.size())){ 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int result = std::min(buf_len, 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<int>(input_data_.size()) - input_pos_); 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) memcpy(buf->data(), &(*input_data_.begin()) + input_pos_, result); 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) input_pos_ += result; 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return result; 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) read_pending_ = true; 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) read_buffer_ = buf; 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) read_buffer_size_ = buf_len; 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) read_callback_ = callback; 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return net::ERR_IO_PENDING; 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int FakeSocket::Write(net::IOBuffer* buf, int buf_len, 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const net::CompletionCallback& callback) { 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(buf); 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!write_pending_); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (async_write_) { 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, base::Bind( 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &FakeSocket::DoAsyncWrite, base::Unretained(this), 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<net::IOBuffer>(buf), buf_len, callback)); 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) write_pending_ = true; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return net::ERR_IO_PENDING; 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (written_data_) { 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) written_data_->insert(written_data_->end(), 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) buf->data(), buf->data() + buf_len); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return buf_len; 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FakeSocket::DoAsyncWrite(scoped_refptr<net::IOBuffer> buf, int buf_len, 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const net::CompletionCallback& callback) { 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) write_pending_ = false; 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (written_data_) { 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) written_data_->insert(written_data_->end(), 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) buf->data(), buf->data() + buf_len); 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback.Run(buf_len); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint FakeSocket::SetReceiveBufferSize(int32 size) { 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTIMPLEMENTED(); 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return net::ERR_NOT_IMPLEMENTED; 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint FakeSocket::SetSendBufferSize(int32 size) { 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTIMPLEMENTED(); 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return net::ERR_NOT_IMPLEMENTED; 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int FakeSocket::Connect(const net::CompletionCallback& callback) { 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return 0; 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FakeSocket::Disconnect() { 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool FakeSocket::IsConnected() const { 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool FakeSocket::IsConnectedAndIdle() const { 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int FakeSocket::GetPeerAddress(net::IPEndPoint* address) const { 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *address = peer_address_; 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return net::OK; 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int FakeSocket::GetLocalAddress(net::IPEndPoint* address) const { 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *address = local_address_; 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return net::OK; 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const net::BoundNetLog& FakeSocket::NetLog() const { 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return net_log_; 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FakeSocket::SetSubresourceSpeculation() { 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FakeSocket::SetOmniboxSpeculation() { 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool FakeSocket::WasEverUsed() const { 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool FakeSocket::UsingTCPFastOpen() const { 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool FakeSocket::WasNpnNegotiated() const { 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)net::NextProto FakeSocket::GetNegotiatedProtocol() const { 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return net::kProtoUnknown; 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool FakeSocket::GetSSLInfo(net::SSLInfo* ssl_info) { 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void CreateRandomPacket(std::vector<char>* packet) { 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t size = kStunHeaderSize + rand() % 1000; 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) packet->resize(size); 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < size; i++) { 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (*packet)[i] = rand() % 256; 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Always set the first bit to ensure that generated packet is not 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // valid STUN packet. 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (*packet)[0] = (*packet)[0] | 0x80; 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static void CreateStunPacket(std::vector<char>* packet, uint16 type) { 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CreateRandomPacket(packet); 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *reinterpret_cast<uint16*>(&*packet->begin()) = base::HostToNet16(type); 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *reinterpret_cast<uint16*>(&*packet->begin() + 2) = 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::HostToNet16(packet->size() - kStunHeaderSize); 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *reinterpret_cast<uint32*>(&*packet->begin() + 4) = 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::HostToNet32(kStunMagicCookie); 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void CreateStunRequest(std::vector<char>* packet) { 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CreateStunPacket(packet, kStunBindingRequest); 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void CreateStunResponse(std::vector<char>* packet) { 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CreateStunPacket(packet, kStunBindingResponse); 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void CreateStunError(std::vector<char>* packet) { 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CreateStunPacket(packet, kStunBindingError); 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)net::IPEndPoint ParseAddress(const std::string ip_str, int port) { 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::IPAddressNumber ip; 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(net::ParseIPLiteralToNumber(ip_str, &ip)); 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return net::IPEndPoint(ip, port); 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 212