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