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 <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <iostream> | 9 #include <iostream> |
10 #include <string> | 10 #include <string> |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 | 135 |
136 // This mock is for testing expectations about how the EventInterface is used. | 136 // This mock is for testing expectations about how the EventInterface is used. |
137 class MockWebSocketEventInterface : public WebSocketEventInterface { | 137 class MockWebSocketEventInterface : public WebSocketEventInterface { |
138 public: | 138 public: |
139 MOCK_METHOD2(OnAddChannelResponse, | 139 MOCK_METHOD2(OnAddChannelResponse, |
140 ChannelState(bool, const std::string&)); // NOLINT | 140 ChannelState(bool, const std::string&)); // NOLINT |
141 MOCK_METHOD3(OnDataFrame, | 141 MOCK_METHOD3(OnDataFrame, |
142 ChannelState(bool, | 142 ChannelState(bool, |
143 WebSocketMessageType, | 143 WebSocketMessageType, |
144 const std::vector<char>&)); // NOLINT | 144 const std::vector<char>&)); // NOLINT |
145 MOCK_METHOD1(OnFlowControl, ChannelState(int64)); // NOLINT | 145 MOCK_METHOD1(OnFlowControl, ChannelState(int64)); // NOLINT |
146 MOCK_METHOD0(OnClosingHandshake, ChannelState(void)); // NOLINT | 146 MOCK_METHOD0(OnClosingHandshake, ChannelState(void)); // NOLINT |
| 147 MOCK_METHOD1(OnFailChannel, ChannelState(const std::string&)); // NOLINT |
147 MOCK_METHOD2(OnDropChannel, | 148 MOCK_METHOD2(OnDropChannel, |
148 ChannelState(uint16, const std::string&)); // NOLINT | 149 ChannelState(uint16, const std::string&)); // NOLINT |
149 }; | 150 }; |
150 | 151 |
151 // This fake EventInterface is for tests which need a WebSocketEventInterface | 152 // This fake EventInterface is for tests which need a WebSocketEventInterface |
152 // implementation but are not verifying how it is used. | 153 // implementation but are not verifying how it is used. |
153 class FakeWebSocketEventInterface : public WebSocketEventInterface { | 154 class FakeWebSocketEventInterface : public WebSocketEventInterface { |
154 virtual ChannelState OnAddChannelResponse( | 155 virtual ChannelState OnAddChannelResponse( |
155 bool fail, | 156 bool fail, |
156 const std::string& selected_protocol) OVERRIDE { | 157 const std::string& selected_protocol) OVERRIDE { |
157 return fail ? CHANNEL_DELETED : CHANNEL_ALIVE; | 158 return fail ? CHANNEL_DELETED : CHANNEL_ALIVE; |
158 } | 159 } |
159 virtual ChannelState OnDataFrame(bool fin, | 160 virtual ChannelState OnDataFrame(bool fin, |
160 WebSocketMessageType type, | 161 WebSocketMessageType type, |
161 const std::vector<char>& data) OVERRIDE { | 162 const std::vector<char>& data) OVERRIDE { |
162 return CHANNEL_ALIVE; | 163 return CHANNEL_ALIVE; |
163 } | 164 } |
164 virtual ChannelState OnFlowControl(int64 quota) OVERRIDE { | 165 virtual ChannelState OnFlowControl(int64 quota) OVERRIDE { |
165 return CHANNEL_ALIVE; | 166 return CHANNEL_ALIVE; |
166 } | 167 } |
167 virtual ChannelState OnClosingHandshake() OVERRIDE { return CHANNEL_ALIVE; } | 168 virtual ChannelState OnClosingHandshake() OVERRIDE { return CHANNEL_ALIVE; } |
| 169 virtual ChannelState OnFailChannel(const std::string& message) OVERRIDE { |
| 170 return CHANNEL_DELETED; |
| 171 } |
168 virtual ChannelState OnDropChannel(uint16 code, | 172 virtual ChannelState OnDropChannel(uint16 code, |
169 const std::string& reason) OVERRIDE { | 173 const std::string& reason) OVERRIDE { |
170 return CHANNEL_DELETED; | 174 return CHANNEL_DELETED; |
171 } | 175 } |
172 }; | 176 }; |
173 | 177 |
174 // This fake WebSocketStream is for tests that require a WebSocketStream but are | 178 // This fake WebSocketStream is for tests that require a WebSocketStream but are |
175 // not testing the way it is used. It has minimal functionality to return | 179 // not testing the way it is used. It has minimal functionality to return |
176 // the |protocol| and |extensions| that it was constructed with. | 180 // the |protocol| and |extensions| that it was constructed with. |
177 class FakeWebSocketStream : public WebSocketStream { | 181 class FakeWebSocketStream : public WebSocketStream { |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 scoped_ptr<WebSocketStream> stream_; | 758 scoped_ptr<WebSocketStream> stream_; |
755 }; | 759 }; |
756 | 760 |
757 // enum of WebSocketEventInterface calls. These are intended to be or'd together | 761 // enum of WebSocketEventInterface calls. These are intended to be or'd together |
758 // in order to instruct WebSocketChannelDeletingTest when it should fail. | 762 // in order to instruct WebSocketChannelDeletingTest when it should fail. |
759 enum EventInterfaceCall { | 763 enum EventInterfaceCall { |
760 EVENT_ON_ADD_CHANNEL_RESPONSE = 0x1, | 764 EVENT_ON_ADD_CHANNEL_RESPONSE = 0x1, |
761 EVENT_ON_DATA_FRAME = 0x2, | 765 EVENT_ON_DATA_FRAME = 0x2, |
762 EVENT_ON_FLOW_CONTROL = 0x4, | 766 EVENT_ON_FLOW_CONTROL = 0x4, |
763 EVENT_ON_CLOSING_HANDSHAKE = 0x8, | 767 EVENT_ON_CLOSING_HANDSHAKE = 0x8, |
764 EVENT_ON_DROP_CHANNEL = 0x10, | 768 EVENT_ON_FAIL_CHANNEL = 0x10, |
| 769 EVENT_ON_DROP_CHANNEL = 0x20, |
765 }; | 770 }; |
766 | 771 |
767 class WebSocketChannelDeletingTest : public WebSocketChannelTest { | 772 class WebSocketChannelDeletingTest : public WebSocketChannelTest { |
768 public: | 773 public: |
769 ChannelState DeleteIfDeleting(EventInterfaceCall call) { | 774 ChannelState DeleteIfDeleting(EventInterfaceCall call) { |
770 if (deleting_ & call) { | 775 if (deleting_ & call) { |
771 channel_.reset(); | 776 channel_.reset(); |
772 return CHANNEL_DELETED; | 777 return CHANNEL_DELETED; |
773 } else { | 778 } else { |
774 return CHANNEL_ALIVE; | 779 return CHANNEL_ALIVE; |
775 } | 780 } |
776 } | 781 } |
777 | 782 |
778 protected: | 783 protected: |
779 WebSocketChannelDeletingTest() | 784 WebSocketChannelDeletingTest() |
780 : deleting_(EVENT_ON_ADD_CHANNEL_RESPONSE | EVENT_ON_DATA_FRAME | | 785 : deleting_(EVENT_ON_ADD_CHANNEL_RESPONSE | EVENT_ON_DATA_FRAME | |
781 EVENT_ON_FLOW_CONTROL | | 786 EVENT_ON_FLOW_CONTROL | |
782 EVENT_ON_CLOSING_HANDSHAKE | | 787 EVENT_ON_CLOSING_HANDSHAKE | |
| 788 EVENT_ON_FAIL_CHANNEL | |
783 EVENT_ON_DROP_CHANNEL) {} | 789 EVENT_ON_DROP_CHANNEL) {} |
784 // Create a ChannelDeletingFakeWebSocketEventInterface. Defined out-of-line to | 790 // Create a ChannelDeletingFakeWebSocketEventInterface. Defined out-of-line to |
785 // avoid circular dependency. | 791 // avoid circular dependency. |
786 virtual scoped_ptr<WebSocketEventInterface> CreateEventInterface() OVERRIDE; | 792 virtual scoped_ptr<WebSocketEventInterface> CreateEventInterface() OVERRIDE; |
787 | 793 |
788 // Tests can set deleting_ to a bitmap of EventInterfaceCall members that they | 794 // Tests can set deleting_ to a bitmap of EventInterfaceCall members that they |
789 // want to cause Channel deletion. The default is for all calls to cause | 795 // want to cause Channel deletion. The default is for all calls to cause |
790 // deletion. | 796 // deletion. |
791 int deleting_; | 797 int deleting_; |
792 }; | 798 }; |
(...skipping 20 matching lines...) Expand all Loading... |
813 } | 819 } |
814 | 820 |
815 virtual ChannelState OnFlowControl(int64 quota) OVERRIDE { | 821 virtual ChannelState OnFlowControl(int64 quota) OVERRIDE { |
816 return fixture_->DeleteIfDeleting(EVENT_ON_FLOW_CONTROL); | 822 return fixture_->DeleteIfDeleting(EVENT_ON_FLOW_CONTROL); |
817 } | 823 } |
818 | 824 |
819 virtual ChannelState OnClosingHandshake() OVERRIDE { | 825 virtual ChannelState OnClosingHandshake() OVERRIDE { |
820 return fixture_->DeleteIfDeleting(EVENT_ON_CLOSING_HANDSHAKE); | 826 return fixture_->DeleteIfDeleting(EVENT_ON_CLOSING_HANDSHAKE); |
821 } | 827 } |
822 | 828 |
| 829 virtual ChannelState OnFailChannel(const std::string& message) OVERRIDE { |
| 830 return fixture_->DeleteIfDeleting(EVENT_ON_FAIL_CHANNEL); |
| 831 } |
| 832 |
823 virtual ChannelState OnDropChannel(uint16 code, | 833 virtual ChannelState OnDropChannel(uint16 code, |
824 const std::string& reason) OVERRIDE { | 834 const std::string& reason) OVERRIDE { |
825 return fixture_->DeleteIfDeleting(EVENT_ON_DROP_CHANNEL); | 835 return fixture_->DeleteIfDeleting(EVENT_ON_DROP_CHANNEL); |
826 } | 836 } |
827 | 837 |
828 private: | 838 private: |
829 // A pointer to the test fixture. Owned by the test harness; this object will | 839 // A pointer to the test fixture. Owned by the test harness; this object will |
830 // be deleted before it is. | 840 // be deleted before it is. |
831 WebSocketChannelDeletingTest* fixture_; | 841 WebSocketChannelDeletingTest* fixture_; |
832 }; | 842 }; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 } | 918 } |
909 | 919 |
910 // Any WebSocketEventInterface methods can delete the WebSocketChannel and | 920 // Any WebSocketEventInterface methods can delete the WebSocketChannel and |
911 // return CHANNEL_DELETED. The WebSocketChannelDeletingTests are intended to | 921 // return CHANNEL_DELETED. The WebSocketChannelDeletingTests are intended to |
912 // verify that there are no use-after-free bugs when this happens. Problems will | 922 // verify that there are no use-after-free bugs when this happens. Problems will |
913 // probably only be found when running under Address Sanitizer or a similar | 923 // probably only be found when running under Address Sanitizer or a similar |
914 // tool. | 924 // tool. |
915 TEST_F(WebSocketChannelDeletingTest, OnAddChannelResponseFail) { | 925 TEST_F(WebSocketChannelDeletingTest, OnAddChannelResponseFail) { |
916 CreateChannelAndConnect(); | 926 CreateChannelAndConnect(); |
917 EXPECT_TRUE(channel_); | 927 EXPECT_TRUE(channel_); |
918 connect_data_.creator.connect_delegate->OnFailure( | 928 connect_data_.creator.connect_delegate->OnFailure("bye"); |
919 kWebSocketErrorNoStatusReceived); | |
920 EXPECT_EQ(NULL, channel_.get()); | 929 EXPECT_EQ(NULL, channel_.get()); |
921 } | 930 } |
922 | 931 |
923 // Deletion is possible (due to IPC failure) even if the connect succeeds. | 932 // Deletion is possible (due to IPC failure) even if the connect succeeds. |
924 TEST_F(WebSocketChannelDeletingTest, OnAddChannelResponseSuccess) { | 933 TEST_F(WebSocketChannelDeletingTest, OnAddChannelResponseSuccess) { |
925 CreateChannelAndConnectSuccessfully(); | 934 CreateChannelAndConnectSuccessfully(); |
926 EXPECT_EQ(NULL, channel_.get()); | 935 EXPECT_EQ(NULL, channel_.get()); |
927 } | 936 } |
928 | 937 |
929 TEST_F(WebSocketChannelDeletingTest, OnDataFrameSync) { | 938 TEST_F(WebSocketChannelDeletingTest, OnDataFrameSync) { |
(...skipping 27 matching lines...) Expand all Loading... |
957 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterConnect) { | 966 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterConnect) { |
958 deleting_ = EVENT_ON_FLOW_CONTROL; | 967 deleting_ = EVENT_ON_FLOW_CONTROL; |
959 | 968 |
960 CreateChannelAndConnectSuccessfully(); | 969 CreateChannelAndConnectSuccessfully(); |
961 EXPECT_EQ(NULL, channel_.get()); | 970 EXPECT_EQ(NULL, channel_.get()); |
962 } | 971 } |
963 | 972 |
964 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterSend) { | 973 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterSend) { |
965 set_stream(make_scoped_ptr(new WriteableFakeWebSocketStream)); | 974 set_stream(make_scoped_ptr(new WriteableFakeWebSocketStream)); |
966 // Avoid deleting the channel yet. | 975 // Avoid deleting the channel yet. |
967 deleting_ = EVENT_ON_DROP_CHANNEL; | 976 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
968 CreateChannelAndConnectSuccessfully(); | 977 CreateChannelAndConnectSuccessfully(); |
969 ASSERT_TRUE(channel_); | 978 ASSERT_TRUE(channel_); |
970 deleting_ = EVENT_ON_FLOW_CONTROL; | 979 deleting_ = EVENT_ON_FLOW_CONTROL; |
971 channel_->SendFrame(true, | 980 channel_->SendFrame(true, |
972 WebSocketFrameHeader::kOpCodeText, | 981 WebSocketFrameHeader::kOpCodeText, |
973 std::vector<char>(kDefaultInitialQuota, 'B')); | 982 std::vector<char>(kDefaultInitialQuota, 'B')); |
974 EXPECT_EQ(NULL, channel_.get()); | 983 EXPECT_EQ(NULL, channel_.get()); |
975 } | 984 } |
976 | 985 |
977 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeSync) { | 986 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeSync) { |
(...skipping 19 matching lines...) Expand all Loading... |
997 set_stream(stream.Pass()); | 1006 set_stream(stream.Pass()); |
998 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; | 1007 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; |
999 CreateChannelAndConnectSuccessfully(); | 1008 CreateChannelAndConnectSuccessfully(); |
1000 ASSERT_TRUE(channel_); | 1009 ASSERT_TRUE(channel_); |
1001 base::MessageLoop::current()->RunUntilIdle(); | 1010 base::MessageLoop::current()->RunUntilIdle(); |
1002 EXPECT_EQ(NULL, channel_.get()); | 1011 EXPECT_EQ(NULL, channel_.get()); |
1003 } | 1012 } |
1004 | 1013 |
1005 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { | 1014 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { |
1006 set_stream(make_scoped_ptr(new UnWriteableFakeWebSocketStream)); | 1015 set_stream(make_scoped_ptr(new UnWriteableFakeWebSocketStream)); |
1007 deleting_ = EVENT_ON_DROP_CHANNEL; | 1016 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1008 CreateChannelAndConnectSuccessfully(); | 1017 CreateChannelAndConnectSuccessfully(); |
1009 ASSERT_TRUE(channel_); | 1018 ASSERT_TRUE(channel_); |
1010 channel_->SendFrame( | 1019 channel_->SendFrame( |
1011 true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); | 1020 true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); |
1012 EXPECT_EQ(NULL, channel_.get()); | 1021 EXPECT_EQ(NULL, channel_.get()); |
1013 } | 1022 } |
1014 | 1023 |
1015 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { | 1024 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { |
1016 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1025 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1017 new ReadableFakeWebSocketStream); | 1026 new ReadableFakeWebSocketStream); |
1018 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1027 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
1019 ERR_FAILED); | 1028 ERR_FAILED); |
1020 set_stream(stream.Pass()); | 1029 set_stream(stream.Pass()); |
1021 deleting_ = EVENT_ON_DROP_CHANNEL; | 1030 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1022 CreateChannelAndConnectSuccessfully(); | 1031 CreateChannelAndConnectSuccessfully(); |
1023 ASSERT_TRUE(channel_); | 1032 ASSERT_TRUE(channel_); |
1024 base::MessageLoop::current()->RunUntilIdle(); | 1033 base::MessageLoop::current()->RunUntilIdle(); |
1025 EXPECT_EQ(NULL, channel_.get()); | 1034 EXPECT_EQ(NULL, channel_.get()); |
1026 } | 1035 } |
1027 | 1036 |
1028 TEST_F(WebSocketChannelDeletingTest, FailChannelInSendFrame) { | 1037 TEST_F(WebSocketChannelDeletingTest, FailChannelInSendFrame) { |
1029 set_stream(make_scoped_ptr(new WriteableFakeWebSocketStream)); | 1038 set_stream(make_scoped_ptr(new WriteableFakeWebSocketStream)); |
1030 deleting_ = EVENT_ON_DROP_CHANNEL; | 1039 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1031 CreateChannelAndConnectSuccessfully(); | 1040 CreateChannelAndConnectSuccessfully(); |
1032 ASSERT_TRUE(channel_); | 1041 ASSERT_TRUE(channel_); |
1033 channel_->SendFrame(true, | 1042 channel_->SendFrame(true, |
1034 WebSocketFrameHeader::kOpCodeText, | 1043 WebSocketFrameHeader::kOpCodeText, |
1035 std::vector<char>(kDefaultInitialQuota * 2, 'T')); | 1044 std::vector<char>(kDefaultInitialQuota * 2, 'T')); |
1036 EXPECT_EQ(NULL, channel_.get()); | 1045 EXPECT_EQ(NULL, channel_.get()); |
1037 } | 1046 } |
1038 | 1047 |
1039 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { | 1048 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { |
1040 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1049 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1041 new ReadableFakeWebSocketStream); | 1050 new ReadableFakeWebSocketStream); |
1042 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1051 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
1043 ERR_WS_PROTOCOL_ERROR); | 1052 ERR_WS_PROTOCOL_ERROR); |
1044 set_stream(stream.Pass()); | 1053 set_stream(stream.Pass()); |
1045 deleting_ = EVENT_ON_DROP_CHANNEL; | 1054 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1046 CreateChannelAndConnectSuccessfully(); | 1055 CreateChannelAndConnectSuccessfully(); |
1047 ASSERT_TRUE(channel_); | 1056 ASSERT_TRUE(channel_); |
1048 base::MessageLoop::current()->RunUntilIdle(); | 1057 base::MessageLoop::current()->RunUntilIdle(); |
1049 EXPECT_EQ(NULL, channel_.get()); | 1058 EXPECT_EQ(NULL, channel_.get()); |
1050 } | 1059 } |
1051 | 1060 |
1052 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToMaskedFrame) { | 1061 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToMaskedFrame) { |
1053 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1062 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1054 new ReadableFakeWebSocketStream); | 1063 new ReadableFakeWebSocketStream); |
1055 static const InitFrame frames[] = { | 1064 static const InitFrame frames[] = { |
1056 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; | 1065 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; |
1057 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1066 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1058 set_stream(stream.Pass()); | 1067 set_stream(stream.Pass()); |
1059 deleting_ = EVENT_ON_DROP_CHANNEL; | 1068 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1060 | 1069 |
1061 CreateChannelAndConnectSuccessfully(); | 1070 CreateChannelAndConnectSuccessfully(); |
1062 EXPECT_EQ(NULL, channel_.get()); | 1071 EXPECT_EQ(NULL, channel_.get()); |
1063 } | 1072 } |
1064 | 1073 |
1065 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrame) { | 1074 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrame) { |
1066 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1075 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1067 new ReadableFakeWebSocketStream); | 1076 new ReadableFakeWebSocketStream); |
1068 static const InitFrame frames[] = { | 1077 static const InitFrame frames[] = { |
1069 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; | 1078 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; |
1070 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1079 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1071 set_stream(stream.Pass()); | 1080 set_stream(stream.Pass()); |
1072 deleting_ = EVENT_ON_DROP_CHANNEL; | 1081 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1073 | 1082 |
1074 CreateChannelAndConnectSuccessfully(); | 1083 CreateChannelAndConnectSuccessfully(); |
1075 EXPECT_EQ(NULL, channel_.get()); | 1084 EXPECT_EQ(NULL, channel_.get()); |
1076 } | 1085 } |
1077 | 1086 |
1078 // Version of above test with NULL data. | 1087 // Version of above test with NULL data. |
1079 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrameNull) { | 1088 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrameNull) { |
1080 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1089 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1081 new ReadableFakeWebSocketStream); | 1090 new ReadableFakeWebSocketStream); |
1082 static const InitFrame frames[] = { | 1091 static const InitFrame frames[] = { |
1083 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; | 1092 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; |
1084 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1093 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1085 set_stream(stream.Pass()); | 1094 set_stream(stream.Pass()); |
1086 deleting_ = EVENT_ON_DROP_CHANNEL; | 1095 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1087 | 1096 |
1088 CreateChannelAndConnectSuccessfully(); | 1097 CreateChannelAndConnectSuccessfully(); |
1089 EXPECT_EQ(NULL, channel_.get()); | 1098 EXPECT_EQ(NULL, channel_.get()); |
1090 } | 1099 } |
1091 | 1100 |
1092 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterClose) { | 1101 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterClose) { |
1093 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1102 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1094 new ReadableFakeWebSocketStream); | 1103 new ReadableFakeWebSocketStream); |
1095 static const InitFrame frames[] = { | 1104 static const InitFrame frames[] = { |
1096 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, | 1105 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, |
1097 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, | 1106 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, |
1098 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; | 1107 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; |
1099 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1108 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1100 set_stream(stream.Pass()); | 1109 set_stream(stream.Pass()); |
1101 deleting_ = EVENT_ON_DROP_CHANNEL; | 1110 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1102 | 1111 |
1103 CreateChannelAndConnectSuccessfully(); | 1112 CreateChannelAndConnectSuccessfully(); |
1104 EXPECT_EQ(NULL, channel_.get()); | 1113 EXPECT_EQ(NULL, channel_.get()); |
1105 } | 1114 } |
1106 | 1115 |
1107 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterCloseNull) { | 1116 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterCloseNull) { |
1108 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1117 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1109 new ReadableFakeWebSocketStream); | 1118 new ReadableFakeWebSocketStream); |
1110 static const InitFrame frames[] = { | 1119 static const InitFrame frames[] = { |
1111 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, | 1120 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, |
1112 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, | 1121 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, |
1113 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; | 1122 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; |
1114 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1123 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1115 set_stream(stream.Pass()); | 1124 set_stream(stream.Pass()); |
1116 deleting_ = EVENT_ON_DROP_CHANNEL; | 1125 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1117 | 1126 |
1118 CreateChannelAndConnectSuccessfully(); | 1127 CreateChannelAndConnectSuccessfully(); |
1119 EXPECT_EQ(NULL, channel_.get()); | 1128 EXPECT_EQ(NULL, channel_.get()); |
1120 } | 1129 } |
1121 | 1130 |
1122 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCode) { | 1131 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCode) { |
1123 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1132 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1124 new ReadableFakeWebSocketStream); | 1133 new ReadableFakeWebSocketStream); |
1125 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, ""}}; | 1134 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, ""}}; |
1126 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1135 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1127 set_stream(stream.Pass()); | 1136 set_stream(stream.Pass()); |
1128 deleting_ = EVENT_ON_DROP_CHANNEL; | 1137 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1129 | 1138 |
1130 CreateChannelAndConnectSuccessfully(); | 1139 CreateChannelAndConnectSuccessfully(); |
1131 EXPECT_EQ(NULL, channel_.get()); | 1140 EXPECT_EQ(NULL, channel_.get()); |
1132 } | 1141 } |
1133 | 1142 |
1134 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCodeNull) { | 1143 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCodeNull) { |
1135 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1144 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1136 new ReadableFakeWebSocketStream); | 1145 new ReadableFakeWebSocketStream); |
1137 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, NULL}}; | 1146 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, NULL}}; |
1138 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1147 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1139 set_stream(stream.Pass()); | 1148 set_stream(stream.Pass()); |
1140 deleting_ = EVENT_ON_DROP_CHANNEL; | 1149 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1141 | 1150 |
1142 CreateChannelAndConnectSuccessfully(); | 1151 CreateChannelAndConnectSuccessfully(); |
1143 EXPECT_EQ(NULL, channel_.get()); | 1152 EXPECT_EQ(NULL, channel_.get()); |
1144 } | 1153 } |
1145 | 1154 |
1146 TEST_F(WebSocketChannelEventInterfaceTest, ConnectSuccessReported) { | 1155 TEST_F(WebSocketChannelEventInterfaceTest, ConnectSuccessReported) { |
1147 // false means success. | 1156 // false means success. |
1148 EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, "")); | 1157 EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, "")); |
1149 // OnFlowControl is always called immediately after connect to provide initial | 1158 // OnFlowControl is always called immediately after connect to provide initial |
1150 // quota to the renderer. | 1159 // quota to the renderer. |
1151 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1160 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
1152 | 1161 |
1153 CreateChannelAndConnect(); | 1162 CreateChannelAndConnect(); |
1154 | 1163 |
1155 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 1164 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); |
1156 } | 1165 } |
1157 | 1166 |
1158 TEST_F(WebSocketChannelEventInterfaceTest, ConnectFailureReported) { | 1167 TEST_F(WebSocketChannelEventInterfaceTest, ConnectFailureReported) { |
1159 // true means failure. | 1168 EXPECT_CALL(*event_interface_, OnFailChannel("hello")); |
1160 EXPECT_CALL(*event_interface_, OnAddChannelResponse(true, "")); | |
1161 | 1169 |
1162 CreateChannelAndConnect(); | 1170 CreateChannelAndConnect(); |
1163 | 1171 |
1164 connect_data_.creator.connect_delegate->OnFailure( | 1172 connect_data_.creator.connect_delegate->OnFailure("hello"); |
1165 kWebSocketErrorNoStatusReceived); | |
1166 } | 1173 } |
1167 | 1174 |
1168 TEST_F(WebSocketChannelEventInterfaceTest, NonWebSocketSchemeRejected) { | 1175 TEST_F(WebSocketChannelEventInterfaceTest, NonWebSocketSchemeRejected) { |
1169 EXPECT_CALL(*event_interface_, OnAddChannelResponse(true, "")); | 1176 EXPECT_CALL(*event_interface_, OnAddChannelResponse(true, "")); |
1170 connect_data_.socket_url = GURL("http://www.google.com/"); | 1177 connect_data_.socket_url = GURL("http://www.google.com/"); |
1171 CreateChannelAndConnect(); | 1178 CreateChannelAndConnect(); |
1172 } | 1179 } |
1173 | 1180 |
1174 TEST_F(WebSocketChannelEventInterfaceTest, ProtocolPassed) { | 1181 TEST_F(WebSocketChannelEventInterfaceTest, ProtocolPassed) { |
1175 EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, "Bob")); | 1182 EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, "Bob")); |
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2377 channel_->StartClosingHandshake(kWebSocketNormalClosure, "OK"); | 2384 channel_->StartClosingHandshake(kWebSocketNormalClosure, "OK"); |
2378 ASSERT_TRUE(read_frames); | 2385 ASSERT_TRUE(read_frames); |
2379 // Provide the "Close" message from the server. | 2386 // Provide the "Close" message from the server. |
2380 *read_frames = CreateFrameVector(frames); | 2387 *read_frames = CreateFrameVector(frames); |
2381 read_callback.Run(OK); | 2388 read_callback.Run(OK); |
2382 completion.WaitForResult(); | 2389 completion.WaitForResult(); |
2383 } | 2390 } |
2384 | 2391 |
2385 } // namespace | 2392 } // namespace |
2386 } // namespace net | 2393 } // namespace net |
OLD | NEW |