| 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 <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <iostream> | 10 #include <iostream> |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 new WebSocketFrame(source_frame.opcode)); | 331 new WebSocketFrame(source_frame.opcode)); |
| 332 size_t frame_length = source_frame.data ? strlen(source_frame.data) : 0; | 332 size_t frame_length = source_frame.data ? strlen(source_frame.data) : 0; |
| 333 WebSocketFrameHeader& result_header = result_frame->header; | 333 WebSocketFrameHeader& result_header = result_frame->header; |
| 334 result_header.final = (source_frame.final == FINAL_FRAME); | 334 result_header.final = (source_frame.final == FINAL_FRAME); |
| 335 result_header.masked = (source_frame.masked == MASKED); | 335 result_header.masked = (source_frame.masked == MASKED); |
| 336 result_header.payload_length = frame_length; | 336 result_header.payload_length = frame_length; |
| 337 if (source_frame.data) { | 337 if (source_frame.data) { |
| 338 result_frame->data = new IOBuffer(frame_length); | 338 result_frame->data = new IOBuffer(frame_length); |
| 339 memcpy(result_frame->data->data(), source_frame.data, frame_length); | 339 memcpy(result_frame->data->data(), source_frame.data, frame_length); |
| 340 } | 340 } |
| 341 result_frames.push_back(result_frame.Pass()); | 341 result_frames.push_back(std::move(result_frame)); |
| 342 } | 342 } |
| 343 return result_frames; | 343 return result_frames; |
| 344 } | 344 } |
| 345 | 345 |
| 346 // A GoogleMock action which can be used to respond to call to ReadFrames with | 346 // A GoogleMock action which can be used to respond to call to ReadFrames with |
| 347 // some frames. Use like ReadFrames(_, _).WillOnce(ReturnFrames(&frames)); | 347 // some frames. Use like ReadFrames(_, _).WillOnce(ReturnFrames(&frames)); |
| 348 // |frames| is an array of InitFrame. |frames| needs to be passed by pointer | 348 // |frames| is an array of InitFrame. |frames| needs to be passed by pointer |
| 349 // because otherwise it will be treated as a pointer and the array size | 349 // because otherwise it will be treated as a pointer and the array size |
| 350 // information will be lost. | 350 // information will be lost. |
| 351 ACTION_P(ReturnFrames, source_frames) { | 351 ACTION_P(ReturnFrames, source_frames) { |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 695 const std::vector<std::string>& requested_subprotocols, | 695 const std::vector<std::string>& requested_subprotocols, |
| 696 const url::Origin& origin, | 696 const url::Origin& origin, |
| 697 URLRequestContext* url_request_context, | 697 URLRequestContext* url_request_context, |
| 698 const BoundNetLog& net_log, | 698 const BoundNetLog& net_log, |
| 699 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate) { | 699 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate) { |
| 700 this->socket_url = socket_url; | 700 this->socket_url = socket_url; |
| 701 this->requested_subprotocols = requested_subprotocols; | 701 this->requested_subprotocols = requested_subprotocols; |
| 702 this->origin = origin; | 702 this->origin = origin; |
| 703 this->url_request_context = url_request_context; | 703 this->url_request_context = url_request_context; |
| 704 this->net_log = net_log; | 704 this->net_log = net_log; |
| 705 this->connect_delegate = connect_delegate.Pass(); | 705 this->connect_delegate = std::move(connect_delegate); |
| 706 return make_scoped_ptr(new WebSocketStreamRequest); | 706 return make_scoped_ptr(new WebSocketStreamRequest); |
| 707 } | 707 } |
| 708 | 708 |
| 709 GURL socket_url; | 709 GURL socket_url; |
| 710 url::Origin origin; | 710 url::Origin origin; |
| 711 std::vector<std::string> requested_subprotocols; | 711 std::vector<std::string> requested_subprotocols; |
| 712 URLRequestContext* url_request_context; | 712 URLRequestContext* url_request_context; |
| 713 BoundNetLog net_log; | 713 BoundNetLog net_log; |
| 714 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate; | 714 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate; |
| 715 }; | 715 }; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 746 base::Unretained(&connect_data_.creator))); | 746 base::Unretained(&connect_data_.creator))); |
| 747 } | 747 } |
| 748 | 748 |
| 749 // Same as CreateChannelAndConnect(), but calls the on_success callback as | 749 // Same as CreateChannelAndConnect(), but calls the on_success callback as |
| 750 // well. This method is virtual so that subclasses can also set the stream. | 750 // well. This method is virtual so that subclasses can also set the stream. |
| 751 virtual void CreateChannelAndConnectSuccessfully() { | 751 virtual void CreateChannelAndConnectSuccessfully() { |
| 752 CreateChannelAndConnect(); | 752 CreateChannelAndConnect(); |
| 753 // Most tests aren't concerned with flow control from the renderer, so allow | 753 // Most tests aren't concerned with flow control from the renderer, so allow |
| 754 // MAX_INT quota units. | 754 // MAX_INT quota units. |
| 755 channel_->SendFlowControl(kPlentyOfQuota); | 755 channel_->SendFlowControl(kPlentyOfQuota); |
| 756 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 756 connect_data_.creator.connect_delegate->OnSuccess(std::move(stream_)); |
| 757 } | 757 } |
| 758 | 758 |
| 759 // Returns a WebSocketEventInterface to be passed to the WebSocketChannel. | 759 // Returns a WebSocketEventInterface to be passed to the WebSocketChannel. |
| 760 // This implementation returns a newly-created fake. Subclasses may return a | 760 // This implementation returns a newly-created fake. Subclasses may return a |
| 761 // mock instead. | 761 // mock instead. |
| 762 virtual scoped_ptr<WebSocketEventInterface> CreateEventInterface() { | 762 virtual scoped_ptr<WebSocketEventInterface> CreateEventInterface() { |
| 763 return scoped_ptr<WebSocketEventInterface>(new FakeWebSocketEventInterface); | 763 return scoped_ptr<WebSocketEventInterface>(new FakeWebSocketEventInterface); |
| 764 } | 764 } |
| 765 | 765 |
| 766 // This method serves no other purpose than to provide a nice syntax for | 766 // This method serves no other purpose than to provide a nice syntax for |
| 767 // assigning to stream_. class T must be a subclass of WebSocketStream or you | 767 // assigning to stream_. class T must be a subclass of WebSocketStream or you |
| 768 // will have unpleasant compile errors. | 768 // will have unpleasant compile errors. |
| 769 template <class T> | 769 template <class T> |
| 770 void set_stream(scoped_ptr<T> stream) { | 770 void set_stream(scoped_ptr<T> stream) { |
| 771 stream_ = stream.Pass(); | 771 stream_ = std::move(stream); |
| 772 } | 772 } |
| 773 | 773 |
| 774 // A struct containing the data that will be used to connect the channel. | 774 // A struct containing the data that will be used to connect the channel. |
| 775 // Grouped for readability. | 775 // Grouped for readability. |
| 776 struct ConnectData { | 776 struct ConnectData { |
| 777 ConnectData() : socket_url("ws://ws/"), origin(GURL("http://ws")) {} | 777 ConnectData() : socket_url("ws://ws/"), origin(GURL("http://ws")) {} |
| 778 | 778 |
| 779 // URLRequestContext object. | 779 // URLRequestContext object. |
| 780 URLRequestContext url_request_context; | 780 URLRequestContext url_request_context; |
| 781 | 781 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 938 }; | 938 }; |
| 939 | 939 |
| 940 // Base class for tests which verify that WebSocketStream methods are called | 940 // Base class for tests which verify that WebSocketStream methods are called |
| 941 // appropriately by using a MockWebSocketStream. | 941 // appropriately by using a MockWebSocketStream. |
| 942 class WebSocketChannelStreamTest : public WebSocketChannelTest { | 942 class WebSocketChannelStreamTest : public WebSocketChannelTest { |
| 943 protected: | 943 protected: |
| 944 WebSocketChannelStreamTest() | 944 WebSocketChannelStreamTest() |
| 945 : mock_stream_(new StrictMock<MockWebSocketStream>) {} | 945 : mock_stream_(new StrictMock<MockWebSocketStream>) {} |
| 946 | 946 |
| 947 void CreateChannelAndConnectSuccessfully() override { | 947 void CreateChannelAndConnectSuccessfully() override { |
| 948 set_stream(mock_stream_.Pass()); | 948 set_stream(std::move(mock_stream_)); |
| 949 WebSocketChannelTest::CreateChannelAndConnectSuccessfully(); | 949 WebSocketChannelTest::CreateChannelAndConnectSuccessfully(); |
| 950 } | 950 } |
| 951 | 951 |
| 952 scoped_ptr<MockWebSocketStream> mock_stream_; | 952 scoped_ptr<MockWebSocketStream> mock_stream_; |
| 953 }; | 953 }; |
| 954 | 954 |
| 955 // Fixture for tests which test UTF-8 validation of sent Text frames via the | 955 // Fixture for tests which test UTF-8 validation of sent Text frames via the |
| 956 // EventInterface. | 956 // EventInterface. |
| 957 class WebSocketChannelSendUtf8Test | 957 class WebSocketChannelSendUtf8Test |
| 958 : public WebSocketChannelEventInterfaceTest { | 958 : public WebSocketChannelEventInterfaceTest { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 970 | 970 |
| 971 // Fixture for tests which test use of receive quota from the renderer. | 971 // Fixture for tests which test use of receive quota from the renderer. |
| 972 class WebSocketChannelFlowControlTest | 972 class WebSocketChannelFlowControlTest |
| 973 : public WebSocketChannelEventInterfaceTest { | 973 : public WebSocketChannelEventInterfaceTest { |
| 974 protected: | 974 protected: |
| 975 // Tests using this fixture should use CreateChannelAndConnectWithQuota() | 975 // Tests using this fixture should use CreateChannelAndConnectWithQuota() |
| 976 // instead of CreateChannelAndConnectSuccessfully(). | 976 // instead of CreateChannelAndConnectSuccessfully(). |
| 977 void CreateChannelAndConnectWithQuota(int64_t quota) { | 977 void CreateChannelAndConnectWithQuota(int64_t quota) { |
| 978 CreateChannelAndConnect(); | 978 CreateChannelAndConnect(); |
| 979 channel_->SendFlowControl(quota); | 979 channel_->SendFlowControl(quota); |
| 980 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 980 connect_data_.creator.connect_delegate->OnSuccess(std::move(stream_)); |
| 981 } | 981 } |
| 982 | 982 |
| 983 virtual void CreateChannelAndConnectSuccesfully() { NOTREACHED(); } | 983 virtual void CreateChannelAndConnectSuccesfully() { NOTREACHED(); } |
| 984 }; | 984 }; |
| 985 | 985 |
| 986 // Fixture for tests which test UTF-8 validation of received Text frames using a | 986 // Fixture for tests which test UTF-8 validation of received Text frames using a |
| 987 // mock WebSocketStream. | 987 // mock WebSocketStream. |
| 988 class WebSocketChannelReceiveUtf8Test : public WebSocketChannelStreamTest { | 988 class WebSocketChannelReceiveUtf8Test : public WebSocketChannelStreamTest { |
| 989 public: | 989 public: |
| 990 void SetUp() override { | 990 void SetUp() override { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1039 CreateChannelAndConnectSuccessfully(); | 1039 CreateChannelAndConnectSuccessfully(); |
| 1040 EXPECT_EQ(NULL, channel_.get()); | 1040 EXPECT_EQ(NULL, channel_.get()); |
| 1041 } | 1041 } |
| 1042 | 1042 |
| 1043 TEST_F(WebSocketChannelDeletingTest, OnDataFrameSync) { | 1043 TEST_F(WebSocketChannelDeletingTest, OnDataFrameSync) { |
| 1044 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1044 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1045 new ReadableFakeWebSocketStream); | 1045 new ReadableFakeWebSocketStream); |
| 1046 static const InitFrame frames[] = { | 1046 static const InitFrame frames[] = { |
| 1047 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1047 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1048 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1048 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1049 set_stream(stream.Pass()); | 1049 set_stream(std::move(stream)); |
| 1050 deleting_ = EVENT_ON_DATA_FRAME; | 1050 deleting_ = EVENT_ON_DATA_FRAME; |
| 1051 | 1051 |
| 1052 CreateChannelAndConnectSuccessfully(); | 1052 CreateChannelAndConnectSuccessfully(); |
| 1053 EXPECT_EQ(NULL, channel_.get()); | 1053 EXPECT_EQ(NULL, channel_.get()); |
| 1054 } | 1054 } |
| 1055 | 1055 |
| 1056 TEST_F(WebSocketChannelDeletingTest, OnDataFrameAsync) { | 1056 TEST_F(WebSocketChannelDeletingTest, OnDataFrameAsync) { |
| 1057 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1057 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1058 new ReadableFakeWebSocketStream); | 1058 new ReadableFakeWebSocketStream); |
| 1059 static const InitFrame frames[] = { | 1059 static const InitFrame frames[] = { |
| 1060 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1060 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1061 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1061 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1062 set_stream(stream.Pass()); | 1062 set_stream(std::move(stream)); |
| 1063 deleting_ = EVENT_ON_DATA_FRAME; | 1063 deleting_ = EVENT_ON_DATA_FRAME; |
| 1064 | 1064 |
| 1065 CreateChannelAndConnectSuccessfully(); | 1065 CreateChannelAndConnectSuccessfully(); |
| 1066 EXPECT_TRUE(channel_); | 1066 EXPECT_TRUE(channel_); |
| 1067 base::MessageLoop::current()->RunUntilIdle(); | 1067 base::MessageLoop::current()->RunUntilIdle(); |
| 1068 EXPECT_EQ(NULL, channel_.get()); | 1068 EXPECT_EQ(NULL, channel_.get()); |
| 1069 } | 1069 } |
| 1070 | 1070 |
| 1071 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterConnect) { | 1071 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterConnect) { |
| 1072 deleting_ = EVENT_ON_FLOW_CONTROL; | 1072 deleting_ = EVENT_ON_FLOW_CONTROL; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1088 EXPECT_EQ(NULL, channel_.get()); | 1088 EXPECT_EQ(NULL, channel_.get()); |
| 1089 } | 1089 } |
| 1090 | 1090 |
| 1091 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeSync) { | 1091 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeSync) { |
| 1092 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1092 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1093 new ReadableFakeWebSocketStream); | 1093 new ReadableFakeWebSocketStream); |
| 1094 static const InitFrame frames[] = { | 1094 static const InitFrame frames[] = { |
| 1095 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 1095 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 1096 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; | 1096 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; |
| 1097 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1097 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1098 set_stream(stream.Pass()); | 1098 set_stream(std::move(stream)); |
| 1099 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; | 1099 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; |
| 1100 CreateChannelAndConnectSuccessfully(); | 1100 CreateChannelAndConnectSuccessfully(); |
| 1101 EXPECT_EQ(NULL, channel_.get()); | 1101 EXPECT_EQ(NULL, channel_.get()); |
| 1102 } | 1102 } |
| 1103 | 1103 |
| 1104 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeAsync) { | 1104 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeAsync) { |
| 1105 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1105 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1106 new ReadableFakeWebSocketStream); | 1106 new ReadableFakeWebSocketStream); |
| 1107 static const InitFrame frames[] = { | 1107 static const InitFrame frames[] = { |
| 1108 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 1108 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 1109 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; | 1109 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "Success")}}; |
| 1110 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1110 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1111 set_stream(stream.Pass()); | 1111 set_stream(std::move(stream)); |
| 1112 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; | 1112 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; |
| 1113 CreateChannelAndConnectSuccessfully(); | 1113 CreateChannelAndConnectSuccessfully(); |
| 1114 ASSERT_TRUE(channel_); | 1114 ASSERT_TRUE(channel_); |
| 1115 base::MessageLoop::current()->RunUntilIdle(); | 1115 base::MessageLoop::current()->RunUntilIdle(); |
| 1116 EXPECT_EQ(NULL, channel_.get()); | 1116 EXPECT_EQ(NULL, channel_.get()); |
| 1117 } | 1117 } |
| 1118 | 1118 |
| 1119 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { | 1119 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { |
| 1120 set_stream(make_scoped_ptr(new UnWriteableFakeWebSocketStream)); | 1120 set_stream(make_scoped_ptr(new UnWriteableFakeWebSocketStream)); |
| 1121 deleting_ = EVENT_ON_DROP_CHANNEL; | 1121 deleting_ = EVENT_ON_DROP_CHANNEL; |
| 1122 CreateChannelAndConnectSuccessfully(); | 1122 CreateChannelAndConnectSuccessfully(); |
| 1123 ASSERT_TRUE(channel_); | 1123 ASSERT_TRUE(channel_); |
| 1124 channel_->SendFrame( | 1124 channel_->SendFrame( |
| 1125 true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); | 1125 true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); |
| 1126 EXPECT_EQ(NULL, channel_.get()); | 1126 EXPECT_EQ(NULL, channel_.get()); |
| 1127 } | 1127 } |
| 1128 | 1128 |
| 1129 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { | 1129 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { |
| 1130 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1130 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1131 new ReadableFakeWebSocketStream); | 1131 new ReadableFakeWebSocketStream); |
| 1132 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1132 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1133 ERR_FAILED); | 1133 ERR_FAILED); |
| 1134 set_stream(stream.Pass()); | 1134 set_stream(std::move(stream)); |
| 1135 deleting_ = EVENT_ON_DROP_CHANNEL; | 1135 deleting_ = EVENT_ON_DROP_CHANNEL; |
| 1136 CreateChannelAndConnectSuccessfully(); | 1136 CreateChannelAndConnectSuccessfully(); |
| 1137 ASSERT_TRUE(channel_); | 1137 ASSERT_TRUE(channel_); |
| 1138 base::MessageLoop::current()->RunUntilIdle(); | 1138 base::MessageLoop::current()->RunUntilIdle(); |
| 1139 EXPECT_EQ(NULL, channel_.get()); | 1139 EXPECT_EQ(NULL, channel_.get()); |
| 1140 } | 1140 } |
| 1141 | 1141 |
| 1142 TEST_F(WebSocketChannelDeletingTest, OnNotifyStartOpeningHandshakeError) { | 1142 TEST_F(WebSocketChannelDeletingTest, OnNotifyStartOpeningHandshakeError) { |
| 1143 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1143 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1144 new ReadableFakeWebSocketStream); | 1144 new ReadableFakeWebSocketStream); |
| 1145 static const InitFrame frames[] = { | 1145 static const InitFrame frames[] = { |
| 1146 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1146 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1147 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1147 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1148 set_stream(stream.Pass()); | 1148 set_stream(std::move(stream)); |
| 1149 deleting_ = EVENT_ON_START_OPENING_HANDSHAKE; | 1149 deleting_ = EVENT_ON_START_OPENING_HANDSHAKE; |
| 1150 | 1150 |
| 1151 CreateChannelAndConnectSuccessfully(); | 1151 CreateChannelAndConnectSuccessfully(); |
| 1152 ASSERT_TRUE(channel_); | 1152 ASSERT_TRUE(channel_); |
| 1153 channel_->OnStartOpeningHandshake(scoped_ptr<WebSocketHandshakeRequestInfo>( | 1153 channel_->OnStartOpeningHandshake(scoped_ptr<WebSocketHandshakeRequestInfo>( |
| 1154 new WebSocketHandshakeRequestInfo(GURL("http://www.example.com/"), | 1154 new WebSocketHandshakeRequestInfo(GURL("http://www.example.com/"), |
| 1155 base::Time()))); | 1155 base::Time()))); |
| 1156 base::MessageLoop::current()->RunUntilIdle(); | 1156 base::MessageLoop::current()->RunUntilIdle(); |
| 1157 EXPECT_EQ(NULL, channel_.get()); | 1157 EXPECT_EQ(NULL, channel_.get()); |
| 1158 } | 1158 } |
| 1159 | 1159 |
| 1160 TEST_F(WebSocketChannelDeletingTest, OnNotifyFinishOpeningHandshakeError) { | 1160 TEST_F(WebSocketChannelDeletingTest, OnNotifyFinishOpeningHandshakeError) { |
| 1161 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1161 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1162 new ReadableFakeWebSocketStream); | 1162 new ReadableFakeWebSocketStream); |
| 1163 static const InitFrame frames[] = { | 1163 static const InitFrame frames[] = { |
| 1164 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1164 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1165 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1165 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1166 set_stream(stream.Pass()); | 1166 set_stream(std::move(stream)); |
| 1167 deleting_ = EVENT_ON_FINISH_OPENING_HANDSHAKE; | 1167 deleting_ = EVENT_ON_FINISH_OPENING_HANDSHAKE; |
| 1168 | 1168 |
| 1169 CreateChannelAndConnectSuccessfully(); | 1169 CreateChannelAndConnectSuccessfully(); |
| 1170 ASSERT_TRUE(channel_); | 1170 ASSERT_TRUE(channel_); |
| 1171 scoped_refptr<HttpResponseHeaders> response_headers( | 1171 scoped_refptr<HttpResponseHeaders> response_headers( |
| 1172 new HttpResponseHeaders("")); | 1172 new HttpResponseHeaders("")); |
| 1173 channel_->OnFinishOpeningHandshake(scoped_ptr<WebSocketHandshakeResponseInfo>( | 1173 channel_->OnFinishOpeningHandshake(scoped_ptr<WebSocketHandshakeResponseInfo>( |
| 1174 new WebSocketHandshakeResponseInfo(GURL("http://www.example.com/"), | 1174 new WebSocketHandshakeResponseInfo(GURL("http://www.example.com/"), |
| 1175 200, | 1175 200, |
| 1176 "OK", | 1176 "OK", |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1189 WebSocketFrameHeader::kOpCodeText, | 1189 WebSocketFrameHeader::kOpCodeText, |
| 1190 std::vector<char>(kDefaultInitialQuota * 2, 'T')); | 1190 std::vector<char>(kDefaultInitialQuota * 2, 'T')); |
| 1191 EXPECT_EQ(NULL, channel_.get()); | 1191 EXPECT_EQ(NULL, channel_.get()); |
| 1192 } | 1192 } |
| 1193 | 1193 |
| 1194 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { | 1194 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { |
| 1195 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1195 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1196 new ReadableFakeWebSocketStream); | 1196 new ReadableFakeWebSocketStream); |
| 1197 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1197 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1198 ERR_WS_PROTOCOL_ERROR); | 1198 ERR_WS_PROTOCOL_ERROR); |
| 1199 set_stream(stream.Pass()); | 1199 set_stream(std::move(stream)); |
| 1200 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1200 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1201 CreateChannelAndConnectSuccessfully(); | 1201 CreateChannelAndConnectSuccessfully(); |
| 1202 ASSERT_TRUE(channel_); | 1202 ASSERT_TRUE(channel_); |
| 1203 base::MessageLoop::current()->RunUntilIdle(); | 1203 base::MessageLoop::current()->RunUntilIdle(); |
| 1204 EXPECT_EQ(NULL, channel_.get()); | 1204 EXPECT_EQ(NULL, channel_.get()); |
| 1205 } | 1205 } |
| 1206 | 1206 |
| 1207 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToMaskedFrame) { | 1207 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToMaskedFrame) { |
| 1208 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1208 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1209 new ReadableFakeWebSocketStream); | 1209 new ReadableFakeWebSocketStream); |
| 1210 static const InitFrame frames[] = { | 1210 static const InitFrame frames[] = { |
| 1211 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; | 1211 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; |
| 1212 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1212 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1213 set_stream(stream.Pass()); | 1213 set_stream(std::move(stream)); |
| 1214 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1214 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1215 | 1215 |
| 1216 CreateChannelAndConnectSuccessfully(); | 1216 CreateChannelAndConnectSuccessfully(); |
| 1217 EXPECT_EQ(NULL, channel_.get()); | 1217 EXPECT_EQ(NULL, channel_.get()); |
| 1218 } | 1218 } |
| 1219 | 1219 |
| 1220 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrame) { | 1220 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrame) { |
| 1221 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1221 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1222 new ReadableFakeWebSocketStream); | 1222 new ReadableFakeWebSocketStream); |
| 1223 static const InitFrame frames[] = { | 1223 static const InitFrame frames[] = { |
| 1224 {FINAL_FRAME, 0xF, NOT_MASKED, ""}}; | 1224 {FINAL_FRAME, 0xF, NOT_MASKED, ""}}; |
| 1225 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1225 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1226 set_stream(stream.Pass()); | 1226 set_stream(std::move(stream)); |
| 1227 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1227 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1228 | 1228 |
| 1229 CreateChannelAndConnectSuccessfully(); | 1229 CreateChannelAndConnectSuccessfully(); |
| 1230 EXPECT_EQ(NULL, channel_.get()); | 1230 EXPECT_EQ(NULL, channel_.get()); |
| 1231 } | 1231 } |
| 1232 | 1232 |
| 1233 // Version of above test with NULL data. | 1233 // Version of above test with NULL data. |
| 1234 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrameNull) { | 1234 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrameNull) { |
| 1235 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1235 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1236 new ReadableFakeWebSocketStream); | 1236 new ReadableFakeWebSocketStream); |
| 1237 static const InitFrame frames[] = { | 1237 static const InitFrame frames[] = { |
| 1238 {FINAL_FRAME, 0xF, NOT_MASKED, NULL}}; | 1238 {FINAL_FRAME, 0xF, NOT_MASKED, NULL}}; |
| 1239 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1239 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1240 set_stream(stream.Pass()); | 1240 set_stream(std::move(stream)); |
| 1241 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1241 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1242 | 1242 |
| 1243 CreateChannelAndConnectSuccessfully(); | 1243 CreateChannelAndConnectSuccessfully(); |
| 1244 EXPECT_EQ(NULL, channel_.get()); | 1244 EXPECT_EQ(NULL, channel_.get()); |
| 1245 } | 1245 } |
| 1246 | 1246 |
| 1247 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterClose) { | 1247 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterClose) { |
| 1248 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1248 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1249 new ReadableFakeWebSocketStream); | 1249 new ReadableFakeWebSocketStream); |
| 1250 static const InitFrame frames[] = { | 1250 static const InitFrame frames[] = { |
| 1251 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, | 1251 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, |
| 1252 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, | 1252 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, |
| 1253 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; | 1253 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; |
| 1254 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1254 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1255 set_stream(stream.Pass()); | 1255 set_stream(std::move(stream)); |
| 1256 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1256 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1257 | 1257 |
| 1258 CreateChannelAndConnectSuccessfully(); | 1258 CreateChannelAndConnectSuccessfully(); |
| 1259 EXPECT_EQ(NULL, channel_.get()); | 1259 EXPECT_EQ(NULL, channel_.get()); |
| 1260 } | 1260 } |
| 1261 | 1261 |
| 1262 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterCloseNull) { | 1262 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterCloseNull) { |
| 1263 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1263 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1264 new ReadableFakeWebSocketStream); | 1264 new ReadableFakeWebSocketStream); |
| 1265 static const InitFrame frames[] = { | 1265 static const InitFrame frames[] = { |
| 1266 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, | 1266 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, |
| 1267 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, | 1267 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, |
| 1268 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; | 1268 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; |
| 1269 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1269 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1270 set_stream(stream.Pass()); | 1270 set_stream(std::move(stream)); |
| 1271 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1271 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1272 | 1272 |
| 1273 CreateChannelAndConnectSuccessfully(); | 1273 CreateChannelAndConnectSuccessfully(); |
| 1274 EXPECT_EQ(NULL, channel_.get()); | 1274 EXPECT_EQ(NULL, channel_.get()); |
| 1275 } | 1275 } |
| 1276 | 1276 |
| 1277 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCode) { | 1277 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCode) { |
| 1278 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1278 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1279 new ReadableFakeWebSocketStream); | 1279 new ReadableFakeWebSocketStream); |
| 1280 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, ""}}; | 1280 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, ""}}; |
| 1281 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1281 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1282 set_stream(stream.Pass()); | 1282 set_stream(std::move(stream)); |
| 1283 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1283 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1284 | 1284 |
| 1285 CreateChannelAndConnectSuccessfully(); | 1285 CreateChannelAndConnectSuccessfully(); |
| 1286 EXPECT_EQ(NULL, channel_.get()); | 1286 EXPECT_EQ(NULL, channel_.get()); |
| 1287 } | 1287 } |
| 1288 | 1288 |
| 1289 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCodeNull) { | 1289 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCodeNull) { |
| 1290 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1290 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1291 new ReadableFakeWebSocketStream); | 1291 new ReadableFakeWebSocketStream); |
| 1292 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, NULL}}; | 1292 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, NULL}}; |
| 1293 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1293 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1294 set_stream(stream.Pass()); | 1294 set_stream(std::move(stream)); |
| 1295 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1295 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1296 | 1296 |
| 1297 CreateChannelAndConnectSuccessfully(); | 1297 CreateChannelAndConnectSuccessfully(); |
| 1298 EXPECT_EQ(NULL, channel_.get()); | 1298 EXPECT_EQ(NULL, channel_.get()); |
| 1299 } | 1299 } |
| 1300 | 1300 |
| 1301 TEST_F(WebSocketChannelDeletingTest, FailChannelDueInvalidCloseReason) { | 1301 TEST_F(WebSocketChannelDeletingTest, FailChannelDueInvalidCloseReason) { |
| 1302 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1302 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1303 new ReadableFakeWebSocketStream); | 1303 new ReadableFakeWebSocketStream); |
| 1304 static const InitFrame frames[] = { | 1304 static const InitFrame frames[] = { |
| 1305 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 1305 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 1306 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "\xFF")}}; | 1306 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "\xFF")}}; |
| 1307 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1307 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1308 set_stream(stream.Pass()); | 1308 set_stream(std::move(stream)); |
| 1309 deleting_ = EVENT_ON_FAIL_CHANNEL; | 1309 deleting_ = EVENT_ON_FAIL_CHANNEL; |
| 1310 | 1310 |
| 1311 CreateChannelAndConnectSuccessfully(); | 1311 CreateChannelAndConnectSuccessfully(); |
| 1312 EXPECT_EQ(NULL, channel_.get()); | 1312 EXPECT_EQ(NULL, channel_.get()); |
| 1313 } | 1313 } |
| 1314 | 1314 |
| 1315 TEST_F(WebSocketChannelEventInterfaceTest, ConnectSuccessReported) { | 1315 TEST_F(WebSocketChannelEventInterfaceTest, ConnectSuccessReported) { |
| 1316 // false means success. | 1316 // false means success. |
| 1317 EXPECT_CALL(*event_interface_, OnAddChannelResponse("", "")); | 1317 EXPECT_CALL(*event_interface_, OnAddChannelResponse("", "")); |
| 1318 // OnFlowControl is always called immediately after connect to provide initial | 1318 // OnFlowControl is always called immediately after connect to provide initial |
| 1319 // quota to the renderer. | 1319 // quota to the renderer. |
| 1320 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1320 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1321 | 1321 |
| 1322 CreateChannelAndConnect(); | 1322 CreateChannelAndConnect(); |
| 1323 | 1323 |
| 1324 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 1324 connect_data_.creator.connect_delegate->OnSuccess(std::move(stream_)); |
| 1325 } | 1325 } |
| 1326 | 1326 |
| 1327 TEST_F(WebSocketChannelEventInterfaceTest, ConnectFailureReported) { | 1327 TEST_F(WebSocketChannelEventInterfaceTest, ConnectFailureReported) { |
| 1328 EXPECT_CALL(*event_interface_, OnFailChannel("hello")); | 1328 EXPECT_CALL(*event_interface_, OnFailChannel("hello")); |
| 1329 | 1329 |
| 1330 CreateChannelAndConnect(); | 1330 CreateChannelAndConnect(); |
| 1331 | 1331 |
| 1332 connect_data_.creator.connect_delegate->OnFailure("hello"); | 1332 connect_data_.creator.connect_delegate->OnFailure("hello"); |
| 1333 } | 1333 } |
| 1334 | 1334 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1361 | 1361 |
| 1362 // The first frames from the server can arrive together with the handshake, in | 1362 // The first frames from the server can arrive together with the handshake, in |
| 1363 // which case they will be available as soon as ReadFrames() is called the first | 1363 // which case they will be available as soon as ReadFrames() is called the first |
| 1364 // time. | 1364 // time. |
| 1365 TEST_F(WebSocketChannelEventInterfaceTest, DataLeftFromHandshake) { | 1365 TEST_F(WebSocketChannelEventInterfaceTest, DataLeftFromHandshake) { |
| 1366 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1366 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1367 new ReadableFakeWebSocketStream); | 1367 new ReadableFakeWebSocketStream); |
| 1368 static const InitFrame frames[] = { | 1368 static const InitFrame frames[] = { |
| 1369 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1369 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1370 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1370 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1371 set_stream(stream.Pass()); | 1371 set_stream(std::move(stream)); |
| 1372 { | 1372 { |
| 1373 InSequence s; | 1373 InSequence s; |
| 1374 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1374 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1375 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1375 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1376 EXPECT_CALL( | 1376 EXPECT_CALL( |
| 1377 *event_interface_, | 1377 *event_interface_, |
| 1378 OnDataFrame( | 1378 OnDataFrame( |
| 1379 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); | 1379 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); |
| 1380 } | 1380 } |
| 1381 | 1381 |
| 1382 CreateChannelAndConnectSuccessfully(); | 1382 CreateChannelAndConnectSuccessfully(); |
| 1383 } | 1383 } |
| 1384 | 1384 |
| 1385 // A remote server could accept the handshake, but then immediately send a | 1385 // A remote server could accept the handshake, but then immediately send a |
| 1386 // Close frame. | 1386 // Close frame. |
| 1387 TEST_F(WebSocketChannelEventInterfaceTest, CloseAfterHandshake) { | 1387 TEST_F(WebSocketChannelEventInterfaceTest, CloseAfterHandshake) { |
| 1388 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1388 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1389 new ReadableFakeWebSocketStream); | 1389 new ReadableFakeWebSocketStream); |
| 1390 static const InitFrame frames[] = { | 1390 static const InitFrame frames[] = { |
| 1391 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 1391 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 1392 NOT_MASKED, CLOSE_DATA(SERVER_ERROR, "Internal Server Error")}}; | 1392 NOT_MASKED, CLOSE_DATA(SERVER_ERROR, "Internal Server Error")}}; |
| 1393 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1393 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1394 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, | 1394 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, |
| 1395 ERR_CONNECTION_CLOSED); | 1395 ERR_CONNECTION_CLOSED); |
| 1396 set_stream(stream.Pass()); | 1396 set_stream(std::move(stream)); |
| 1397 { | 1397 { |
| 1398 InSequence s; | 1398 InSequence s; |
| 1399 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1399 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1400 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1400 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1401 EXPECT_CALL(*event_interface_, OnClosingHandshake()); | 1401 EXPECT_CALL(*event_interface_, OnClosingHandshake()); |
| 1402 EXPECT_CALL( | 1402 EXPECT_CALL( |
| 1403 *event_interface_, | 1403 *event_interface_, |
| 1404 OnDropChannel( | 1404 OnDropChannel( |
| 1405 true, kWebSocketErrorInternalServerError, "Internal Server Error")); | 1405 true, kWebSocketErrorInternalServerError, "Internal Server Error")); |
| 1406 } | 1406 } |
| 1407 | 1407 |
| 1408 CreateChannelAndConnectSuccessfully(); | 1408 CreateChannelAndConnectSuccessfully(); |
| 1409 } | 1409 } |
| 1410 | 1410 |
| 1411 // A remote server could close the connection immediately after sending the | 1411 // A remote server could close the connection immediately after sending the |
| 1412 // handshake response (most likely a bug in the server). | 1412 // handshake response (most likely a bug in the server). |
| 1413 TEST_F(WebSocketChannelEventInterfaceTest, ConnectionCloseAfterHandshake) { | 1413 TEST_F(WebSocketChannelEventInterfaceTest, ConnectionCloseAfterHandshake) { |
| 1414 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1414 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1415 new ReadableFakeWebSocketStream); | 1415 new ReadableFakeWebSocketStream); |
| 1416 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, | 1416 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, |
| 1417 ERR_CONNECTION_CLOSED); | 1417 ERR_CONNECTION_CLOSED); |
| 1418 set_stream(stream.Pass()); | 1418 set_stream(std::move(stream)); |
| 1419 { | 1419 { |
| 1420 InSequence s; | 1420 InSequence s; |
| 1421 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1421 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1422 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1422 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1423 EXPECT_CALL(*event_interface_, | 1423 EXPECT_CALL(*event_interface_, |
| 1424 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); | 1424 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); |
| 1425 } | 1425 } |
| 1426 | 1426 |
| 1427 CreateChannelAndConnectSuccessfully(); | 1427 CreateChannelAndConnectSuccessfully(); |
| 1428 } | 1428 } |
| 1429 | 1429 |
| 1430 TEST_F(WebSocketChannelEventInterfaceTest, NormalAsyncRead) { | 1430 TEST_F(WebSocketChannelEventInterfaceTest, NormalAsyncRead) { |
| 1431 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1431 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1432 new ReadableFakeWebSocketStream); | 1432 new ReadableFakeWebSocketStream); |
| 1433 static const InitFrame frames[] = { | 1433 static const InitFrame frames[] = { |
| 1434 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1434 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1435 // We use this checkpoint object to verify that the callback isn't called | 1435 // We use this checkpoint object to verify that the callback isn't called |
| 1436 // until we expect it to be. | 1436 // until we expect it to be. |
| 1437 Checkpoint checkpoint; | 1437 Checkpoint checkpoint; |
| 1438 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1438 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1439 set_stream(stream.Pass()); | 1439 set_stream(std::move(stream)); |
| 1440 { | 1440 { |
| 1441 InSequence s; | 1441 InSequence s; |
| 1442 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1442 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1443 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1443 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1444 EXPECT_CALL(checkpoint, Call(1)); | 1444 EXPECT_CALL(checkpoint, Call(1)); |
| 1445 EXPECT_CALL( | 1445 EXPECT_CALL( |
| 1446 *event_interface_, | 1446 *event_interface_, |
| 1447 OnDataFrame( | 1447 OnDataFrame( |
| 1448 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); | 1448 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); |
| 1449 EXPECT_CALL(checkpoint, Call(2)); | 1449 EXPECT_CALL(checkpoint, Call(2)); |
| 1450 } | 1450 } |
| 1451 | 1451 |
| 1452 CreateChannelAndConnectSuccessfully(); | 1452 CreateChannelAndConnectSuccessfully(); |
| 1453 checkpoint.Call(1); | 1453 checkpoint.Call(1); |
| 1454 base::MessageLoop::current()->RunUntilIdle(); | 1454 base::MessageLoop::current()->RunUntilIdle(); |
| 1455 checkpoint.Call(2); | 1455 checkpoint.Call(2); |
| 1456 } | 1456 } |
| 1457 | 1457 |
| 1458 // Extra data can arrive while a read is being processed, resulting in the next | 1458 // Extra data can arrive while a read is being processed, resulting in the next |
| 1459 // read completing synchronously. | 1459 // read completing synchronously. |
| 1460 TEST_F(WebSocketChannelEventInterfaceTest, AsyncThenSyncRead) { | 1460 TEST_F(WebSocketChannelEventInterfaceTest, AsyncThenSyncRead) { |
| 1461 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1461 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1462 new ReadableFakeWebSocketStream); | 1462 new ReadableFakeWebSocketStream); |
| 1463 static const InitFrame frames1[] = { | 1463 static const InitFrame frames1[] = { |
| 1464 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; | 1464 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "HELLO"}}; |
| 1465 static const InitFrame frames2[] = { | 1465 static const InitFrame frames2[] = { |
| 1466 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "WORLD"}}; | 1466 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "WORLD"}}; |
| 1467 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); | 1467 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); |
| 1468 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames2); | 1468 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames2); |
| 1469 set_stream(stream.Pass()); | 1469 set_stream(std::move(stream)); |
| 1470 { | 1470 { |
| 1471 InSequence s; | 1471 InSequence s; |
| 1472 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1472 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1473 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1473 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1474 EXPECT_CALL( | 1474 EXPECT_CALL( |
| 1475 *event_interface_, | 1475 *event_interface_, |
| 1476 OnDataFrame( | 1476 OnDataFrame( |
| 1477 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); | 1477 true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); |
| 1478 EXPECT_CALL( | 1478 EXPECT_CALL( |
| 1479 *event_interface_, | 1479 *event_interface_, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1501 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 1501 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 1502 NOT_MASKED, "SMALL"}}; | 1502 NOT_MASKED, "SMALL"}}; |
| 1503 static const InitFrame frames3[] = { | 1503 static const InitFrame frames3[] = { |
| 1504 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 1504 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 1505 NOT_MASKED, " "}, | 1505 NOT_MASKED, " "}, |
| 1506 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 1506 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 1507 NOT_MASKED, "FRAMES"}}; | 1507 NOT_MASKED, "FRAMES"}}; |
| 1508 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); | 1508 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); |
| 1509 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames2); | 1509 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames2); |
| 1510 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames3); | 1510 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames3); |
| 1511 set_stream(stream.Pass()); | 1511 set_stream(std::move(stream)); |
| 1512 { | 1512 { |
| 1513 InSequence s; | 1513 InSequence s; |
| 1514 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1514 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1515 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1515 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1516 EXPECT_CALL( | 1516 EXPECT_CALL( |
| 1517 *event_interface_, | 1517 *event_interface_, |
| 1518 OnDataFrame( | 1518 OnDataFrame( |
| 1519 false, WebSocketFrameHeader::kOpCodeText, AsVector("THREE"))); | 1519 false, WebSocketFrameHeader::kOpCodeText, AsVector("THREE"))); |
| 1520 EXPECT_CALL( | 1520 EXPECT_CALL( |
| 1521 *event_interface_, | 1521 *event_interface_, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1539 base::MessageLoop::current()->RunUntilIdle(); | 1539 base::MessageLoop::current()->RunUntilIdle(); |
| 1540 } | 1540 } |
| 1541 | 1541 |
| 1542 // A message can consist of one frame with NULL payload. | 1542 // A message can consist of one frame with NULL payload. |
| 1543 TEST_F(WebSocketChannelEventInterfaceTest, NullMessage) { | 1543 TEST_F(WebSocketChannelEventInterfaceTest, NullMessage) { |
| 1544 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1544 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1545 new ReadableFakeWebSocketStream); | 1545 new ReadableFakeWebSocketStream); |
| 1546 static const InitFrame frames[] = { | 1546 static const InitFrame frames[] = { |
| 1547 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, NULL}}; | 1547 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, NULL}}; |
| 1548 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1548 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1549 set_stream(stream.Pass()); | 1549 set_stream(std::move(stream)); |
| 1550 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1550 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1551 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1551 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1552 EXPECT_CALL( | 1552 EXPECT_CALL( |
| 1553 *event_interface_, | 1553 *event_interface_, |
| 1554 OnDataFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); | 1554 OnDataFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); |
| 1555 CreateChannelAndConnectSuccessfully(); | 1555 CreateChannelAndConnectSuccessfully(); |
| 1556 } | 1556 } |
| 1557 | 1557 |
| 1558 // Connection closed by the remote host without a closing handshake. | 1558 // Connection closed by the remote host without a closing handshake. |
| 1559 TEST_F(WebSocketChannelEventInterfaceTest, AsyncAbnormalClosure) { | 1559 TEST_F(WebSocketChannelEventInterfaceTest, AsyncAbnormalClosure) { |
| 1560 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1560 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1561 new ReadableFakeWebSocketStream); | 1561 new ReadableFakeWebSocketStream); |
| 1562 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1562 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1563 ERR_CONNECTION_CLOSED); | 1563 ERR_CONNECTION_CLOSED); |
| 1564 set_stream(stream.Pass()); | 1564 set_stream(std::move(stream)); |
| 1565 { | 1565 { |
| 1566 InSequence s; | 1566 InSequence s; |
| 1567 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1567 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1568 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1568 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1569 EXPECT_CALL(*event_interface_, | 1569 EXPECT_CALL(*event_interface_, |
| 1570 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); | 1570 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); |
| 1571 } | 1571 } |
| 1572 | 1572 |
| 1573 CreateChannelAndConnectSuccessfully(); | 1573 CreateChannelAndConnectSuccessfully(); |
| 1574 base::MessageLoop::current()->RunUntilIdle(); | 1574 base::MessageLoop::current()->RunUntilIdle(); |
| 1575 } | 1575 } |
| 1576 | 1576 |
| 1577 // A connection reset should produce the same event as an unexpected closure. | 1577 // A connection reset should produce the same event as an unexpected closure. |
| 1578 TEST_F(WebSocketChannelEventInterfaceTest, ConnectionReset) { | 1578 TEST_F(WebSocketChannelEventInterfaceTest, ConnectionReset) { |
| 1579 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1579 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1580 new ReadableFakeWebSocketStream); | 1580 new ReadableFakeWebSocketStream); |
| 1581 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1581 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1582 ERR_CONNECTION_RESET); | 1582 ERR_CONNECTION_RESET); |
| 1583 set_stream(stream.Pass()); | 1583 set_stream(std::move(stream)); |
| 1584 { | 1584 { |
| 1585 InSequence s; | 1585 InSequence s; |
| 1586 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1586 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1587 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1587 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1588 EXPECT_CALL(*event_interface_, | 1588 EXPECT_CALL(*event_interface_, |
| 1589 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); | 1589 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)); |
| 1590 } | 1590 } |
| 1591 | 1591 |
| 1592 CreateChannelAndConnectSuccessfully(); | 1592 CreateChannelAndConnectSuccessfully(); |
| 1593 base::MessageLoop::current()->RunUntilIdle(); | 1593 base::MessageLoop::current()->RunUntilIdle(); |
| 1594 } | 1594 } |
| 1595 | 1595 |
| 1596 // RFC6455 5.1 "A client MUST close a connection if it detects a masked frame." | 1596 // RFC6455 5.1 "A client MUST close a connection if it detects a masked frame." |
| 1597 TEST_F(WebSocketChannelEventInterfaceTest, MaskedFramesAreRejected) { | 1597 TEST_F(WebSocketChannelEventInterfaceTest, MaskedFramesAreRejected) { |
| 1598 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1598 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1599 new ReadableFakeWebSocketStream); | 1599 new ReadableFakeWebSocketStream); |
| 1600 static const InitFrame frames[] = { | 1600 static const InitFrame frames[] = { |
| 1601 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; | 1601 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; |
| 1602 | 1602 |
| 1603 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1603 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1604 set_stream(stream.Pass()); | 1604 set_stream(std::move(stream)); |
| 1605 { | 1605 { |
| 1606 InSequence s; | 1606 InSequence s; |
| 1607 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1607 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1608 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1608 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1609 EXPECT_CALL( | 1609 EXPECT_CALL( |
| 1610 *event_interface_, | 1610 *event_interface_, |
| 1611 OnFailChannel( | 1611 OnFailChannel( |
| 1612 "A server must not mask any frames that it sends to the client.")); | 1612 "A server must not mask any frames that it sends to the client.")); |
| 1613 } | 1613 } |
| 1614 | 1614 |
| 1615 CreateChannelAndConnectSuccessfully(); | 1615 CreateChannelAndConnectSuccessfully(); |
| 1616 base::MessageLoop::current()->RunUntilIdle(); | 1616 base::MessageLoop::current()->RunUntilIdle(); |
| 1617 } | 1617 } |
| 1618 | 1618 |
| 1619 // RFC6455 5.2 "If an unknown opcode is received, the receiving endpoint MUST | 1619 // RFC6455 5.2 "If an unknown opcode is received, the receiving endpoint MUST |
| 1620 // _Fail the WebSocket Connection_." | 1620 // _Fail the WebSocket Connection_." |
| 1621 TEST_F(WebSocketChannelEventInterfaceTest, UnknownOpCodeIsRejected) { | 1621 TEST_F(WebSocketChannelEventInterfaceTest, UnknownOpCodeIsRejected) { |
| 1622 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1622 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1623 new ReadableFakeWebSocketStream); | 1623 new ReadableFakeWebSocketStream); |
| 1624 static const InitFrame frames[] = {{FINAL_FRAME, 4, NOT_MASKED, "HELLO"}}; | 1624 static const InitFrame frames[] = {{FINAL_FRAME, 4, NOT_MASKED, "HELLO"}}; |
| 1625 | 1625 |
| 1626 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1626 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1627 set_stream(stream.Pass()); | 1627 set_stream(std::move(stream)); |
| 1628 { | 1628 { |
| 1629 InSequence s; | 1629 InSequence s; |
| 1630 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1630 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1631 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1631 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1632 EXPECT_CALL(*event_interface_, | 1632 EXPECT_CALL(*event_interface_, |
| 1633 OnFailChannel("Unrecognized frame opcode: 4")); | 1633 OnFailChannel("Unrecognized frame opcode: 4")); |
| 1634 } | 1634 } |
| 1635 | 1635 |
| 1636 CreateChannelAndConnectSuccessfully(); | 1636 CreateChannelAndConnectSuccessfully(); |
| 1637 base::MessageLoop::current()->RunUntilIdle(); | 1637 base::MessageLoop::current()->RunUntilIdle(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1648 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, | 1648 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, |
| 1649 NOT_MASKED, "SPLIT "}}; | 1649 NOT_MASKED, "SPLIT "}}; |
| 1650 static const InitFrame frames2[] = { | 1650 static const InitFrame frames2[] = { |
| 1651 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; | 1651 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; |
| 1652 static const InitFrame frames3[] = { | 1652 static const InitFrame frames3[] = { |
| 1653 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 1653 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 1654 NOT_MASKED, "MESSAGE"}}; | 1654 NOT_MASKED, "MESSAGE"}}; |
| 1655 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); | 1655 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames1); |
| 1656 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames2); | 1656 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames2); |
| 1657 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames3); | 1657 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames3); |
| 1658 set_stream(stream.Pass()); | 1658 set_stream(std::move(stream)); |
| 1659 { | 1659 { |
| 1660 InSequence s; | 1660 InSequence s; |
| 1661 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1661 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1662 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1662 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1663 EXPECT_CALL( | 1663 EXPECT_CALL( |
| 1664 *event_interface_, | 1664 *event_interface_, |
| 1665 OnDataFrame( | 1665 OnDataFrame( |
| 1666 false, WebSocketFrameHeader::kOpCodeText, AsVector("SPLIT "))); | 1666 false, WebSocketFrameHeader::kOpCodeText, AsVector("SPLIT "))); |
| 1667 EXPECT_CALL(*event_interface_, | 1667 EXPECT_CALL(*event_interface_, |
| 1668 OnDataFrame(true, | 1668 OnDataFrame(true, |
| 1669 WebSocketFrameHeader::kOpCodeContinuation, | 1669 WebSocketFrameHeader::kOpCodeContinuation, |
| 1670 AsVector("MESSAGE"))); | 1670 AsVector("MESSAGE"))); |
| 1671 } | 1671 } |
| 1672 | 1672 |
| 1673 CreateChannelAndConnectSuccessfully(); | 1673 CreateChannelAndConnectSuccessfully(); |
| 1674 base::MessageLoop::current()->RunUntilIdle(); | 1674 base::MessageLoop::current()->RunUntilIdle(); |
| 1675 } | 1675 } |
| 1676 | 1676 |
| 1677 // It seems redundant to repeat the entirety of the above test, so just test a | 1677 // It seems redundant to repeat the entirety of the above test, so just test a |
| 1678 // Pong with NULL data. | 1678 // Pong with NULL data. |
| 1679 TEST_F(WebSocketChannelEventInterfaceTest, PongWithNullData) { | 1679 TEST_F(WebSocketChannelEventInterfaceTest, PongWithNullData) { |
| 1680 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1680 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1681 new ReadableFakeWebSocketStream); | 1681 new ReadableFakeWebSocketStream); |
| 1682 static const InitFrame frames[] = { | 1682 static const InitFrame frames[] = { |
| 1683 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; | 1683 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; |
| 1684 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1684 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1685 set_stream(stream.Pass()); | 1685 set_stream(std::move(stream)); |
| 1686 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1686 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1687 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1687 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1688 | 1688 |
| 1689 CreateChannelAndConnectSuccessfully(); | 1689 CreateChannelAndConnectSuccessfully(); |
| 1690 base::MessageLoop::current()->RunUntilIdle(); | 1690 base::MessageLoop::current()->RunUntilIdle(); |
| 1691 } | 1691 } |
| 1692 | 1692 |
| 1693 // If a frame has an invalid header, then the connection is closed and | 1693 // If a frame has an invalid header, then the connection is closed and |
| 1694 // subsequent frames must not trigger events. | 1694 // subsequent frames must not trigger events. |
| 1695 TEST_F(WebSocketChannelEventInterfaceTest, FrameAfterInvalidFrame) { | 1695 TEST_F(WebSocketChannelEventInterfaceTest, FrameAfterInvalidFrame) { |
| 1696 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1696 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1697 new ReadableFakeWebSocketStream); | 1697 new ReadableFakeWebSocketStream); |
| 1698 static const InitFrame frames[] = { | 1698 static const InitFrame frames[] = { |
| 1699 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}, | 1699 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}, |
| 1700 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, " WORLD"}}; | 1700 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, " WORLD"}}; |
| 1701 | 1701 |
| 1702 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 1702 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 1703 set_stream(stream.Pass()); | 1703 set_stream(std::move(stream)); |
| 1704 { | 1704 { |
| 1705 InSequence s; | 1705 InSequence s; |
| 1706 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1706 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1707 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1707 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1708 EXPECT_CALL( | 1708 EXPECT_CALL( |
| 1709 *event_interface_, | 1709 *event_interface_, |
| 1710 OnFailChannel( | 1710 OnFailChannel( |
| 1711 "A server must not mask any frames that it sends to the client.")); | 1711 "A server must not mask any frames that it sends to the client.")); |
| 1712 } | 1712 } |
| 1713 | 1713 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1868 // When the remote server sends a Close frame with an empty payload, | 1868 // When the remote server sends a Close frame with an empty payload, |
| 1869 // WebSocketChannel should report code 1005, kWebSocketErrorNoStatusReceived. | 1869 // WebSocketChannel should report code 1005, kWebSocketErrorNoStatusReceived. |
| 1870 TEST_F(WebSocketChannelEventInterfaceTest, CloseWithNoPayloadGivesStatus1005) { | 1870 TEST_F(WebSocketChannelEventInterfaceTest, CloseWithNoPayloadGivesStatus1005) { |
| 1871 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1871 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1872 new ReadableFakeWebSocketStream); | 1872 new ReadableFakeWebSocketStream); |
| 1873 static const InitFrame frames[] = { | 1873 static const InitFrame frames[] = { |
| 1874 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, ""}}; | 1874 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, ""}}; |
| 1875 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1875 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1876 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, | 1876 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, |
| 1877 ERR_CONNECTION_CLOSED); | 1877 ERR_CONNECTION_CLOSED); |
| 1878 set_stream(stream.Pass()); | 1878 set_stream(std::move(stream)); |
| 1879 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1879 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1880 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1880 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1881 EXPECT_CALL(*event_interface_, OnClosingHandshake()); | 1881 EXPECT_CALL(*event_interface_, OnClosingHandshake()); |
| 1882 EXPECT_CALL(*event_interface_, | 1882 EXPECT_CALL(*event_interface_, |
| 1883 OnDropChannel(true, kWebSocketErrorNoStatusReceived, _)); | 1883 OnDropChannel(true, kWebSocketErrorNoStatusReceived, _)); |
| 1884 | 1884 |
| 1885 CreateChannelAndConnectSuccessfully(); | 1885 CreateChannelAndConnectSuccessfully(); |
| 1886 } | 1886 } |
| 1887 | 1887 |
| 1888 // A version of the above test with NULL payload. | 1888 // A version of the above test with NULL payload. |
| 1889 TEST_F(WebSocketChannelEventInterfaceTest, | 1889 TEST_F(WebSocketChannelEventInterfaceTest, |
| 1890 CloseWithNullPayloadGivesStatus1005) { | 1890 CloseWithNullPayloadGivesStatus1005) { |
| 1891 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1891 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1892 new ReadableFakeWebSocketStream); | 1892 new ReadableFakeWebSocketStream); |
| 1893 static const InitFrame frames[] = { | 1893 static const InitFrame frames[] = { |
| 1894 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, NULL}}; | 1894 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, NULL}}; |
| 1895 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1895 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 1896 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, | 1896 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, |
| 1897 ERR_CONNECTION_CLOSED); | 1897 ERR_CONNECTION_CLOSED); |
| 1898 set_stream(stream.Pass()); | 1898 set_stream(std::move(stream)); |
| 1899 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1899 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1900 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1900 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1901 EXPECT_CALL(*event_interface_, OnClosingHandshake()); | 1901 EXPECT_CALL(*event_interface_, OnClosingHandshake()); |
| 1902 EXPECT_CALL(*event_interface_, | 1902 EXPECT_CALL(*event_interface_, |
| 1903 OnDropChannel(true, kWebSocketErrorNoStatusReceived, _)); | 1903 OnDropChannel(true, kWebSocketErrorNoStatusReceived, _)); |
| 1904 | 1904 |
| 1905 CreateChannelAndConnectSuccessfully(); | 1905 CreateChannelAndConnectSuccessfully(); |
| 1906 } | 1906 } |
| 1907 | 1907 |
| 1908 // If ReadFrames() returns ERR_WS_PROTOCOL_ERROR, then the connection must be | 1908 // If ReadFrames() returns ERR_WS_PROTOCOL_ERROR, then the connection must be |
| 1909 // failed. | 1909 // failed. |
| 1910 TEST_F(WebSocketChannelEventInterfaceTest, SyncProtocolErrorGivesStatus1002) { | 1910 TEST_F(WebSocketChannelEventInterfaceTest, SyncProtocolErrorGivesStatus1002) { |
| 1911 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1911 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1912 new ReadableFakeWebSocketStream); | 1912 new ReadableFakeWebSocketStream); |
| 1913 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, | 1913 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, |
| 1914 ERR_WS_PROTOCOL_ERROR); | 1914 ERR_WS_PROTOCOL_ERROR); |
| 1915 set_stream(stream.Pass()); | 1915 set_stream(std::move(stream)); |
| 1916 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1916 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1917 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1917 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1918 | 1918 |
| 1919 EXPECT_CALL(*event_interface_, OnFailChannel("Invalid frame header")); | 1919 EXPECT_CALL(*event_interface_, OnFailChannel("Invalid frame header")); |
| 1920 | 1920 |
| 1921 CreateChannelAndConnectSuccessfully(); | 1921 CreateChannelAndConnectSuccessfully(); |
| 1922 } | 1922 } |
| 1923 | 1923 |
| 1924 // Async version of above test. | 1924 // Async version of above test. |
| 1925 TEST_F(WebSocketChannelEventInterfaceTest, AsyncProtocolErrorGivesStatus1002) { | 1925 TEST_F(WebSocketChannelEventInterfaceTest, AsyncProtocolErrorGivesStatus1002) { |
| 1926 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1926 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 1927 new ReadableFakeWebSocketStream); | 1927 new ReadableFakeWebSocketStream); |
| 1928 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1928 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
| 1929 ERR_WS_PROTOCOL_ERROR); | 1929 ERR_WS_PROTOCOL_ERROR); |
| 1930 set_stream(stream.Pass()); | 1930 set_stream(std::move(stream)); |
| 1931 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1931 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1932 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1932 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1933 | 1933 |
| 1934 EXPECT_CALL(*event_interface_, OnFailChannel("Invalid frame header")); | 1934 EXPECT_CALL(*event_interface_, OnFailChannel("Invalid frame header")); |
| 1935 | 1935 |
| 1936 CreateChannelAndConnectSuccessfully(); | 1936 CreateChannelAndConnectSuccessfully(); |
| 1937 base::MessageLoop::current()->RunUntilIdle(); | 1937 base::MessageLoop::current()->RunUntilIdle(); |
| 1938 } | 1938 } |
| 1939 | 1939 |
| 1940 TEST_F(WebSocketChannelEventInterfaceTest, StartHandshakeRequest) { | 1940 TEST_F(WebSocketChannelEventInterfaceTest, StartHandshakeRequest) { |
| 1941 { | 1941 { |
| 1942 InSequence s; | 1942 InSequence s; |
| 1943 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1943 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1944 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1944 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1945 EXPECT_CALL(*event_interface_, OnStartOpeningHandshakeCalled()); | 1945 EXPECT_CALL(*event_interface_, OnStartOpeningHandshakeCalled()); |
| 1946 } | 1946 } |
| 1947 | 1947 |
| 1948 CreateChannelAndConnectSuccessfully(); | 1948 CreateChannelAndConnectSuccessfully(); |
| 1949 | 1949 |
| 1950 scoped_ptr<WebSocketHandshakeRequestInfo> request_info( | 1950 scoped_ptr<WebSocketHandshakeRequestInfo> request_info( |
| 1951 new WebSocketHandshakeRequestInfo(GURL("ws://www.example.com/"), | 1951 new WebSocketHandshakeRequestInfo(GURL("ws://www.example.com/"), |
| 1952 base::Time())); | 1952 base::Time())); |
| 1953 connect_data_.creator.connect_delegate->OnStartOpeningHandshake( | 1953 connect_data_.creator.connect_delegate->OnStartOpeningHandshake( |
| 1954 request_info.Pass()); | 1954 std::move(request_info)); |
| 1955 | 1955 |
| 1956 base::MessageLoop::current()->RunUntilIdle(); | 1956 base::MessageLoop::current()->RunUntilIdle(); |
| 1957 } | 1957 } |
| 1958 | 1958 |
| 1959 TEST_F(WebSocketChannelEventInterfaceTest, FinishHandshakeRequest) { | 1959 TEST_F(WebSocketChannelEventInterfaceTest, FinishHandshakeRequest) { |
| 1960 { | 1960 { |
| 1961 InSequence s; | 1961 InSequence s; |
| 1962 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 1962 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 1963 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1963 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 1964 EXPECT_CALL(*event_interface_, OnFinishOpeningHandshakeCalled()); | 1964 EXPECT_CALL(*event_interface_, OnFinishOpeningHandshakeCalled()); |
| 1965 } | 1965 } |
| 1966 | 1966 |
| 1967 CreateChannelAndConnectSuccessfully(); | 1967 CreateChannelAndConnectSuccessfully(); |
| 1968 | 1968 |
| 1969 scoped_refptr<HttpResponseHeaders> response_headers( | 1969 scoped_refptr<HttpResponseHeaders> response_headers( |
| 1970 new HttpResponseHeaders("")); | 1970 new HttpResponseHeaders("")); |
| 1971 scoped_ptr<WebSocketHandshakeResponseInfo> response_info( | 1971 scoped_ptr<WebSocketHandshakeResponseInfo> response_info( |
| 1972 new WebSocketHandshakeResponseInfo(GURL("ws://www.example.com/"), | 1972 new WebSocketHandshakeResponseInfo(GURL("ws://www.example.com/"), |
| 1973 200, | 1973 200, |
| 1974 "OK", | 1974 "OK", |
| 1975 response_headers, | 1975 response_headers, |
| 1976 base::Time())); | 1976 base::Time())); |
| 1977 connect_data_.creator.connect_delegate->OnFinishOpeningHandshake( | 1977 connect_data_.creator.connect_delegate->OnFinishOpeningHandshake( |
| 1978 response_info.Pass()); | 1978 std::move(response_info)); |
| 1979 base::MessageLoop::current()->RunUntilIdle(); | 1979 base::MessageLoop::current()->RunUntilIdle(); |
| 1980 } | 1980 } |
| 1981 | 1981 |
| 1982 TEST_F(WebSocketChannelEventInterfaceTest, FailJustAfterHandshake) { | 1982 TEST_F(WebSocketChannelEventInterfaceTest, FailJustAfterHandshake) { |
| 1983 { | 1983 { |
| 1984 InSequence s; | 1984 InSequence s; |
| 1985 EXPECT_CALL(*event_interface_, OnStartOpeningHandshakeCalled()); | 1985 EXPECT_CALL(*event_interface_, OnStartOpeningHandshakeCalled()); |
| 1986 EXPECT_CALL(*event_interface_, OnFinishOpeningHandshakeCalled()); | 1986 EXPECT_CALL(*event_interface_, OnFinishOpeningHandshakeCalled()); |
| 1987 EXPECT_CALL(*event_interface_, OnFailChannel("bye")); | 1987 EXPECT_CALL(*event_interface_, OnFailChannel("bye")); |
| 1988 } | 1988 } |
| 1989 | 1989 |
| 1990 CreateChannelAndConnect(); | 1990 CreateChannelAndConnect(); |
| 1991 | 1991 |
| 1992 WebSocketStream::ConnectDelegate* connect_delegate = | 1992 WebSocketStream::ConnectDelegate* connect_delegate = |
| 1993 connect_data_.creator.connect_delegate.get(); | 1993 connect_data_.creator.connect_delegate.get(); |
| 1994 GURL url("ws://www.example.com/"); | 1994 GURL url("ws://www.example.com/"); |
| 1995 scoped_ptr<WebSocketHandshakeRequestInfo> request_info( | 1995 scoped_ptr<WebSocketHandshakeRequestInfo> request_info( |
| 1996 new WebSocketHandshakeRequestInfo(url, base::Time())); | 1996 new WebSocketHandshakeRequestInfo(url, base::Time())); |
| 1997 scoped_refptr<HttpResponseHeaders> response_headers( | 1997 scoped_refptr<HttpResponseHeaders> response_headers( |
| 1998 new HttpResponseHeaders("")); | 1998 new HttpResponseHeaders("")); |
| 1999 scoped_ptr<WebSocketHandshakeResponseInfo> response_info( | 1999 scoped_ptr<WebSocketHandshakeResponseInfo> response_info( |
| 2000 new WebSocketHandshakeResponseInfo(url, | 2000 new WebSocketHandshakeResponseInfo(url, |
| 2001 200, | 2001 200, |
| 2002 "OK", | 2002 "OK", |
| 2003 response_headers, | 2003 response_headers, |
| 2004 base::Time())); | 2004 base::Time())); |
| 2005 connect_delegate->OnStartOpeningHandshake(request_info.Pass()); | 2005 connect_delegate->OnStartOpeningHandshake(std::move(request_info)); |
| 2006 connect_delegate->OnFinishOpeningHandshake(response_info.Pass()); | 2006 connect_delegate->OnFinishOpeningHandshake(std::move(response_info)); |
| 2007 | 2007 |
| 2008 connect_delegate->OnFailure("bye"); | 2008 connect_delegate->OnFailure("bye"); |
| 2009 base::MessageLoop::current()->RunUntilIdle(); | 2009 base::MessageLoop::current()->RunUntilIdle(); |
| 2010 } | 2010 } |
| 2011 | 2011 |
| 2012 // Any frame after close is invalid. This test uses a Text frame. See also | 2012 // Any frame after close is invalid. This test uses a Text frame. See also |
| 2013 // test "PingAfterCloseIfRejected". | 2013 // test "PingAfterCloseIfRejected". |
| 2014 TEST_F(WebSocketChannelEventInterfaceTest, DataAfterCloseIsRejected) { | 2014 TEST_F(WebSocketChannelEventInterfaceTest, DataAfterCloseIsRejected) { |
| 2015 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2015 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2016 new ReadableFakeWebSocketStream); | 2016 new ReadableFakeWebSocketStream); |
| 2017 static const InitFrame frames[] = { | 2017 static const InitFrame frames[] = { |
| 2018 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, | 2018 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, |
| 2019 CLOSE_DATA(NORMAL_CLOSURE, "OK")}, | 2019 CLOSE_DATA(NORMAL_CLOSURE, "OK")}, |
| 2020 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "Payload"}}; | 2020 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "Payload"}}; |
| 2021 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2021 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2022 set_stream(stream.Pass()); | 2022 set_stream(std::move(stream)); |
| 2023 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2023 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2024 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2024 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2025 | 2025 |
| 2026 { | 2026 { |
| 2027 InSequence s; | 2027 InSequence s; |
| 2028 EXPECT_CALL(*event_interface_, OnClosingHandshake()); | 2028 EXPECT_CALL(*event_interface_, OnClosingHandshake()); |
| 2029 EXPECT_CALL(*event_interface_, | 2029 EXPECT_CALL(*event_interface_, |
| 2030 OnFailChannel("Data frame received after close")); | 2030 OnFailChannel("Data frame received after close")); |
| 2031 } | 2031 } |
| 2032 | 2032 |
| 2033 CreateChannelAndConnectSuccessfully(); | 2033 CreateChannelAndConnectSuccessfully(); |
| 2034 } | 2034 } |
| 2035 | 2035 |
| 2036 // A Close frame with a one-byte payload elicits a specific console error | 2036 // A Close frame with a one-byte payload elicits a specific console error |
| 2037 // message. | 2037 // message. |
| 2038 TEST_F(WebSocketChannelEventInterfaceTest, OneByteClosePayloadMessage) { | 2038 TEST_F(WebSocketChannelEventInterfaceTest, OneByteClosePayloadMessage) { |
| 2039 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2039 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2040 new ReadableFakeWebSocketStream); | 2040 new ReadableFakeWebSocketStream); |
| 2041 static const InitFrame frames[] = { | 2041 static const InitFrame frames[] = { |
| 2042 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, "\x03"}}; | 2042 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, "\x03"}}; |
| 2043 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2043 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2044 set_stream(stream.Pass()); | 2044 set_stream(std::move(stream)); |
| 2045 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2045 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2046 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2046 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2047 EXPECT_CALL( | 2047 EXPECT_CALL( |
| 2048 *event_interface_, | 2048 *event_interface_, |
| 2049 OnFailChannel( | 2049 OnFailChannel( |
| 2050 "Received a broken close frame containing an invalid size body.")); | 2050 "Received a broken close frame containing an invalid size body.")); |
| 2051 | 2051 |
| 2052 CreateChannelAndConnectSuccessfully(); | 2052 CreateChannelAndConnectSuccessfully(); |
| 2053 } | 2053 } |
| 2054 | 2054 |
| 2055 // A Close frame with a reserved status code also elicits a specific console | 2055 // A Close frame with a reserved status code also elicits a specific console |
| 2056 // error message. | 2056 // error message. |
| 2057 TEST_F(WebSocketChannelEventInterfaceTest, ClosePayloadReservedStatusMessage) { | 2057 TEST_F(WebSocketChannelEventInterfaceTest, ClosePayloadReservedStatusMessage) { |
| 2058 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2058 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2059 new ReadableFakeWebSocketStream); | 2059 new ReadableFakeWebSocketStream); |
| 2060 static const InitFrame frames[] = { | 2060 static const InitFrame frames[] = { |
| 2061 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 2061 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 2062 NOT_MASKED, CLOSE_DATA(ABNORMAL_CLOSURE, "Not valid on wire")}}; | 2062 NOT_MASKED, CLOSE_DATA(ABNORMAL_CLOSURE, "Not valid on wire")}}; |
| 2063 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2063 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2064 set_stream(stream.Pass()); | 2064 set_stream(std::move(stream)); |
| 2065 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2065 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2066 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2066 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2067 EXPECT_CALL( | 2067 EXPECT_CALL( |
| 2068 *event_interface_, | 2068 *event_interface_, |
| 2069 OnFailChannel( | 2069 OnFailChannel( |
| 2070 "Received a broken close frame containing a reserved status code.")); | 2070 "Received a broken close frame containing a reserved status code.")); |
| 2071 | 2071 |
| 2072 CreateChannelAndConnectSuccessfully(); | 2072 CreateChannelAndConnectSuccessfully(); |
| 2073 } | 2073 } |
| 2074 | 2074 |
| 2075 // A Close frame with invalid UTF-8 also elicits a specific console error | 2075 // A Close frame with invalid UTF-8 also elicits a specific console error |
| 2076 // message. | 2076 // message. |
| 2077 TEST_F(WebSocketChannelEventInterfaceTest, ClosePayloadInvalidReason) { | 2077 TEST_F(WebSocketChannelEventInterfaceTest, ClosePayloadInvalidReason) { |
| 2078 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2078 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2079 new ReadableFakeWebSocketStream); | 2079 new ReadableFakeWebSocketStream); |
| 2080 static const InitFrame frames[] = { | 2080 static const InitFrame frames[] = { |
| 2081 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 2081 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 2082 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "\xFF")}}; | 2082 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "\xFF")}}; |
| 2083 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2083 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2084 set_stream(stream.Pass()); | 2084 set_stream(std::move(stream)); |
| 2085 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2085 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2086 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2086 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2087 EXPECT_CALL( | 2087 EXPECT_CALL( |
| 2088 *event_interface_, | 2088 *event_interface_, |
| 2089 OnFailChannel( | 2089 OnFailChannel( |
| 2090 "Received a broken close frame containing invalid UTF-8.")); | 2090 "Received a broken close frame containing invalid UTF-8.")); |
| 2091 | 2091 |
| 2092 CreateChannelAndConnectSuccessfully(); | 2092 CreateChannelAndConnectSuccessfully(); |
| 2093 } | 2093 } |
| 2094 | 2094 |
| 2095 // The reserved bits must all be clear on received frames. Extensions should | 2095 // The reserved bits must all be clear on received frames. Extensions should |
| 2096 // clear the bits when they are set correctly before passing on the frame. | 2096 // clear the bits when they are set correctly before passing on the frame. |
| 2097 TEST_F(WebSocketChannelEventInterfaceTest, ReservedBitsMustNotBeSet) { | 2097 TEST_F(WebSocketChannelEventInterfaceTest, ReservedBitsMustNotBeSet) { |
| 2098 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2098 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2099 new ReadableFakeWebSocketStream); | 2099 new ReadableFakeWebSocketStream); |
| 2100 static const InitFrame frames[] = { | 2100 static const InitFrame frames[] = { |
| 2101 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, | 2101 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, |
| 2102 NOT_MASKED, "sakana"}}; | 2102 NOT_MASKED, "sakana"}}; |
| 2103 // It is not worth adding support for reserved bits to InitFrame just for this | 2103 // It is not worth adding support for reserved bits to InitFrame just for this |
| 2104 // one test, so set the bit manually. | 2104 // one test, so set the bit manually. |
| 2105 std::vector<scoped_ptr<WebSocketFrame>> raw_frames = | 2105 std::vector<scoped_ptr<WebSocketFrame>> raw_frames = |
| 2106 CreateFrameVector(frames); | 2106 CreateFrameVector(frames); |
| 2107 raw_frames[0]->header.reserved1 = true; | 2107 raw_frames[0]->header.reserved1 = true; |
| 2108 stream->PrepareRawReadFrames(ReadableFakeWebSocketStream::SYNC, OK, | 2108 stream->PrepareRawReadFrames(ReadableFakeWebSocketStream::SYNC, OK, |
| 2109 std::move(raw_frames)); | 2109 std::move(raw_frames)); |
| 2110 set_stream(stream.Pass()); | 2110 set_stream(std::move(stream)); |
| 2111 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2111 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2112 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2112 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2113 EXPECT_CALL(*event_interface_, | 2113 EXPECT_CALL(*event_interface_, |
| 2114 OnFailChannel( | 2114 OnFailChannel( |
| 2115 "One or more reserved bits are on: reserved1 = 1, " | 2115 "One or more reserved bits are on: reserved1 = 1, " |
| 2116 "reserved2 = 0, reserved3 = 0")); | 2116 "reserved2 = 0, reserved3 = 0")); |
| 2117 | 2117 |
| 2118 CreateChannelAndConnectSuccessfully(); | 2118 CreateChannelAndConnectSuccessfully(); |
| 2119 } | 2119 } |
| 2120 | 2120 |
| 2121 // The closing handshake times out and sends an OnDropChannel event if no | 2121 // The closing handshake times out and sends an OnDropChannel event if no |
| 2122 // response to the client Close message is received. | 2122 // response to the client Close message is received. |
| 2123 TEST_F(WebSocketChannelEventInterfaceTest, | 2123 TEST_F(WebSocketChannelEventInterfaceTest, |
| 2124 ClientInitiatedClosingHandshakeTimesOut) { | 2124 ClientInitiatedClosingHandshakeTimesOut) { |
| 2125 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2125 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2126 new ReadableFakeWebSocketStream); | 2126 new ReadableFakeWebSocketStream); |
| 2127 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, | 2127 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::SYNC, |
| 2128 ERR_IO_PENDING); | 2128 ERR_IO_PENDING); |
| 2129 set_stream(stream.Pass()); | 2129 set_stream(std::move(stream)); |
| 2130 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2130 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2131 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2131 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2132 // This checkpoint object verifies that the OnDropChannel message comes after | 2132 // This checkpoint object verifies that the OnDropChannel message comes after |
| 2133 // the timeout. | 2133 // the timeout. |
| 2134 Checkpoint checkpoint; | 2134 Checkpoint checkpoint; |
| 2135 TestClosure completion; | 2135 TestClosure completion; |
| 2136 { | 2136 { |
| 2137 InSequence s; | 2137 InSequence s; |
| 2138 EXPECT_CALL(checkpoint, Call(1)); | 2138 EXPECT_CALL(checkpoint, Call(1)); |
| 2139 EXPECT_CALL(*event_interface_, | 2139 EXPECT_CALL(*event_interface_, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2156 // The closing handshake times out and sends an OnDropChannel event if a Close | 2156 // The closing handshake times out and sends an OnDropChannel event if a Close |
| 2157 // message is received but the connection isn't closed by the remote host. | 2157 // message is received but the connection isn't closed by the remote host. |
| 2158 TEST_F(WebSocketChannelEventInterfaceTest, | 2158 TEST_F(WebSocketChannelEventInterfaceTest, |
| 2159 ServerInitiatedClosingHandshakeTimesOut) { | 2159 ServerInitiatedClosingHandshakeTimesOut) { |
| 2160 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2160 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2161 new ReadableFakeWebSocketStream); | 2161 new ReadableFakeWebSocketStream); |
| 2162 static const InitFrame frames[] = { | 2162 static const InitFrame frames[] = { |
| 2163 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 2163 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 2164 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "OK")}}; | 2164 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "OK")}}; |
| 2165 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 2165 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 2166 set_stream(stream.Pass()); | 2166 set_stream(std::move(stream)); |
| 2167 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2167 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2168 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2168 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2169 Checkpoint checkpoint; | 2169 Checkpoint checkpoint; |
| 2170 TestClosure completion; | 2170 TestClosure completion; |
| 2171 { | 2171 { |
| 2172 InSequence s; | 2172 InSequence s; |
| 2173 EXPECT_CALL(checkpoint, Call(1)); | 2173 EXPECT_CALL(checkpoint, Call(1)); |
| 2174 EXPECT_CALL(*event_interface_, OnClosingHandshake()); | 2174 EXPECT_CALL(*event_interface_, OnClosingHandshake()); |
| 2175 EXPECT_CALL(*event_interface_, | 2175 EXPECT_CALL(*event_interface_, |
| 2176 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)) | 2176 OnDropChannel(false, kWebSocketErrorAbnormalClosure, _)) |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2192 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2192 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2193 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2193 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2194 { | 2194 { |
| 2195 InSequence s; | 2195 InSequence s; |
| 2196 EXPECT_CALL(checkpoint, Call(1)); | 2196 EXPECT_CALL(checkpoint, Call(1)); |
| 2197 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) | 2197 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) |
| 2198 .WillOnce(Return(ERR_IO_PENDING)); | 2198 .WillOnce(Return(ERR_IO_PENDING)); |
| 2199 EXPECT_CALL(checkpoint, Call(2)); | 2199 EXPECT_CALL(checkpoint, Call(2)); |
| 2200 } | 2200 } |
| 2201 | 2201 |
| 2202 set_stream(mock_stream_.Pass()); | 2202 set_stream(std::move(mock_stream_)); |
| 2203 CreateChannelAndConnect(); | 2203 CreateChannelAndConnect(); |
| 2204 channel_->SendFlowControl(kPlentyOfQuota); | 2204 channel_->SendFlowControl(kPlentyOfQuota); |
| 2205 checkpoint.Call(1); | 2205 checkpoint.Call(1); |
| 2206 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 2206 connect_data_.creator.connect_delegate->OnSuccess(std::move(stream_)); |
| 2207 checkpoint.Call(2); | 2207 checkpoint.Call(2); |
| 2208 } | 2208 } |
| 2209 | 2209 |
| 2210 // If for some reason the connect succeeds before the renderer sends us quota, | 2210 // If for some reason the connect succeeds before the renderer sends us quota, |
| 2211 // we shouldn't call ReadFrames() immediately. | 2211 // we shouldn't call ReadFrames() immediately. |
| 2212 // TODO(ricea): Actually we should call ReadFrames() with a small limit so we | 2212 // TODO(ricea): Actually we should call ReadFrames() with a small limit so we |
| 2213 // can still handle control frames. This should be done once we have any API to | 2213 // can still handle control frames. This should be done once we have any API to |
| 2214 // expose quota to the lower levels. | 2214 // expose quota to the lower levels. |
| 2215 TEST_F(WebSocketChannelStreamTest, FlowControlLate) { | 2215 TEST_F(WebSocketChannelStreamTest, FlowControlLate) { |
| 2216 Checkpoint checkpoint; | 2216 Checkpoint checkpoint; |
| 2217 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2217 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2218 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2218 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2219 { | 2219 { |
| 2220 InSequence s; | 2220 InSequence s; |
| 2221 EXPECT_CALL(checkpoint, Call(1)); | 2221 EXPECT_CALL(checkpoint, Call(1)); |
| 2222 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) | 2222 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) |
| 2223 .WillOnce(Return(ERR_IO_PENDING)); | 2223 .WillOnce(Return(ERR_IO_PENDING)); |
| 2224 EXPECT_CALL(checkpoint, Call(2)); | 2224 EXPECT_CALL(checkpoint, Call(2)); |
| 2225 } | 2225 } |
| 2226 | 2226 |
| 2227 set_stream(mock_stream_.Pass()); | 2227 set_stream(std::move(mock_stream_)); |
| 2228 CreateChannelAndConnect(); | 2228 CreateChannelAndConnect(); |
| 2229 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 2229 connect_data_.creator.connect_delegate->OnSuccess(std::move(stream_)); |
| 2230 checkpoint.Call(1); | 2230 checkpoint.Call(1); |
| 2231 channel_->SendFlowControl(kPlentyOfQuota); | 2231 channel_->SendFlowControl(kPlentyOfQuota); |
| 2232 checkpoint.Call(2); | 2232 checkpoint.Call(2); |
| 2233 } | 2233 } |
| 2234 | 2234 |
| 2235 // We should stop calling ReadFrames() when all quota is used. | 2235 // We should stop calling ReadFrames() when all quota is used. |
| 2236 TEST_F(WebSocketChannelStreamTest, FlowControlStopsReadFrames) { | 2236 TEST_F(WebSocketChannelStreamTest, FlowControlStopsReadFrames) { |
| 2237 static const InitFrame frames[] = { | 2237 static const InitFrame frames[] = { |
| 2238 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; | 2238 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; |
| 2239 | 2239 |
| 2240 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2240 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2241 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2241 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2242 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) | 2242 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) |
| 2243 .WillOnce(ReturnFrames(&frames)); | 2243 .WillOnce(ReturnFrames(&frames)); |
| 2244 | 2244 |
| 2245 set_stream(mock_stream_.Pass()); | 2245 set_stream(std::move(mock_stream_)); |
| 2246 CreateChannelAndConnect(); | 2246 CreateChannelAndConnect(); |
| 2247 channel_->SendFlowControl(4); | 2247 channel_->SendFlowControl(4); |
| 2248 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 2248 connect_data_.creator.connect_delegate->OnSuccess(std::move(stream_)); |
| 2249 } | 2249 } |
| 2250 | 2250 |
| 2251 // Providing extra quota causes ReadFrames() to be called again. | 2251 // Providing extra quota causes ReadFrames() to be called again. |
| 2252 TEST_F(WebSocketChannelStreamTest, FlowControlStartsWithMoreQuota) { | 2252 TEST_F(WebSocketChannelStreamTest, FlowControlStartsWithMoreQuota) { |
| 2253 static const InitFrame frames[] = { | 2253 static const InitFrame frames[] = { |
| 2254 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; | 2254 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; |
| 2255 Checkpoint checkpoint; | 2255 Checkpoint checkpoint; |
| 2256 | 2256 |
| 2257 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2257 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2258 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2258 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2259 { | 2259 { |
| 2260 InSequence s; | 2260 InSequence s; |
| 2261 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) | 2261 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) |
| 2262 .WillOnce(ReturnFrames(&frames)); | 2262 .WillOnce(ReturnFrames(&frames)); |
| 2263 EXPECT_CALL(checkpoint, Call(1)); | 2263 EXPECT_CALL(checkpoint, Call(1)); |
| 2264 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) | 2264 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) |
| 2265 .WillOnce(Return(ERR_IO_PENDING)); | 2265 .WillOnce(Return(ERR_IO_PENDING)); |
| 2266 } | 2266 } |
| 2267 | 2267 |
| 2268 set_stream(mock_stream_.Pass()); | 2268 set_stream(std::move(mock_stream_)); |
| 2269 CreateChannelAndConnect(); | 2269 CreateChannelAndConnect(); |
| 2270 channel_->SendFlowControl(4); | 2270 channel_->SendFlowControl(4); |
| 2271 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 2271 connect_data_.creator.connect_delegate->OnSuccess(std::move(stream_)); |
| 2272 checkpoint.Call(1); | 2272 checkpoint.Call(1); |
| 2273 channel_->SendFlowControl(4); | 2273 channel_->SendFlowControl(4); |
| 2274 } | 2274 } |
| 2275 | 2275 |
| 2276 // ReadFrames() isn't called again until all pending data has been passed to | 2276 // ReadFrames() isn't called again until all pending data has been passed to |
| 2277 // the renderer. | 2277 // the renderer. |
| 2278 TEST_F(WebSocketChannelStreamTest, ReadFramesNotCalledUntilQuotaAvailable) { | 2278 TEST_F(WebSocketChannelStreamTest, ReadFramesNotCalledUntilQuotaAvailable) { |
| 2279 static const InitFrame frames[] = { | 2279 static const InitFrame frames[] = { |
| 2280 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; | 2280 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; |
| 2281 Checkpoint checkpoint; | 2281 Checkpoint checkpoint; |
| 2282 | 2282 |
| 2283 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); | 2283 EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber()); |
| 2284 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); | 2284 EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber()); |
| 2285 { | 2285 { |
| 2286 InSequence s; | 2286 InSequence s; |
| 2287 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) | 2287 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) |
| 2288 .WillOnce(ReturnFrames(&frames)); | 2288 .WillOnce(ReturnFrames(&frames)); |
| 2289 EXPECT_CALL(checkpoint, Call(1)); | 2289 EXPECT_CALL(checkpoint, Call(1)); |
| 2290 EXPECT_CALL(checkpoint, Call(2)); | 2290 EXPECT_CALL(checkpoint, Call(2)); |
| 2291 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) | 2291 EXPECT_CALL(*mock_stream_, ReadFrames(_, _)) |
| 2292 .WillOnce(Return(ERR_IO_PENDING)); | 2292 .WillOnce(Return(ERR_IO_PENDING)); |
| 2293 } | 2293 } |
| 2294 | 2294 |
| 2295 set_stream(mock_stream_.Pass()); | 2295 set_stream(std::move(mock_stream_)); |
| 2296 CreateChannelAndConnect(); | 2296 CreateChannelAndConnect(); |
| 2297 channel_->SendFlowControl(2); | 2297 channel_->SendFlowControl(2); |
| 2298 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 2298 connect_data_.creator.connect_delegate->OnSuccess(std::move(stream_)); |
| 2299 checkpoint.Call(1); | 2299 checkpoint.Call(1); |
| 2300 channel_->SendFlowControl(2); | 2300 channel_->SendFlowControl(2); |
| 2301 checkpoint.Call(2); | 2301 checkpoint.Call(2); |
| 2302 channel_->SendFlowControl(2); | 2302 channel_->SendFlowControl(2); |
| 2303 } | 2303 } |
| 2304 | 2304 |
| 2305 // A message that needs to be split into frames to fit within quota should | 2305 // A message that needs to be split into frames to fit within quota should |
| 2306 // maintain correct semantics. | 2306 // maintain correct semantics. |
| 2307 TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitSync) { | 2307 TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitSync) { |
| 2308 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2308 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2309 new ReadableFakeWebSocketStream); | 2309 new ReadableFakeWebSocketStream); |
| 2310 static const InitFrame frames[] = { | 2310 static const InitFrame frames[] = { |
| 2311 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; | 2311 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; |
| 2312 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2312 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2313 set_stream(stream.Pass()); | 2313 set_stream(std::move(stream)); |
| 2314 { | 2314 { |
| 2315 InSequence s; | 2315 InSequence s; |
| 2316 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2316 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2317 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2317 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2318 EXPECT_CALL( | 2318 EXPECT_CALL( |
| 2319 *event_interface_, | 2319 *event_interface_, |
| 2320 OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO"))); | 2320 OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO"))); |
| 2321 EXPECT_CALL( | 2321 EXPECT_CALL( |
| 2322 *event_interface_, | 2322 *event_interface_, |
| 2323 OnDataFrame( | 2323 OnDataFrame( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2334 } | 2334 } |
| 2335 | 2335 |
| 2336 // The code path for async messages is slightly different, so test it | 2336 // The code path for async messages is slightly different, so test it |
| 2337 // separately. | 2337 // separately. |
| 2338 TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitAsync) { | 2338 TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitAsync) { |
| 2339 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2339 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2340 new ReadableFakeWebSocketStream); | 2340 new ReadableFakeWebSocketStream); |
| 2341 static const InitFrame frames[] = { | 2341 static const InitFrame frames[] = { |
| 2342 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; | 2342 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}}; |
| 2343 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); | 2343 stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames); |
| 2344 set_stream(stream.Pass()); | 2344 set_stream(std::move(stream)); |
| 2345 Checkpoint checkpoint; | 2345 Checkpoint checkpoint; |
| 2346 { | 2346 { |
| 2347 InSequence s; | 2347 InSequence s; |
| 2348 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2348 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2349 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2349 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2350 EXPECT_CALL(checkpoint, Call(1)); | 2350 EXPECT_CALL(checkpoint, Call(1)); |
| 2351 EXPECT_CALL( | 2351 EXPECT_CALL( |
| 2352 *event_interface_, | 2352 *event_interface_, |
| 2353 OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO"))); | 2353 OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO"))); |
| 2354 EXPECT_CALL(checkpoint, Call(2)); | 2354 EXPECT_CALL(checkpoint, Call(2)); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2381 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2381 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2382 new ReadableFakeWebSocketStream); | 2382 new ReadableFakeWebSocketStream); |
| 2383 static const InitFrame frames[] = { | 2383 static const InitFrame frames[] = { |
| 2384 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, | 2384 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, |
| 2385 NOT_MASKED, "FIRST FRAME IS 25 BYTES. "}, | 2385 NOT_MASKED, "FIRST FRAME IS 25 BYTES. "}, |
| 2386 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 2386 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 2387 NOT_MASKED, "SECOND FRAME IS 26 BYTES. "}, | 2387 NOT_MASKED, "SECOND FRAME IS 26 BYTES. "}, |
| 2388 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 2388 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 2389 NOT_MASKED, "FINAL FRAME IS 24 BYTES."}}; | 2389 NOT_MASKED, "FINAL FRAME IS 24 BYTES."}}; |
| 2390 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2390 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2391 set_stream(stream.Pass()); | 2391 set_stream(std::move(stream)); |
| 2392 { | 2392 { |
| 2393 InSequence s; | 2393 InSequence s; |
| 2394 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2394 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2395 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2395 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2396 EXPECT_CALL(*event_interface_, | 2396 EXPECT_CALL(*event_interface_, |
| 2397 OnDataFrame(false, | 2397 OnDataFrame(false, |
| 2398 WebSocketFrameHeader::kOpCodeText, | 2398 WebSocketFrameHeader::kOpCodeText, |
| 2399 AsVector("FIRST FRAME IS"))); | 2399 AsVector("FIRST FRAME IS"))); |
| 2400 EXPECT_CALL(*event_interface_, | 2400 EXPECT_CALL(*event_interface_, |
| 2401 OnDataFrame(false, | 2401 OnDataFrame(false, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2425 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2425 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2426 new ReadableFakeWebSocketStream); | 2426 new ReadableFakeWebSocketStream); |
| 2427 static const InitFrame frames[] = { | 2427 static const InitFrame frames[] = { |
| 2428 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, | 2428 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, |
| 2429 NOT_MASKED, "FIRST MESSAGE"}, | 2429 NOT_MASKED, "FIRST MESSAGE"}, |
| 2430 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, | 2430 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, |
| 2431 NOT_MASKED, NULL}, | 2431 NOT_MASKED, NULL}, |
| 2432 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, | 2432 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, |
| 2433 NOT_MASKED, "THIRD MESSAGE"}}; | 2433 NOT_MASKED, "THIRD MESSAGE"}}; |
| 2434 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2434 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2435 set_stream(stream.Pass()); | 2435 set_stream(std::move(stream)); |
| 2436 { | 2436 { |
| 2437 InSequence s; | 2437 InSequence s; |
| 2438 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2438 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2439 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2439 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2440 EXPECT_CALL(*event_interface_, | 2440 EXPECT_CALL(*event_interface_, |
| 2441 OnDataFrame(false, | 2441 OnDataFrame(false, |
| 2442 WebSocketFrameHeader::kOpCodeText, | 2442 WebSocketFrameHeader::kOpCodeText, |
| 2443 AsVector("FIRST "))); | 2443 AsVector("FIRST "))); |
| 2444 EXPECT_CALL(*event_interface_, | 2444 EXPECT_CALL(*event_interface_, |
| 2445 OnDataFrame(true, | 2445 OnDataFrame(true, |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2855 // Test the read path for 8-bit cleanliness as well. | 2855 // Test the read path for 8-bit cleanliness as well. |
| 2856 TEST_F(WebSocketChannelEventInterfaceTest, ReadBinaryFramesAre8BitClean) { | 2856 TEST_F(WebSocketChannelEventInterfaceTest, ReadBinaryFramesAre8BitClean) { |
| 2857 scoped_ptr<WebSocketFrame> frame( | 2857 scoped_ptr<WebSocketFrame> frame( |
| 2858 new WebSocketFrame(WebSocketFrameHeader::kOpCodeBinary)); | 2858 new WebSocketFrame(WebSocketFrameHeader::kOpCodeBinary)); |
| 2859 WebSocketFrameHeader& frame_header = frame->header; | 2859 WebSocketFrameHeader& frame_header = frame->header; |
| 2860 frame_header.final = true; | 2860 frame_header.final = true; |
| 2861 frame_header.payload_length = kBinaryBlobSize; | 2861 frame_header.payload_length = kBinaryBlobSize; |
| 2862 frame->data = new IOBuffer(kBinaryBlobSize); | 2862 frame->data = new IOBuffer(kBinaryBlobSize); |
| 2863 memcpy(frame->data->data(), kBinaryBlob, kBinaryBlobSize); | 2863 memcpy(frame->data->data(), kBinaryBlob, kBinaryBlobSize); |
| 2864 std::vector<scoped_ptr<WebSocketFrame>> frames; | 2864 std::vector<scoped_ptr<WebSocketFrame>> frames; |
| 2865 frames.push_back(frame.Pass()); | 2865 frames.push_back(std::move(frame)); |
| 2866 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2866 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2867 new ReadableFakeWebSocketStream); | 2867 new ReadableFakeWebSocketStream); |
| 2868 stream->PrepareRawReadFrames(ReadableFakeWebSocketStream::SYNC, OK, | 2868 stream->PrepareRawReadFrames(ReadableFakeWebSocketStream::SYNC, OK, |
| 2869 std::move(frames)); | 2869 std::move(frames)); |
| 2870 set_stream(stream.Pass()); | 2870 set_stream(std::move(stream)); |
| 2871 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2871 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2872 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 2872 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| 2873 EXPECT_CALL(*event_interface_, | 2873 EXPECT_CALL(*event_interface_, |
| 2874 OnDataFrame(true, | 2874 OnDataFrame(true, |
| 2875 WebSocketFrameHeader::kOpCodeBinary, | 2875 WebSocketFrameHeader::kOpCodeBinary, |
| 2876 std::vector<char>(kBinaryBlob, | 2876 std::vector<char>(kBinaryBlob, |
| 2877 kBinaryBlob + kBinaryBlobSize))); | 2877 kBinaryBlob + kBinaryBlobSize))); |
| 2878 | 2878 |
| 2879 CreateChannelAndConnectSuccessfully(); | 2879 CreateChannelAndConnectSuccessfully(); |
| 2880 } | 2880 } |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2976 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("bar")); | 2976 channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("bar")); |
| 2977 } | 2977 } |
| 2978 | 2978 |
| 2979 // UTF-8 validation is enforced on received Text frames. | 2979 // UTF-8 validation is enforced on received Text frames. |
| 2980 TEST_F(WebSocketChannelEventInterfaceTest, ReceivedInvalidUtf8) { | 2980 TEST_F(WebSocketChannelEventInterfaceTest, ReceivedInvalidUtf8) { |
| 2981 scoped_ptr<ReadableFakeWebSocketStream> stream( | 2981 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 2982 new ReadableFakeWebSocketStream); | 2982 new ReadableFakeWebSocketStream); |
| 2983 static const InitFrame frames[] = { | 2983 static const InitFrame frames[] = { |
| 2984 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "\xff"}}; | 2984 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "\xff"}}; |
| 2985 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 2985 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 2986 set_stream(stream.Pass()); | 2986 set_stream(std::move(stream)); |
| 2987 | 2987 |
| 2988 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 2988 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 2989 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); | 2989 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| 2990 EXPECT_CALL(*event_interface_, | 2990 EXPECT_CALL(*event_interface_, |
| 2991 OnFailChannel("Could not decode a text frame as UTF-8.")); | 2991 OnFailChannel("Could not decode a text frame as UTF-8.")); |
| 2992 | 2992 |
| 2993 CreateChannelAndConnectSuccessfully(); | 2993 CreateChannelAndConnectSuccessfully(); |
| 2994 base::MessageLoop::current()->RunUntilIdle(); | 2994 base::MessageLoop::current()->RunUntilIdle(); |
| 2995 } | 2995 } |
| 2996 | 2996 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3168 // A new data message cannot start in the middle of another data message. | 3168 // A new data message cannot start in the middle of another data message. |
| 3169 TEST_F(WebSocketChannelEventInterfaceTest, BogusContinuation) { | 3169 TEST_F(WebSocketChannelEventInterfaceTest, BogusContinuation) { |
| 3170 scoped_ptr<ReadableFakeWebSocketStream> stream( | 3170 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 3171 new ReadableFakeWebSocketStream); | 3171 new ReadableFakeWebSocketStream); |
| 3172 static const InitFrame frames[] = { | 3172 static const InitFrame frames[] = { |
| 3173 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeBinary, | 3173 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeBinary, |
| 3174 NOT_MASKED, "frame1"}, | 3174 NOT_MASKED, "frame1"}, |
| 3175 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, | 3175 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, |
| 3176 NOT_MASKED, "frame2"}}; | 3176 NOT_MASKED, "frame2"}}; |
| 3177 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 3177 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 3178 set_stream(stream.Pass()); | 3178 set_stream(std::move(stream)); |
| 3179 | 3179 |
| 3180 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 3180 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 3181 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); | 3181 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| 3182 EXPECT_CALL( | 3182 EXPECT_CALL( |
| 3183 *event_interface_, | 3183 *event_interface_, |
| 3184 OnDataFrame( | 3184 OnDataFrame( |
| 3185 false, WebSocketFrameHeader::kOpCodeBinary, AsVector("frame1"))); | 3185 false, WebSocketFrameHeader::kOpCodeBinary, AsVector("frame1"))); |
| 3186 EXPECT_CALL( | 3186 EXPECT_CALL( |
| 3187 *event_interface_, | 3187 *event_interface_, |
| 3188 OnFailChannel( | 3188 OnFailChannel( |
| 3189 "Received start of new message but previous message is unfinished.")); | 3189 "Received start of new message but previous message is unfinished.")); |
| 3190 | 3190 |
| 3191 CreateChannelAndConnectSuccessfully(); | 3191 CreateChannelAndConnectSuccessfully(); |
| 3192 } | 3192 } |
| 3193 | 3193 |
| 3194 // A new message cannot start with a Continuation frame. | 3194 // A new message cannot start with a Continuation frame. |
| 3195 TEST_F(WebSocketChannelEventInterfaceTest, MessageStartingWithContinuation) { | 3195 TEST_F(WebSocketChannelEventInterfaceTest, MessageStartingWithContinuation) { |
| 3196 scoped_ptr<ReadableFakeWebSocketStream> stream( | 3196 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 3197 new ReadableFakeWebSocketStream); | 3197 new ReadableFakeWebSocketStream); |
| 3198 static const InitFrame frames[] = { | 3198 static const InitFrame frames[] = { |
| 3199 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 3199 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 3200 NOT_MASKED, "continuation"}}; | 3200 NOT_MASKED, "continuation"}}; |
| 3201 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 3201 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 3202 set_stream(stream.Pass()); | 3202 set_stream(std::move(stream)); |
| 3203 | 3203 |
| 3204 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 3204 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 3205 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); | 3205 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| 3206 EXPECT_CALL(*event_interface_, | 3206 EXPECT_CALL(*event_interface_, |
| 3207 OnFailChannel("Received unexpected continuation frame.")); | 3207 OnFailChannel("Received unexpected continuation frame.")); |
| 3208 | 3208 |
| 3209 CreateChannelAndConnectSuccessfully(); | 3209 CreateChannelAndConnectSuccessfully(); |
| 3210 } | 3210 } |
| 3211 | 3211 |
| 3212 // A frame passed to the renderer must be either non-empty or have the final bit | 3212 // A frame passed to the renderer must be either non-empty or have the final bit |
| 3213 // set. | 3213 // set. |
| 3214 TEST_F(WebSocketChannelEventInterfaceTest, DataFramesNonEmptyOrFinal) { | 3214 TEST_F(WebSocketChannelEventInterfaceTest, DataFramesNonEmptyOrFinal) { |
| 3215 scoped_ptr<ReadableFakeWebSocketStream> stream( | 3215 scoped_ptr<ReadableFakeWebSocketStream> stream( |
| 3216 new ReadableFakeWebSocketStream); | 3216 new ReadableFakeWebSocketStream); |
| 3217 static const InitFrame frames[] = { | 3217 static const InitFrame frames[] = { |
| 3218 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, ""}, | 3218 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, ""}, |
| 3219 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, | 3219 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, |
| 3220 NOT_MASKED, ""}, | 3220 NOT_MASKED, ""}, |
| 3221 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, NOT_MASKED, ""}}; | 3221 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation, NOT_MASKED, ""}}; |
| 3222 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 3222 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
| 3223 set_stream(stream.Pass()); | 3223 set_stream(std::move(stream)); |
| 3224 | 3224 |
| 3225 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); | 3225 EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| 3226 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); | 3226 EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| 3227 EXPECT_CALL( | 3227 EXPECT_CALL( |
| 3228 *event_interface_, | 3228 *event_interface_, |
| 3229 OnDataFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); | 3229 OnDataFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); |
| 3230 | 3230 |
| 3231 CreateChannelAndConnectSuccessfully(); | 3231 CreateChannelAndConnectSuccessfully(); |
| 3232 } | 3232 } |
| 3233 | 3233 |
| 3234 // Calls to OnSSLCertificateError() must be passed through to the event | 3234 // Calls to OnSSLCertificateError() must be passed through to the event |
| 3235 // interface with the correct URL attached. | 3235 // interface with the correct URL attached. |
| 3236 TEST_F(WebSocketChannelEventInterfaceTest, OnSSLCertificateErrorCalled) { | 3236 TEST_F(WebSocketChannelEventInterfaceTest, OnSSLCertificateErrorCalled) { |
| 3237 const GURL wss_url("wss://example.com/sslerror"); | 3237 const GURL wss_url("wss://example.com/sslerror"); |
| 3238 connect_data_.socket_url = wss_url; | 3238 connect_data_.socket_url = wss_url; |
| 3239 const SSLInfo ssl_info; | 3239 const SSLInfo ssl_info; |
| 3240 const bool fatal = true; | 3240 const bool fatal = true; |
| 3241 scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks> fake_callbacks( | 3241 scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks> fake_callbacks( |
| 3242 new FakeSSLErrorCallbacks); | 3242 new FakeSSLErrorCallbacks); |
| 3243 | 3243 |
| 3244 EXPECT_CALL(*event_interface_, | 3244 EXPECT_CALL(*event_interface_, |
| 3245 OnSSLCertificateErrorCalled(NotNull(), wss_url, _, fatal)); | 3245 OnSSLCertificateErrorCalled(NotNull(), wss_url, _, fatal)); |
| 3246 | 3246 |
| 3247 CreateChannelAndConnect(); | 3247 CreateChannelAndConnect(); |
| 3248 connect_data_.creator.connect_delegate->OnSSLCertificateError( | 3248 connect_data_.creator.connect_delegate->OnSSLCertificateError( |
| 3249 fake_callbacks.Pass(), ssl_info, fatal); | 3249 std::move(fake_callbacks), ssl_info, fatal); |
| 3250 } | 3250 } |
| 3251 | 3251 |
| 3252 // If we receive another frame after Close, it is not valid. It is not | 3252 // If we receive another frame after Close, it is not valid. It is not |
| 3253 // completely clear what behaviour is required from the standard in this case, | 3253 // completely clear what behaviour is required from the standard in this case, |
| 3254 // but the current implementation fails the connection. Since a Close has | 3254 // but the current implementation fails the connection. Since a Close has |
| 3255 // already been sent, this just means closing the connection. | 3255 // already been sent, this just means closing the connection. |
| 3256 TEST_F(WebSocketChannelStreamTest, PingAfterCloseIsRejected) { | 3256 TEST_F(WebSocketChannelStreamTest, PingAfterCloseIsRejected) { |
| 3257 static const InitFrame frames[] = { | 3257 static const InitFrame frames[] = { |
| 3258 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, | 3258 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, |
| 3259 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "OK")}, | 3259 NOT_MASKED, CLOSE_DATA(NORMAL_CLOSURE, "OK")}, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3297 | 3297 |
| 3298 CreateChannelAndConnectSuccessfully(); | 3298 CreateChannelAndConnectSuccessfully(); |
| 3299 } | 3299 } |
| 3300 | 3300 |
| 3301 // Set the closing handshake timeout to a very tiny value before connecting. | 3301 // Set the closing handshake timeout to a very tiny value before connecting. |
| 3302 class WebSocketChannelStreamTimeoutTest : public WebSocketChannelStreamTest { | 3302 class WebSocketChannelStreamTimeoutTest : public WebSocketChannelStreamTest { |
| 3303 protected: | 3303 protected: |
| 3304 WebSocketChannelStreamTimeoutTest() {} | 3304 WebSocketChannelStreamTimeoutTest() {} |
| 3305 | 3305 |
| 3306 void CreateChannelAndConnectSuccessfully() override { | 3306 void CreateChannelAndConnectSuccessfully() override { |
| 3307 set_stream(mock_stream_.Pass()); | 3307 set_stream(std::move(mock_stream_)); |
| 3308 CreateChannelAndConnect(); | 3308 CreateChannelAndConnect(); |
| 3309 channel_->SendFlowControl(kPlentyOfQuota); | 3309 channel_->SendFlowControl(kPlentyOfQuota); |
| 3310 channel_->SetClosingHandshakeTimeoutForTesting( | 3310 channel_->SetClosingHandshakeTimeoutForTesting( |
| 3311 TimeDelta::FromMilliseconds(kVeryTinyTimeoutMillis)); | 3311 TimeDelta::FromMilliseconds(kVeryTinyTimeoutMillis)); |
| 3312 channel_->SetUnderlyingConnectionCloseTimeoutForTesting( | 3312 channel_->SetUnderlyingConnectionCloseTimeoutForTesting( |
| 3313 TimeDelta::FromMilliseconds(kVeryTinyTimeoutMillis)); | 3313 TimeDelta::FromMilliseconds(kVeryTinyTimeoutMillis)); |
| 3314 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 3314 connect_data_.creator.connect_delegate->OnSuccess(std::move(stream_)); |
| 3315 } | 3315 } |
| 3316 }; | 3316 }; |
| 3317 | 3317 |
| 3318 // In this case the server initiates the closing handshake with a Close | 3318 // In this case the server initiates the closing handshake with a Close |
| 3319 // message. WebSocketChannel responds with a matching Close message, and waits | 3319 // message. WebSocketChannel responds with a matching Close message, and waits |
| 3320 // for the server to close the TCP/IP connection. The server never closes the | 3320 // for the server to close the TCP/IP connection. The server never closes the |
| 3321 // connection, so the closing handshake times out and WebSocketChannel closes | 3321 // connection, so the closing handshake times out and WebSocketChannel closes |
| 3322 // the connection itself. | 3322 // the connection itself. |
| 3323 TEST_F(WebSocketChannelStreamTimeoutTest, ServerInitiatedCloseTimesOut) { | 3323 TEST_F(WebSocketChannelStreamTimeoutTest, ServerInitiatedCloseTimesOut) { |
| 3324 static const InitFrame frames[] = { | 3324 static const InitFrame frames[] = { |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3416 channel_->StartClosingHandshake(kWebSocketNormalClosure, "OK"); | 3416 channel_->StartClosingHandshake(kWebSocketNormalClosure, "OK"); |
| 3417 ASSERT_TRUE(read_frames); | 3417 ASSERT_TRUE(read_frames); |
| 3418 // Provide the "Close" message from the server. | 3418 // Provide the "Close" message from the server. |
| 3419 *read_frames = CreateFrameVector(frames); | 3419 *read_frames = CreateFrameVector(frames); |
| 3420 read_callback.Run(OK); | 3420 read_callback.Run(OK); |
| 3421 completion.WaitForResult(); | 3421 completion.WaitForResult(); |
| 3422 } | 3422 } |
| 3423 | 3423 |
| 3424 } // namespace | 3424 } // namespace |
| 3425 } // namespace net | 3425 } // namespace net |
| OLD | NEW |