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