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

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

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

Powered by Google App Engine
This is Rietveld 408576698