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 "net/websockets/websocket_channel.h" | 5 #include "net/websockets/websocket_channel.h" |
| 6 | 6 |
| 7 #include <limits.h> | 7 #include <limits.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <string.h> | 9 #include <string.h> |
| 10 | 10 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 150 | 150 |
| 151 // This typedef mainly exists to avoid having to repeat the "NOLINT" incantation | 151 // This typedef mainly exists to avoid having to repeat the "NOLINT" incantation |
| 152 // all over the place. | 152 // all over the place. |
| 153 typedef StrictMock< MockFunction<void(int)> > Checkpoint; // NOLINT | 153 typedef StrictMock< MockFunction<void(int)> > Checkpoint; // NOLINT |
| 154 | 154 |
| 155 // This mock is for testing expectations about how the EventInterface is used. | 155 // This mock is for testing expectations about how the EventInterface is used. |
| 156 class MockWebSocketEventInterface : public WebSocketEventInterface { | 156 class MockWebSocketEventInterface : public WebSocketEventInterface { |
| 157 public: | 157 public: |
| 158 MockWebSocketEventInterface() {} | 158 MockWebSocketEventInterface() {} |
| 159 | 159 |
| 160 ChannelState OnDataFrame(bool fin, | |
| 161 WebSocketMessageType type, | |
| 162 scoped_refptr<IOBuffer> buffer, | |
| 163 size_t buffer_size) override { | |
| 164 char* data = buffer ? buffer->data() : nullptr; | |
|
yhirano
2016/10/04 01:35:09
|const char*| might be preferable.
darin (slow to review)
2016/10/04 16:17:48
Done.
| |
| 165 return OnDataFrameVector(fin, type, | |
| 166 std::vector<char>(data, data + buffer_size)); | |
| 167 } | |
| 168 | |
| 160 MOCK_METHOD2(OnAddChannelResponse, | 169 MOCK_METHOD2(OnAddChannelResponse, |
| 161 ChannelState(const std::string&, | 170 ChannelState(const std::string&, |
| 162 const std::string&)); // NOLINT | 171 const std::string&)); // NOLINT |
| 163 MOCK_METHOD3(OnDataFrame, | 172 MOCK_METHOD3(OnDataFrameVector, |
| 164 ChannelState(bool, | 173 ChannelState(bool, |
| 165 WebSocketMessageType, | 174 WebSocketMessageType, |
| 166 const std::vector<char>&)); // NOLINT | 175 const std::vector<char>&)); // NOLINT |
| 167 MOCK_METHOD1(OnFlowControl, ChannelState(int64_t)); // NOLINT | 176 MOCK_METHOD1(OnFlowControl, ChannelState(int64_t)); // NOLINT |
| 168 MOCK_METHOD0(OnClosingHandshake, ChannelState(void)); // NOLINT | 177 MOCK_METHOD0(OnClosingHandshake, ChannelState(void)); // NOLINT |
| 169 MOCK_METHOD1(OnFailChannel, ChannelState(const std::string&)); // NOLINT | 178 MOCK_METHOD1(OnFailChannel, ChannelState(const std::string&)); // NOLINT |
| 170 MOCK_METHOD3(OnDropChannel, | 179 MOCK_METHOD3(OnDropChannel, |
| 171 ChannelState(bool, uint16_t, const std::string&)); // NOLINT | 180 ChannelState(bool, uint16_t, const std::string&)); // NOLINT |
| 172 | 181 |
| 173 // We can't use GMock with scoped_ptr. | 182 // We can't use GMock with scoped_ptr. |
| 174 ChannelState OnStartOpeningHandshake( | 183 ChannelState OnStartOpeningHandshake( |
| 175 std::unique_ptr<WebSocketHandshakeRequestInfo>) override { | 184 std::unique_ptr<WebSocketHandshakeRequestInfo>) override { |
| 176 OnStartOpeningHandshakeCalled(); | 185 OnStartOpeningHandshakeCalled(); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 200 | 209 |
| 201 // This fake EventInterface is for tests which need a WebSocketEventInterface | 210 // This fake EventInterface is for tests which need a WebSocketEventInterface |
| 202 // implementation but are not verifying how it is used. | 211 // implementation but are not verifying how it is used. |
| 203 class FakeWebSocketEventInterface : public WebSocketEventInterface { | 212 class FakeWebSocketEventInterface : public WebSocketEventInterface { |
| 204 ChannelState OnAddChannelResponse(const std::string& selected_protocol, | 213 ChannelState OnAddChannelResponse(const std::string& selected_protocol, |
| 205 const std::string& extensions) override { | 214 const std::string& extensions) override { |
| 206 return CHANNEL_ALIVE; | 215 return CHANNEL_ALIVE; |
| 207 } | 216 } |
| 208 ChannelState OnDataFrame(bool fin, | 217 ChannelState OnDataFrame(bool fin, |
| 209 WebSocketMessageType type, | 218 WebSocketMessageType type, |
| 210 const std::vector<char>& data) override { | 219 scoped_refptr<IOBuffer> data, |
| 220 size_t data_size) override { | |
| 211 return CHANNEL_ALIVE; | 221 return CHANNEL_ALIVE; |
| 212 } | 222 } |
| 213 ChannelState OnFlowControl(int64_t quota) override { return CHANNEL_ALIVE; } | 223 ChannelState OnFlowControl(int64_t quota) override { return CHANNEL_ALIVE; } |
| 214 ChannelState OnClosingHandshake() override { return CHANNEL_ALIVE; } | 224 ChannelState OnClosingHandshake() override { return CHANNEL_ALIVE; } |
| 215 ChannelState OnFailChannel(const std::string& message) override { | 225 ChannelState OnFailChannel(const std::string& message) override { |
| 216 return CHANNEL_DELETED; | 226 return CHANNEL_DELETED; |
| 217 } | 227 } |
| 218 ChannelState OnDropChannel(bool was_clean, | 228 ChannelState OnDropChannel(bool was_clean, |
| 219 uint16_t code, | 229 uint16_t code, |
| 220 const std::string& reason) override { | 230 const std::string& reason) override { |
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 725 | 735 |
| 726 GURL socket_url; | 736 GURL socket_url; |
| 727 std::unique_ptr<WebSocketHandshakeStreamCreateHelper> create_helper; | 737 std::unique_ptr<WebSocketHandshakeStreamCreateHelper> create_helper; |
| 728 url::Origin origin; | 738 url::Origin origin; |
| 729 GURL first_party_for_cookies; | 739 GURL first_party_for_cookies; |
| 730 URLRequestContext* url_request_context; | 740 URLRequestContext* url_request_context; |
| 731 NetLogWithSource net_log; | 741 NetLogWithSource net_log; |
| 732 std::unique_ptr<WebSocketStream::ConnectDelegate> connect_delegate; | 742 std::unique_ptr<WebSocketStream::ConnectDelegate> connect_delegate; |
| 733 }; | 743 }; |
| 734 | 744 |
| 735 // Converts a std::string to a std::vector<char>. For test purposes, it is | 745 std::vector<char> AsVector(const base::StringPiece& s) { |
| 746 return std::vector<char>(s.begin(), s.end()); | |
| 747 } | |
| 748 | |
| 749 // Converts a base::StringPiece to a IOBuffer. For test purposes, it is | |
| 736 // convenient to be able to specify data as a string, but the | 750 // convenient to be able to specify data as a string, but the |
| 737 // WebSocketEventInterface requires the vector<char> type. | 751 // WebSocketEventInterface requires the IOBuffer type. |
| 738 std::vector<char> AsVector(const std::string& s) { | 752 scoped_refptr<IOBuffer> AsIOBuffer(const base::StringPiece& s) { |
| 739 return std::vector<char>(s.begin(), s.end()); | 753 scoped_refptr<IOBuffer> buffer(new IOBuffer(s.size())); |
| 754 std::copy(s.begin(), s.end(), buffer->data()); | |
| 755 return buffer; | |
| 740 } | 756 } |
| 741 | 757 |
| 742 class FakeSSLErrorCallbacks | 758 class FakeSSLErrorCallbacks |
| 743 : public WebSocketEventInterface::SSLErrorCallbacks { | 759 : public WebSocketEventInterface::SSLErrorCallbacks { |
| 744 public: | 760 public: |
| 745 void CancelSSLRequest(int error, const SSLInfo* ssl_info) override {} | 761 void CancelSSLRequest(int error, const SSLInfo* ssl_info) override {} |
| 746 void ContinueSSLRequest() override {} | 762 void ContinueSSLRequest() override {} |
| 747 }; | 763 }; |
| 748 | 764 |
| 749 // Base class for all test fixtures. | 765 // Base class for all test fixtures. |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 874 WebSocketChannelDeletingTest* fixture) | 890 WebSocketChannelDeletingTest* fixture) |
| 875 : fixture_(fixture) {} | 891 : fixture_(fixture) {} |
| 876 | 892 |
| 877 ChannelState OnAddChannelResponse(const std::string& selected_protocol, | 893 ChannelState OnAddChannelResponse(const std::string& selected_protocol, |
| 878 const std::string& extensions) override { | 894 const std::string& extensions) override { |
| 879 return fixture_->DeleteIfDeleting(EVENT_ON_ADD_CHANNEL_RESPONSE); | 895 return fixture_->DeleteIfDeleting(EVENT_ON_ADD_CHANNEL_RESPONSE); |
| 880 } | 896 } |
| 881 | 897 |
| 882 ChannelState OnDataFrame(bool fin, | 898 ChannelState OnDataFrame(bool fin, |
| 883 WebSocketMessageType type, | 899 WebSocketMessageType type, |
| 884 const std::vector<char>& data) override { | 900 scoped_refptr<IOBuffer> data, |
| 901 size_t data_size) override { | |
| 885 return fixture_->DeleteIfDeleting(EVENT_ON_DATA_FRAME); | 902 return fixture_->DeleteIfDeleting(EVENT_ON_DATA_FRAME); |
| 886 } | 903 } |
| 887 | 904 |
| 888 ChannelState OnFlowControl(int64_t quota) override { | 905 ChannelState OnFlowControl(int64_t quota) override { |
| 889 return fixture_->DeleteIfDeleting(EVENT_ON_FLOW_CONTROL); | 906 return fixture_->DeleteIfDeleting(EVENT_ON_FLOW_CONTROL); |
| 890 } | 907 } |
| 891 | 908 |
| 892 ChannelState OnClosingHandshake() override { | 909 ChannelState OnClosingHandshake() override { |
| 893 return fixture_->DeleteIfDeleting(EVENT_ON_CLOSING_HANDSHAKE); | 910 return fixture_->DeleteIfDeleting(EVENT_ON_CLOSING_HANDSHAKE); |
| 894 } | 911 } |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1099 EXPECT_EQ(nullptr, channel_.get()); | 1116 EXPECT_EQ(nullptr, channel_.get()); |
| 1100 } | 1117 } |
| 1101 | 1118 |
| 1102 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterSend) { | 1119 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterSend) { |
| 1103 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); | 1120 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); |
| 1104 // Avoid deleting the channel yet. | 1121 // Avoid deleting the channel yet. |
| 1105 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; | 1122 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
| 1106 CreateChannelAndConnectSuccessfully(); | 1123 CreateChannelAndConnectSuccessfully(); |
| 1107 ASSERT_TRUE(channel_); | 1124 ASSERT_TRUE(channel_); |
| 1108 deleting_ = EVENT_ON_FLOW_CONTROL; | 1125 deleting_ = EVENT_ON_FLOW_CONTROL; |
| 1109 channel_->SendFrame(true, | 1126 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 1110 WebSocketFrameHeader::kOpCodeText, | 1127 AsIOBuffer(std::string(kDefaultInitialQuota, 'B')), |
| 1111 std::vector<char>(kDefaultInitialQuota, 'B')); | 1128 kDefaultInitialQuota); |
| 1112 EXPECT_EQ(nullptr, channel_.get()); | 1129 EXPECT_EQ(nullptr, channel_.get()); |
| 1113 } | 1130 } |
| 1114 | 1131 |
| 1115 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeSync) { | 1132 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeSync) { |
| 1116 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1133 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1117 new ReadableFakeWebSocketStream); | 1134 new ReadableFakeWebSocketStream); |
| 1118 static const InitFrame frames[] = { | 1135 static const InitFrame frames[] = { |
| 1119 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 1136 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 1120 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; | 1137 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; |
| 1121 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1138 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1138 ASSERT_TRUE(channel_); | 1155 ASSERT_TRUE(channel_); |
| 1139 base::RunLoop().RunUntilIdle(); | 1156 base::RunLoop().RunUntilIdle(); |
| 1140 EXPECT_EQ(nullptr, channel_.get()); | 1157 EXPECT_EQ(nullptr, channel_.get()); |
| 1141 } | 1158 } |
| 1142 | 1159 |
| 1143 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { | 1160 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { |
| 1144 set_stream(base::WrapUnique(new UnWriteableFakeWebSocketStream)); | 1161 set_stream(base::WrapUnique(new UnWriteableFakeWebSocketStream)); |
| 1145 deleting_ = EVENT_ON_DROP_CHANNEL; | 1162 deleting_ = EVENT_ON_DROP_CHANNEL; |
| 1146 CreateChannelAndConnectSuccessfully(); | 1163 CreateChannelAndConnectSuccessfully(); |
| 1147 ASSERT_TRUE(channel_); | 1164 ASSERT_TRUE(channel_); |
| 1148 channel_->SendFrame( | 1165 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 1149 true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); | 1166 AsIOBuffer("this will fail"), 14U); |
| 1150 EXPECT_EQ(nullptr, channel_.get()); | 1167 EXPECT_EQ(nullptr, channel_.get()); |
| 1151 } | 1168 } |
| 1152 | 1169 |
| 1153 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { | 1170 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { |
| 1154 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1171 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1155 new ReadableFakeWebSocketStream); | 1172 new ReadableFakeWebSocketStream); |
| 1156 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1173 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1157 ERR_FAILED); | 1174 ERR_FAILED); |
| 1158 set_stream(std::move(stream)); | 1175 set_stream(std::move(stream)); |
| 1159 deleting_ = EVENT_ON_DROP_CHANNEL; | 1176 deleting_ = EVENT_ON_DROP_CHANNEL; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1201 base::Time())); | 1218 base::Time())); |
| 1202 base::RunLoop().RunUntilIdle(); | 1219 base::RunLoop().RunUntilIdle(); |
| 1203 EXPECT_EQ(nullptr, channel_.get()); | 1220 EXPECT_EQ(nullptr, channel_.get()); |
| 1204 } | 1221 } |
| 1205 | 1222 |
| 1206 TEST_F(WebSocketChannelDeletingTest, FailChannelInSendFrame) { | 1223 TEST_F(WebSocketChannelDeletingTest, FailChannelInSendFrame) { |
| 1207 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); | 1224 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); |
| 1208 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1225 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1209 CreateChannelAndConnectSuccessfully(); | 1226 CreateChannelAndConnectSuccessfully(); |
| 1210 ASSERT_TRUE(channel_); | 1227 ASSERT_TRUE(channel_); |
| 1211 channel_->SendFrame(true, | 1228 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 1212 WebSocketFrameHeader::kOpCodeText, | 1229 AsIOBuffer(std::string(kDefaultInitialQuota * 2, 'T')), |
| 1213 std::vector<char>(kDefaultInitialQuota * 2, 'T')); | 1230 kDefaultInitialQuota * 2); |
| 1214 EXPECT_EQ(nullptr, channel_.get()); | 1231 EXPECT_EQ(nullptr, channel_.get()); |
| 1215 } | 1232 } |
| 1216 | 1233 |
| 1217 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { | 1234 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { |
| 1218 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1235 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1219 new ReadableFakeWebSocketStream); | 1236 new ReadableFakeWebSocketStream); |
| 1220 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1237 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1221 ERR_WS_PROTOCOL_ERROR); | 1238 ERR_WS_PROTOCOL_ERROR); |
| 1222 set_stream(std::move(stream)); | 1239 set_stream(std::move(stream)); |
| 1223 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1240 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1388 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1405 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1389 new ReadableFakeWebSocketStream); | 1406 new ReadableFakeWebSocketStream); |
| 1390 static const InitFrame frames[] = { | 1407 static const InitFrame frames[] = { |
| 1391 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1408 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1392 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1409 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1393 set_stream(std::move(stream)); | 1410 set_stream(std::move(stream)); |
| 1394 { | 1411 { |
| 1395 InSequence s; | 1412 InSequence s; |
| 1396 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1413 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1397 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1414 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1398 EXPECT_CALL( | 1415 EXPECT_CALL(*event_interface_, |
| 1399 *event_interface_, | 1416 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| 1400 OnDataFrame( | 1417 AsVector("HELLO"))); |
| 1401 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); | |
| 1402 } | 1418 } |
| 1403 | 1419 |
| 1404 CreateChannelAndConnectSuccessfully(); | 1420 CreateChannelAndConnectSuccessfully(); |
| 1405 } | 1421 } |
| 1406 | 1422 |
| 1407 // A remote server could accept the handshake, but then immediately send a | 1423 // A remote server could accept the handshake, but then immediately send a |
| 1408 // Close frame. | 1424 // Close frame. |
| 1409 TEST_F(WebSocketChannelEventInterfaceTest, CloseAfterHandshake) { | 1425 TEST_F(WebSocketChannelEventInterfaceTest, CloseAfterHandshake) { |
| 1410 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1426 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1411 new ReadableFakeWebSocketStream); | 1427 new ReadableFakeWebSocketStream); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1457 // We use this checkpoint object to verify that the callback isn't called | 1473 // We use this checkpoint object to verify that the callback isn't called |
| 1458 // until we expect it to be. | 1474 // until we expect it to be. |
| 1459 Checkpoint checkpoint; | 1475 Checkpoint checkpoint; |
| 1460 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1476 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1461 set_stream(std::move(stream)); | 1477 set_stream(std::move(stream)); |
| 1462 { | 1478 { |
| 1463 InSequence s; | 1479 InSequence s; |
| 1464 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1480 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1465 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1481 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1466 EXPECT_CALL(checkpoint, Call(1)); | 1482 EXPECT_CALL(checkpoint, Call(1)); |
| 1467 EXPECT_CALL( | 1483 EXPECT_CALL(*event_interface_, |
| 1468 *event_interface_, | 1484 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| 1469 OnDataFrame( | 1485 AsVector("HELLO"))); |
| 1470 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); | |
| 1471 EXPECT_CALL(checkpoint, Call(2)); | 1486 EXPECT_CALL(checkpoint, Call(2)); |
| 1472 } | 1487 } |
| 1473 | 1488 |
| 1474 CreateChannelAndConnectSuccessfully(); | 1489 CreateChannelAndConnectSuccessfully(); |
| 1475 checkpoint.Call(1); | 1490 checkpoint.Call(1); |
| 1476 base::RunLoop().RunUntilIdle(); | 1491 base::RunLoop().RunUntilIdle(); |
| 1477 checkpoint.Call(2); | 1492 checkpoint.Call(2); |
| 1478 } | 1493 } |
| 1479 | 1494 |
| 1480 // Extra data can arrive while a read is being processed, resulting in the next | 1495 // Extra data can arrive while a read is being processed, resulting in the next |
| 1481 // read completing synchronously. | 1496 // read completing synchronously. |
| 1482 TEST_F(WebSocketChannelEventInterfaceTest, AsyncThenSyncRead) { | 1497 TEST_F(WebSocketChannelEventInterfaceTest, AsyncThenSyncRead) { |
| 1483 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1498 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1484 new ReadableFakeWebSocketStream); | 1499 new ReadableFakeWebSocketStream); |
| 1485 static const InitFrame frames1[] = { | 1500 static const InitFrame frames1[] = { |
| 1486 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1501 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1487 static const InitFrame frames2[] = { | 1502 static const InitFrame frames2[] = { |
| 1488 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "WORLD"}}; | 1503 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "WORLD"}}; |
| 1489 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); | 1504 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); |
| 1490 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames2); | 1505 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames2); |
| 1491 set_stream(std::move(stream)); | 1506 set_stream(std::move(stream)); |
| 1492 { | 1507 { |
| 1493 InSequence s; | 1508 InSequence s; |
| 1494 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1509 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1495 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1510 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1496 EXPECT_CALL( | 1511 EXPECT_CALL(*event_interface_, |
| 1497 *event_interface_, | 1512 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| 1498 OnDataFrame( | 1513 AsVector("HELLO"))); |
| 1499 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); | 1514 EXPECT_CALL(*event_interface_, |
| 1500 EXPECT_CALL( | 1515 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| 1501 *event_interface_, | 1516 AsVector("WORLD"))); |
| 1502 OnDataFrame( | |
| 1503 true, WebSocketFrameHeader::kOpCodeText, AsVector("WORLD"))); | |
| 1504 } | 1517 } |
| 1505 | 1518 |
| 1506 CreateChannelAndConnectSuccessfully(); | 1519 CreateChannelAndConnectSuccessfully(); |
| 1507 base::RunLoop().RunUntilIdle(); | 1520 base::RunLoop().RunUntilIdle(); |
| 1508 } | 1521 } |
| 1509 | 1522 |
| 1510 // Data frames are delivered the same regardless of how many reads they arrive | 1523 // Data frames are delivered the same regardless of how many reads they arrive |
| 1511 // as. | 1524 // as. |
| 1512 TEST_F(WebSocketChannelEventInterfaceTest, FragmentedMessage) { | 1525 TEST_F(WebSocketChannelEventInterfaceTest, FragmentedMessage) { |
| 1513 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1526 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1528 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 1541 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 1529 NOT_MASKED, "FRAMES"}}; | 1542 NOT_MASKED, "FRAMES"}}; |
| 1530 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); | 1543 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); |
| 1531 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames2); | 1544 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames2); |
| 1532 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames3); | 1545 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames3); |
| 1533 set_stream(std::move(stream)); | 1546 set_stream(std::move(stream)); |
| 1534 { | 1547 { |
| 1535 InSequence s; | 1548 InSequence s; |
| 1536 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1549 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1537 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1550 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1551 EXPECT_CALL(*event_interface_, | |
| 1552 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, | |
| 1553 AsVector("THREE"))); | |
| 1538 EXPECT_CALL( | 1554 EXPECT_CALL( |
| 1539 *event_interface_, | 1555 *event_interface_, |
| 1540 OnDataFrame( | 1556 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 1541 false, WebSocketFrameHeader::kOpCodeText, AsVector("THREE"))); | 1557 AsVector(" "))); |
| 1542 EXPECT_CALL( | 1558 EXPECT_CALL( |
| 1543 *event_interface_, | 1559 *event_interface_, |
| 1544 OnDataFrame( | 1560 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 1545 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector(" "))); | 1561 AsVector("SMALL"))); |
| 1546 EXPECT_CALL(*event_interface_, | |
| 1547 OnDataFrame(false, | |
| 1548 WebSocketFrameHeader::kOpCodeContinuation, | |
| 1549 AsVector("SMALL"))); | |
| 1550 EXPECT_CALL( | 1562 EXPECT_CALL( |
| 1551 *event_interface_, | 1563 *event_interface_, |
| 1552 OnDataFrame( | 1564 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 1553 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector(" "))); | 1565 AsVector(" "))); |
| 1554 EXPECT_CALL(*event_interface_, | 1566 EXPECT_CALL( |
| 1555 OnDataFrame(true, | 1567 *event_interface_, |
| 1556 WebSocketFrameHeader::kOpCodeContinuation, | 1568 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 1557 AsVector("FRAMES"))); | 1569 AsVector("FRAMES"))); |
| 1558 } | 1570 } |
| 1559 | 1571 |
| 1560 CreateChannelAndConnectSuccessfully(); | 1572 CreateChannelAndConnectSuccessfully(); |
| 1561 base::RunLoop().RunUntilIdle(); | 1573 base::RunLoop().RunUntilIdle(); |
| 1562 } | 1574 } |
| 1563 | 1575 |
| 1564 // A message can consist of one frame with null payload. | 1576 // A message can consist of one frame with null payload. |
| 1565 TEST_F(WebSocketChannelEventInterfaceTest, NullMessage) { | 1577 TEST_F(WebSocketChannelEventInterfaceTest, NullMessage) { |
| 1566 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1578 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1567 new ReadableFakeWebSocketStream); | 1579 new ReadableFakeWebSocketStream); |
| 1568 static const InitFrame frames[] = { | 1580 static const InitFrame frames[] = { |
| 1569 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, nullptr}}; | 1581 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, nullptr}}; |
| 1570 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1582 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1571 set_stream(std::move(stream)); | 1583 set_stream(std::move(stream)); |
| 1572 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1584 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1573 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1585 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1574 EXPECT_CALL( | 1586 EXPECT_CALL( |
| 1575 *event_interface_, | 1587 *event_interface_, |
| 1576 OnDataFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); | 1588 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); |
| 1577 CreateChannelAndConnectSuccessfully(); | 1589 CreateChannelAndConnectSuccessfully(); |
| 1578 } | 1590 } |
| 1579 | 1591 |
| 1580 // Connection closed by the remote host without a closing handshake. | 1592 // Connection closed by the remote host without a closing handshake. |
| 1581 TEST_F(WebSocketChannelEventInterfaceTest, AsyncAbnormalClosure) { | 1593 TEST_F(WebSocketChannelEventInterfaceTest, AsyncAbnormalClosure) { |
| 1582 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1594 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1583 new ReadableFakeWebSocketStream); | 1595 new ReadableFakeWebSocketStream); |
| 1584 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1596 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1585 ERR_CONNECTION_CLOSED); | 1597 ERR_CONNECTION_CLOSED); |
| 1586 set_stream(std::move(stream)); | 1598 set_stream(std::move(stream)); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1675 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 1687 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 1676 NOT_MASKED, "MESSAGE"}}; | 1688 NOT_MASKED, "MESSAGE"}}; |
| 1677 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); | 1689 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); |
| 1678 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames2); | 1690 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames2); |
| 1679 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames3); | 1691 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames3); |
| 1680 set_stream(std::move(stream)); | 1692 set_stream(std::move(stream)); |
| 1681 { | 1693 { |
| 1682 InSequence s; | 1694 InSequence s; |
| 1683 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1695 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1684 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1696 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1697 EXPECT_CALL(*event_interface_, | |
| 1698 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, | |
| 1699 AsVector("SPLIT "))); | |
| 1685 EXPECT_CALL( | 1700 EXPECT_CALL( |
| 1686 *event_interface_, | 1701 *event_interface_, |
| 1687 OnDataFrame( | 1702 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 1688 false, WebSocketFrameHeader::kOpCodeText, AsVector("SPLIT "))); | 1703 AsVector("MESSAGE"))); |
| 1689 EXPECT_CALL(*event_interface_, | |
| 1690 OnDataFrame(true, | |
| 1691 WebSocketFrameHeader::kOpCodeContinuation, | |
| 1692 AsVector("MESSAGE"))); | |
| 1693 } | 1704 } |
| 1694 | 1705 |
| 1695 CreateChannelAndConnectSuccessfully(); | 1706 CreateChannelAndConnectSuccessfully(); |
| 1696 base::RunLoop().RunUntilIdle(); | 1707 base::RunLoop().RunUntilIdle(); |
| 1697 } | 1708 } |
| 1698 | 1709 |
| 1699 // It seems redundant to repeat the entirety of the above test, so just test a | 1710 // It seems redundant to repeat the entirety of the above test, so just test a |
| 1700 // Pong with null data. | 1711 // Pong with null data. |
| 1701 TEST_F(WebSocketChannelEventInterfaceTest, PongWithNullData) { | 1712 TEST_F(WebSocketChannelEventInterfaceTest, PongWithNullData) { |
| 1702 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1713 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1741 // for each one. | 1752 // for each one. |
| 1742 TEST_F(WebSocketChannelEventInterfaceTest, SmallWriteDoesntUpdateQuota) { | 1753 TEST_F(WebSocketChannelEventInterfaceTest, SmallWriteDoesntUpdateQuota) { |
| 1743 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); | 1754 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); |
| 1744 { | 1755 { |
| 1745 InSequence s; | 1756 InSequence s; |
| 1746 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1757 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1747 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1758 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1748 } | 1759 } |
| 1749 | 1760 |
| 1750 CreateChannelAndConnectSuccessfully(); | 1761 CreateChannelAndConnectSuccessfully(); |
| 1751 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("B")); | 1762 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsIOBuffer("B"), |
| 1763 1U); | |
| 1752 } | 1764 } |
| 1753 | 1765 |
| 1754 // If we send enough to go below |send_quota_low_water_mark_| we should get our | 1766 // If we send enough to go below |send_quota_low_water_mark_| we should get our |
| 1755 // quota refreshed. | 1767 // quota refreshed. |
| 1756 TEST_F(WebSocketChannelEventInterfaceTest, LargeWriteUpdatesQuota) { | 1768 TEST_F(WebSocketChannelEventInterfaceTest, LargeWriteUpdatesQuota) { |
| 1757 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); | 1769 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); |
| 1758 // We use this checkpoint object to verify that the quota update comes after | 1770 // We use this checkpoint object to verify that the quota update comes after |
| 1759 // the write. | 1771 // the write. |
| 1760 Checkpoint checkpoint; | 1772 Checkpoint checkpoint; |
| 1761 { | 1773 { |
| 1762 InSequence s; | 1774 InSequence s; |
| 1763 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1775 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1764 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1776 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1765 EXPECT_CALL(checkpoint, Call(1)); | 1777 EXPECT_CALL(checkpoint, Call(1)); |
| 1766 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1778 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1767 EXPECT_CALL(checkpoint, Call(2)); | 1779 EXPECT_CALL(checkpoint, Call(2)); |
| 1768 } | 1780 } |
| 1769 | 1781 |
| 1770 CreateChannelAndConnectSuccessfully(); | 1782 CreateChannelAndConnectSuccessfully(); |
| 1771 checkpoint.Call(1); | 1783 checkpoint.Call(1); |
| 1772 channel_->SendFrame(true, | 1784 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 1773 WebSocketFrameHeader::kOpCodeText, | 1785 AsIOBuffer(std::string(kDefaultInitialQuota, 'B')), |
| 1774 std::vector<char>(kDefaultInitialQuota, 'B')); | 1786 kDefaultInitialQuota); |
| 1775 checkpoint.Call(2); | 1787 checkpoint.Call(2); |
| 1776 } | 1788 } |
| 1777 | 1789 |
| 1778 // Verify that our quota actually is refreshed when we are told it is. | 1790 // Verify that our quota actually is refreshed when we are told it is. |
| 1779 TEST_F(WebSocketChannelEventInterfaceTest, QuotaReallyIsRefreshed) { | 1791 TEST_F(WebSocketChannelEventInterfaceTest, QuotaReallyIsRefreshed) { |
| 1780 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); | 1792 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); |
| 1781 Checkpoint checkpoint; | 1793 Checkpoint checkpoint; |
| 1782 { | 1794 { |
| 1783 InSequence s; | 1795 InSequence s; |
| 1784 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1796 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1785 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1797 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1786 EXPECT_CALL(checkpoint, Call(1)); | 1798 EXPECT_CALL(checkpoint, Call(1)); |
| 1787 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1799 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1788 EXPECT_CALL(checkpoint, Call(2)); | 1800 EXPECT_CALL(checkpoint, Call(2)); |
| 1789 // If quota was not really refreshed, we would get an OnDropChannel() | 1801 // If quota was not really refreshed, we would get an OnDropChannel() |
| 1790 // message. | 1802 // message. |
| 1791 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1803 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1792 EXPECT_CALL(checkpoint, Call(3)); | 1804 EXPECT_CALL(checkpoint, Call(3)); |
| 1793 } | 1805 } |
| 1794 | 1806 |
| 1795 CreateChannelAndConnectSuccessfully(); | 1807 CreateChannelAndConnectSuccessfully(); |
| 1796 checkpoint.Call(1); | 1808 checkpoint.Call(1); |
| 1797 channel_->SendFrame(true, | 1809 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 1798 WebSocketFrameHeader::kOpCodeText, | 1810 AsIOBuffer(std::string(kDefaultQuotaRefreshTrigger, 'D')), |
| 1799 std::vector<char>(kDefaultQuotaRefreshTrigger, 'D')); | 1811 kDefaultQuotaRefreshTrigger); |
| 1800 checkpoint.Call(2); | 1812 checkpoint.Call(2); |
| 1801 // We should have received more quota at this point. | 1813 // We should have received more quota at this point. |
| 1802 channel_->SendFrame(true, | 1814 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 1803 WebSocketFrameHeader::kOpCodeText, | 1815 AsIOBuffer(std::string(kDefaultQuotaRefreshTrigger, 'E')), |
| 1804 std::vector<char>(kDefaultQuotaRefreshTrigger, 'E')); | 1816 kDefaultQuotaRefreshTrigger); |
| 1805 checkpoint.Call(3); | 1817 checkpoint.Call(3); |
| 1806 } | 1818 } |
| 1807 | 1819 |
| 1808 // If we send more than the available quota then the connection will be closed | 1820 // If we send more than the available quota then the connection will be closed |
| 1809 // with an error. | 1821 // with an error. |
| 1810 TEST_F(WebSocketChannelEventInterfaceTest, WriteOverQuotaIsRejected) { | 1822 TEST_F(WebSocketChannelEventInterfaceTest, WriteOverQuotaIsRejected) { |
| 1811 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); | 1823 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); |
| 1812 { | 1824 { |
| 1813 InSequence s; | 1825 InSequence s; |
| 1814 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1826 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1815 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); | 1827 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| 1816 EXPECT_CALL(*event_interface_, OnFailChannel("Send quota exceeded")); | 1828 EXPECT_CALL(*event_interface_, OnFailChannel("Send quota exceeded")); |
| 1817 } | 1829 } |
| 1818 | 1830 |
| 1819 CreateChannelAndConnectSuccessfully(); | 1831 CreateChannelAndConnectSuccessfully(); |
| 1820 channel_->SendFrame(true, | 1832 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 1821 WebSocketFrameHeader::kOpCodeText, | 1833 AsIOBuffer(std::string(kDefaultInitialQuota + 1, 'C')), |
| 1822 std::vector<char>(kDefaultInitialQuota + 1, 'C')); | 1834 kDefaultInitialQuota + 1); |
| 1823 } | 1835 } |
| 1824 | 1836 |
| 1825 // If a write fails, the channel is dropped. | 1837 // If a write fails, the channel is dropped. |
| 1826 TEST_F(WebSocketChannelEventInterfaceTest, FailedWrite) { | 1838 TEST_F(WebSocketChannelEventInterfaceTest, FailedWrite) { |
| 1827 set_stream(base::WrapUnique(new UnWriteableFakeWebSocketStream)); | 1839 set_stream(base::WrapUnique(new UnWriteableFakeWebSocketStream)); |
| 1828 Checkpoint checkpoint; | 1840 Checkpoint checkpoint; |
| 1829 { | 1841 { |
| 1830 InSequence s; | 1842 InSequence s; |
| 1831 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1843 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1832 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1844 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1833 EXPECT_CALL(checkpoint, Call(1)); | 1845 EXPECT_CALL(checkpoint, Call(1)); |
| 1834 EXPECT_CALL(*event_interface_, | 1846 EXPECT_CALL(*event_interface_, |
| 1835 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); | 1847 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); |
| 1836 EXPECT_CALL(checkpoint, Call(2)); | 1848 EXPECT_CALL(checkpoint, Call(2)); |
| 1837 } | 1849 } |
| 1838 | 1850 |
| 1839 CreateChannelAndConnectSuccessfully(); | 1851 CreateChannelAndConnectSuccessfully(); |
| 1840 checkpoint.Call(1); | 1852 checkpoint.Call(1); |
| 1841 | 1853 |
| 1842 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("H")); | 1854 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsIOBuffer("H"), |
| 1855 1U); | |
| 1843 checkpoint.Call(2); | 1856 checkpoint.Call(2); |
| 1844 } | 1857 } |
| 1845 | 1858 |
| 1846 // OnDropChannel() is called exactly once when StartClosingHandshake() is used. | 1859 // OnDropChannel() is called exactly once when StartClosingHandshake() is used. |
| 1847 TEST_F(WebSocketChannelEventInterfaceTest, SendCloseDropsChannel) { | 1860 TEST_F(WebSocketChannelEventInterfaceTest, SendCloseDropsChannel) { |
| 1848 set_stream(base::WrapUnique(new EchoeyFakeWebSocketStream)); | 1861 set_stream(base::WrapUnique(new EchoeyFakeWebSocketStream)); |
| 1849 { | 1862 { |
| 1850 InSequence s; | 1863 InSequence s; |
| 1851 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1864 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1852 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1865 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 1878 set_stream(base::WrapUnique(new ResetOnWriteFakeWebSocketStream)); | 1891 set_stream(base::WrapUnique(new ResetOnWriteFakeWebSocketStream)); |
| 1879 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1892 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1880 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1893 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1881 | 1894 |
| 1882 EXPECT_CALL(*event_interface_, | 1895 EXPECT_CALL(*event_interface_, |
| 1883 OnDropChannel(false, kWebSocketErrorAbnormalClosure, "")) | 1896 OnDropChannel(false, kWebSocketErrorAbnormalClosure, "")) |
| 1884 .Times(1); | 1897 .Times(1); |
| 1885 | 1898 |
| 1886 CreateChannelAndConnectSuccessfully(); | 1899 CreateChannelAndConnectSuccessfully(); |
| 1887 | 1900 |
| 1888 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("yt?")); | 1901 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 1902 AsIOBuffer("yt?"), 3U); | |
| 1889 base::RunLoop().RunUntilIdle(); | 1903 base::RunLoop().RunUntilIdle(); |
| 1890 } | 1904 } |
| 1891 | 1905 |
| 1892 // When the remote server sends a Close frame with an empty payload, | 1906 // When the remote server sends a Close frame with an empty payload, |
| 1893 // WebSocketChannel should report code 1005, kWebSocketErrorNoStatusReceived. | 1907 // WebSocketChannel should report code 1005, kWebSocketErrorNoStatusReceived. |
| 1894 TEST_F(WebSocketChannelEventInterfaceTest, CloseWithNoPayloadGivesStatus1005) { | 1908 TEST_F(WebSocketChannelEventInterfaceTest, CloseWithNoPayloadGivesStatus1005) { |
| 1895 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1909 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1896 new ReadableFakeWebSocketStream); | 1910 new ReadableFakeWebSocketStream); |
| 1897 static const InitFrame frames[] = { | 1911 static const InitFrame frames[] = { |
| 1898 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, ""}}; | 1912 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, ""}}; |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2327 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 2341 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 2328 new ReadableFakeWebSocketStream); | 2342 new ReadableFakeWebSocketStream); |
| 2329 static const InitFrame frames[] = { | 2343 static const InitFrame frames[] = { |
| 2330 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; | 2344 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; |
| 2331 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2345 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2332 set_stream(std::move(stream)); | 2346 set_stream(std::move(stream)); |
| 2333 { | 2347 { |
| 2334 InSequence s; | 2348 InSequence s; |
| 2335 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2349 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2336 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2350 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2351 EXPECT_CALL(*event_interface_, | |
| 2352 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, | |
| 2353 AsVector("FO"))); | |
| 2337 EXPECT_CALL( | 2354 EXPECT_CALL( |
| 2338 *event_interface_, | 2355 *event_interface_, |
| 2339 OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO"))); | 2356 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 2357 AsVector("U"))); | |
| 2340 EXPECT_CALL( | 2358 EXPECT_CALL( |
| 2341 *event_interface_, | 2359 *event_interface_, |
| 2342 OnDataFrame( | 2360 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 2343 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("U"))); | 2361 AsVector("R"))); |
| 2344 EXPECT_CALL( | |
| 2345 *event_interface_, | |
| 2346 OnDataFrame( | |
| 2347 true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("R"))); | |
| 2348 } | 2362 } |
| 2349 | 2363 |
| 2350 CreateChannelAndConnectWithQuota(2); | 2364 CreateChannelAndConnectWithQuota(2); |
| 2351 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); | 2365 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); |
| 2352 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); | 2366 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); |
| 2353 } | 2367 } |
| 2354 | 2368 |
| 2355 // The code path for async messages is slightly different, so test it | 2369 // The code path for async messages is slightly different, so test it |
| 2356 // separately. | 2370 // separately. |
| 2357 TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitAsync) { | 2371 TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitAsync) { |
| 2358 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 2372 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 2359 new ReadableFakeWebSocketStream); | 2373 new ReadableFakeWebSocketStream); |
| 2360 static const InitFrame frames[] = { | 2374 static const InitFrame frames[] = { |
| 2361 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; | 2375 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; |
| 2362 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 2376 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 2363 set_stream(std::move(stream)); | 2377 set_stream(std::move(stream)); |
| 2364 Checkpoint checkpoint; | 2378 Checkpoint checkpoint; |
| 2365 { | 2379 { |
| 2366 InSequence s; | 2380 InSequence s; |
| 2367 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2381 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2368 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2382 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2369 EXPECT_CALL(checkpoint, Call(1)); | 2383 EXPECT_CALL(checkpoint, Call(1)); |
| 2370 EXPECT_CALL( | 2384 EXPECT_CALL(*event_interface_, |
| 2371 *event_interface_, | 2385 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| 2372 OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO"))); | 2386 AsVector("FO"))); |
| 2373 EXPECT_CALL(checkpoint, Call(2)); | 2387 EXPECT_CALL(checkpoint, Call(2)); |
| 2374 EXPECT_CALL( | 2388 EXPECT_CALL( |
| 2375 *event_interface_, | 2389 *event_interface_, |
| 2376 OnDataFrame( | 2390 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 2377 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("U"))); | 2391 AsVector("U"))); |
| 2378 EXPECT_CALL(checkpoint, Call(3)); | 2392 EXPECT_CALL(checkpoint, Call(3)); |
| 2379 EXPECT_CALL( | 2393 EXPECT_CALL( |
| 2380 *event_interface_, | 2394 *event_interface_, |
| 2381 OnDataFrame( | 2395 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 2382 true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("R"))); | 2396 AsVector("R"))); |
| 2383 } | 2397 } |
| 2384 | 2398 |
| 2385 CreateChannelAndConnectWithQuota(2); | 2399 CreateChannelAndConnectWithQuota(2); |
| 2386 checkpoint.Call(1); | 2400 checkpoint.Call(1); |
| 2387 base::RunLoop().RunUntilIdle(); | 2401 base::RunLoop().RunUntilIdle(); |
| 2388 checkpoint.Call(2); | 2402 checkpoint.Call(2); |
| 2389 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); | 2403 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); |
| 2390 checkpoint.Call(3); | 2404 checkpoint.Call(3); |
| 2391 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); | 2405 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); |
| 2392 } | 2406 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 2406 NOT_MASKED, "SECOND FRAME IS 26 BYTES. "}, | 2420 NOT_MASKED, "SECOND FRAME IS 26 BYTES. "}, |
| 2407 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 2421 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 2408 NOT_MASKED, "FINAL FRAME IS 24 BYTES."}}; | 2422 NOT_MASKED, "FINAL FRAME IS 24 BYTES."}}; |
| 2409 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2423 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2410 set_stream(std::move(stream)); | 2424 set_stream(std::move(stream)); |
| 2411 { | 2425 { |
| 2412 InSequence s; | 2426 InSequence s; |
| 2413 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2427 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2414 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2428 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2415 EXPECT_CALL(*event_interface_, | 2429 EXPECT_CALL(*event_interface_, |
| 2416 OnDataFrame(false, | 2430 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| 2417 WebSocketFrameHeader::kOpCodeText, | 2431 AsVector("FIRST FRAME IS"))); |
| 2418 AsVector("FIRST FRAME IS"))); | 2432 EXPECT_CALL( |
| 2419 EXPECT_CALL(*event_interface_, | 2433 *event_interface_, |
| 2420 OnDataFrame(false, | 2434 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 2421 WebSocketFrameHeader::kOpCodeContinuation, | 2435 AsVector(" 25 BYTES. "))); |
| 2422 AsVector(" 25 BYTES. "))); | 2436 EXPECT_CALL( |
| 2423 EXPECT_CALL(*event_interface_, | 2437 *event_interface_, |
| 2424 OnDataFrame(false, | 2438 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 2425 WebSocketFrameHeader::kOpCodeContinuation, | 2439 AsVector("SECOND FRAME IS 26 BYTES. "))); |
| 2426 AsVector("SECOND FRAME IS 26 BYTES. "))); | 2440 EXPECT_CALL( |
| 2427 EXPECT_CALL(*event_interface_, | 2441 *event_interface_, |
| 2428 OnDataFrame(false, | 2442 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 2429 WebSocketFrameHeader::kOpCodeContinuation, | 2443 AsVector("FINAL "))); |
| 2430 AsVector("FINAL "))); | 2444 EXPECT_CALL( |
| 2431 EXPECT_CALL(*event_interface_, | 2445 *event_interface_, |
| 2432 OnDataFrame(true, | 2446 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 2433 WebSocketFrameHeader::kOpCodeContinuation, | 2447 AsVector("FRAME IS 24 BYTES."))); |
| 2434 AsVector("FRAME IS 24 BYTES."))); | |
| 2435 } | 2448 } |
| 2436 CreateChannelAndConnectWithQuota(14); | 2449 CreateChannelAndConnectWithQuota(14); |
| 2437 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(43)); | 2450 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(43)); |
| 2438 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(32)); | 2451 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(32)); |
| 2439 } | 2452 } |
| 2440 | 2453 |
| 2441 // An empty message handled when we are out of quota must not be delivered | 2454 // An empty message handled when we are out of quota must not be delivered |
| 2442 // out-of-order with respect to other messages. | 2455 // out-of-order with respect to other messages. |
| 2443 TEST_F(WebSocketChannelFlowControlTest, EmptyMessageNoQuota) { | 2456 TEST_F(WebSocketChannelFlowControlTest, EmptyMessageNoQuota) { |
| 2444 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 2457 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 2445 new ReadableFakeWebSocketStream); | 2458 new ReadableFakeWebSocketStream); |
| 2446 static const InitFrame frames[] = { | 2459 static const InitFrame frames[] = { |
| 2447 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, | 2460 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, |
| 2448 "FIRST MESSAGE"}, | 2461 "FIRST MESSAGE"}, |
| 2449 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, nullptr}, | 2462 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, nullptr}, |
| 2450 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, | 2463 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, |
| 2451 "THIRD MESSAGE"}}; | 2464 "THIRD MESSAGE"}}; |
| 2452 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2465 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2453 set_stream(std::move(stream)); | 2466 set_stream(std::move(stream)); |
| 2454 { | 2467 { |
| 2455 InSequence s; | 2468 InSequence s; |
| 2456 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2469 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2457 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2470 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2458 EXPECT_CALL(*event_interface_, | 2471 EXPECT_CALL(*event_interface_, |
| 2459 OnDataFrame(false, | 2472 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| 2460 WebSocketFrameHeader::kOpCodeText, | 2473 AsVector("FIRST "))); |
| 2461 AsVector("FIRST "))); | 2474 EXPECT_CALL( |
| 2475 *event_interface_, | |
| 2476 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, | |
| 2477 AsVector("MESSAGE"))); | |
| 2462 EXPECT_CALL(*event_interface_, | 2478 EXPECT_CALL(*event_interface_, |
| 2463 OnDataFrame(true, | 2479 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| 2464 WebSocketFrameHeader::kOpCodeContinuation, | 2480 AsVector(""))); |
| 2465 AsVector("MESSAGE"))); | |
| 2466 EXPECT_CALL(*event_interface_, | 2481 EXPECT_CALL(*event_interface_, |
| 2467 OnDataFrame(true, | 2482 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| 2468 WebSocketFrameHeader::kOpCodeText, | 2483 AsVector("THIRD MESSAGE"))); |
| 2469 AsVector(""))); | |
| 2470 EXPECT_CALL(*event_interface_, | |
| 2471 OnDataFrame(true, | |
| 2472 WebSocketFrameHeader::kOpCodeText, | |
| 2473 AsVector("THIRD MESSAGE"))); | |
| 2474 } | 2484 } |
| 2475 | 2485 |
| 2476 CreateChannelAndConnectWithQuota(6); | 2486 CreateChannelAndConnectWithQuota(6); |
| 2477 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(128)); | 2487 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(128)); |
| 2478 } | 2488 } |
| 2479 | 2489 |
| 2480 // A close frame should not overtake data frames. | 2490 // A close frame should not overtake data frames. |
| 2481 TEST_F(WebSocketChannelFlowControlTest, CloseFrameShouldNotOvertakeDataFrames) { | 2491 TEST_F(WebSocketChannelFlowControlTest, CloseFrameShouldNotOvertakeDataFrames) { |
| 2482 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 2492 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 2483 new ReadableFakeWebSocketStream); | 2493 new ReadableFakeWebSocketStream); |
| 2484 static const InitFrame frames[] = { | 2494 static const InitFrame frames[] = { |
| 2485 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, | 2495 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, |
| 2486 "FIRST "}, | 2496 "FIRST "}, |
| 2487 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, NOT_MASKED, | 2497 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, NOT_MASKED, |
| 2488 "MESSAGE"}, | 2498 "MESSAGE"}, |
| 2489 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, | 2499 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, |
| 2490 "SECOND "}, | 2500 "SECOND "}, |
| 2491 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, | 2501 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, |
| 2492 CLOSE_DATA(NORMAL_CLOSURE, "GOOD BYE")}, | 2502 CLOSE_DATA(NORMAL_CLOSURE, "GOOD BYE")}, |
| 2493 }; | 2503 }; |
| 2494 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2504 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2495 set_stream(std::move(stream)); | 2505 set_stream(std::move(stream)); |
| 2496 Checkpoint checkpoint; | 2506 Checkpoint checkpoint; |
| 2497 InSequence s; | 2507 InSequence s; |
| 2498 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2508 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2499 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2509 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2500 EXPECT_CALL(*event_interface_, | 2510 EXPECT_CALL(*event_interface_, |
| 2501 OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, | 2511 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| 2502 AsVector("FIRST "))); | 2512 AsVector("FIRST "))); |
| 2503 EXPECT_CALL(checkpoint, Call(1)); | 2513 EXPECT_CALL(checkpoint, Call(1)); |
| 2504 EXPECT_CALL(*event_interface_, | 2514 EXPECT_CALL( |
| 2505 OnDataFrame(false, WebSocketFrameHeader::kOpCodeContinuation, | 2515 *event_interface_, |
| 2506 AsVector("MESSAG"))); | 2516 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 2517 AsVector("MESSAG"))); | |
| 2507 EXPECT_CALL(checkpoint, Call(2)); | 2518 EXPECT_CALL(checkpoint, Call(2)); |
| 2508 EXPECT_CALL(*event_interface_, | 2519 EXPECT_CALL(*event_interface_, |
| 2509 OnDataFrame(true, WebSocketFrameHeader::kOpCodeContinuation, | 2520 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 2510 AsVector("E"))); | 2521 AsVector("E"))); |
| 2522 EXPECT_CALL(*event_interface_, | |
| 2523 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, | |
| 2524 AsVector("SECON"))); | |
| 2525 EXPECT_CALL(checkpoint, Call(3)); | |
| 2511 EXPECT_CALL( | 2526 EXPECT_CALL( |
| 2512 *event_interface_, | 2527 *event_interface_, |
| 2513 OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("SECON"))); | 2528 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 2514 EXPECT_CALL(checkpoint, Call(3)); | 2529 AsVector("D "))); |
| 2515 EXPECT_CALL(*event_interface_, | |
| 2516 OnDataFrame(false, WebSocketFrameHeader::kOpCodeContinuation, | |
| 2517 AsVector("D "))); | |
| 2518 EXPECT_CALL(*event_interface_, OnClosingHandshake()); | 2530 EXPECT_CALL(*event_interface_, OnClosingHandshake()); |
| 2519 EXPECT_CALL(checkpoint, Call(4)); | 2531 EXPECT_CALL(checkpoint, Call(4)); |
| 2520 | 2532 |
| 2521 CreateChannelAndConnectWithQuota(6); | 2533 CreateChannelAndConnectWithQuota(6); |
| 2522 checkpoint.Call(1); | 2534 checkpoint.Call(1); |
| 2523 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(6)); | 2535 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(6)); |
| 2524 checkpoint.Call(2); | 2536 checkpoint.Call(2); |
| 2525 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(6)); | 2537 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(6)); |
| 2526 checkpoint.Call(3); | 2538 checkpoint.Call(3); |
| 2527 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(6)); | 2539 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(6)); |
| 2528 checkpoint.Call(4); | 2540 checkpoint.Call(4); |
| 2529 } | 2541 } |
| 2530 | 2542 |
| 2531 // RFC6455 5.1 "a client MUST mask all frames that it sends to the server". | 2543 // RFC6455 5.1 "a client MUST mask all frames that it sends to the server". |
| 2532 // WebSocketChannel actually only sets the mask bit in the header, it doesn't | 2544 // WebSocketChannel actually only sets the mask bit in the header, it doesn't |
| 2533 // perform masking itself (not all transports actually use masking). | 2545 // perform masking itself (not all transports actually use masking). |
| 2534 TEST_F(WebSocketChannelStreamTest, SentFramesAreMasked) { | 2546 TEST_F(WebSocketChannelStreamTest, SentFramesAreMasked) { |
| 2535 static const InitFrame expected[] = { | 2547 static const InitFrame expected[] = { |
| 2536 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, | 2548 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, |
| 2537 MASKED, "NEEDS MASKING"}}; | 2549 MASKED, "NEEDS MASKING"}}; |
| 2538 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2550 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2539 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2551 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2540 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); | 2552 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); |
| 2541 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected), _)) | 2553 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected), _)) |
| 2542 .WillOnce(Return(OK)); | 2554 .WillOnce(Return(OK)); |
| 2543 | 2555 |
| 2544 CreateChannelAndConnectSuccessfully(); | 2556 CreateChannelAndConnectSuccessfully(); |
| 2545 channel_->SendFrame( | 2557 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 2546 true, WebSocketFrameHeader::kOpCodeText, AsVector("NEEDS MASKING")); | 2558 AsIOBuffer("NEEDS MASKING"), 13U); |
| 2547 } | 2559 } |
| 2548 | 2560 |
| 2549 // RFC6455 5.5.1 "The application MUST NOT send any more data frames after | 2561 // RFC6455 5.5.1 "The application MUST NOT send any more data frames after |
| 2550 // sending a Close frame." | 2562 // sending a Close frame." |
| 2551 TEST_F(WebSocketChannelStreamTest, NothingIsSentAfterClose) { | 2563 TEST_F(WebSocketChannelStreamTest, NothingIsSentAfterClose) { |
| 2552 static const InitFrame expected[] = { | 2564 static const InitFrame expected[] = { |
| 2553 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 2565 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 2554 MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; | 2566 MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; |
| 2555 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2567 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2556 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2568 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2557 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); | 2569 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); |
| 2558 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected), _)) | 2570 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected), _)) |
| 2559 .WillOnce(Return(OK)); | 2571 .WillOnce(Return(OK)); |
| 2560 | 2572 |
| 2561 CreateChannelAndConnectSuccessfully(); | 2573 CreateChannelAndConnectSuccessfully(); |
| 2562 ASSERT_EQ(CHANNEL_ALIVE, channel_->StartClosingHandshake(1000, "Success")); | 2574 ASSERT_EQ(CHANNEL_ALIVE, channel_->StartClosingHandshake(1000, "Success")); |
| 2563 channel_->SendFrame( | 2575 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 2564 true, WebSocketFrameHeader::kOpCodeText, AsVector("SHOULD BE IGNORED")); | 2576 AsIOBuffer("SHOULD BE IGNORED"), 18U); |
| 2565 } | 2577 } |
| 2566 | 2578 |
| 2567 // RFC6455 5.5.1 "If an endpoint receives a Close frame and did not previously | 2579 // RFC6455 5.5.1 "If an endpoint receives a Close frame and did not previously |
| 2568 // send a Close frame, the endpoint MUST send a Close frame in response." | 2580 // send a Close frame, the endpoint MUST send a Close frame in response." |
| 2569 TEST_F(WebSocketChannelStreamTest, CloseIsEchoedBack) { | 2581 TEST_F(WebSocketChannelStreamTest, CloseIsEchoedBack) { |
| 2570 static const InitFrame frames[] = { | 2582 static const InitFrame frames[] = { |
| 2571 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 2583 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 2572 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Close")}}; | 2584 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Close")}}; |
| 2573 static const InitFrame expected[] = { | 2585 static const InitFrame expected[] = { |
| 2574 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 2586 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2795 | 2807 |
| 2796 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected1), _)) | 2808 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected1), _)) |
| 2797 .WillOnce(Return(OK)); | 2809 .WillOnce(Return(OK)); |
| 2798 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected2), _)) | 2810 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected2), _)) |
| 2799 .WillOnce(Return(OK)); | 2811 .WillOnce(Return(OK)); |
| 2800 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected3), _)) | 2812 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected3), _)) |
| 2801 .WillOnce(Return(OK)); | 2813 .WillOnce(Return(OK)); |
| 2802 } | 2814 } |
| 2803 | 2815 |
| 2804 CreateChannelAndConnectSuccessfully(); | 2816 CreateChannelAndConnectSuccessfully(); |
| 2805 channel_->SendFrame( | 2817 channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| 2806 false, WebSocketFrameHeader::kOpCodeText, AsVector("Hello ")); | 2818 AsIOBuffer("Hello "), 6U); |
| 2807 *read_frames = CreateFrameVector(frames); | 2819 *read_frames = CreateFrameVector(frames); |
| 2808 read_callback.Run(OK); | 2820 read_callback.Run(OK); |
| 2809 channel_->SendFrame( | 2821 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 2810 true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("World")); | 2822 AsIOBuffer("World"), 5U); |
| 2811 } | 2823 } |
| 2812 | 2824 |
| 2813 // WriteFrames() may not be called until the previous write has completed. | 2825 // WriteFrames() may not be called until the previous write has completed. |
| 2814 // WebSocketChannel must buffer writes that happen in the meantime. | 2826 // WebSocketChannel must buffer writes that happen in the meantime. |
| 2815 TEST_F(WebSocketChannelStreamTest, WriteFramesOneAtATime) { | 2827 TEST_F(WebSocketChannelStreamTest, WriteFramesOneAtATime) { |
| 2816 static const InitFrame expected1[] = { | 2828 static const InitFrame expected1[] = { |
| 2817 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "Hello "}}; | 2829 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "Hello "}}; |
| 2818 static const InitFrame expected2[] = { | 2830 static const InitFrame expected2[] = { |
| 2819 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "World"}}; | 2831 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "World"}}; |
| 2820 CompletionCallback write_callback; | 2832 CompletionCallback write_callback; |
| 2821 Checkpoint checkpoint; | 2833 Checkpoint checkpoint; |
| 2822 | 2834 |
| 2823 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2835 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2824 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2836 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2825 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); | 2837 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); |
| 2826 { | 2838 { |
| 2827 InSequence s; | 2839 InSequence s; |
| 2828 EXPECT_CALL(checkpoint, Call(1)); | 2840 EXPECT_CALL(checkpoint, Call(1)); |
| 2829 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected1), _)) | 2841 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected1), _)) |
| 2830 .WillOnce(DoAll(SaveArg<1>(&write_callback), Return(ERR_IO_PENDING))); | 2842 .WillOnce(DoAll(SaveArg<1>(&write_callback), Return(ERR_IO_PENDING))); |
| 2831 EXPECT_CALL(checkpoint, Call(2)); | 2843 EXPECT_CALL(checkpoint, Call(2)); |
| 2832 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected2), _)) | 2844 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected2), _)) |
| 2833 .WillOnce(Return(ERR_IO_PENDING)); | 2845 .WillOnce(Return(ERR_IO_PENDING)); |
| 2834 EXPECT_CALL(checkpoint, Call(3)); | 2846 EXPECT_CALL(checkpoint, Call(3)); |
| 2835 } | 2847 } |
| 2836 | 2848 |
| 2837 CreateChannelAndConnectSuccessfully(); | 2849 CreateChannelAndConnectSuccessfully(); |
| 2838 checkpoint.Call(1); | 2850 checkpoint.Call(1); |
| 2839 channel_->SendFrame( | 2851 channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| 2840 false, WebSocketFrameHeader::kOpCodeText, AsVector("Hello ")); | 2852 AsIOBuffer("Hello "), 6U); |
| 2841 channel_->SendFrame( | 2853 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 2842 true, WebSocketFrameHeader::kOpCodeText, AsVector("World")); | 2854 AsIOBuffer("World"), 5U); |
| 2843 checkpoint.Call(2); | 2855 checkpoint.Call(2); |
| 2844 write_callback.Run(OK); | 2856 write_callback.Run(OK); |
| 2845 checkpoint.Call(3); | 2857 checkpoint.Call(3); |
| 2846 } | 2858 } |
| 2847 | 2859 |
| 2848 // WebSocketChannel must buffer frames while it is waiting for a write to | 2860 // WebSocketChannel must buffer frames while it is waiting for a write to |
| 2849 // complete, and then send them in a single batch. The batching behaviour is | 2861 // complete, and then send them in a single batch. The batching behaviour is |
| 2850 // important to get good throughput in the "many small messages" case. | 2862 // important to get good throughput in the "many small messages" case. |
| 2851 TEST_F(WebSocketChannelStreamTest, WaitingMessagesAreBatched) { | 2863 TEST_F(WebSocketChannelStreamTest, WaitingMessagesAreBatched) { |
| 2852 static const char input_letters[] = "Hello"; | 2864 static const char input_letters[] = "Hello"; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 2865 { | 2877 { |
| 2866 InSequence s; | 2878 InSequence s; |
| 2867 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected1), _)) | 2879 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected1), _)) |
| 2868 .WillOnce(DoAll(SaveArg<1>(&write_callback), Return(ERR_IO_PENDING))); | 2880 .WillOnce(DoAll(SaveArg<1>(&write_callback), Return(ERR_IO_PENDING))); |
| 2869 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected2), _)) | 2881 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected2), _)) |
| 2870 .WillOnce(Return(ERR_IO_PENDING)); | 2882 .WillOnce(Return(ERR_IO_PENDING)); |
| 2871 } | 2883 } |
| 2872 | 2884 |
| 2873 CreateChannelAndConnectSuccessfully(); | 2885 CreateChannelAndConnectSuccessfully(); |
| 2874 for (size_t i = 0; i < strlen(input_letters); ++i) { | 2886 for (size_t i = 0; i < strlen(input_letters); ++i) { |
| 2875 channel_->SendFrame(true, | 2887 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 2876 WebSocketFrameHeader::kOpCodeText, | 2888 AsIOBuffer(std::string(1, input_letters[i])), 1U); |
| 2877 std::vector<char>(1, input_letters[i])); | |
| 2878 } | 2889 } |
| 2879 write_callback.Run(OK); | 2890 write_callback.Run(OK); |
| 2880 } | 2891 } |
| 2881 | 2892 |
| 2882 // When the renderer sends more on a channel than it has quota for, we send the | 2893 // When the renderer sends more on a channel than it has quota for, we send the |
| 2883 // remote server a kWebSocketErrorGoingAway error code. | 2894 // remote server a kWebSocketErrorGoingAway error code. |
| 2884 TEST_F(WebSocketChannelStreamTest, SendGoingAwayOnRendererQuotaExceeded) { | 2895 TEST_F(WebSocketChannelStreamTest, SendGoingAwayOnRendererQuotaExceeded) { |
| 2885 static const InitFrame expected[] = { | 2896 static const InitFrame expected[] = { |
| 2886 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 2897 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 2887 MASKED, CLOSE_DATA(GOING_AWAY, "")}}; | 2898 MASKED, CLOSE_DATA(GOING_AWAY, "")}}; |
| 2888 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2899 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2889 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2900 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2890 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); | 2901 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); |
| 2891 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected), _)) | 2902 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected), _)) |
| 2892 .WillOnce(Return(OK)); | 2903 .WillOnce(Return(OK)); |
| 2893 EXPECT_CALL(*mock_stream_, Close()); | 2904 EXPECT_CALL(*mock_stream_, Close()); |
| 2894 | 2905 |
| 2895 CreateChannelAndConnectSuccessfully(); | 2906 CreateChannelAndConnectSuccessfully(); |
| 2896 channel_->SendFrame(true, | 2907 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 2897 WebSocketFrameHeader::kOpCodeText, | 2908 AsIOBuffer(std::string(kDefaultInitialQuota + 1, 'C')), |
| 2898 std::vector<char>(kDefaultInitialQuota + 1, 'C')); | 2909 kDefaultInitialQuota + 1); |
| 2899 } | 2910 } |
| 2900 | 2911 |
| 2901 // For convenience, most of these tests use Text frames. However, the WebSocket | 2912 // For convenience, most of these tests use Text frames. However, the WebSocket |
| 2902 // protocol also has Binary frames and those need to be 8-bit clean. For the | 2913 // protocol also has Binary frames and those need to be 8-bit clean. For the |
| 2903 // sake of completeness, this test verifies that they are. | 2914 // sake of completeness, this test verifies that they are. |
| 2904 TEST_F(WebSocketChannelStreamTest, WrittenBinaryFramesAre8BitClean) { | 2915 TEST_F(WebSocketChannelStreamTest, WrittenBinaryFramesAre8BitClean) { |
| 2905 std::vector<std::unique_ptr<WebSocketFrame>>* frames = nullptr; | 2916 std::vector<std::unique_ptr<WebSocketFrame>>* frames = nullptr; |
| 2906 | 2917 |
| 2907 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2918 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2908 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2919 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2909 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); | 2920 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)).WillOnce(Return(ERR_IO_PENDING)); |
| 2910 EXPECT_CALL(*mock_stream_, WriteFrames(_, _)) | 2921 EXPECT_CALL(*mock_stream_, WriteFrames(_, _)) |
| 2911 .WillOnce(DoAll(SaveArg<0>(&frames), Return(ERR_IO_PENDING))); | 2922 .WillOnce(DoAll(SaveArg<0>(&frames), Return(ERR_IO_PENDING))); |
| 2912 | 2923 |
| 2913 CreateChannelAndConnectSuccessfully(); | 2924 CreateChannelAndConnectSuccessfully(); |
| 2914 channel_->SendFrame( | 2925 channel_->SendFrame( |
| 2915 true, | 2926 true, WebSocketFrameHeader::kOpCodeBinary, |
| 2916 WebSocketFrameHeader::kOpCodeBinary, | 2927 AsIOBuffer(std::string(kBinaryBlob, kBinaryBlob + kBinaryBlobSize)), |
| 2917 std::vector<char>(kBinaryBlob, kBinaryBlob + kBinaryBlobSize)); | 2928 kBinaryBlobSize); |
| 2918 ASSERT_TRUE(frames != nullptr); | 2929 ASSERT_TRUE(frames != nullptr); |
| 2919 ASSERT_EQ(1U, frames->size()); | 2930 ASSERT_EQ(1U, frames->size()); |
| 2920 const WebSocketFrame* out_frame = (*frames)[0].get(); | 2931 const WebSocketFrame* out_frame = (*frames)[0].get(); |
| 2921 EXPECT_EQ(kBinaryBlobSize, out_frame->header.payload_length); | 2932 EXPECT_EQ(kBinaryBlobSize, out_frame->header.payload_length); |
| 2922 ASSERT_TRUE(out_frame->data.get()); | 2933 ASSERT_TRUE(out_frame->data.get()); |
| 2923 EXPECT_EQ(0, memcmp(kBinaryBlob, out_frame->data->data(), kBinaryBlobSize)); | 2934 EXPECT_EQ(0, memcmp(kBinaryBlob, out_frame->data->data(), kBinaryBlobSize)); |
| 2924 } | 2935 } |
| 2925 | 2936 |
| 2926 // Test the read path for 8-bit cleanliness as well. | 2937 // Test the read path for 8-bit cleanliness as well. |
| 2927 TEST_F(WebSocketChannelEventInterfaceTest, ReadBinaryFramesAre8BitClean) { | 2938 TEST_F(WebSocketChannelEventInterfaceTest, ReadBinaryFramesAre8BitClean) { |
| 2928 std::unique_ptr<WebSocketFrame> frame( | 2939 std::unique_ptr<WebSocketFrame> frame( |
| 2929 new WebSocketFrame(WebSocketFrameHeader::kOpCodeBinary)); | 2940 new WebSocketFrame(WebSocketFrameHeader::kOpCodeBinary)); |
| 2930 WebSocketFrameHeader& frame_header = frame->header; | 2941 WebSocketFrameHeader& frame_header = frame->header; |
| 2931 frame_header.final = true; | 2942 frame_header.final = true; |
| 2932 frame_header.payload_length = kBinaryBlobSize; | 2943 frame_header.payload_length = kBinaryBlobSize; |
| 2933 frame->data = new IOBuffer(kBinaryBlobSize); | 2944 frame->data = new IOBuffer(kBinaryBlobSize); |
| 2934 memcpy(frame->data->data(), kBinaryBlob, kBinaryBlobSize); | 2945 memcpy(frame->data->data(), kBinaryBlob, kBinaryBlobSize); |
| 2935 std::vector<std::unique_ptr<WebSocketFrame>> frames; | 2946 std::vector<std::unique_ptr<WebSocketFrame>> frames; |
| 2936 frames.push_back(std::move(frame)); | 2947 frames.push_back(std::move(frame)); |
| 2937 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 2948 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 2938 new ReadableFakeWebSocketStream); | 2949 new ReadableFakeWebSocketStream); |
| 2939 stream->PrepareRawReadFrames(ReadableFakeWebSocketStream::SYNC, OK, | 2950 stream->PrepareRawReadFrames(ReadableFakeWebSocketStream::SYNC, OK, |
| 2940 std::move(frames)); | 2951 std::move(frames)); |
| 2941 set_stream(std::move(stream)); | 2952 set_stream(std::move(stream)); |
| 2942 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2953 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2943 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2954 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2944 EXPECT_CALL(*event_interface_, | 2955 EXPECT_CALL( |
| 2945 OnDataFrame(true, | 2956 *event_interface_, |
| 2946 WebSocketFrameHeader::kOpCodeBinary, | 2957 OnDataFrameVector( |
| 2947 std::vector<char>(kBinaryBlob, | 2958 true, WebSocketFrameHeader::kOpCodeBinary, |
| 2948 kBinaryBlob + kBinaryBlobSize))); | 2959 std::vector<char>(kBinaryBlob, kBinaryBlob + kBinaryBlobSize))); |
| 2949 | 2960 |
| 2950 CreateChannelAndConnectSuccessfully(); | 2961 CreateChannelAndConnectSuccessfully(); |
| 2951 } | 2962 } |
| 2952 | 2963 |
| 2953 // Invalid UTF-8 is not permitted in Text frames. | 2964 // Invalid UTF-8 is not permitted in Text frames. |
| 2954 TEST_F(WebSocketChannelSendUtf8Test, InvalidUtf8Rejected) { | 2965 TEST_F(WebSocketChannelSendUtf8Test, InvalidUtf8Rejected) { |
| 2955 EXPECT_CALL( | 2966 EXPECT_CALL( |
| 2956 *event_interface_, | 2967 *event_interface_, |
| 2957 OnFailChannel("Browser sent a text frame containing invalid UTF-8")); | 2968 OnFailChannel("Browser sent a text frame containing invalid UTF-8")); |
| 2958 | 2969 |
| 2959 CreateChannelAndConnectSuccessfully(); | 2970 CreateChannelAndConnectSuccessfully(); |
| 2960 | 2971 |
| 2961 channel_->SendFrame( | 2972 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 2962 true, WebSocketFrameHeader::kOpCodeText, AsVector("\xff")); | 2973 AsIOBuffer("\xff"), 1U); |
| 2963 } | 2974 } |
| 2964 | 2975 |
| 2965 // A Text message cannot end with a partial UTF-8 character. | 2976 // A Text message cannot end with a partial UTF-8 character. |
| 2966 TEST_F(WebSocketChannelSendUtf8Test, IncompleteCharacterInFinalFrame) { | 2977 TEST_F(WebSocketChannelSendUtf8Test, IncompleteCharacterInFinalFrame) { |
| 2967 EXPECT_CALL( | 2978 EXPECT_CALL( |
| 2968 *event_interface_, | 2979 *event_interface_, |
| 2969 OnFailChannel("Browser sent a text frame containing invalid UTF-8")); | 2980 OnFailChannel("Browser sent a text frame containing invalid UTF-8")); |
| 2970 | 2981 |
| 2971 CreateChannelAndConnectSuccessfully(); | 2982 CreateChannelAndConnectSuccessfully(); |
| 2972 | 2983 |
| 2973 channel_->SendFrame( | 2984 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 2974 true, WebSocketFrameHeader::kOpCodeText, AsVector("\xc2")); | 2985 AsIOBuffer("\xc2"), 1U); |
| 2975 } | 2986 } |
| 2976 | 2987 |
| 2977 // A non-final Text frame may end with a partial UTF-8 character (compare to | 2988 // A non-final Text frame may end with a partial UTF-8 character (compare to |
| 2978 // previous test). | 2989 // previous test). |
| 2979 TEST_F(WebSocketChannelSendUtf8Test, IncompleteCharacterInNonFinalFrame) { | 2990 TEST_F(WebSocketChannelSendUtf8Test, IncompleteCharacterInNonFinalFrame) { |
| 2980 CreateChannelAndConnectSuccessfully(); | 2991 CreateChannelAndConnectSuccessfully(); |
| 2981 | 2992 |
| 2982 channel_->SendFrame( | 2993 channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| 2983 false, WebSocketFrameHeader::kOpCodeText, AsVector("\xc2")); | 2994 AsIOBuffer("\xc2"), 1U); |
| 2984 } | 2995 } |
| 2985 | 2996 |
| 2986 // UTF-8 parsing context must be retained between frames. | 2997 // UTF-8 parsing context must be retained between frames. |
| 2987 TEST_F(WebSocketChannelSendUtf8Test, ValidCharacterSplitBetweenFrames) { | 2998 TEST_F(WebSocketChannelSendUtf8Test, ValidCharacterSplitBetweenFrames) { |
| 2988 CreateChannelAndConnectSuccessfully(); | 2999 CreateChannelAndConnectSuccessfully(); |
| 2989 | 3000 |
| 2990 channel_->SendFrame( | 3001 channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| 2991 false, WebSocketFrameHeader::kOpCodeText, AsVector("\xf1")); | 3002 AsIOBuffer("\xf1"), 1U); |
| 2992 channel_->SendFrame(true, | 3003 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 2993 WebSocketFrameHeader::kOpCodeContinuation, | 3004 AsIOBuffer("\x80\xa0\xbf"), 3U); |
| 2994 AsVector("\x80\xa0\xbf")); | |
| 2995 } | 3005 } |
| 2996 | 3006 |
| 2997 // Similarly, an invalid character should be detected even if split. | 3007 // Similarly, an invalid character should be detected even if split. |
| 2998 TEST_F(WebSocketChannelSendUtf8Test, InvalidCharacterSplit) { | 3008 TEST_F(WebSocketChannelSendUtf8Test, InvalidCharacterSplit) { |
| 2999 EXPECT_CALL( | 3009 EXPECT_CALL( |
| 3000 *event_interface_, | 3010 *event_interface_, |
| 3001 OnFailChannel("Browser sent a text frame containing invalid UTF-8")); | 3011 OnFailChannel("Browser sent a text frame containing invalid UTF-8")); |
| 3002 | 3012 |
| 3003 CreateChannelAndConnectSuccessfully(); | 3013 CreateChannelAndConnectSuccessfully(); |
| 3004 | 3014 |
| 3005 channel_->SendFrame( | 3015 channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| 3006 false, WebSocketFrameHeader::kOpCodeText, AsVector("\xe1")); | 3016 AsIOBuffer("\xe1"), 1U); |
| 3007 channel_->SendFrame(true, | 3017 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 3008 WebSocketFrameHeader::kOpCodeContinuation, | 3018 AsIOBuffer("\x80\xa0\xbf"), 3U); |
| 3009 AsVector("\x80\xa0\xbf")); | |
| 3010 } | 3019 } |
| 3011 | 3020 |
| 3012 // An invalid character must be detected in continuation frames. | 3021 // An invalid character must be detected in continuation frames. |
| 3013 TEST_F(WebSocketChannelSendUtf8Test, InvalidByteInContinuation) { | 3022 TEST_F(WebSocketChannelSendUtf8Test, InvalidByteInContinuation) { |
| 3014 EXPECT_CALL( | 3023 EXPECT_CALL( |
| 3015 *event_interface_, | 3024 *event_interface_, |
| 3016 OnFailChannel("Browser sent a text frame containing invalid UTF-8")); | 3025 OnFailChannel("Browser sent a text frame containing invalid UTF-8")); |
| 3017 | 3026 |
| 3018 CreateChannelAndConnectSuccessfully(); | 3027 CreateChannelAndConnectSuccessfully(); |
| 3019 | 3028 |
| 3020 channel_->SendFrame( | 3029 channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| 3021 false, WebSocketFrameHeader::kOpCodeText, AsVector("foo")); | 3030 AsIOBuffer("foo"), 3U); |
| 3022 channel_->SendFrame( | 3031 channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 3023 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("bar")); | 3032 AsIOBuffer("bar"), 3U); |
| 3024 channel_->SendFrame( | 3033 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 3025 true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("\xff")); | 3034 AsIOBuffer("\xff"), 1U); |
| 3026 } | 3035 } |
| 3027 | 3036 |
| 3028 // However, continuation frames of a Binary frame will not be tested for UTF-8 | 3037 // However, continuation frames of a Binary frame will not be tested for UTF-8 |
| 3029 // validity. | 3038 // validity. |
| 3030 TEST_F(WebSocketChannelSendUtf8Test, BinaryContinuationNotChecked) { | 3039 TEST_F(WebSocketChannelSendUtf8Test, BinaryContinuationNotChecked) { |
| 3031 CreateChannelAndConnectSuccessfully(); | 3040 CreateChannelAndConnectSuccessfully(); |
| 3032 | 3041 |
| 3033 channel_->SendFrame( | 3042 channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeBinary, |
| 3034 false, WebSocketFrameHeader::kOpCodeBinary, AsVector("foo")); | 3043 AsIOBuffer("foo"), 3U); |
| 3035 channel_->SendFrame( | 3044 channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeContinuation, |
| 3036 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("bar")); | 3045 AsIOBuffer("bar"), 3U); |
| 3037 channel_->SendFrame( | 3046 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| 3038 true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("\xff")); | 3047 AsIOBuffer("\xff"), 1U); |
| 3039 } | 3048 } |
| 3040 | 3049 |
| 3041 // Multiple text messages can be validated without the validation state getting | 3050 // Multiple text messages can be validated without the validation state getting |
| 3042 // confused. | 3051 // confused. |
| 3043 TEST_F(WebSocketChannelSendUtf8Test, ValidateMultipleTextMessages) { | 3052 TEST_F(WebSocketChannelSendUtf8Test, ValidateMultipleTextMessages) { |
| 3044 CreateChannelAndConnectSuccessfully(); | 3053 CreateChannelAndConnectSuccessfully(); |
| 3045 | 3054 |
| 3046 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("foo")); | 3055 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 3047 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("bar")); | 3056 AsIOBuffer("foo"), 3U); |
| 3057 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, | |
| 3058 AsIOBuffer("bar"), 3U); | |
| 3048 } | 3059 } |
| 3049 | 3060 |
| 3050 // UTF-8 validation is enforced on received Text frames. | 3061 // UTF-8 validation is enforced on received Text frames. |
| 3051 TEST_F(WebSocketChannelEventInterfaceTest, ReceivedInvalidUtf8) { | 3062 TEST_F(WebSocketChannelEventInterfaceTest, ReceivedInvalidUtf8) { |
| 3052 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 3063 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 3053 new ReadableFakeWebSocketStream); | 3064 new ReadableFakeWebSocketStream); |
| 3054 static const InitFrame frames[] = { | 3065 static const InitFrame frames[] = { |
| 3055 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "\xff"}}; | 3066 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "\xff"}}; |
| 3056 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 3067 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 3057 set_stream(std::move(stream)); | 3068 set_stream(std::move(stream)); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 3073 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 3084 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 3074 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 3085 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 3075 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) | 3086 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) |
| 3076 .WillRepeatedly(Return(ERR_IO_PENDING)); | 3087 .WillRepeatedly(Return(ERR_IO_PENDING)); |
| 3077 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected), _)) | 3088 EXPECT_CALL(*mock_stream_, WriteFrames(EqualsFrames(expected), _)) |
| 3078 .WillOnce(Return(OK)); | 3089 .WillOnce(Return(OK)); |
| 3079 EXPECT_CALL(*mock_stream_, Close()).Times(1); | 3090 EXPECT_CALL(*mock_stream_, Close()).Times(1); |
| 3080 | 3091 |
| 3081 CreateChannelAndConnectSuccessfully(); | 3092 CreateChannelAndConnectSuccessfully(); |
| 3082 | 3093 |
| 3083 channel_->SendFrame( | 3094 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| 3084 true, WebSocketFrameHeader::kOpCodeText, AsVector("\xff")); | 3095 AsIOBuffer("\xff"), 1U); |
| 3085 } | 3096 } |
| 3086 | 3097 |
| 3087 // The rest of the tests for receiving invalid UTF-8 test the communication with | 3098 // The rest of the tests for receiving invalid UTF-8 test the communication with |
| 3088 // the server. Since there is only one code path, it would be redundant to | 3099 // the server. Since there is only one code path, it would be redundant to |
| 3089 // perform the same tests on the EventInterface as well. | 3100 // perform the same tests on the EventInterface as well. |
| 3090 | 3101 |
| 3091 // If invalid UTF-8 is received in a Text frame, the connection is failed. | 3102 // If invalid UTF-8 is received in a Text frame, the connection is failed. |
| 3092 TEST_F(WebSocketChannelReceiveUtf8Test, InvalidTextFrameRejected) { | 3103 TEST_F(WebSocketChannelReceiveUtf8Test, InvalidTextFrameRejected) { |
| 3093 static const InitFrame frames[] = { | 3104 static const InitFrame frames[] = { |
| 3094 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "\xff"}}; | 3105 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "\xff"}}; |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3243 static const InitFrame frames[] = { | 3254 static const InitFrame frames[] = { |
| 3244 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeBinary, | 3255 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeBinary, |
| 3245 NOT_MASKED, "frame1"}, | 3256 NOT_MASKED, "frame1"}, |
| 3246 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, | 3257 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, |
| 3247 NOT_MASKED, "frame2"}}; | 3258 NOT_MASKED, "frame2"}}; |
| 3248 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 3259 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 3249 set_stream(std::move(stream)); | 3260 set_stream(std::move(stream)); |
| 3250 | 3261 |
| 3251 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 3262 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 3252 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); | 3263 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| 3253 EXPECT_CALL( | 3264 EXPECT_CALL(*event_interface_, |
| 3254 *event_interface_, | 3265 OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeBinary, |
| 3255 OnDataFrame( | 3266 AsVector("frame1"))); |
| 3256 false, WebSocketFrameHeader::kOpCodeBinary, AsVector("frame1"))); | |
| 3257 EXPECT_CALL( | 3267 EXPECT_CALL( |
| 3258 *event_interface_, | 3268 *event_interface_, |
| 3259 OnFailChannel( | 3269 OnFailChannel( |
| 3260 "Received start of new message but previous message is unfinished.")); | 3270 "Received start of new message but previous message is unfinished.")); |
| 3261 | 3271 |
| 3262 CreateChannelAndConnectSuccessfully(); | 3272 CreateChannelAndConnectSuccessfully(); |
| 3263 } | 3273 } |
| 3264 | 3274 |
| 3265 // A new message cannot start with a Continuation frame. | 3275 // A new message cannot start with a Continuation frame. |
| 3266 TEST_F(WebSocketChannelEventInterfaceTest, MessageStartingWithContinuation) { | 3276 TEST_F(WebSocketChannelEventInterfaceTest, MessageStartingWithContinuation) { |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 3290 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 3300 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 3291 NOT_MASKED, ""}, | 3301 NOT_MASKED, ""}, |
| 3292 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, NOT_MASKED, ""}}; | 3302 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, NOT_MASKED, ""}}; |
| 3293 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 3303 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 3294 set_stream(std::move(stream)); | 3304 set_stream(std::move(stream)); |
| 3295 | 3305 |
| 3296 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 3306 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 3297 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); | 3307 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| 3298 EXPECT_CALL( | 3308 EXPECT_CALL( |
| 3299 *event_interface_, | 3309 *event_interface_, |
| 3300 OnDataFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); | 3310 OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); |
| 3301 | 3311 |
| 3302 CreateChannelAndConnectSuccessfully(); | 3312 CreateChannelAndConnectSuccessfully(); |
| 3303 } | 3313 } |
| 3304 | 3314 |
| 3305 // Calls to OnSSLCertificateError() must be passed through to the event | 3315 // Calls to OnSSLCertificateError() must be passed through to the event |
| 3306 // interface with the correct URL attached. | 3316 // interface with the correct URL attached. |
| 3307 TEST_F(WebSocketChannelEventInterfaceTest, OnSSLCertificateErrorCalled) { | 3317 TEST_F(WebSocketChannelEventInterfaceTest, OnSSLCertificateErrorCalled) { |
| 3308 const GURL wss_url("wss://example.com/sslerror"); | 3318 const GURL wss_url("wss://example.com/sslerror"); |
| 3309 connect_data_.socket_url = wss_url; | 3319 connect_data_.socket_url = wss_url; |
| 3310 const SSLInfo ssl_info; | 3320 const SSLInfo ssl_info; |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3506 TEST_F(WebSocketChannelTest, CurrentSendQuotaUpdated) { | 3516 TEST_F(WebSocketChannelTest, CurrentSendQuotaUpdated) { |
| 3507 const int kMessageSize = 5; | 3517 const int kMessageSize = 5; |
| 3508 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); | 3518 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); |
| 3509 CreateChannelAndConnectSuccessfully(); | 3519 CreateChannelAndConnectSuccessfully(); |
| 3510 | 3520 |
| 3511 int initial_send_quota = channel_->current_send_quota(); | 3521 int initial_send_quota = channel_->current_send_quota(); |
| 3512 EXPECT_GE(initial_send_quota, kMessageSize); | 3522 EXPECT_GE(initial_send_quota, kMessageSize); |
| 3513 | 3523 |
| 3514 channel_->SendFrame( | 3524 channel_->SendFrame( |
| 3515 true, WebSocketFrameHeader::kOpCodeText, | 3525 true, WebSocketFrameHeader::kOpCodeText, |
| 3516 std::vector<char>(static_cast<size_t>(kMessageSize), 'a')); | 3526 AsIOBuffer(std::string(static_cast<size_t>(kMessageSize), 'a')), |
| 3527 static_cast<size_t>(kMessageSize)); | |
| 3517 int new_send_quota = channel_->current_send_quota(); | 3528 int new_send_quota = channel_->current_send_quota(); |
| 3518 EXPECT_EQ(kMessageSize, initial_send_quota - new_send_quota); | 3529 EXPECT_EQ(kMessageSize, initial_send_quota - new_send_quota); |
| 3519 } | 3530 } |
| 3520 | 3531 |
| 3521 } // namespace | 3532 } // namespace |
| 3522 } // namespace net | 3533 } // namespace net |
| OLD | NEW |