| 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 |
| 11 #include <iostream> | 11 #include <iostream> |
| 12 #include <iterator> | 12 #include <iterator> |
| 13 #include <memory> | 13 #include <memory> |
| 14 #include <string> | 14 #include <string> |
| 15 #include <utility> | 15 #include <utility> |
| 16 #include <vector> | 16 #include <vector> |
| 17 | 17 |
| 18 #include "base/bind.h" | 18 #include "base/bind.h" |
| 19 #include "base/bind_helpers.h" | 19 #include "base/bind_helpers.h" |
| 20 #include "base/callback.h" | 20 #include "base/callback.h" |
| 21 #include "base/location.h" | 21 #include "base/location.h" |
| 22 #include "base/macros.h" | 22 #include "base/macros.h" |
| 23 #include "base/memory/ptr_util.h" | 23 #include "base/memory/ptr_util.h" |
| 24 #include "base/memory/weak_ptr.h" | 24 #include "base/memory/weak_ptr.h" |
| 25 #include "base/message_loop/message_loop.h" | 25 #include "base/message_loop/message_loop.h" |
| 26 #include "base/run_loop.h" |
| 26 #include "base/single_thread_task_runner.h" | 27 #include "base/single_thread_task_runner.h" |
| 27 #include "base/strings/string_piece.h" | 28 #include "base/strings/string_piece.h" |
| 28 #include "base/threading/thread_task_runner_handle.h" | 29 #include "base/threading/thread_task_runner_handle.h" |
| 29 #include "net/base/net_errors.h" | 30 #include "net/base/net_errors.h" |
| 30 #include "net/base/test_completion_callback.h" | 31 #include "net/base/test_completion_callback.h" |
| 31 #include "net/http/http_response_headers.h" | 32 #include "net/http/http_response_headers.h" |
| 32 #include "net/url_request/url_request_context.h" | 33 #include "net/url_request/url_request_context.h" |
| 33 #include "net/websockets/websocket_errors.h" | 34 #include "net/websockets/websocket_errors.h" |
| 34 #include "net/websockets/websocket_event_interface.h" | 35 #include "net/websockets/websocket_event_interface.h" |
| 35 #include "net/websockets/websocket_handshake_request_info.h" | 36 #include "net/websockets/websocket_handshake_request_info.h" |
| (...skipping 1025 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1061 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1062 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1062 new ReadableFakeWebSocketStream); | 1063 new ReadableFakeWebSocketStream); |
| 1063 static const InitFrame frames[] = { | 1064 static const InitFrame frames[] = { |
| 1064 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1065 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1065 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1066 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1066 set_stream(std::move(stream)); | 1067 set_stream(std::move(stream)); |
| 1067 deleting_ = EVENT_ON_DATA_FRAME; | 1068 deleting_ = EVENT_ON_DATA_FRAME; |
| 1068 | 1069 |
| 1069 CreateChannelAndConnectSuccessfully(); | 1070 CreateChannelAndConnectSuccessfully(); |
| 1070 EXPECT_TRUE(channel_); | 1071 EXPECT_TRUE(channel_); |
| 1071 base::MessageLoop::current()->RunUntilIdle(); | 1072 base::RunLoop().RunUntilIdle(); |
| 1072 EXPECT_EQ(nullptr, channel_.get()); | 1073 EXPECT_EQ(nullptr, channel_.get()); |
| 1073 } | 1074 } |
| 1074 | 1075 |
| 1075 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterConnect) { | 1076 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterConnect) { |
| 1076 deleting_ = EVENT_ON_FLOW_CONTROL; | 1077 deleting_ = EVENT_ON_FLOW_CONTROL; |
| 1077 | 1078 |
| 1078 CreateChannelAndConnectSuccessfully(); | 1079 CreateChannelAndConnectSuccessfully(); |
| 1079 EXPECT_EQ(nullptr, channel_.get()); | 1080 EXPECT_EQ(nullptr, channel_.get()); |
| 1080 } | 1081 } |
| 1081 | 1082 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1109 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1110 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1110 new ReadableFakeWebSocketStream); | 1111 new ReadableFakeWebSocketStream); |
| 1111 static const InitFrame frames[] = { | 1112 static const InitFrame frames[] = { |
| 1112 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 1113 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 1113 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; | 1114 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; |
| 1114 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1115 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1115 set_stream(std::move(stream)); | 1116 set_stream(std::move(stream)); |
| 1116 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; | 1117 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; |
| 1117 CreateChannelAndConnectSuccessfully(); | 1118 CreateChannelAndConnectSuccessfully(); |
| 1118 ASSERT_TRUE(channel_); | 1119 ASSERT_TRUE(channel_); |
| 1119 base::MessageLoop::current()->RunUntilIdle(); | 1120 base::RunLoop().RunUntilIdle(); |
| 1120 EXPECT_EQ(nullptr, channel_.get()); | 1121 EXPECT_EQ(nullptr, channel_.get()); |
| 1121 } | 1122 } |
| 1122 | 1123 |
| 1123 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { | 1124 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { |
| 1124 set_stream(base::WrapUnique(new UnWriteableFakeWebSocketStream)); | 1125 set_stream(base::WrapUnique(new UnWriteableFakeWebSocketStream)); |
| 1125 deleting_ = EVENT_ON_DROP_CHANNEL; | 1126 deleting_ = EVENT_ON_DROP_CHANNEL; |
| 1126 CreateChannelAndConnectSuccessfully(); | 1127 CreateChannelAndConnectSuccessfully(); |
| 1127 ASSERT_TRUE(channel_); | 1128 ASSERT_TRUE(channel_); |
| 1128 channel_->SendFrame( | 1129 channel_->SendFrame( |
| 1129 true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); | 1130 true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); |
| 1130 EXPECT_EQ(nullptr, channel_.get()); | 1131 EXPECT_EQ(nullptr, channel_.get()); |
| 1131 } | 1132 } |
| 1132 | 1133 |
| 1133 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { | 1134 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { |
| 1134 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1135 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1135 new ReadableFakeWebSocketStream); | 1136 new ReadableFakeWebSocketStream); |
| 1136 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1137 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1137 ERR_FAILED); | 1138 ERR_FAILED); |
| 1138 set_stream(std::move(stream)); | 1139 set_stream(std::move(stream)); |
| 1139 deleting_ = EVENT_ON_DROP_CHANNEL; | 1140 deleting_ = EVENT_ON_DROP_CHANNEL; |
| 1140 CreateChannelAndConnectSuccessfully(); | 1141 CreateChannelAndConnectSuccessfully(); |
| 1141 ASSERT_TRUE(channel_); | 1142 ASSERT_TRUE(channel_); |
| 1142 base::MessageLoop::current()->RunUntilIdle(); | 1143 base::RunLoop().RunUntilIdle(); |
| 1143 EXPECT_EQ(nullptr, channel_.get()); | 1144 EXPECT_EQ(nullptr, channel_.get()); |
| 1144 } | 1145 } |
| 1145 | 1146 |
| 1146 TEST_F(WebSocketChannelDeletingTest, OnNotifyStartOpeningHandshakeError) { | 1147 TEST_F(WebSocketChannelDeletingTest, OnNotifyStartOpeningHandshakeError) { |
| 1147 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1148 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1148 new ReadableFakeWebSocketStream); | 1149 new ReadableFakeWebSocketStream); |
| 1149 static const InitFrame frames[] = { | 1150 static const InitFrame frames[] = { |
| 1150 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1151 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1151 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1152 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1152 set_stream(std::move(stream)); | 1153 set_stream(std::move(stream)); |
| 1153 deleting_ = EVENT_ON_START_OPENING_HANDSHAKE; | 1154 deleting_ = EVENT_ON_START_OPENING_HANDSHAKE; |
| 1154 | 1155 |
| 1155 CreateChannelAndConnectSuccessfully(); | 1156 CreateChannelAndConnectSuccessfully(); |
| 1156 ASSERT_TRUE(channel_); | 1157 ASSERT_TRUE(channel_); |
| 1157 channel_->OnStartOpeningHandshake( | 1158 channel_->OnStartOpeningHandshake( |
| 1158 std::unique_ptr<WebSocketHandshakeRequestInfo>( | 1159 std::unique_ptr<WebSocketHandshakeRequestInfo>( |
| 1159 new WebSocketHandshakeRequestInfo(GURL("http://www.example.com/"), | 1160 new WebSocketHandshakeRequestInfo(GURL("http://www.example.com/"), |
| 1160 base::Time()))); | 1161 base::Time()))); |
| 1161 base::MessageLoop::current()->RunUntilIdle(); | 1162 base::RunLoop().RunUntilIdle(); |
| 1162 EXPECT_EQ(nullptr, channel_.get()); | 1163 EXPECT_EQ(nullptr, channel_.get()); |
| 1163 } | 1164 } |
| 1164 | 1165 |
| 1165 TEST_F(WebSocketChannelDeletingTest, OnNotifyFinishOpeningHandshakeError) { | 1166 TEST_F(WebSocketChannelDeletingTest, OnNotifyFinishOpeningHandshakeError) { |
| 1166 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1167 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1167 new ReadableFakeWebSocketStream); | 1168 new ReadableFakeWebSocketStream); |
| 1168 static const InitFrame frames[] = { | 1169 static const InitFrame frames[] = { |
| 1169 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1170 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1170 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1171 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1171 set_stream(std::move(stream)); | 1172 set_stream(std::move(stream)); |
| 1172 deleting_ = EVENT_ON_FINISH_OPENING_HANDSHAKE; | 1173 deleting_ = EVENT_ON_FINISH_OPENING_HANDSHAKE; |
| 1173 | 1174 |
| 1174 CreateChannelAndConnectSuccessfully(); | 1175 CreateChannelAndConnectSuccessfully(); |
| 1175 ASSERT_TRUE(channel_); | 1176 ASSERT_TRUE(channel_); |
| 1176 scoped_refptr<HttpResponseHeaders> response_headers( | 1177 scoped_refptr<HttpResponseHeaders> response_headers( |
| 1177 new HttpResponseHeaders("")); | 1178 new HttpResponseHeaders("")); |
| 1178 channel_->OnFinishOpeningHandshake( | 1179 channel_->OnFinishOpeningHandshake( |
| 1179 base::WrapUnique(new WebSocketHandshakeResponseInfo( | 1180 base::WrapUnique(new WebSocketHandshakeResponseInfo( |
| 1180 GURL("http://www.example.com/"), 200, "OK", response_headers, | 1181 GURL("http://www.example.com/"), 200, "OK", response_headers, |
| 1181 base::Time()))); | 1182 base::Time()))); |
| 1182 base::MessageLoop::current()->RunUntilIdle(); | 1183 base::RunLoop().RunUntilIdle(); |
| 1183 EXPECT_EQ(nullptr, channel_.get()); | 1184 EXPECT_EQ(nullptr, channel_.get()); |
| 1184 } | 1185 } |
| 1185 | 1186 |
| 1186 TEST_F(WebSocketChannelDeletingTest, FailChannelInSendFrame) { | 1187 TEST_F(WebSocketChannelDeletingTest, FailChannelInSendFrame) { |
| 1187 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); | 1188 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); |
| 1188 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1189 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1189 CreateChannelAndConnectSuccessfully(); | 1190 CreateChannelAndConnectSuccessfully(); |
| 1190 ASSERT_TRUE(channel_); | 1191 ASSERT_TRUE(channel_); |
| 1191 channel_->SendFrame(true, | 1192 channel_->SendFrame(true, |
| 1192 WebSocketFrameHeader::kOpCodeText, | 1193 WebSocketFrameHeader::kOpCodeText, |
| 1193 std::vector<char>(kDefaultInitialQuota * 2, 'T')); | 1194 std::vector<char>(kDefaultInitialQuota * 2, 'T')); |
| 1194 EXPECT_EQ(nullptr, channel_.get()); | 1195 EXPECT_EQ(nullptr, channel_.get()); |
| 1195 } | 1196 } |
| 1196 | 1197 |
| 1197 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { | 1198 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { |
| 1198 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1199 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1199 new ReadableFakeWebSocketStream); | 1200 new ReadableFakeWebSocketStream); |
| 1200 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1201 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1201 ERR_WS_PROTOCOL_ERROR); | 1202 ERR_WS_PROTOCOL_ERROR); |
| 1202 set_stream(std::move(stream)); | 1203 set_stream(std::move(stream)); |
| 1203 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1204 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1204 CreateChannelAndConnectSuccessfully(); | 1205 CreateChannelAndConnectSuccessfully(); |
| 1205 ASSERT_TRUE(channel_); | 1206 ASSERT_TRUE(channel_); |
| 1206 base::MessageLoop::current()->RunUntilIdle(); | 1207 base::RunLoop().RunUntilIdle(); |
| 1207 EXPECT_EQ(nullptr, channel_.get()); | 1208 EXPECT_EQ(nullptr, channel_.get()); |
| 1208 } | 1209 } |
| 1209 | 1210 |
| 1210 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToMaskedFrame) { | 1211 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToMaskedFrame) { |
| 1211 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1212 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1212 new ReadableFakeWebSocketStream); | 1213 new ReadableFakeWebSocketStream); |
| 1213 static const InitFrame frames[] = { | 1214 static const InitFrame frames[] = { |
| 1214 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; | 1215 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; |
| 1215 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1216 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1216 set_stream(std::move(stream)); | 1217 set_stream(std::move(stream)); |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1446 EXPECT_CALL(checkpoint, Call(1)); | 1447 EXPECT_CALL(checkpoint, Call(1)); |
| 1447 EXPECT_CALL( | 1448 EXPECT_CALL( |
| 1448 *event_interface_, | 1449 *event_interface_, |
| 1449 OnDataFrame( | 1450 OnDataFrame( |
| 1450 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); | 1451 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); |
| 1451 EXPECT_CALL(checkpoint, Call(2)); | 1452 EXPECT_CALL(checkpoint, Call(2)); |
| 1452 } | 1453 } |
| 1453 | 1454 |
| 1454 CreateChannelAndConnectSuccessfully(); | 1455 CreateChannelAndConnectSuccessfully(); |
| 1455 checkpoint.Call(1); | 1456 checkpoint.Call(1); |
| 1456 base::MessageLoop::current()->RunUntilIdle(); | 1457 base::RunLoop().RunUntilIdle(); |
| 1457 checkpoint.Call(2); | 1458 checkpoint.Call(2); |
| 1458 } | 1459 } |
| 1459 | 1460 |
| 1460 // Extra data can arrive while a read is being processed, resulting in the next | 1461 // Extra data can arrive while a read is being processed, resulting in the next |
| 1461 // read completing synchronously. | 1462 // read completing synchronously. |
| 1462 TEST_F(WebSocketChannelEventInterfaceTest, AsyncThenSyncRead) { | 1463 TEST_F(WebSocketChannelEventInterfaceTest, AsyncThenSyncRead) { |
| 1463 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1464 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1464 new ReadableFakeWebSocketStream); | 1465 new ReadableFakeWebSocketStream); |
| 1465 static const InitFrame frames1[] = { | 1466 static const InitFrame frames1[] = { |
| 1466 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1467 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1477 *event_interface_, | 1478 *event_interface_, |
| 1478 OnDataFrame( | 1479 OnDataFrame( |
| 1479 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); | 1480 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); |
| 1480 EXPECT_CALL( | 1481 EXPECT_CALL( |
| 1481 *event_interface_, | 1482 *event_interface_, |
| 1482 OnDataFrame( | 1483 OnDataFrame( |
| 1483 true, WebSocketFrameHeader::kOpCodeText, AsVector("WORLD"))); | 1484 true, WebSocketFrameHeader::kOpCodeText, AsVector("WORLD"))); |
| 1484 } | 1485 } |
| 1485 | 1486 |
| 1486 CreateChannelAndConnectSuccessfully(); | 1487 CreateChannelAndConnectSuccessfully(); |
| 1487 base::MessageLoop::current()->RunUntilIdle(); | 1488 base::RunLoop().RunUntilIdle(); |
| 1488 } | 1489 } |
| 1489 | 1490 |
| 1490 // Data frames are delivered the same regardless of how many reads they arrive | 1491 // Data frames are delivered the same regardless of how many reads they arrive |
| 1491 // as. | 1492 // as. |
| 1492 TEST_F(WebSocketChannelEventInterfaceTest, FragmentedMessage) { | 1493 TEST_F(WebSocketChannelEventInterfaceTest, FragmentedMessage) { |
| 1493 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1494 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1494 new ReadableFakeWebSocketStream); | 1495 new ReadableFakeWebSocketStream); |
| 1495 // Here we have one message which arrived in five frames split across three | 1496 // Here we have one message which arrived in five frames split across three |
| 1496 // reads. It may have been reframed on arrival, but this class doesn't care | 1497 // reads. It may have been reframed on arrival, but this class doesn't care |
| 1497 // about that. | 1498 // about that. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1531 *event_interface_, | 1532 *event_interface_, |
| 1532 OnDataFrame( | 1533 OnDataFrame( |
| 1533 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector(" "))); | 1534 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector(" "))); |
| 1534 EXPECT_CALL(*event_interface_, | 1535 EXPECT_CALL(*event_interface_, |
| 1535 OnDataFrame(true, | 1536 OnDataFrame(true, |
| 1536 WebSocketFrameHeader::kOpCodeContinuation, | 1537 WebSocketFrameHeader::kOpCodeContinuation, |
| 1537 AsVector("FRAMES"))); | 1538 AsVector("FRAMES"))); |
| 1538 } | 1539 } |
| 1539 | 1540 |
| 1540 CreateChannelAndConnectSuccessfully(); | 1541 CreateChannelAndConnectSuccessfully(); |
| 1541 base::MessageLoop::current()->RunUntilIdle(); | 1542 base::RunLoop().RunUntilIdle(); |
| 1542 } | 1543 } |
| 1543 | 1544 |
| 1544 // A message can consist of one frame with null payload. | 1545 // A message can consist of one frame with null payload. |
| 1545 TEST_F(WebSocketChannelEventInterfaceTest, NullMessage) { | 1546 TEST_F(WebSocketChannelEventInterfaceTest, NullMessage) { |
| 1546 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1547 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1547 new ReadableFakeWebSocketStream); | 1548 new ReadableFakeWebSocketStream); |
| 1548 static const InitFrame frames[] = { | 1549 static const InitFrame frames[] = { |
| 1549 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, nullptr}}; | 1550 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, nullptr}}; |
| 1550 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1551 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1551 set_stream(std::move(stream)); | 1552 set_stream(std::move(stream)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1566 set_stream(std::move(stream)); | 1567 set_stream(std::move(stream)); |
| 1567 { | 1568 { |
| 1568 InSequence s; | 1569 InSequence s; |
| 1569 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1570 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1570 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1571 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1571 EXPECT_CALL(*event_interface_, | 1572 EXPECT_CALL(*event_interface_, |
| 1572 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); | 1573 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); |
| 1573 } | 1574 } |
| 1574 | 1575 |
| 1575 CreateChannelAndConnectSuccessfully(); | 1576 CreateChannelAndConnectSuccessfully(); |
| 1576 base::MessageLoop::current()->RunUntilIdle(); | 1577 base::RunLoop().RunUntilIdle(); |
| 1577 } | 1578 } |
| 1578 | 1579 |
| 1579 // A connection reset should produce the same event as an unexpected closure. | 1580 // A connection reset should produce the same event as an unexpected closure. |
| 1580 TEST_F(WebSocketChannelEventInterfaceTest, ConnectionReset) { | 1581 TEST_F(WebSocketChannelEventInterfaceTest, ConnectionReset) { |
| 1581 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1582 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1582 new ReadableFakeWebSocketStream); | 1583 new ReadableFakeWebSocketStream); |
| 1583 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1584 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1584 ERR_CONNECTION_RESET); | 1585 ERR_CONNECTION_RESET); |
| 1585 set_stream(std::move(stream)); | 1586 set_stream(std::move(stream)); |
| 1586 { | 1587 { |
| 1587 InSequence s; | 1588 InSequence s; |
| 1588 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1589 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1589 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1590 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1590 EXPECT_CALL(*event_interface_, | 1591 EXPECT_CALL(*event_interface_, |
| 1591 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); | 1592 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); |
| 1592 } | 1593 } |
| 1593 | 1594 |
| 1594 CreateChannelAndConnectSuccessfully(); | 1595 CreateChannelAndConnectSuccessfully(); |
| 1595 base::MessageLoop::current()->RunUntilIdle(); | 1596 base::RunLoop().RunUntilIdle(); |
| 1596 } | 1597 } |
| 1597 | 1598 |
| 1598 // RFC6455 5.1 "A client MUST close a connection if it detects a masked frame." | 1599 // RFC6455 5.1 "A client MUST close a connection if it detects a masked frame." |
| 1599 TEST_F(WebSocketChannelEventInterfaceTest, MaskedFramesAreRejected) { | 1600 TEST_F(WebSocketChannelEventInterfaceTest, MaskedFramesAreRejected) { |
| 1600 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1601 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1601 new ReadableFakeWebSocketStream); | 1602 new ReadableFakeWebSocketStream); |
| 1602 static const InitFrame frames[] = { | 1603 static const InitFrame frames[] = { |
| 1603 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; | 1604 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; |
| 1604 | 1605 |
| 1605 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1606 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1606 set_stream(std::move(stream)); | 1607 set_stream(std::move(stream)); |
| 1607 { | 1608 { |
| 1608 InSequence s; | 1609 InSequence s; |
| 1609 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1610 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1610 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1611 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1611 EXPECT_CALL( | 1612 EXPECT_CALL( |
| 1612 *event_interface_, | 1613 *event_interface_, |
| 1613 OnFailChannel( | 1614 OnFailChannel( |
| 1614 "A server must not mask any frames that it sends to the client.")); | 1615 "A server must not mask any frames that it sends to the client.")); |
| 1615 } | 1616 } |
| 1616 | 1617 |
| 1617 CreateChannelAndConnectSuccessfully(); | 1618 CreateChannelAndConnectSuccessfully(); |
| 1618 base::MessageLoop::current()->RunUntilIdle(); | 1619 base::RunLoop().RunUntilIdle(); |
| 1619 } | 1620 } |
| 1620 | 1621 |
| 1621 // RFC6455 5.2 "If an unknown opcode is received, the receiving endpoint MUST | 1622 // RFC6455 5.2 "If an unknown opcode is received, the receiving endpoint MUST |
| 1622 // _Fail the WebSocket Connection_." | 1623 // _Fail the WebSocket Connection_." |
| 1623 TEST_F(WebSocketChannelEventInterfaceTest, UnknownOpCodeIsRejected) { | 1624 TEST_F(WebSocketChannelEventInterfaceTest, UnknownOpCodeIsRejected) { |
| 1624 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1625 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1625 new ReadableFakeWebSocketStream); | 1626 new ReadableFakeWebSocketStream); |
| 1626 static const InitFrame frames[] = {{FINAL_FRAME, 4, NOT_MASKED, "HELLO"}}; | 1627 static const InitFrame frames[] = {{FINAL_FRAME, 4, NOT_MASKED, "HELLO"}}; |
| 1627 | 1628 |
| 1628 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1629 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1629 set_stream(std::move(stream)); | 1630 set_stream(std::move(stream)); |
| 1630 { | 1631 { |
| 1631 InSequence s; | 1632 InSequence s; |
| 1632 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1633 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1633 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1634 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1634 EXPECT_CALL(*event_interface_, | 1635 EXPECT_CALL(*event_interface_, |
| 1635 OnFailChannel("Unrecognized frame opcode: 4")); | 1636 OnFailChannel("Unrecognized frame opcode: 4")); |
| 1636 } | 1637 } |
| 1637 | 1638 |
| 1638 CreateChannelAndConnectSuccessfully(); | 1639 CreateChannelAndConnectSuccessfully(); |
| 1639 base::MessageLoop::current()->RunUntilIdle(); | 1640 base::RunLoop().RunUntilIdle(); |
| 1640 } | 1641 } |
| 1641 | 1642 |
| 1642 // RFC6455 5.4 "Control frames ... MAY be injected in the middle of a | 1643 // RFC6455 5.4 "Control frames ... MAY be injected in the middle of a |
| 1643 // fragmented message." | 1644 // fragmented message." |
| 1644 TEST_F(WebSocketChannelEventInterfaceTest, ControlFrameInDataMessage) { | 1645 TEST_F(WebSocketChannelEventInterfaceTest, ControlFrameInDataMessage) { |
| 1645 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1646 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1646 new ReadableFakeWebSocketStream); | 1647 new ReadableFakeWebSocketStream); |
| 1647 // We have one message of type Text split into two frames. In the middle is a | 1648 // We have one message of type Text split into two frames. In the middle is a |
| 1648 // control message of type Pong. | 1649 // control message of type Pong. |
| 1649 static const InitFrame frames1[] = { | 1650 static const InitFrame frames1[] = { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1666 *event_interface_, | 1667 *event_interface_, |
| 1667 OnDataFrame( | 1668 OnDataFrame( |
| 1668 false, WebSocketFrameHeader::kOpCodeText, AsVector("SPLIT "))); | 1669 false, WebSocketFrameHeader::kOpCodeText, AsVector("SPLIT "))); |
| 1669 EXPECT_CALL(*event_interface_, | 1670 EXPECT_CALL(*event_interface_, |
| 1670 OnDataFrame(true, | 1671 OnDataFrame(true, |
| 1671 WebSocketFrameHeader::kOpCodeContinuation, | 1672 WebSocketFrameHeader::kOpCodeContinuation, |
| 1672 AsVector("MESSAGE"))); | 1673 AsVector("MESSAGE"))); |
| 1673 } | 1674 } |
| 1674 | 1675 |
| 1675 CreateChannelAndConnectSuccessfully(); | 1676 CreateChannelAndConnectSuccessfully(); |
| 1676 base::MessageLoop::current()->RunUntilIdle(); | 1677 base::RunLoop().RunUntilIdle(); |
| 1677 } | 1678 } |
| 1678 | 1679 |
| 1679 // It seems redundant to repeat the entirety of the above test, so just test a | 1680 // It seems redundant to repeat the entirety of the above test, so just test a |
| 1680 // Pong with null data. | 1681 // Pong with null data. |
| 1681 TEST_F(WebSocketChannelEventInterfaceTest, PongWithNullData) { | 1682 TEST_F(WebSocketChannelEventInterfaceTest, PongWithNullData) { |
| 1682 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1683 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1683 new ReadableFakeWebSocketStream); | 1684 new ReadableFakeWebSocketStream); |
| 1684 static const InitFrame frames[] = { | 1685 static const InitFrame frames[] = { |
| 1685 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, nullptr}}; | 1686 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, nullptr}}; |
| 1686 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1687 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1687 set_stream(std::move(stream)); | 1688 set_stream(std::move(stream)); |
| 1688 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1689 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1689 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1690 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1690 | 1691 |
| 1691 CreateChannelAndConnectSuccessfully(); | 1692 CreateChannelAndConnectSuccessfully(); |
| 1692 base::MessageLoop::current()->RunUntilIdle(); | 1693 base::RunLoop().RunUntilIdle(); |
| 1693 } | 1694 } |
| 1694 | 1695 |
| 1695 // If a frame has an invalid header, then the connection is closed and | 1696 // If a frame has an invalid header, then the connection is closed and |
| 1696 // subsequent frames must not trigger events. | 1697 // subsequent frames must not trigger events. |
| 1697 TEST_F(WebSocketChannelEventInterfaceTest, FrameAfterInvalidFrame) { | 1698 TEST_F(WebSocketChannelEventInterfaceTest, FrameAfterInvalidFrame) { |
| 1698 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1699 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1699 new ReadableFakeWebSocketStream); | 1700 new ReadableFakeWebSocketStream); |
| 1700 static const InitFrame frames[] = { | 1701 static const InitFrame frames[] = { |
| 1701 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}, | 1702 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}, |
| 1702 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, " WORLD"}}; | 1703 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, " WORLD"}}; |
| 1703 | 1704 |
| 1704 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1705 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1705 set_stream(std::move(stream)); | 1706 set_stream(std::move(stream)); |
| 1706 { | 1707 { |
| 1707 InSequence s; | 1708 InSequence s; |
| 1708 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1709 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1709 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1710 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1710 EXPECT_CALL( | 1711 EXPECT_CALL( |
| 1711 *event_interface_, | 1712 *event_interface_, |
| 1712 OnFailChannel( | 1713 OnFailChannel( |
| 1713 "A server must not mask any frames that it sends to the client.")); | 1714 "A server must not mask any frames that it sends to the client.")); |
| 1714 } | 1715 } |
| 1715 | 1716 |
| 1716 CreateChannelAndConnectSuccessfully(); | 1717 CreateChannelAndConnectSuccessfully(); |
| 1717 base::MessageLoop::current()->RunUntilIdle(); | 1718 base::RunLoop().RunUntilIdle(); |
| 1718 } | 1719 } |
| 1719 | 1720 |
| 1720 // If the renderer sends lots of small writes, we don't want to update the quota | 1721 // If the renderer sends lots of small writes, we don't want to update the quota |
| 1721 // for each one. | 1722 // for each one. |
| 1722 TEST_F(WebSocketChannelEventInterfaceTest, SmallWriteDoesntUpdateQuota) { | 1723 TEST_F(WebSocketChannelEventInterfaceTest, SmallWriteDoesntUpdateQuota) { |
| 1723 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); | 1724 set_stream(base::WrapUnique(new WriteableFakeWebSocketStream)); |
| 1724 { | 1725 { |
| 1725 InSequence s; | 1726 InSequence s; |
| 1726 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1727 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1727 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1728 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1831 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1832 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1832 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1833 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1833 EXPECT_CALL(*event_interface_, | 1834 EXPECT_CALL(*event_interface_, |
| 1834 OnDropChannel(true, kWebSocketNormalClosure, "Fred")); | 1835 OnDropChannel(true, kWebSocketNormalClosure, "Fred")); |
| 1835 } | 1836 } |
| 1836 | 1837 |
| 1837 CreateChannelAndConnectSuccessfully(); | 1838 CreateChannelAndConnectSuccessfully(); |
| 1838 | 1839 |
| 1839 ASSERT_EQ(CHANNEL_ALIVE, | 1840 ASSERT_EQ(CHANNEL_ALIVE, |
| 1840 channel_->StartClosingHandshake(kWebSocketNormalClosure, "Fred")); | 1841 channel_->StartClosingHandshake(kWebSocketNormalClosure, "Fred")); |
| 1841 base::MessageLoop::current()->RunUntilIdle(); | 1842 base::RunLoop().RunUntilIdle(); |
| 1842 } | 1843 } |
| 1843 | 1844 |
| 1844 // StartClosingHandshake() also works before connection completes, and calls | 1845 // StartClosingHandshake() also works before connection completes, and calls |
| 1845 // OnDropChannel. | 1846 // OnDropChannel. |
| 1846 TEST_F(WebSocketChannelEventInterfaceTest, CloseDuringConnection) { | 1847 TEST_F(WebSocketChannelEventInterfaceTest, CloseDuringConnection) { |
| 1847 EXPECT_CALL(*event_interface_, | 1848 EXPECT_CALL(*event_interface_, |
| 1848 OnDropChannel(false, kWebSocketErrorAbnormalClosure, "")); | 1849 OnDropChannel(false, kWebSocketErrorAbnormalClosure, "")); |
| 1849 | 1850 |
| 1850 CreateChannelAndConnect(); | 1851 CreateChannelAndConnect(); |
| 1851 ASSERT_EQ(CHANNEL_DELETED, | 1852 ASSERT_EQ(CHANNEL_DELETED, |
| 1852 channel_->StartClosingHandshake(kWebSocketNormalClosure, "Joe")); | 1853 channel_->StartClosingHandshake(kWebSocketNormalClosure, "Joe")); |
| 1853 } | 1854 } |
| 1854 | 1855 |
| 1855 // OnDropChannel() is only called once when a write() on the socket triggers a | 1856 // OnDropChannel() is only called once when a write() on the socket triggers a |
| 1856 // connection reset. | 1857 // connection reset. |
| 1857 TEST_F(WebSocketChannelEventInterfaceTest, OnDropChannelCalledOnce) { | 1858 TEST_F(WebSocketChannelEventInterfaceTest, OnDropChannelCalledOnce) { |
| 1858 set_stream(base::WrapUnique(new ResetOnWriteFakeWebSocketStream)); | 1859 set_stream(base::WrapUnique(new ResetOnWriteFakeWebSocketStream)); |
| 1859 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1860 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1860 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1861 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1861 | 1862 |
| 1862 EXPECT_CALL(*event_interface_, | 1863 EXPECT_CALL(*event_interface_, |
| 1863 OnDropChannel(false, kWebSocketErrorAbnormalClosure, "")) | 1864 OnDropChannel(false, kWebSocketErrorAbnormalClosure, "")) |
| 1864 .Times(1); | 1865 .Times(1); |
| 1865 | 1866 |
| 1866 CreateChannelAndConnectSuccessfully(); | 1867 CreateChannelAndConnectSuccessfully(); |
| 1867 | 1868 |
| 1868 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("yt?")); | 1869 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("yt?")); |
| 1869 base::MessageLoop::current()->RunUntilIdle(); | 1870 base::RunLoop().RunUntilIdle(); |
| 1870 } | 1871 } |
| 1871 | 1872 |
| 1872 // When the remote server sends a Close frame with an empty payload, | 1873 // When the remote server sends a Close frame with an empty payload, |
| 1873 // WebSocketChannel should report code 1005, kWebSocketErrorNoStatusReceived. | 1874 // WebSocketChannel should report code 1005, kWebSocketErrorNoStatusReceived. |
| 1874 TEST_F(WebSocketChannelEventInterfaceTest, CloseWithNoPayloadGivesStatus1005) { | 1875 TEST_F(WebSocketChannelEventInterfaceTest, CloseWithNoPayloadGivesStatus1005) { |
| 1875 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 1876 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 1876 new ReadableFakeWebSocketStream); | 1877 new ReadableFakeWebSocketStream); |
| 1877 static const InitFrame frames[] = { | 1878 static const InitFrame frames[] = { |
| 1878 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, ""}}; | 1879 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, ""}}; |
| 1879 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1880 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1931 new ReadableFakeWebSocketStream); | 1932 new ReadableFakeWebSocketStream); |
| 1932 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1933 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1933 ERR_WS_PROTOCOL_ERROR); | 1934 ERR_WS_PROTOCOL_ERROR); |
| 1934 set_stream(std::move(stream)); | 1935 set_stream(std::move(stream)); |
| 1935 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1936 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1936 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1937 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1937 | 1938 |
| 1938 EXPECT_CALL(*event_interface_, OnFailChannel("Invalid frame header")); | 1939 EXPECT_CALL(*event_interface_, OnFailChannel("Invalid frame header")); |
| 1939 | 1940 |
| 1940 CreateChannelAndConnectSuccessfully(); | 1941 CreateChannelAndConnectSuccessfully(); |
| 1941 base::MessageLoop::current()->RunUntilIdle(); | 1942 base::RunLoop().RunUntilIdle(); |
| 1942 } | 1943 } |
| 1943 | 1944 |
| 1944 TEST_F(WebSocketChannelEventInterfaceTest, StartHandshakeRequest) { | 1945 TEST_F(WebSocketChannelEventInterfaceTest, StartHandshakeRequest) { |
| 1945 { | 1946 { |
| 1946 InSequence s; | 1947 InSequence s; |
| 1947 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1948 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1948 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1949 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1949 EXPECT_CALL(*event_interface_, OnStartOpeningHandshakeCalled()); | 1950 EXPECT_CALL(*event_interface_, OnStartOpeningHandshakeCalled()); |
| 1950 } | 1951 } |
| 1951 | 1952 |
| 1952 CreateChannelAndConnectSuccessfully(); | 1953 CreateChannelAndConnectSuccessfully(); |
| 1953 | 1954 |
| 1954 std::unique_ptr<WebSocketHandshakeRequestInfo> request_info( | 1955 std::unique_ptr<WebSocketHandshakeRequestInfo> request_info( |
| 1955 new WebSocketHandshakeRequestInfo(GURL("ws://www.example.com/"), | 1956 new WebSocketHandshakeRequestInfo(GURL("ws://www.example.com/"), |
| 1956 base::Time())); | 1957 base::Time())); |
| 1957 connect_data_.creator.connect_delegate->OnStartOpeningHandshake( | 1958 connect_data_.creator.connect_delegate->OnStartOpeningHandshake( |
| 1958 std::move(request_info)); | 1959 std::move(request_info)); |
| 1959 | 1960 |
| 1960 base::MessageLoop::current()->RunUntilIdle(); | 1961 base::RunLoop().RunUntilIdle(); |
| 1961 } | 1962 } |
| 1962 | 1963 |
| 1963 TEST_F(WebSocketChannelEventInterfaceTest, FinishHandshakeRequest) { | 1964 TEST_F(WebSocketChannelEventInterfaceTest, FinishHandshakeRequest) { |
| 1964 { | 1965 { |
| 1965 InSequence s; | 1966 InSequence s; |
| 1966 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1967 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1967 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1968 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1968 EXPECT_CALL(*event_interface_, OnFinishOpeningHandshakeCalled()); | 1969 EXPECT_CALL(*event_interface_, OnFinishOpeningHandshakeCalled()); |
| 1969 } | 1970 } |
| 1970 | 1971 |
| 1971 CreateChannelAndConnectSuccessfully(); | 1972 CreateChannelAndConnectSuccessfully(); |
| 1972 | 1973 |
| 1973 scoped_refptr<HttpResponseHeaders> response_headers( | 1974 scoped_refptr<HttpResponseHeaders> response_headers( |
| 1974 new HttpResponseHeaders("")); | 1975 new HttpResponseHeaders("")); |
| 1975 std::unique_ptr<WebSocketHandshakeResponseInfo> response_info( | 1976 std::unique_ptr<WebSocketHandshakeResponseInfo> response_info( |
| 1976 new WebSocketHandshakeResponseInfo(GURL("ws://www.example.com/"), 200, | 1977 new WebSocketHandshakeResponseInfo(GURL("ws://www.example.com/"), 200, |
| 1977 "OK", response_headers, base::Time())); | 1978 "OK", response_headers, base::Time())); |
| 1978 connect_data_.creator.connect_delegate->OnFinishOpeningHandshake( | 1979 connect_data_.creator.connect_delegate->OnFinishOpeningHandshake( |
| 1979 std::move(response_info)); | 1980 std::move(response_info)); |
| 1980 base::MessageLoop::current()->RunUntilIdle(); | 1981 base::RunLoop().RunUntilIdle(); |
| 1981 } | 1982 } |
| 1982 | 1983 |
| 1983 TEST_F(WebSocketChannelEventInterfaceTest, FailJustAfterHandshake) { | 1984 TEST_F(WebSocketChannelEventInterfaceTest, FailJustAfterHandshake) { |
| 1984 { | 1985 { |
| 1985 InSequence s; | 1986 InSequence s; |
| 1986 EXPECT_CALL(*event_interface_, OnStartOpeningHandshakeCalled()); | 1987 EXPECT_CALL(*event_interface_, OnStartOpeningHandshakeCalled()); |
| 1987 EXPECT_CALL(*event_interface_, OnFinishOpeningHandshakeCalled()); | 1988 EXPECT_CALL(*event_interface_, OnFinishOpeningHandshakeCalled()); |
| 1988 EXPECT_CALL(*event_interface_, OnFailChannel("bye")); | 1989 EXPECT_CALL(*event_interface_, OnFailChannel("bye")); |
| 1989 } | 1990 } |
| 1990 | 1991 |
| 1991 CreateChannelAndConnect(); | 1992 CreateChannelAndConnect(); |
| 1992 | 1993 |
| 1993 WebSocketStream::ConnectDelegate* connect_delegate = | 1994 WebSocketStream::ConnectDelegate* connect_delegate = |
| 1994 connect_data_.creator.connect_delegate.get(); | 1995 connect_data_.creator.connect_delegate.get(); |
| 1995 GURL url("ws://www.example.com/"); | 1996 GURL url("ws://www.example.com/"); |
| 1996 std::unique_ptr<WebSocketHandshakeRequestInfo> request_info( | 1997 std::unique_ptr<WebSocketHandshakeRequestInfo> request_info( |
| 1997 new WebSocketHandshakeRequestInfo(url, base::Time())); | 1998 new WebSocketHandshakeRequestInfo(url, base::Time())); |
| 1998 scoped_refptr<HttpResponseHeaders> response_headers( | 1999 scoped_refptr<HttpResponseHeaders> response_headers( |
| 1999 new HttpResponseHeaders("")); | 2000 new HttpResponseHeaders("")); |
| 2000 std::unique_ptr<WebSocketHandshakeResponseInfo> response_info( | 2001 std::unique_ptr<WebSocketHandshakeResponseInfo> response_info( |
| 2001 new WebSocketHandshakeResponseInfo(url, 200, "OK", response_headers, | 2002 new WebSocketHandshakeResponseInfo(url, 200, "OK", response_headers, |
| 2002 base::Time())); | 2003 base::Time())); |
| 2003 connect_delegate->OnStartOpeningHandshake(std::move(request_info)); | 2004 connect_delegate->OnStartOpeningHandshake(std::move(request_info)); |
| 2004 connect_delegate->OnFinishOpeningHandshake(std::move(response_info)); | 2005 connect_delegate->OnFinishOpeningHandshake(std::move(response_info)); |
| 2005 | 2006 |
| 2006 connect_delegate->OnFailure("bye"); | 2007 connect_delegate->OnFailure("bye"); |
| 2007 base::MessageLoop::current()->RunUntilIdle(); | 2008 base::RunLoop().RunUntilIdle(); |
| 2008 } | 2009 } |
| 2009 | 2010 |
| 2010 // Any frame after close is invalid. This test uses a Text frame. See also | 2011 // Any frame after close is invalid. This test uses a Text frame. See also |
| 2011 // test "PingAfterCloseIfRejected". | 2012 // test "PingAfterCloseIfRejected". |
| 2012 TEST_F(WebSocketChannelEventInterfaceTest, DataAfterCloseIsRejected) { | 2013 TEST_F(WebSocketChannelEventInterfaceTest, DataAfterCloseIsRejected) { |
| 2013 std::unique_ptr<ReadableFakeWebSocketStream> stream( | 2014 std::unique_ptr<ReadableFakeWebSocketStream> stream( |
| 2014 new ReadableFakeWebSocketStream); | 2015 new ReadableFakeWebSocketStream); |
| 2015 static const InitFrame frames[] = { | 2016 static const InitFrame frames[] = { |
| 2016 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, | 2017 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, |
| 2017 CLOSE_DATA(NORMAL_CLOSURE, "OK")}, | 2018 CLOSE_DATA(NORMAL_CLOSURE, "OK")}, |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2357 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("U"))); | 2358 false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("U"))); |
| 2358 EXPECT_CALL(checkpoint, Call(3)); | 2359 EXPECT_CALL(checkpoint, Call(3)); |
| 2359 EXPECT_CALL( | 2360 EXPECT_CALL( |
| 2360 *event_interface_, | 2361 *event_interface_, |
| 2361 OnDataFrame( | 2362 OnDataFrame( |
| 2362 true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("R"))); | 2363 true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("R"))); |
| 2363 } | 2364 } |
| 2364 | 2365 |
| 2365 CreateChannelAndConnectWithQuota(2); | 2366 CreateChannelAndConnectWithQuota(2); |
| 2366 checkpoint.Call(1); | 2367 checkpoint.Call(1); |
| 2367 base::MessageLoop::current()->RunUntilIdle(); | 2368 base::RunLoop().RunUntilIdle(); |
| 2368 checkpoint.Call(2); | 2369 checkpoint.Call(2); |
| 2369 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); | 2370 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); |
| 2370 checkpoint.Call(3); | 2371 checkpoint.Call(3); |
| 2371 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); | 2372 ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(1)); |
| 2372 } | 2373 } |
| 2373 | 2374 |
| 2374 // A message split into multiple frames which is further split due to quota | 2375 // A message split into multiple frames which is further split due to quota |
| 2375 // restrictions should stil be correct. | 2376 // restrictions should stil be correct. |
| 2376 // TODO(ricea): The message ends up split into more frames than are strictly | 2377 // TODO(ricea): The message ends up split into more frames than are strictly |
| 2377 // necessary. The complexity/performance tradeoffs here need further | 2378 // necessary. The complexity/performance tradeoffs here need further |
| (...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3035 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "\xff"}}; | 3036 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "\xff"}}; |
| 3036 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 3037 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 3037 set_stream(std::move(stream)); | 3038 set_stream(std::move(stream)); |
| 3038 | 3039 |
| 3039 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 3040 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 3040 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); | 3041 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| 3041 EXPECT_CALL(*event_interface_, | 3042 EXPECT_CALL(*event_interface_, |
| 3042 OnFailChannel("Could not decode a text frame as UTF-8.")); | 3043 OnFailChannel("Could not decode a text frame as UTF-8.")); |
| 3043 | 3044 |
| 3044 CreateChannelAndConnectSuccessfully(); | 3045 CreateChannelAndConnectSuccessfully(); |
| 3045 base::MessageLoop::current()->RunUntilIdle(); | 3046 base::RunLoop().RunUntilIdle(); |
| 3046 } | 3047 } |
| 3047 | 3048 |
| 3048 // Invalid UTF-8 is not sent over the network. | 3049 // Invalid UTF-8 is not sent over the network. |
| 3049 TEST_F(WebSocketChannelStreamTest, InvalidUtf8TextFrameNotSent) { | 3050 TEST_F(WebSocketChannelStreamTest, InvalidUtf8TextFrameNotSent) { |
| 3050 static const InitFrame expected[] = {{FINAL_FRAME, | 3051 static const InitFrame expected[] = {{FINAL_FRAME, |
| 3051 WebSocketFrameHeader::kOpCodeClose, | 3052 WebSocketFrameHeader::kOpCodeClose, |
| 3052 MASKED, CLOSE_DATA(GOING_AWAY, "")}}; | 3053 MASKED, CLOSE_DATA(GOING_AWAY, "")}}; |
| 3053 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 3054 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 3054 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 3055 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 3055 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) | 3056 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) |
| (...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3492 | 3493 |
| 3493 channel_->SendFrame( | 3494 channel_->SendFrame( |
| 3494 true, WebSocketFrameHeader::kOpCodeText, | 3495 true, WebSocketFrameHeader::kOpCodeText, |
| 3495 std::vector<char>(static_cast<size_t>(kMessageSize), 'a')); | 3496 std::vector<char>(static_cast<size_t>(kMessageSize), 'a')); |
| 3496 int new_send_quota = channel_->current_send_quota(); | 3497 int new_send_quota = channel_->current_send_quota(); |
| 3497 EXPECT_EQ(kMessageSize, initial_send_quota - new_send_quota); | 3498 EXPECT_EQ(kMessageSize, initial_send_quota - new_send_quota); |
| 3498 } | 3499 } |
| 3499 | 3500 |
| 3500 } // namespace | 3501 } // namespace |
| 3501 } // namespace net | 3502 } // namespace net |
| OLD | NEW |