Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1111)

Side by Side Diff: chrome/browser/extensions/api/cast_channel/cast_socket_unittest.cc

Issue 79673003: Refactor CastSocket code for the following: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/extensions/api/cast_channel/cast_socket.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/cast_channel/cast_socket.h" 5 #include "chrome/browser/extensions/api/cast_channel/cast_socket.h"
6 6
7 #include "base/message_loop/message_loop.h"
8 #include "base/run_loop.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/sys_byteorder.h"
7 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h" 11 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h"
8 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h" 12 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h"
9 #include "net/base/address_list.h" 13 #include "net/base/address_list.h"
10 #include "net/base/capturing_net_log.h" 14 #include "net/base/capturing_net_log.h"
11 #include "net/base/io_buffer.h" 15 #include "net/base/io_buffer.h"
12 #include "net/base/net_errors.h" 16 #include "net/base/net_errors.h"
13 #include "net/base/net_log.h" 17 #include "net/base/net_log.h"
14 #include "net/socket/socket_test_util.h" 18 #include "net/socket/socket_test_util.h"
15 #include "net/socket/ssl_client_socket.h" 19 #include "net/socket/ssl_client_socket.h"
16 #include "net/socket/tcp_client_socket.h" 20 #include "net/socket/tcp_client_socket.h"
17 #include "net/ssl/ssl_info.h" 21 #include "net/ssl/ssl_info.h"
18 #include "testing/gmock/include/gmock/gmock.h" 22 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
20 24
21 using ::testing::_; 25 using ::testing::_;
22 using ::testing::A; 26 using ::testing::A;
23 using ::testing::DoAll; 27 using ::testing::DoAll;
24 using ::testing::Return; 28 using ::testing::Return;
25 using ::testing::SaveArg; 29 using ::testing::SaveArg;
26 30
31 namespace {
32 const char* kTestData[4] = {
33 "Hello, World!",
34 "Goodbye, World!",
35 "Hello, Sky!",
36 "Goodbye, Volcano!",
37 };
38 } // namespace
39
27 namespace extensions { 40 namespace extensions {
28 namespace api { 41 namespace api {
29 namespace cast_channel { 42 namespace cast_channel {
30 43
44 // Fills in |message| with a string message.
45 static void CreateStringMessage(const std::string& namespace_,
46 const std::string& source_id,
47 const std::string& destination_id,
48 const std::string& data,
49 MessageInfo* message) {
50 message->namespace_ = namespace_;
51 message->source_id = source_id;
52 message->destination_id = destination_id;
53 message->data.reset(new base::StringValue(data));
54 }
55
56 // Fills in |message| with a binary message.
57 static void CreateBinaryMessage(const std::string& namespace_,
58 const std::string& source_id,
59 const std::string& destination_id,
60 const std::string& data,
61 MessageInfo* message) {
62 message->namespace_ = namespace_;
63 message->source_id = source_id;
64 message->destination_id = destination_id;
65 message->data.reset(base::BinaryValue::CreateWithCopiedBuffer(
66 data.c_str(), data.size()));
67 }
68
69 // Returns the size of the body (in bytes) of the given serialized message.
70 static size_t ComputeBodySize(const std::string& msg) {
71 return msg.length() - kMessageHeaderSize;
72 }
73
31 class MockCastSocketDelegate : public CastSocket::Delegate { 74 class MockCastSocketDelegate : public CastSocket::Delegate {
32 public: 75 public:
33 MOCK_METHOD2(OnError, void(const CastSocket* socket, 76 MOCK_METHOD2(OnError, void(const CastSocket* socket,
34 ChannelError error)); 77 ChannelError error));
35 MOCK_METHOD2(OnMessage, void(const CastSocket* socket, 78 MOCK_METHOD2(OnMessage, void(const CastSocket* socket,
36 const MessageInfo& message)); 79 const MessageInfo& message));
37 }; 80 };
38 81
39 class MockTCPClientSocket : public net::TCPClientSocket { 82 class MockTCPSocket : public net::TCPClientSocket {
40 public: 83 public:
41 explicit MockTCPClientSocket() : 84 explicit MockTCPSocket(const net::MockConnect& connect_data) :
42 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()) { } 85 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()),
43 virtual ~MockTCPClientSocket() { } 86 connect_data_(connect_data) { }
44 87
45 MOCK_METHOD1(Connect, int(const net::CompletionCallback& callback)); 88 virtual int Connect(const net::CompletionCallback& callback) OVERRIDE {
46 MOCK_METHOD2(SetKeepAlive, bool(bool, int)); 89 if (connect_data_.mode == net::ASYNC) {
47 MOCK_METHOD1(SetNoDelay, bool(bool)); 90 CHECK_NE(connect_data_.result, net::ERR_IO_PENDING);
48 MOCK_METHOD3(Read, int(net::IOBuffer* buf, int buf_len, 91 base::MessageLoop::current()->PostTask(
49 const net::CompletionCallback& callback)); 92 FROM_HERE,
50 MOCK_METHOD3(Write, int(net::IOBuffer* buf, int buf_len, 93 base::Bind(callback, connect_data_.result));
51 const net::CompletionCallback& callback)); 94 return net::ERR_IO_PENDING;
52 MOCK_METHOD0(Disconnect, void()); 95 } else {
53 }; 96 return connect_data_.result;
97 }
98 }
54 99
55 class MockSSLClientSocket : public net::MockClientSocket { 100 virtual bool SetKeepAlive(bool enable, int delay) OVERRIDE {
56 public: 101 // Always return true in tests
57 MockSSLClientSocket() : MockClientSocket(net::BoundNetLog()) { } 102 return true;
58 virtual ~MockSSLClientSocket() { } 103 }
59 104
60 MOCK_METHOD1(Connect, int(const net::CompletionCallback& callback)); 105 virtual bool SetNoDelay(bool no_delay) OVERRIDE {
61 MOCK_METHOD3(Read, int(net::IOBuffer* buf, int buf_len, 106 // Always return true in tests
62 const net::CompletionCallback& callback)); 107 return true;
63 MOCK_METHOD3(Write, int(net::IOBuffer* buf, int buf_len, 108 }
64 const net::CompletionCallback& callback)); 109
65 MOCK_METHOD0(Disconnect, void()); 110 MOCK_METHOD3(Read,
66 MOCK_CONST_METHOD0(WasEverUsed, bool()); 111 int(net::IOBuffer*, int, const net::CompletionCallback&));
67 MOCK_CONST_METHOD0(UsingTCPFastOpen, bool()); 112 MOCK_METHOD3(Write,
68 MOCK_CONST_METHOD0(WasNpnNegotiated, bool()); 113 int(net::IOBuffer*, int, const net::CompletionCallback&));
69 MOCK_METHOD1(GetSSLInfo, bool(net::SSLInfo*)); 114
115 virtual void Disconnect() OVERRIDE {
116 // Do nothing in tests
117 }
118
119 private:
120 net::MockConnect connect_data_;
70 }; 121 };
71 122
72 class CompleteHandler { 123 class CompleteHandler {
73 public: 124 public:
74 CompleteHandler() {} 125 CompleteHandler() {}
75 MOCK_METHOD1(OnCloseComplete, void(int result)); 126 MOCK_METHOD1(OnCloseComplete, void(int result));
76 MOCK_METHOD1(OnConnectComplete, void(int result)); 127 MOCK_METHOD1(OnConnectComplete, void(int result));
77 MOCK_METHOD1(OnWriteComplete, void(int result)); 128 MOCK_METHOD1(OnWriteComplete, void(int result));
78 private: 129 private:
79 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); 130 DISALLOW_COPY_AND_ASSIGN(CompleteHandler);
80 }; 131 };
81 132
82 class TestCastSocket : public CastSocket { 133 class TestCastSocket : public CastSocket {
83 public: 134 public:
84 static scoped_ptr<TestCastSocket> Create( 135 static scoped_ptr<TestCastSocket> Create(
85 MockCastSocketDelegate* delegate) { 136 MockCastSocketDelegate* delegate) {
86 return scoped_ptr<TestCastSocket>( 137 return scoped_ptr<TestCastSocket>(
87 new TestCastSocket(delegate, "cast://192.0.0.1:8009")); 138 new TestCastSocket(delegate, "cast://192.0.0.1:8009"));
88 } 139 }
89 140
90 static scoped_ptr<TestCastSocket> CreateSecure( 141 static scoped_ptr<TestCastSocket> CreateSecure(
91 MockCastSocketDelegate* delegate) { 142 MockCastSocketDelegate* delegate) {
92 return scoped_ptr<TestCastSocket>( 143 return scoped_ptr<TestCastSocket>(
93 new TestCastSocket(delegate, "casts://192.0.0.1:8009")); 144 new TestCastSocket(delegate, "casts://192.0.0.1:8009"));
94 } 145 }
95 146
96 explicit TestCastSocket(MockCastSocketDelegate* delegate, 147 explicit TestCastSocket(MockCastSocketDelegate* delegate,
97 const std::string& url) : 148 const std::string& url) :
98 CastSocket("abcdefg", GURL(url), delegate, 149 CastSocket("abcdefg", GURL(url), delegate,
99 &capturing_net_log_), 150 &capturing_net_log_),
100 mock_tcp_socket_(new MockTCPClientSocket()), 151 ip_(CreateIPEndPoint()),
101 mock_ssl_socket_(new MockSSLClientSocket()), 152 connect_index_(0),
102 owns_tcp_socket_(true), 153 extract_cert_result_(true),
103 owns_ssl_socket_(true), 154 verify_challenge_result_(true) {
104 extract_cert_result_(true), 155 }
105 send_auth_challenge_result_(net::ERR_IO_PENDING), 156
106 read_auth_challenge_reply_result_(net::ERR_IO_PENDING), 157 static net::IPEndPoint CreateIPEndPoint() {
107 challenge_reply_result_(true) { 158 net::IPAddressNumber number;
159 number.push_back(192);
160 number.push_back(0);
161 number.push_back(0);
162 number.push_back(1);
163 return net::IPEndPoint(number, 8009);
108 } 164 }
109 165
110 virtual ~TestCastSocket() { 166 virtual ~TestCastSocket() {
111 if (owns_tcp_socket_) { 167 }
112 DCHECK(mock_tcp_socket_); 168
113 delete mock_tcp_socket_; 169 // Helpers to set mock results for various operations.
114 } 170 void SetupTcp1Connect(net::IoMode mode, int result) {
115 if (owns_ssl_socket_) { 171 tcp_connect_data_[0].reset(new net::MockConnect(mode, result));
116 DCHECK(mock_ssl_socket_); 172 }
117 delete mock_ssl_socket_; 173 void SetupSsl1Connect(net::IoMode mode, int result) {
174 ssl_connect_data_[0].reset(new net::MockConnect(mode, result));
175 }
176 void SetupTcp2Connect(net::IoMode mode, int result) {
177 tcp_connect_data_[1].reset(new net::MockConnect(mode, result));
178 }
179 void SetupSsl2Connect(net::IoMode mode, int result) {
180 ssl_connect_data_[1].reset(new net::MockConnect(mode, result));
181 }
182 void AddWriteResult(const net::MockWrite& write) {
183 writes_.push_back(write);
184 }
185 void AddWriteResult(net::IoMode mode, int result) {
186 AddWriteResult(net::MockWrite(mode, result));
187 }
188 void AddWriteResultForMessage(net::IoMode mode, const std::string& msg) {
189 AddWriteResult(mode, msg.size());
190 }
191 void AddWriteResultForMessage(net::IoMode mode,
192 const std::string& msg,
193 size_t ch_size) {
194 size_t msg_size = msg.size();
195 for (size_t offset = 0; offset < msg_size; offset += ch_size) {
196 if (offset + ch_size > msg_size)
197 ch_size = msg_size - offset;
198 AddWriteResult(mode, ch_size);
118 } 199 }
119 } 200 }
120 201
121 virtual void Close(const net::CompletionCallback& callback) OVERRIDE { 202 void AddReadResult(const net::MockRead& read) {
122 if (!owns_tcp_socket_) 203 reads_.push_back(read);
123 mock_tcp_socket_ = NULL;
124 if (!owns_ssl_socket_)
125 mock_ssl_socket_ = NULL;
126 CastSocket::Close(callback);
127 } 204 }
128 205 void AddReadResult(net::IoMode mode, int result) {
129 void CreateNewSockets() { 206 AddReadResult(net::MockRead(mode, result));
130 owns_tcp_socket_ = true; 207 }
131 mock_tcp_socket_ = new MockTCPClientSocket(); 208 void AddReadResult(net::IoMode mode, const char* data, int data_len) {
132 owns_ssl_socket_ = true; 209 AddReadResult(net::MockRead(mode, data, data_len));
133 mock_ssl_socket_ = new MockSSLClientSocket(); 210 }
211 void AddReadResultForMessage(net::IoMode mode, const std::string& msg) {
212 size_t body_size = ComputeBodySize(msg);
213 const char* data = msg.c_str();
214 AddReadResult(mode, data, kMessageHeaderSize);
215 AddReadResult(mode, data + kMessageHeaderSize, body_size);
216 }
217 void AddReadResultForMessage(net::IoMode mode,
218 const std::string& msg,
219 size_t ch_size) {
220 size_t msg_size = msg.size();
221 const char* data = msg.c_str();
222 for (size_t offset = 0; offset < msg_size; offset += ch_size) {
223 if (offset + ch_size > msg_size)
224 ch_size = msg_size - offset;
225 AddReadResult(mode, data + offset, ch_size);
226 }
134 } 227 }
135 228
136 void SetExtractCertResult(bool value) { 229 void SetExtractCertResult(bool value) {
137 extract_cert_result_ = value; 230 extract_cert_result_ = value;
138 } 231 }
139 232 void SetVerifyChallengeResult(bool value) {
140 void SetSendAuthChallengeResult(int result) { 233 verify_challenge_result_ = value;
141 send_auth_challenge_result_ = result;
142 } 234 }
143 235
144 void SetReadAuthChallengeReplyResult(int result) { 236 private:
145 read_auth_challenge_reply_result_ = result; 237 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE {
238 net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get();
239 connect_data->peer_addr = ip_;
240 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(*connect_data));
146 } 241 }
147 242
148 void SetChallengeReplyResult(bool value) { 243 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket(
149 challenge_reply_result_ = value; 244 scoped_ptr<net::StreamSocket> socket) OVERRIDE {
150 } 245 net::MockConnect* connect_data = ssl_connect_data_[connect_index_].get();
246 connect_data->peer_addr = ip_;
247 ++connect_index_;
151 248
152 MockTCPClientSocket* mock_tcp_socket_; 249 ssl_data_.reset(new net::StaticSocketDataProvider(
153 MockSSLClientSocket* mock_ssl_socket_; 250 reads_.data(), reads_.size(), writes_.data(), writes_.size()));
154 251 ssl_data_->set_connect_data(*connect_data);
155 protected: 252 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !!
156 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE { 253 return scoped_ptr<net::SSLClientSocket>(
157 owns_tcp_socket_ = false; 254 new net::MockTCPClientSocket(
158 return scoped_ptr<net::TCPClientSocket>(mock_tcp_socket_); 255 net::AddressList(), &capturing_net_log_, ssl_data_.get()));
159 }
160
161 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket() OVERRIDE {
162 owns_ssl_socket_ = false;
163 return scoped_ptr<net::SSLClientSocket>(mock_ssl_socket_);
164 } 256 }
165 257
166 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE { 258 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE {
167 if (extract_cert_result_) 259 if (extract_cert_result_)
168 cert->assign("dummy_test_cert"); 260 cert->assign("dummy_test_cert");
169 return extract_cert_result_; 261 return extract_cert_result_;
170 } 262 }
171 263
172 virtual int SendAuthChallenge() OVERRIDE { 264 virtual bool VerifyChallengeReply() OVERRIDE {
173 return send_auth_challenge_result_; 265 return verify_challenge_result_;
174 } 266 }
175 267
176 virtual int ReadAuthChallengeReply() OVERRIDE {
177 return read_auth_challenge_reply_result_;
178 }
179
180 virtual bool VerifyChallengeReply() OVERRIDE {
181 return challenge_reply_result_;
182 }
183
184 private:
185 net::CapturingNetLog capturing_net_log_; 268 net::CapturingNetLog capturing_net_log_;
186 // Whether this object or the parent owns |mock_tcp_socket_|. 269 net::IPEndPoint ip_;
187 bool owns_tcp_socket_; 270 // Simulated connect data
188 // Whether this object or the parent owns |mock_ssl_socket_|. 271 scoped_ptr<net::MockConnect> tcp_connect_data_[2];
189 bool owns_ssl_socket_; 272 scoped_ptr<net::MockConnect> ssl_connect_data_[2];
273 // Simulated read / write data
274 std::vector<net::MockWrite> writes_;
275 std::vector<net::MockRead> reads_;
276 scoped_ptr<net::SocketDataProvider> ssl_data_;
277 // Number of times Connect method is called
278 size_t connect_index_;
190 // Simulated result of peer cert extraction. 279 // Simulated result of peer cert extraction.
191 bool extract_cert_result_; 280 bool extract_cert_result_;
192 // Simulated result to be returned by SendAuthChallenge.
193 int send_auth_challenge_result_;
194 // Simulated result to be returned by ReadAuthChallengeReply.
195 int read_auth_challenge_reply_result_;
196 // Simulated result of verifying challenge reply. 281 // Simulated result of verifying challenge reply.
197 bool challenge_reply_result_; 282 bool verify_challenge_result_;
198 }; 283 };
199 284
200 class CastSocketTest : public testing::Test { 285 class CastSocketTest : public testing::Test {
201 public: 286 public:
202 CastSocketTest() {} 287 CastSocketTest() {}
203 virtual ~CastSocketTest() {} 288 virtual ~CastSocketTest() {}
204 289
205 virtual void SetUp() OVERRIDE { 290 virtual void SetUp() OVERRIDE {
206 test_message_.namespace_ = "urn:test"; 291 // Create a few test messages
207 test_message_.source_id = "1"; 292 for (size_t i = 0; i < arraysize(test_messages_); i++) {
208 test_message_.destination_id = "2"; 293 CreateStringMessage("urn:cast", "1", "2", kTestData[i],
209 test_message_.data.reset(new base::StringValue("Hello, World!")); 294 &test_messages_[i]);
210 ASSERT_TRUE(MessageInfoToCastMessage(test_message_, &test_proto_)); 295 ASSERT_TRUE(MessageInfoToCastMessage(
296 test_messages_[i], &test_protos_[i]));
297 ASSERT_TRUE(CastSocket::Serialize(test_protos_[i], &test_proto_strs_[i]));
298 }
299
300 // Create a test auth request.
301 CastMessage request;
302 CreateAuthChallengeMessage(&request);
303 ASSERT_TRUE(CastSocket::Serialize(request, &auth_request_));
304
305 // Create a test auth reply.
306 MessageInfo reply;
307 CreateBinaryMessage("urn:x-cast:com.google.cast.tp.deviceauth",
308 "sender-0",
309 "receiver-0",
310 "abcd",
311 &reply);
312 CastMessage reply_msg;
313 ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg));
314 ASSERT_TRUE(CastSocket::Serialize(reply_msg, &auth_reply_));
211 } 315 }
212 316
213 virtual void TearDown() OVERRIDE { 317 virtual void TearDown() OVERRIDE {
214 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); 318 EXPECT_CALL(handler_, OnCloseComplete(net::OK));
215 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, 319 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
216 base::Unretained(&handler_))); 320 base::Unretained(&handler_)));
217 } 321 }
218 322
219 void CreateCastSocket() { 323 void CreateCastSocket() {
220 socket_ = TestCastSocket::Create(&mock_delegate_); 324 socket_ = TestCastSocket::Create(&mock_delegate_);
221 } 325 }
222 326
223 void CreateCastSocketSecure() { 327 void CreateCastSocketSecure() {
224 socket_ = TestCastSocket::CreateSecure(&mock_delegate_); 328 socket_ = TestCastSocket::CreateSecure(&mock_delegate_);
225 } 329 }
226 330
227 // Sets an expectation that TCPClientSocket::Connect is called and 331 // Sets up CastSocket::Connect to succeed.
228 // returns |result| and stores the callback passed to it in |callback|. 332 // Connecting the socket also starts the read loop; so we add a mock
229 void ExpectTcpConnect(net::CompletionCallback* callback, int result) { 333 // read result that returns IO_PENDING and callback is never fired.
230 EXPECT_CALL(mock_tcp_socket(), Connect(A<const net::CompletionCallback&>())) 334 void ConnectHelper() {
231 .Times(1) 335 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
232 .WillOnce(DoAll(SaveArg<0>(callback), Return(result))); 336 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
233 EXPECT_CALL(mock_tcp_socket(), SetKeepAlive(_, _)) 337 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
234 .WillOnce(Return(true));
235 }
236 338
237 // Same as ExpectTcpConnect but to return net::ERR_IO_PENDING.
238 void ExpectTcpConnectPending(net::CompletionCallback* callback) {
239 ExpectTcpConnect(callback, net::ERR_IO_PENDING);
240 }
241
242 // Sets an expectation that SSLClientSocket::Connect is called and
243 // returns |result| and stores the callback passed to it in |callback|.
244 void ExpectSslConnect(net::CompletionCallback* callback, int result) {
245 EXPECT_CALL(mock_ssl_socket(), Connect(A<const net::CompletionCallback&>()))
246 .Times(1)
247 .WillOnce(DoAll(SaveArg<0>(callback), Return(result)));
248 }
249
250 // Same as ExpectSslConnect but to return net::ERR_IO_PENDING.
251 void ExpectSslConnectPending(net::CompletionCallback* callback) {
252 ExpectSslConnect(callback, net::ERR_IO_PENDING);
253 }
254
255 // Sets an expectation that SSLClientSocket::Read is called |times| number
256 // of times and returns net::ERR_IO_PENDING.
257 void ExpectSslRead(int times) {
258 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(),
259 A<int>(),
260 A<const net::CompletionCallback&>()))
261 .Times(times)
262 .WillOnce(Return(net::ERR_IO_PENDING));
263 }
264
265 // Sets up CastSocket::Connect to succeed.
266 // Connecting the socket also starts the read loop; we expect the call to
267 // Read(), but never fire the read callback.
268 void ConnectHelper() {
269 net::CompletionCallback connect_callback1;
270 net::CompletionCallback connect_callback2;
271
272 ExpectTcpConnect(&connect_callback1, net::OK);
273 ExpectSslConnect(&connect_callback2, net::OK);
274 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); 339 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
275 ExpectSslRead(1);
276
277 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 340 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
278 base::Unretained(&handler_))); 341 base::Unretained(&handler_)));
279 342 RunPendingTasks();
280 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
281 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
282 } 343 }
283 344
284 protected: 345 protected:
285 MockTCPClientSocket& mock_tcp_socket() { 346 // Runs all pending tasks in the message loop.
286 MockTCPClientSocket* mock_socket = socket_->mock_tcp_socket_; 347 void RunPendingTasks() {
287 DCHECK(mock_socket); 348 base::RunLoop run_loop;
288 return *mock_socket; 349 run_loop.RunUntilIdle();
289 } 350 }
290 351
291 MockSSLClientSocket& mock_ssl_socket() { 352 base::MessageLoop message_loop_;
292 MockSSLClientSocket* mock_socket = socket_->mock_ssl_socket_;
293 DCHECK(mock_socket);
294 return *mock_socket;
295 }
296
297 void CallOnChallengeEvent(int result) {
298 socket_->OnChallengeEvent(result);
299 }
300
301 MockCastSocketDelegate mock_delegate_; 353 MockCastSocketDelegate mock_delegate_;
302 scoped_ptr<TestCastSocket> socket_; 354 scoped_ptr<TestCastSocket> socket_;
303 CompleteHandler handler_; 355 CompleteHandler handler_;
304 MessageInfo test_message_; 356 MessageInfo test_messages_[arraysize(kTestData)];
305 CastMessage test_proto_; 357 CastMessage test_protos_[arraysize(kTestData)];
358 std::string test_proto_strs_[arraysize(kTestData)];
359 std::string auth_request_;
360 std::string auth_reply_;
306 }; 361 };
307 362
308 // Tests URL parsing and validation. 363 // Tests URL parsing and validation.
309 TEST_F(CastSocketTest, TestCastURLs) { 364 TEST_F(CastSocketTest, TestCastURLs) {
310 CreateCastSocket(); 365 CreateCastSocket();
311 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:8009"))); 366 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:8009")));
312 EXPECT_FALSE(socket_->auth_required()); 367 EXPECT_FALSE(socket_->auth_required());
313 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:8009"); 368 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:8009");
314 369
315 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("casts://192.0.0.1:12345"))); 370 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("casts://192.0.0.1:12345")));
(...skipping 12 matching lines...) Expand all
328 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast::"))); 383 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast::")));
329 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1"))); 384 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1")));
330 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:"))); 385 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:")));
331 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:"))); 386 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:")));
332 } 387 }
333 388
334 // Tests connecting and closing the socket. 389 // Tests connecting and closing the socket.
335 TEST_F(CastSocketTest, TestConnectAndClose) { 390 TEST_F(CastSocketTest, TestConnectAndClose) {
336 CreateCastSocket(); 391 CreateCastSocket();
337 ConnectHelper(); 392 ConnectHelper();
393 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
394 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
338 395
339 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); 396 EXPECT_CALL(handler_, OnCloseComplete(net::OK));
340 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, 397 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
341 base::Unretained(&handler_))); 398 base::Unretained(&handler_)));
342 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 399 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
343 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 400 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
344 } 401 }
345 402
346 // Tests that the following connection flow works: 403 // Tests that the following connection flow works:
347 // - TCP connection succeeds (async) 404 // - TCP connection succeeds (async)
348 // - SSL connection succeeds (async) 405 // - SSL connection succeeds (async)
349 TEST_F(CastSocketTest, TestConnect) { 406 TEST_F(CastSocketTest, TestConnect) {
350 CreateCastSocket(); 407 CreateCastSocket();
408 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
409 socket_->SetupSsl1Connect(net::ASYNC, net::OK);
410 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
351 411
352 net::CompletionCallback connect_callback1;
353 net::CompletionCallback connect_callback2;
354
355 ExpectTcpConnectPending(&connect_callback1);
356 ExpectSslConnectPending(&connect_callback2);
357 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); 412 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
358 ExpectSslRead(1);
359
360 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 413 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
361 base::Unretained(&handler_))); 414 base::Unretained(&handler_)));
362 connect_callback1.Run(net::OK); 415 RunPendingTasks();
363 connect_callback2.Run(net::OK);
364 416
365 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 417 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
366 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 418 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
367 } 419 }
368 420
369 // Test that the following connection flow works: 421 // Test that the following connection flow works:
370 // - TCP connection succeeds (async) 422 // - TCP connection succeeds (async)
371 // - SSL connection fails with cert error (async) 423 // - SSL connection fails with cert error (async)
372 // - Cert is extracted successfully 424 // - Cert is extracted successfully
373 // - Second TCP connection succeeds (async) 425 // - Second TCP connection succeeds (async)
374 // - Second SSL connection succeeds (async) 426 // - Second SSL connection succeeds (async)
375 TEST_F(CastSocketTest, TestTwoStepConnect) { 427 TEST_F(CastSocketTest, TestConnectTwoStep) {
376 CreateCastSocket(); 428 CreateCastSocket();
429 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
430 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
431 socket_->SetupTcp2Connect(net::ASYNC, net::OK);
432 socket_->SetupSsl2Connect(net::ASYNC, net::OK);
433 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
377 434
378 // Expectations for the initial connect call 435 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
379 net::CompletionCallback tcp_connect_callback1;
380 net::CompletionCallback ssl_connect_callback1;
381
382 ExpectTcpConnectPending(&tcp_connect_callback1);
383 ExpectSslConnectPending(&ssl_connect_callback1);
384
385 // Start connect flow
386 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 436 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
387 base::Unretained(&handler_))); 437 base::Unretained(&handler_)));
388 tcp_connect_callback1.Run(net::OK); 438 RunPendingTasks();
389
390 // Expectations for the second connect call
391 socket_->CreateNewSockets();
392 net::CompletionCallback tcp_connect_callback2;
393 net::CompletionCallback ssl_connect_callback2;
394 ExpectTcpConnectPending(&tcp_connect_callback2);
395 ExpectSslConnectPending(&ssl_connect_callback2);
396 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
397 ExpectSslRead(1);
398
399 // Trigger callbacks for the first connect
400 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID);
401
402 // Trigger callbacks for the second connect
403 tcp_connect_callback2.Run(net::OK);
404 ssl_connect_callback2.Run(net::OK);
405 439
406 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 440 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
407 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 441 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
408 } 442 }
409 443
410 // Test that the following connection flow works: 444 // Test that the following connection flow works:
411 // - TCP connection succeeds (async) 445 // - TCP connection succeeds (async)
412 // - SSL connection fails with cert error (async) 446 // - SSL connection fails with cert error (async)
413 // - Cert is extracted successfully 447 // - Cert is extracted successfully
414 // - Second TCP connection succeeds (async) 448 // - Second TCP connection succeeds (async)
415 // - Second SSL connection fails (async) 449 // - Second SSL connection fails (async)
416 // - The flow should NOT be tried again 450 // - The flow should NOT be tried again
417 TEST_F(CastSocketTest, TestMaxTwoConnectAttempts) { 451 TEST_F(CastSocketTest, TestConnectMaxTwoAttempts) {
418 CreateCastSocket(); 452 CreateCastSocket();
419 453 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
420 net::CompletionCallback tcp_connect_callback1; 454 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
421 net::CompletionCallback ssl_connect_callback1; 455 socket_->SetupTcp2Connect(net::ASYNC, net::OK);
422 456 socket_->SetupSsl2Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
423 // Expectations for the initial connect call 457
424 ExpectTcpConnectPending(&tcp_connect_callback1);
425 ExpectSslConnectPending(&ssl_connect_callback1);
426
427 // Start connect flow
428 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
429 base::Unretained(&handler_)));
430 tcp_connect_callback1.Run(net::OK);
431
432 socket_->CreateNewSockets();
433 net::CompletionCallback tcp_connect_callback2;
434 net::CompletionCallback ssl_connect_callback2;
435
436 // Expectations for the second connect call
437 ExpectTcpConnectPending(&tcp_connect_callback2);
438 ExpectSslConnectPending(&ssl_connect_callback2);
439 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); 458 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID));
440 459 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
441 // Trigger callbacks for the first connect 460 base::Unretained(&handler_)));
442 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); 461 RunPendingTasks();
443
444 // Trigger callbacks for the second connect
445 tcp_connect_callback2.Run(net::OK);
446 ssl_connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID);
447
448 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
449 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
450 }
451
452 // Test that when cert extraction fails the connection flow stops.
453 TEST_F(CastSocketTest, TestCertExtractionFailure) {
454 CreateCastSocket();
455
456 net::CompletionCallback connect_callback1;
457 net::CompletionCallback connect_callback2;
458
459 ExpectTcpConnectPending(&connect_callback1);
460 ExpectSslConnectPending(&connect_callback2);
461
462 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
463 base::Unretained(&handler_)));
464 connect_callback1.Run(net::OK);
465
466 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID));
467
468 // Set cert extraction to fail
469 socket_->SetExtractCertResult(false);
470 // Attempt to connect results in ERR_CERT_AUTHORTY_INVALID
471 connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID);
472 462
473 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 463 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
474 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); 464 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
475 } 465 }
476 466
477 // Tests that the following connection flow works: 467 // Tests that the following connection flow works:
478 // - TCP connection succeeds (async) 468 // - TCP connection succeeds (async)
479 // - SSL connection fails with cert error (async) 469 // - SSL connection fails with cert error (async)
480 // - Cert is extracted successfully 470 // - Cert is extracted successfully
481 // - Second TCP connection succeeds (async) 471 // - Second TCP connection succeeds (async)
482 // - Second SSL connection succeeds (async) 472 // - Second SSL connection succeeds (async)
483 // - Challenge request is sent (async) 473 // - Challenge request is sent (async)
484 // - Challenge response is received (async) 474 // - Challenge response is received (async)
485 // - Credentials are verified successfuly 475 // - Credentials are verified successfuly
486 TEST_F(CastSocketTest, TestFullSecureConnectionFlowAsync) { 476 TEST_F(CastSocketTest, TestConnectFullSecureFlowAsync) {
487 CreateCastSocketSecure(); 477 CreateCastSocketSecure();
488 478
489 net::CompletionCallback tcp_connect_callback1; 479 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
490 net::CompletionCallback ssl_connect_callback1; 480 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
491 481 socket_->SetupTcp2Connect(net::ASYNC, net::OK);
492 // Expectations for the initial connect call 482 socket_->SetupSsl2Connect(net::ASYNC, net::OK);
493 ExpectTcpConnectPending(&tcp_connect_callback1); 483 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_);
494 ExpectSslConnectPending(&ssl_connect_callback1); 484 socket_->AddReadResultForMessage(net::ASYNC, auth_reply_);
495 485 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
496 // Start connect flow 486
497 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
498 base::Unretained(&handler_)));
499 tcp_connect_callback1.Run(net::OK);
500
501 socket_->CreateNewSockets();
502 net::CompletionCallback tcp_connect_callback2;
503 net::CompletionCallback ssl_connect_callback2;
504
505 // Expectations for the second connect call
506 ExpectTcpConnectPending(&tcp_connect_callback2);
507 ExpectSslConnectPending(&ssl_connect_callback2);
508 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); 487 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
509 488 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
510 // Trigger callbacks for the first connect 489 base::Unretained(&handler_)));
511 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); 490 RunPendingTasks();
512 491
513 // Trigger callbacks for the second connect 492 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
514 tcp_connect_callback2.Run(net::OK); 493 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
515 ssl_connect_callback2.Run(net::OK); 494 }
516 495
517 // Trigger callbacks for auth events. 496 // Same as TestFullSecureConnectionFlowAsync, but operations are synchronous.
518 CallOnChallengeEvent(net::OK); // Sent challenge 497 TEST_F(CastSocketTest, TestConnectFullSecureFlowSync) {
519 CallOnChallengeEvent(net::OK); // Received reply 498 CreateCastSocketSecure();
520 499
521 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 500 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
522 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 501 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID);
523 } 502 socket_->SetupTcp2Connect(net::SYNCHRONOUS, net::OK);
524 503 socket_->SetupSsl2Connect(net::SYNCHRONOUS, net::OK);
525 // Same as TestFullSecureConnectionFlowAsync, but operations are synchronous. 504 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, auth_request_);
526 TEST_F(CastSocketTest, TestFullSecureConnectionFlowSync) { 505 socket_->AddReadResultForMessage(net::SYNCHRONOUS, auth_reply_);
527 CreateCastSocketSecure(); 506 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
528 507
529 net::CompletionCallback tcp_connect_callback;
530 net::CompletionCallback ssl_connect_callback;
531
532 // Expectations for the connect calls
533 ExpectTcpConnect(&tcp_connect_callback, net::OK);
534 ExpectSslConnect(&ssl_connect_callback, net::OK);
535 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); 508 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
536 509 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
537 socket_->SetSendAuthChallengeResult(net::OK); 510 base::Unretained(&handler_)));
538 socket_->SetReadAuthChallengeReplyResult(net::OK); 511 RunPendingTasks();
539 512
540 // Start connect flow 513 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
541 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 514 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
542 base::Unretained(&handler_))); 515 }
543 516
544 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 517 // Test connection error - TCP connect fails (async)
545 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 518 TEST_F(CastSocketTest, TestConnectTcpConnectErrorAsync) {
546 } 519 CreateCastSocketSecure();
547 520
548 // Tests writing a single message where the completion is signaled via 521 socket_->SetupTcp1Connect(net::ASYNC, net::ERR_FAILED);
549 // callback. 522
550 TEST_F(CastSocketTest, TestWriteViaCallback) { 523 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
551 CreateCastSocket(); 524 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
552 ConnectHelper(); 525 base::Unretained(&handler_)));
553 526 RunPendingTasks();
554 net::CompletionCallback write_callback; 527
555 528 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
556 EXPECT_CALL(mock_ssl_socket(), 529 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
557 Write(A<net::IOBuffer*>(), 530 }
558 39, 531
559 A<const net::CompletionCallback&>())) 532 // Test connection error - TCP connect fails (sync)
560 .Times(1) 533 TEST_F(CastSocketTest, TestConnectTcpConnectErrorSync) {
561 .WillOnce(DoAll(SaveArg<2>(&write_callback), 534 CreateCastSocketSecure();
562 Return(net::ERR_IO_PENDING))); 535
563 EXPECT_CALL(handler_, OnWriteComplete(39)); 536 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
564 socket_->SendMessage(test_message_, 537
565 base::Bind(&CompleteHandler::OnWriteComplete, 538 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
566 base::Unretained(&handler_))); 539 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
567 write_callback.Run(39); 540 base::Unretained(&handler_)));
568 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 541 RunPendingTasks();
569 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 542
570 } 543 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
571 544 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
572 // Tests writing a single message where the Write() returns directly. 545 }
573 TEST_F(CastSocketTest, TestWrite) { 546
574 CreateCastSocket(); 547 // Test connection error - SSL connect fails (async)
575 ConnectHelper(); 548 TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
576 549 CreateCastSocketSecure();
577 EXPECT_CALL(mock_ssl_socket(), 550
578 Write(A<net::IOBuffer*>(), 551 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
579 39, 552 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
580 A<const net::CompletionCallback&>())) 553
581 .Times(1) 554 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
582 .WillOnce(Return(39)); 555 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
583 EXPECT_CALL(handler_, OnWriteComplete(39)); 556 base::Unretained(&handler_)));
584 socket_->SendMessage(test_message_, 557 RunPendingTasks();
585 base::Bind(&CompleteHandler::OnWriteComplete, 558
586 base::Unretained(&handler_))); 559 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
587 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 560 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
588 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 561 }
589 } 562
590 563 // Test connection error - SSL connect fails (async)
591 // Tests writing multiple messages. 564 TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
592 TEST_F(CastSocketTest, TestWriteMany) { 565 CreateCastSocketSecure();
593 CreateCastSocket(); 566
594 ConnectHelper(); 567 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
595 std::string messages[4]; 568 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED);
596 messages[0] = "Hello, World!"; 569
597 messages[1] = "Goodbye, World!"; 570 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
598 messages[2] = "Hello, Sky!"; 571 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
599 messages[3] = "Goodbye, Volcano!"; 572 base::Unretained(&handler_)));
600 int sizes[4] = {39, 41, 37, 43}; 573 RunPendingTasks();
601 MessageInfo message_info[4]; 574
602 net::CompletionCallback write_callback; 575 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
603 576 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
604 for (int i = 0; i < 4; i++) { 577 }
605 EXPECT_CALL(mock_ssl_socket(), 578
606 Write(A<net::IOBuffer*>(), 579 // Test connection error - cert extraction error (async)
607 sizes[i], 580 TEST_F(CastSocketTest, TestConnectCertExtractionErrorAsync) {
608 A<const net::CompletionCallback&>())) 581 CreateCastSocket();
609 .WillRepeatedly(DoAll(SaveArg<2>(&write_callback), 582 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
610 Return(net::ERR_IO_PENDING))); 583 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
611 EXPECT_CALL(handler_, OnWriteComplete(sizes[i])); 584 // Set cert extraction to fail
585 socket_->SetExtractCertResult(false);
586
587 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID));
588 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
589 base::Unretained(&handler_)));
590 RunPendingTasks();
591
592 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
593 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
594 }
595
596 // Test connection error - cert extraction error (sync)
597 TEST_F(CastSocketTest, TestConnectCertExtractionErrorSync) {
598 CreateCastSocket();
599 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
600 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID);
601 // Set cert extraction to fail
602 socket_->SetExtractCertResult(false);
603
604 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID));
605 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
606 base::Unretained(&handler_)));
607 RunPendingTasks();
608
609 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
610 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
611 }
612
613 // Test connection error - challenge send fails
614 TEST_F(CastSocketTest, TestConnectChallengeSendError) {
615 CreateCastSocketSecure();
616
617 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
618 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
619 socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED);
620
621 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
622 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
623 base::Unretained(&handler_)));
624 RunPendingTasks();
625
626 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
627 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
628 }
629
630 // Test connection error - challenge reply receive fails
631 TEST_F(CastSocketTest, TestConnectChallengeReplyReceiveError) {
632 CreateCastSocketSecure();
633
634 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
635 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
636 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_);
637 socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_FAILED);
638
639 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
640 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
641 base::Unretained(&handler_)));
642 RunPendingTasks();
643
644 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
645 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
646 }
647
648 // Test connection error - challenge reply verification fails
649 TEST_F(CastSocketTest, TestConnectChallengeVerificationFails) {
650 CreateCastSocketSecure();
651
652 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
653 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
654 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_);
655 socket_->AddReadResultForMessage(net::ASYNC, auth_reply_);
656 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
657 socket_->SetVerifyChallengeResult(false);
658
659 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
660 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
661 base::Unretained(&handler_)));
662 RunPendingTasks();
663
664 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
665 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
666 }
667
668 // Test write success - single message (async)
669 TEST_F(CastSocketTest, TestWriteAsync) {
670 CreateCastSocket();
671 socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0]);
672 ConnectHelper();
673
674 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
675 socket_->SendMessage(test_messages_[0],
676 base::Bind(&CompleteHandler::OnWriteComplete,
677 base::Unretained(&handler_)));
678 RunPendingTasks();
679
680 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
681 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
682 }
683
684 // Test write success - single message (sync)
685 TEST_F(CastSocketTest, TestWriteSync) {
686 CreateCastSocket();
687 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]);
688 ConnectHelper();
689
690 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
691 socket_->SendMessage(test_messages_[0],
692 base::Bind(&CompleteHandler::OnWriteComplete,
693 base::Unretained(&handler_)));
694 RunPendingTasks();
695
696 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
697 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
698 }
699
700 // Test write success - single message sent in multiple chunks (async)
701 TEST_F(CastSocketTest, TestWriteChunkedAsync) {
702 CreateCastSocket();
703 socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0], 2);
704 ConnectHelper();
705
706 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
707 socket_->SendMessage(test_messages_[0],
708 base::Bind(&CompleteHandler::OnWriteComplete,
709 base::Unretained(&handler_)));
710 RunPendingTasks();
711
712 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
713 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
714 }
715
716 // Test write success - single message sent in multiple chunks (sync)
717 TEST_F(CastSocketTest, TestWriteChunkedSync) {
718 CreateCastSocket();
719 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2);
720 ConnectHelper();
721
722 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
723 socket_->SendMessage(test_messages_[0],
724 base::Bind(&CompleteHandler::OnWriteComplete,
725 base::Unretained(&handler_)));
726 RunPendingTasks();
727
728 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
729 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
730 }
731
732 // Test write success - multiple messages (async)
733 TEST_F(CastSocketTest, TestWriteManyAsync) {
734 CreateCastSocket();
735 for (size_t i = 0; i < arraysize(test_messages_); i++) {
736 size_t msg_size = test_proto_strs_[i].size();
737 socket_->AddWriteResult(net::ASYNC, msg_size);
738 EXPECT_CALL(handler_, OnWriteComplete(msg_size));
612 } 739 }
613 740 ConnectHelper();
614 for (int i = 0; i < 4; i++) { 741
615 message_info[i].namespace_ = "urn:test"; 742 for (size_t i = 0; i < arraysize(test_messages_); i++) {
616 message_info[i].source_id = "1"; 743 socket_->SendMessage(test_messages_[i],
617 message_info[i].destination_id = "2";
618 message_info[i].data.reset(new base::StringValue(messages[i]));
619 socket_->SendMessage(message_info[i],
620 base::Bind(&CompleteHandler::OnWriteComplete, 744 base::Bind(&CompleteHandler::OnWriteComplete,
621 base::Unretained(&handler_))); 745 base::Unretained(&handler_)));
622 } 746 }
623 for (int i = 0; i < 4; i++) { 747 RunPendingTasks();
624 write_callback.Run(sizes[i]); 748
749 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
750 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
751 }
752
753 // Test write success - multiple messages (sync)
754 TEST_F(CastSocketTest, TestWriteManySync) {
755 CreateCastSocket();
756 for (size_t i = 0; i < arraysize(test_messages_); i++) {
757 size_t msg_size = test_proto_strs_[i].size();
758 socket_->AddWriteResult(net::SYNCHRONOUS, msg_size);
759 EXPECT_CALL(handler_, OnWriteComplete(msg_size));
625 } 760 }
626 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 761 ConnectHelper();
627 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 762
628 } 763 for (size_t i = 0; i < arraysize(test_messages_); i++) {
629 764 socket_->SendMessage(test_messages_[i],
630 // Tests error on writing. 765 base::Bind(&CompleteHandler::OnWriteComplete,
631 TEST_F(CastSocketTest, TestWriteError) { 766 base::Unretained(&handler_)));
632 CreateCastSocket(); 767 }
633 ConnectHelper(); 768 RunPendingTasks();
634 net::CompletionCallback write_callback; 769
635 770 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
636 EXPECT_CALL(mock_ssl_socket(), 771 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
637 Write(A<net::IOBuffer*>(), 772 }
638 39, 773
639 A<const net::CompletionCallback&>())) 774 // Test write error - not connected
640 .Times(1) 775 TEST_F(CastSocketTest, TestWriteErrorNotConnected) {
641 .WillOnce(DoAll(SaveArg<2>(&write_callback), 776 CreateCastSocket();
642 Return(net::ERR_SOCKET_NOT_CONNECTED))); 777
643 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED)); 778 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
779 socket_->SendMessage(test_messages_[0],
780 base::Bind(&CompleteHandler::OnWriteComplete,
781 base::Unretained(&handler_)));
782
783 EXPECT_EQ(cast_channel::READY_STATE_NONE, socket_->ready_state());
784 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
785 }
786
787 // Test write error - very large message
788 TEST_F(CastSocketTest, TestWriteErrorLargeMessage) {
789 CreateCastSocket();
790 ConnectHelper();
791
792 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
793 size_t size = kMaxMessageSize + 1;
794 test_messages_[0].data.reset(
795 new base::StringValue(std::string(size, 'a')));
796 socket_->SendMessage(test_messages_[0],
797 base::Bind(&CompleteHandler::OnWriteComplete,
798 base::Unretained(&handler_)));
799
800 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
801 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
802
803 }
804
805 // Test write error - network error (sync)
806 TEST_F(CastSocketTest, TestWriteNetworkErrorSync) {
807 CreateCastSocket();
808 socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED);
809 ConnectHelper();
810
811 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
644 EXPECT_CALL(mock_delegate_, 812 EXPECT_CALL(mock_delegate_,
645 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); 813 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
646 socket_->SendMessage(test_message_, 814 socket_->SendMessage(test_messages_[0],
647 base::Bind(&CompleteHandler::OnWriteComplete, 815 base::Bind(&CompleteHandler::OnWriteComplete,
648 base::Unretained(&handler_))); 816 base::Unretained(&handler_)));
817 RunPendingTasks();
818
649 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 819 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
650 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); 820 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
651 } 821 }
652 822
653 // Tests reading a single message. 823 // Test write error - network error (async)
654 TEST_F(CastSocketTest, TestRead) { 824 TEST_F(CastSocketTest, TestWriteErrorAsync) {
655 CreateCastSocket(); 825 CreateCastSocket();
656 826 socket_->AddWriteResult(net::ASYNC, net::ERR_FAILED);
657 net::CompletionCallback connect_callback1; 827 ConnectHelper();
658 net::CompletionCallback connect_callback2; 828
659 net::CompletionCallback read_callback; 829 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
660 830 EXPECT_CALL(mock_delegate_,
661 std::string message_data; 831 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
662 ASSERT_TRUE(CastSocket::Serialize(test_proto_, &message_data)); 832 socket_->SendMessage(test_messages_[0],
663 833 base::Bind(&CompleteHandler::OnWriteComplete,
664 ExpectTcpConnect(&connect_callback1, net::ERR_IO_PENDING); 834 base::Unretained(&handler_)));
665 ExpectSslConnect(&connect_callback2, net::ERR_IO_PENDING); 835 RunPendingTasks();
666 836
667 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); 837 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
668 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), 838 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
669 A<int>(), 839 }
670 A<const net::CompletionCallback&>())) 840
671 .Times(3) 841 // Test write error - 0 bytes written should be considered an error
672 .WillRepeatedly(DoAll(SaveArg<2>(&read_callback), 842 TEST_F(CastSocketTest, TestWriteErrorZeroBytesWritten) {
673 Return(net::ERR_IO_PENDING))); 843 CreateCastSocket();
674 844 socket_->AddWriteResult(net::SYNCHRONOUS, 0);
675 // Expect the test message to be read and invoke the delegate. 845 ConnectHelper();
846
847 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
848 EXPECT_CALL(mock_delegate_,
849 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
850 socket_->SendMessage(test_messages_[0],
851 base::Bind(&CompleteHandler::OnWriteComplete,
852 base::Unretained(&handler_)));
853 RunPendingTasks();
854
855 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
856 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
857 }
858
859 // Test that when an error occurrs in one write, write callback is invoked for
860 // all pending writes with the error
861 TEST_F(CastSocketTest, TestWriteErrorWithMultiplePendingWritesAsync) {
862 CreateCastSocket();
863 socket_->AddWriteResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED);
864 ConnectHelper();
865
866 const int num_writes = arraysize(test_messages_);
867 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED))
868 .Times(num_writes);
869 EXPECT_CALL(mock_delegate_,
870 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
871 for (int i = 0; i < num_writes; i++) {
872 socket_->SendMessage(test_messages_[i],
873 base::Bind(&CompleteHandler::OnWriteComplete,
874 base::Unretained(&handler_)));
875 }
876 RunPendingTasks();
877
878 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
879 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
880 }
881
882 // Test read success - single message (async)
883 TEST_F(CastSocketTest, TestReadAsync) {
884 CreateCastSocket();
885 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0]);
676 EXPECT_CALL(mock_delegate_, 886 EXPECT_CALL(mock_delegate_,
677 OnMessage(socket_.get(), A<const MessageInfo&>())); 887 OnMessage(socket_.get(), A<const MessageInfo&>()));
678 888 ConnectHelper();
679 // Connect the socket. 889
680 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 890 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
681 base::Unretained(&handler_))); 891 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
682 connect_callback1.Run(net::OK); 892 }
683 connect_callback2.Run(net::OK); 893
684 894 // Test read success - single message (sync)
685 // Put the test header and message into the io_buffers and invoke the read 895 TEST_F(CastSocketTest, TestReadSync) {
686 // callbacks. 896 CreateCastSocket();
687 memcpy(socket_->header_read_buffer_->StartOfBuffer(), 897 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]);
688 message_data.c_str(), 4); 898 EXPECT_CALL(mock_delegate_,
689 read_callback.Run(4); 899 OnMessage(socket_.get(), A<const MessageInfo&>()));
690 memcpy(socket_->body_read_buffer_->StartOfBuffer(), 900 ConnectHelper();
691 message_data.c_str() + 4, 35); 901
692 read_callback.Run(35); 902 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
693 903 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
694 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 904 }
695 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 905
696 } 906 // Test read success - single message received in multiple chunks (async)
697 907 TEST_F(CastSocketTest, TestReadChunkedAsync) {
698 // Tests reading multiple messages. 908 CreateCastSocket();
699 TEST_F(CastSocketTest, TestReadMany) { 909 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0], 2);
700 CreateCastSocket(); 910 EXPECT_CALL(mock_delegate_,
701 911 OnMessage(socket_.get(), A<const MessageInfo&>()));
702 net::CompletionCallback connect_callback1; 912 ConnectHelper();
703 net::CompletionCallback connect_callback2; 913
704 net::CompletionCallback read_callback; 914 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
705 915 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
706 std::string messages[4]; 916 }
707 messages[0] = "Hello, World!"; 917
708 messages[1] = "Goodbye, World!"; 918 // Test read success - single message received in multiple chunks (sync)
709 messages[2] = "Hello, Sky!"; 919 TEST_F(CastSocketTest, TestReadChunkedSync) {
710 messages[3] = "Goodbye, Volcano!"; 920 CreateCastSocket();
711 int sizes[4] = {35, 37, 33, 39}; 921 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2);
712 std::string message_data[4]; 922 EXPECT_CALL(mock_delegate_,
713 923 OnMessage(socket_.get(), A<const MessageInfo&>()));
714 // Set up test data 924 ConnectHelper();
715 for (int i = 0; i < 4; i++) { 925
716 test_proto_.set_payload_utf8(messages[i]); 926 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
717 ASSERT_TRUE(CastSocket::Serialize(test_proto_, &message_data[i])); 927 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
718 } 928 }
719 929
720 ExpectTcpConnect(&connect_callback1, net::ERR_IO_PENDING); 930 // Test read success - multiple messages (async)
721 ExpectSslConnect(&connect_callback2, net::ERR_IO_PENDING); 931 TEST_F(CastSocketTest, TestReadManyAsync) {
722 932 CreateCastSocket();
723 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); 933 size_t num_reads = arraysize(test_proto_strs_);
724 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), 934 for (size_t i = 0; i < num_reads; i++)
725 A<int>(), 935 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[i]);
726 A<const net::CompletionCallback&>())) 936 EXPECT_CALL(mock_delegate_,
727 .Times(9) 937 OnMessage(socket_.get(), A<const MessageInfo&>()))
728 .WillRepeatedly(DoAll(SaveArg<2>(&read_callback), 938 .Times(num_reads);
729 Return(net::ERR_IO_PENDING))); 939 ConnectHelper();
730 940
731 // Expect the test messages to be read and invoke the delegate. 941 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
732 EXPECT_CALL(mock_delegate_, OnMessage(socket_.get(), 942 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
733 A<const MessageInfo&>())) 943 }
734 .Times(4); 944
735 945 // Test read success - multiple messages (sync)
736 // Connect the socket. 946 TEST_F(CastSocketTest, TestReadManySync) {
737 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 947 CreateCastSocket();
738 base::Unretained(&handler_))); 948 size_t num_reads = arraysize(test_proto_strs_);
739 connect_callback1.Run(net::OK); 949 for (size_t i = 0; i < num_reads; i++)
740 connect_callback2.Run(net::OK); 950 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[i]);
741 951 EXPECT_CALL(mock_delegate_,
742 // Put the test headers and messages into the io_buffer and invoke the read 952 OnMessage(socket_.get(), A<const MessageInfo&>()))
743 // callbacks. 953 .Times(num_reads);
744 for (int i = 0; i < 4; i++) { 954 ConnectHelper();
745 memcpy(socket_->header_read_buffer_->StartOfBuffer(), 955
746 message_data[i].c_str(), 4); 956 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
747 read_callback.Run(4); 957 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
748 memcpy(socket_->body_read_buffer_->StartOfBuffer(), 958 }
749 message_data[i].c_str() + 4, sizes[i]); 959
750 read_callback.Run(sizes[i]); 960 // Test read error - network error (async)
751 } 961 TEST_F(CastSocketTest, TestReadErrorAsync) {
752 962 CreateCastSocket();
753 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 963 socket_->AddReadResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED);
754 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 964 EXPECT_CALL(mock_delegate_,
755 } 965 OnError(socket_.get(),
756 966 cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
757 // Tests error on reading. 967 ConnectHelper();
758 TEST_F(CastSocketTest, TestReadError) {
759 CreateCastSocket();
760
761 net::CompletionCallback connect_callback1;
762 net::CompletionCallback connect_callback2;
763 net::CompletionCallback read_callback;
764
765 ExpectTcpConnect(&connect_callback1, net::ERR_IO_PENDING);
766 ExpectSslConnect(&connect_callback2, net::ERR_IO_PENDING);
767
768 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
769 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(),
770 A<int>(),
771 A<const net::CompletionCallback&>()))
772 .WillOnce(DoAll(SaveArg<2>(&read_callback),
773 Return(net::ERR_IO_PENDING)));
774 EXPECT_CALL(mock_delegate_,
775 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
776
777 // Connect the socket.
778 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
779 base::Unretained(&handler_)));
780 connect_callback1.Run(net::OK);
781 connect_callback2.Run(net::OK);
782
783 // Cause an error.
784 read_callback.Run(net::ERR_SOCKET_NOT_CONNECTED);
785 968
786 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 969 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
787 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); 970 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
788 } 971 }
789 972
973 // Test read error - network error (sync)
974 TEST_F(CastSocketTest, TestReadErrorSync) {
975 CreateCastSocket();
976 socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_SOCKET_NOT_CONNECTED);
977 EXPECT_CALL(mock_delegate_,
978 OnError(socket_.get(),
979 cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
980 ConnectHelper();
981
982 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
983 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
984 }
985
986 // Test read error - header parse error
987 TEST_F(CastSocketTest, TestReadHeaderParseError) {
988 CreateCastSocket();
989 uint32 body_size = base::HostToNet32(kMaxMessageSize + 1);
990 // TODO(munjal): Add a method to cast_message_util.h to serialize messages
991 char header[sizeof(body_size)];
992 memcpy(&header, &body_size, arraysize(header));
993 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header));
994 EXPECT_CALL(mock_delegate_,
995 OnError(socket_.get(),
996 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE));
997 ConnectHelper();
998
999 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
1000 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE,
1001 socket_->error_state());
1002 }
1003
1004 // Test read error - body parse error
1005 TEST_F(CastSocketTest, TestReadBodyParseError) {
1006 CreateCastSocket();
1007 char body[] = "some body";
1008 uint32 body_size = base::HostToNet32(arraysize(body));
1009 char header[sizeof(body_size)];
1010 memcpy(&header, &body_size, arraysize(header));
1011 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header));
1012 socket_->AddReadResult(net::SYNCHRONOUS, body, arraysize(body));
1013 EXPECT_CALL(mock_delegate_,
1014 OnError(socket_.get(),
1015 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE));
1016 ConnectHelper();
1017
1018 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
1019 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE,
1020 socket_->error_state());
1021 }
1022
790 } // namespace cast_channel 1023 } // namespace cast_channel
791 } // namespace api 1024 } // namespace api
792 } // namespace extensions 1025 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/cast_channel/cast_socket.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698