Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 |
| OLD | NEW |