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

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