1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "remoting/protocol/fake_session.h"
8 #include "base/message_loop/message_loop.h"
9 #include "net/base/address_list.h"
10 #include "net/base/io_buffer.h"
11 #include "net/base/net_errors.h"
12 #include "net/base/net_util.h"
13 #include "testing/gtest/include/gtest/gtest.h"
18 const char kTestJid
[] = "host1@gmail.com/chromoting123";
20 FakeSocket::FakeSocket()
21 : async_write_(false),
22 write_pending_(false),
24 next_write_error_(net::OK
),
25 next_read_error_(net::OK
),
29 message_loop_(base::MessageLoop::current()),
33 FakeSocket::~FakeSocket() {
34 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
37 void FakeSocket::AppendInputData(const std::vector
<char>& data
) {
38 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
39 input_data_
.insert(input_data_
.end(), data
.begin(), data
.end());
40 // Complete pending read if any.
42 read_pending_
= false;
43 int result
= std::min(read_buffer_size_
,
44 static_cast<int>(input_data_
.size() - input_pos_
));
46 memcpy(read_buffer_
->data(),
47 &(*input_data_
.begin()) + input_pos_
, result
);
50 read_callback_
.Run(result
);
54 void FakeSocket::PairWith(FakeSocket
* peer_socket
) {
55 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
56 peer_socket_
= peer_socket
->weak_factory_
.GetWeakPtr();
57 peer_socket
->peer_socket_
= weak_factory_
.GetWeakPtr();
60 int FakeSocket::Read(net::IOBuffer
* buf
, int buf_len
,
61 const net::CompletionCallback
& callback
) {
62 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
64 if (next_read_error_
!= net::OK
) {
65 int r
= next_read_error_
;
66 next_read_error_
= net::OK
;
70 if (input_pos_
< static_cast<int>(input_data_
.size())) {
71 int result
= std::min(buf_len
,
72 static_cast<int>(input_data_
.size()) - input_pos_
);
73 memcpy(buf
->data(), &(*input_data_
.begin()) + input_pos_
, result
);
79 read_buffer_size_
= buf_len
;
80 read_callback_
= callback
;
81 return net::ERR_IO_PENDING
;
85 int FakeSocket::Write(net::IOBuffer
* buf
, int buf_len
,
86 const net::CompletionCallback
& callback
) {
87 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
88 EXPECT_FALSE(write_pending_
);
91 buf_len
= std::min(write_limit_
, buf_len
);
94 message_loop_
->PostTask(FROM_HERE
, base::Bind(
95 &FakeSocket::DoAsyncWrite
, weak_factory_
.GetWeakPtr(),
96 scoped_refptr
<net::IOBuffer
>(buf
), buf_len
, callback
));
97 write_pending_
= true;
98 return net::ERR_IO_PENDING
;
100 if (next_write_error_
!= net::OK
) {
101 int r
= next_write_error_
;
102 next_write_error_
= net::OK
;
106 DoWrite(buf
, buf_len
);
111 void FakeSocket::DoAsyncWrite(scoped_refptr
<net::IOBuffer
> buf
, int buf_len
,
112 const net::CompletionCallback
& callback
) {
113 write_pending_
= false;
115 if (next_write_error_
!= net::OK
) {
116 int r
= next_write_error_
;
117 next_write_error_
= net::OK
;
122 DoWrite(buf
.get(), buf_len
);
123 callback
.Run(buf_len
);
126 void FakeSocket::DoWrite(net::IOBuffer
* buf
, int buf_len
) {
127 written_data_
.insert(written_data_
.end(),
128 buf
->data(), buf
->data() + buf_len
);
130 if (peer_socket_
.get()) {
131 message_loop_
->PostTask(
133 base::Bind(&FakeSocket::AppendInputData
,
135 std::vector
<char>(buf
->data(), buf
->data() + buf_len
)));
139 int FakeSocket::SetReceiveBufferSize(int32 size
) {
141 return net::ERR_NOT_IMPLEMENTED
;
144 int FakeSocket::SetSendBufferSize(int32 size
) {
146 return net::ERR_NOT_IMPLEMENTED
;
149 int FakeSocket::Connect(const net::CompletionCallback
& callback
) {
150 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
154 void FakeSocket::Disconnect() {
155 peer_socket_
.reset();
158 bool FakeSocket::IsConnected() const {
159 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
163 bool FakeSocket::IsConnectedAndIdle() const {
168 int FakeSocket::GetPeerAddress(net::IPEndPoint
* address
) const {
169 net::IPAddressNumber
ip(net::kIPv4AddressSize
);
170 *address
= net::IPEndPoint(ip
, 0);
174 int FakeSocket::GetLocalAddress(net::IPEndPoint
* address
) const {
176 return net::ERR_NOT_IMPLEMENTED
;
179 const net::BoundNetLog
& FakeSocket::NetLog() const {
180 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
184 void FakeSocket::SetSubresourceSpeculation() {
188 void FakeSocket::SetOmniboxSpeculation() {
192 bool FakeSocket::WasEverUsed() const {
197 bool FakeSocket::UsingTCPFastOpen() const {
202 bool FakeSocket::WasNpnNegotiated() const {
206 net::NextProto
FakeSocket::GetNegotiatedProtocol() const {
208 return net::kProtoUnknown
;
211 bool FakeSocket::GetSSLInfo(net::SSLInfo
* ssl_info
) {
215 FakeUdpSocket::FakeUdpSocket()
216 : read_pending_(false),
218 message_loop_(base::MessageLoop::current()) {
221 FakeUdpSocket::~FakeUdpSocket() {
222 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
225 void FakeUdpSocket::AppendInputPacket(const char* data
, int data_size
) {
226 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
227 input_packets_
.push_back(std::string());
228 input_packets_
.back().assign(data
, data
+ data_size
);
230 // Complete pending read if any.
232 read_pending_
= false;
233 int result
= std::min(data_size
, read_buffer_size_
);
234 memcpy(read_buffer_
->data(), data
, result
);
235 input_pos_
= input_packets_
.size();
236 read_callback_
.Run(result
);
241 int FakeUdpSocket::Read(net::IOBuffer
* buf
, int buf_len
,
242 const net::CompletionCallback
& callback
) {
243 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
244 if (input_pos_
< static_cast<int>(input_packets_
.size())) {
245 int result
= std::min(
246 buf_len
, static_cast<int>(input_packets_
[input_pos_
].size()));
247 memcpy(buf
->data(), &(*input_packets_
[input_pos_
].begin()), result
);
251 read_pending_
= true;
253 read_buffer_size_
= buf_len
;
254 read_callback_
= callback
;
255 return net::ERR_IO_PENDING
;
259 int FakeUdpSocket::Write(net::IOBuffer
* buf
, int buf_len
,
260 const net::CompletionCallback
& callback
) {
261 EXPECT_EQ(message_loop_
, base::MessageLoop::current());
262 written_packets_
.push_back(std::string());
263 written_packets_
.back().assign(buf
->data(), buf
->data() + buf_len
);
267 int FakeUdpSocket::SetReceiveBufferSize(int32 size
) {
269 return net::ERR_NOT_IMPLEMENTED
;
272 int FakeUdpSocket::SetSendBufferSize(int32 size
) {
274 return net::ERR_NOT_IMPLEMENTED
;
277 FakeSession::FakeSession()
278 : event_handler_(NULL
),
279 candidate_config_(CandidateSessionConfig::CreateDefault()),
280 config_(SessionConfig::ForTest()),
281 message_loop_(base::MessageLoop::current()),
282 async_creation_(false),
286 weak_factory_(this) {
289 FakeSession::~FakeSession() { }
291 FakeSocket
* FakeSession::GetStreamChannel(const std::string
& name
) {
292 return stream_channels_
[name
];
295 FakeUdpSocket
* FakeSession::GetDatagramChannel(const std::string
& name
) {
296 return datagram_channels_
[name
];
299 void FakeSession::SetEventHandler(EventHandler
* event_handler
) {
300 event_handler_
= event_handler
;
303 ErrorCode
FakeSession::error() {
307 const std::string
& FakeSession::jid() {
311 const CandidateSessionConfig
* FakeSession::candidate_config() {
312 return candidate_config_
.get();
315 const SessionConfig
& FakeSession::config() {
319 void FakeSession::set_config(const SessionConfig
& config
) {
323 ChannelFactory
* FakeSession::GetTransportChannelFactory() {
327 ChannelFactory
* FakeSession::GetMultiplexedChannelFactory() {
331 void FakeSession::Close() {
335 void FakeSession::CreateStreamChannel(
336 const std::string
& name
,
337 const StreamChannelCallback
& callback
) {
338 scoped_ptr
<FakeSocket
> channel
;
339 // If we are in the error state then we put NULL in the channels list, so that
340 // NotifyStreamChannelCallback() still calls the callback.
342 channel
.reset(new FakeSocket());
343 stream_channels_
[name
] = channel
.release();
345 if (async_creation_
) {
346 message_loop_
->PostTask(FROM_HERE
, base::Bind(
347 &FakeSession::NotifyStreamChannelCallback
, weak_factory_
.GetWeakPtr(),
350 NotifyStreamChannelCallback(name
, callback
);
354 void FakeSession::NotifyStreamChannelCallback(
355 const std::string
& name
,
356 const StreamChannelCallback
& callback
) {
357 if (stream_channels_
.find(name
) != stream_channels_
.end())
358 callback
.Run(scoped_ptr
<net::StreamSocket
>(stream_channels_
[name
]));
361 void FakeSession::CreateDatagramChannel(
362 const std::string
& name
,
363 const DatagramChannelCallback
& callback
) {
364 scoped_ptr
<FakeUdpSocket
> channel
;
365 // If we are in the error state then we put NULL in the channels list, so that
366 // NotifyStreamChannelCallback() still calls the callback.
368 channel
.reset(new FakeUdpSocket());
369 datagram_channels_
[name
] = channel
.release();
371 if (async_creation_
) {
372 message_loop_
->PostTask(FROM_HERE
, base::Bind(
373 &FakeSession::NotifyDatagramChannelCallback
, weak_factory_
.GetWeakPtr(),
376 NotifyDatagramChannelCallback(name
, callback
);
380 void FakeSession::NotifyDatagramChannelCallback(
381 const std::string
& name
,
382 const DatagramChannelCallback
& callback
) {
383 if (datagram_channels_
.find(name
) != datagram_channels_
.end())
384 callback
.Run(scoped_ptr
<net::Socket
>(datagram_channels_
[name
]));
387 void FakeSession::CancelChannelCreation(const std::string
& name
) {
388 stream_channels_
.erase(name
);
389 datagram_channels_
.erase(name
);
392 } // namespace protocol
393 } // namespace remoting