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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
900 } | 910 } |
901 | 911 |
902 // Any WebSocketEventInterface methods can delete the WebSocketChannel and | 912 // Any WebSocketEventInterface methods can delete the WebSocketChannel and |
903 // return CHANNEL_DELETED. The WebSocketChannelDeletingTests are intended to | 913 // return CHANNEL_DELETED. The WebSocketChannelDeletingTests are intended to |
904 // verify that there are no use-after-free bugs when this happens. Problems will | 914 // verify that there are no use-after-free bugs when this happens. Problems will |
905 // probably only be found when running under Address Sanitizer or a similar | 915 // probably only be found when running under Address Sanitizer or a similar |
906 // tool. | 916 // tool. |
907 TEST_F(WebSocketChannelDeletingTest, OnAddChannelResponseFail) { | 917 TEST_F(WebSocketChannelDeletingTest, OnAddChannelResponseFail) { |
908 CreateChannelAndConnect(); | 918 CreateChannelAndConnect(); |
909 EXPECT_TRUE(channel_); | 919 EXPECT_TRUE(channel_); |
910 connect_data_.creator.connect_delegate->OnFailure( | 920 connect_data_.creator.connect_delegate->OnFailure("bye"); |
911 kWebSocketErrorNoStatusReceived); | |
912 EXPECT_EQ(NULL, channel_.get()); | 921 EXPECT_EQ(NULL, channel_.get()); |
913 } | 922 } |
914 | 923 |
915 // Deletion is possible (due to IPC failure) even if the connect succeeds. | 924 // Deletion is possible (due to IPC failure) even if the connect succeeds. |
916 TEST_F(WebSocketChannelDeletingTest, OnAddChannelResponseSuccess) { | 925 TEST_F(WebSocketChannelDeletingTest, OnAddChannelResponseSuccess) { |
917 CreateChannelAndConnectSuccessfully(); | 926 CreateChannelAndConnectSuccessfully(); |
918 EXPECT_EQ(NULL, channel_.get()); | 927 EXPECT_EQ(NULL, channel_.get()); |
919 } | 928 } |
920 | 929 |
921 TEST_F(WebSocketChannelDeletingTest, OnDataFrameSync) { | 930 TEST_F(WebSocketChannelDeletingTest, OnDataFrameSync) { |
(...skipping 27 matching lines...) Expand all Loading... | |
949 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterConnect) { | 958 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterConnect) { |
950 deleting_ = EVENT_ON_FLOW_CONTROL; | 959 deleting_ = EVENT_ON_FLOW_CONTROL; |
951 | 960 |
952 CreateChannelAndConnectSuccessfully(); | 961 CreateChannelAndConnectSuccessfully(); |
953 EXPECT_EQ(NULL, channel_.get()); | 962 EXPECT_EQ(NULL, channel_.get()); |
954 } | 963 } |
955 | 964 |
956 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterSend) { | 965 TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterSend) { |
957 set_stream(make_scoped_ptr(new WriteableFakeWebSocketStream)); | 966 set_stream(make_scoped_ptr(new WriteableFakeWebSocketStream)); |
958 // Avoid deleting the channel yet. | 967 // Avoid deleting the channel yet. |
959 deleting_ = EVENT_ON_DROP_CHANNEL; | 968 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
960 CreateChannelAndConnectSuccessfully(); | 969 CreateChannelAndConnectSuccessfully(); |
961 ASSERT_TRUE(channel_); | 970 ASSERT_TRUE(channel_); |
962 deleting_ = EVENT_ON_FLOW_CONTROL; | 971 deleting_ = EVENT_ON_FLOW_CONTROL; |
963 channel_->SendFrame(true, | 972 channel_->SendFrame(true, |
964 WebSocketFrameHeader::kOpCodeText, | 973 WebSocketFrameHeader::kOpCodeText, |
965 std::vector<char>(kDefaultInitialQuota, 'B')); | 974 std::vector<char>(kDefaultInitialQuota, 'B')); |
966 EXPECT_EQ(NULL, channel_.get()); | 975 EXPECT_EQ(NULL, channel_.get()); |
967 } | 976 } |
968 | 977 |
969 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeSync) { | 978 TEST_F(WebSocketChannelDeletingTest, OnClosingHandshakeSync) { |
(...skipping 19 matching lines...) Expand all Loading... | |
989 set_stream(stream.Pass()); | 998 set_stream(stream.Pass()); |
990 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; | 999 deleting_ = EVENT_ON_CLOSING_HANDSHAKE; |
991 CreateChannelAndConnectSuccessfully(); | 1000 CreateChannelAndConnectSuccessfully(); |
992 ASSERT_TRUE(channel_); | 1001 ASSERT_TRUE(channel_); |
993 base::MessageLoop::current()->RunUntilIdle(); | 1002 base::MessageLoop::current()->RunUntilIdle(); |
994 EXPECT_EQ(NULL, channel_.get()); | 1003 EXPECT_EQ(NULL, channel_.get()); |
995 } | 1004 } |
996 | 1005 |
997 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { | 1006 TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { |
998 set_stream(make_scoped_ptr(new UnWriteableFakeWebSocketStream)); | 1007 set_stream(make_scoped_ptr(new UnWriteableFakeWebSocketStream)); |
999 deleting_ = EVENT_ON_DROP_CHANNEL; | 1008 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1000 CreateChannelAndConnectSuccessfully(); | 1009 CreateChannelAndConnectSuccessfully(); |
1001 ASSERT_TRUE(channel_); | 1010 ASSERT_TRUE(channel_); |
1002 channel_->SendFrame( | 1011 channel_->SendFrame( |
1003 true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); | 1012 true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); |
1004 EXPECT_EQ(NULL, channel_.get()); | 1013 EXPECT_EQ(NULL, channel_.get()); |
1005 } | 1014 } |
1006 | 1015 |
1007 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { | 1016 TEST_F(WebSocketChannelDeletingTest, OnDropChannelReadError) { |
1008 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1017 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1009 new ReadableFakeWebSocketStream); | 1018 new ReadableFakeWebSocketStream); |
1010 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1019 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
1011 ERR_FAILED); | 1020 ERR_FAILED); |
1012 set_stream(stream.Pass()); | 1021 set_stream(stream.Pass()); |
1013 deleting_ = EVENT_ON_DROP_CHANNEL; | 1022 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1014 CreateChannelAndConnectSuccessfully(); | 1023 CreateChannelAndConnectSuccessfully(); |
1015 ASSERT_TRUE(channel_); | 1024 ASSERT_TRUE(channel_); |
1016 base::MessageLoop::current()->RunUntilIdle(); | 1025 base::MessageLoop::current()->RunUntilIdle(); |
1017 EXPECT_EQ(NULL, channel_.get()); | 1026 EXPECT_EQ(NULL, channel_.get()); |
1018 } | 1027 } |
1019 | 1028 |
1020 TEST_F(WebSocketChannelDeletingTest, FailChannelInSendFrame) { | 1029 TEST_F(WebSocketChannelDeletingTest, FailChannelInSendFrame) { |
1021 set_stream(make_scoped_ptr(new WriteableFakeWebSocketStream)); | 1030 set_stream(make_scoped_ptr(new WriteableFakeWebSocketStream)); |
1022 deleting_ = EVENT_ON_DROP_CHANNEL; | 1031 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1023 CreateChannelAndConnectSuccessfully(); | 1032 CreateChannelAndConnectSuccessfully(); |
1024 ASSERT_TRUE(channel_); | 1033 ASSERT_TRUE(channel_); |
1025 channel_->SendFrame(true, | 1034 channel_->SendFrame(true, |
1026 WebSocketFrameHeader::kOpCodeText, | 1035 WebSocketFrameHeader::kOpCodeText, |
1027 std::vector<char>(kDefaultInitialQuota * 2, 'T')); | 1036 std::vector<char>(kDefaultInitialQuota * 2, 'T')); |
1028 EXPECT_EQ(NULL, channel_.get()); | 1037 EXPECT_EQ(NULL, channel_.get()); |
1029 } | 1038 } |
1030 | 1039 |
1031 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { | 1040 TEST_F(WebSocketChannelDeletingTest, FailChannelInOnReadDone) { |
1032 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1041 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1033 new ReadableFakeWebSocketStream); | 1042 new ReadableFakeWebSocketStream); |
1034 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, | 1043 stream->PrepareReadFramesError(ReadableFakeWebSocketStream::ASYNC, |
1035 ERR_WS_PROTOCOL_ERROR); | 1044 ERR_WS_PROTOCOL_ERROR); |
1036 set_stream(stream.Pass()); | 1045 set_stream(stream.Pass()); |
1037 deleting_ = EVENT_ON_DROP_CHANNEL; | 1046 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1038 CreateChannelAndConnectSuccessfully(); | 1047 CreateChannelAndConnectSuccessfully(); |
1039 ASSERT_TRUE(channel_); | 1048 ASSERT_TRUE(channel_); |
1040 base::MessageLoop::current()->RunUntilIdle(); | 1049 base::MessageLoop::current()->RunUntilIdle(); |
1041 EXPECT_EQ(NULL, channel_.get()); | 1050 EXPECT_EQ(NULL, channel_.get()); |
1042 } | 1051 } |
1043 | 1052 |
1044 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToMaskedFrame) { | 1053 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToMaskedFrame) { |
1045 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1054 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1046 new ReadableFakeWebSocketStream); | 1055 new ReadableFakeWebSocketStream); |
1047 static const InitFrame frames[] = { | 1056 static const InitFrame frames[] = { |
1048 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; | 1057 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, MASKED, "HELLO"}}; |
1049 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1058 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1050 set_stream(stream.Pass()); | 1059 set_stream(stream.Pass()); |
1051 deleting_ = EVENT_ON_DROP_CHANNEL; | 1060 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1052 | 1061 |
1053 CreateChannelAndConnectSuccessfully(); | 1062 CreateChannelAndConnectSuccessfully(); |
1054 EXPECT_EQ(NULL, channel_.get()); | 1063 EXPECT_EQ(NULL, channel_.get()); |
1055 } | 1064 } |
1056 | 1065 |
1057 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrame) { | 1066 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrame) { |
1058 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1067 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1059 new ReadableFakeWebSocketStream); | 1068 new ReadableFakeWebSocketStream); |
1060 static const InitFrame frames[] = { | 1069 static const InitFrame frames[] = { |
1061 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; | 1070 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; |
1062 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1071 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1063 set_stream(stream.Pass()); | 1072 set_stream(stream.Pass()); |
1064 deleting_ = EVENT_ON_DROP_CHANNEL; | 1073 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1065 | 1074 |
1066 CreateChannelAndConnectSuccessfully(); | 1075 CreateChannelAndConnectSuccessfully(); |
1067 EXPECT_EQ(NULL, channel_.get()); | 1076 EXPECT_EQ(NULL, channel_.get()); |
1068 } | 1077 } |
1069 | 1078 |
1070 // Version of above test with NULL data. | 1079 // Version of above test with NULL data. |
1071 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrameNull) { | 1080 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToBadControlFrameNull) { |
1072 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1081 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1073 new ReadableFakeWebSocketStream); | 1082 new ReadableFakeWebSocketStream); |
1074 static const InitFrame frames[] = { | 1083 static const InitFrame frames[] = { |
1075 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; | 1084 {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; |
1076 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1085 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1077 set_stream(stream.Pass()); | 1086 set_stream(stream.Pass()); |
1078 deleting_ = EVENT_ON_DROP_CHANNEL; | 1087 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1079 | 1088 |
1080 CreateChannelAndConnectSuccessfully(); | 1089 CreateChannelAndConnectSuccessfully(); |
1081 EXPECT_EQ(NULL, channel_.get()); | 1090 EXPECT_EQ(NULL, channel_.get()); |
1082 } | 1091 } |
1083 | 1092 |
1084 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterClose) { | 1093 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterClose) { |
1085 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1094 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1086 new ReadableFakeWebSocketStream); | 1095 new ReadableFakeWebSocketStream); |
1087 static const InitFrame frames[] = { | 1096 static const InitFrame frames[] = { |
1088 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, | 1097 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, |
1089 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, | 1098 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, |
1090 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; | 1099 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, ""}}; |
1091 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1100 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1092 set_stream(stream.Pass()); | 1101 set_stream(stream.Pass()); |
1093 deleting_ = EVENT_ON_DROP_CHANNEL; | 1102 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1094 | 1103 |
1095 CreateChannelAndConnectSuccessfully(); | 1104 CreateChannelAndConnectSuccessfully(); |
1096 EXPECT_EQ(NULL, channel_.get()); | 1105 EXPECT_EQ(NULL, channel_.get()); |
1097 } | 1106 } |
1098 | 1107 |
1099 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterCloseNull) { | 1108 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToPongAfterCloseNull) { |
1100 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1109 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1101 new ReadableFakeWebSocketStream); | 1110 new ReadableFakeWebSocketStream); |
1102 static const InitFrame frames[] = { | 1111 static const InitFrame frames[] = { |
1103 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, | 1112 {FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose, NOT_MASKED, |
1104 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, | 1113 CLOSE_DATA(NORMAL_CLOSURE, "Success")}, |
1105 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; | 1114 {FINAL_FRAME, WebSocketFrameHeader::kOpCodePong, NOT_MASKED, NULL}}; |
1106 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1115 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1107 set_stream(stream.Pass()); | 1116 set_stream(stream.Pass()); |
1108 deleting_ = EVENT_ON_DROP_CHANNEL; | 1117 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1109 | 1118 |
1110 CreateChannelAndConnectSuccessfully(); | 1119 CreateChannelAndConnectSuccessfully(); |
1111 EXPECT_EQ(NULL, channel_.get()); | 1120 EXPECT_EQ(NULL, channel_.get()); |
1112 } | 1121 } |
1113 | 1122 |
1114 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCode) { | 1123 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCode) { |
1115 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1124 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1116 new ReadableFakeWebSocketStream); | 1125 new ReadableFakeWebSocketStream); |
1117 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, ""}}; | 1126 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, ""}}; |
1118 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1127 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1119 set_stream(stream.Pass()); | 1128 set_stream(stream.Pass()); |
1120 deleting_ = EVENT_ON_DROP_CHANNEL; | 1129 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1121 | 1130 |
1122 CreateChannelAndConnectSuccessfully(); | 1131 CreateChannelAndConnectSuccessfully(); |
1123 EXPECT_EQ(NULL, channel_.get()); | 1132 EXPECT_EQ(NULL, channel_.get()); |
1124 } | 1133 } |
1125 | 1134 |
1126 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCodeNull) { | 1135 TEST_F(WebSocketChannelDeletingTest, FailChannelDueToUnknownOpCodeNull) { |
1127 scoped_ptr<ReadableFakeWebSocketStream> stream( | 1136 scoped_ptr<ReadableFakeWebSocketStream> stream( |
1128 new ReadableFakeWebSocketStream); | 1137 new ReadableFakeWebSocketStream); |
1129 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, NULL}}; | 1138 static const InitFrame frames[] = {{FINAL_FRAME, 0x7, NOT_MASKED, NULL}}; |
1130 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); | 1139 stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames); |
1131 set_stream(stream.Pass()); | 1140 set_stream(stream.Pass()); |
1132 deleting_ = EVENT_ON_DROP_CHANNEL; | 1141 deleting_ = EVENT_ON_FAIL_CHANNEL | EVENT_ON_DROP_CHANNEL; |
1133 | 1142 |
1134 CreateChannelAndConnectSuccessfully(); | 1143 CreateChannelAndConnectSuccessfully(); |
1135 EXPECT_EQ(NULL, channel_.get()); | 1144 EXPECT_EQ(NULL, channel_.get()); |
1136 } | 1145 } |
1137 | 1146 |
1138 TEST_F(WebSocketChannelEventInterfaceTest, ConnectSuccessReported) { | 1147 TEST_F(WebSocketChannelEventInterfaceTest, ConnectSuccessReported) { |
1139 // false means success. | 1148 // false means success. |
1140 EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, "")); | 1149 EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, "")); |
1141 // OnFlowControl is always called immediately after connect to provide initial | 1150 // OnFlowControl is always called immediately after connect to provide initial |
1142 // quota to the renderer. | 1151 // quota to the renderer. |
1143 EXPECT_CALL(*event_interface_, OnFlowControl(_)); | 1152 EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
1144 | 1153 |
1145 CreateChannelAndConnect(); | 1154 CreateChannelAndConnect(); |
1146 | 1155 |
1147 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); | 1156 connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass()); |
1148 } | 1157 } |
1149 | 1158 |
1150 TEST_F(WebSocketChannelEventInterfaceTest, ConnectFailureReported) { | 1159 TEST_F(WebSocketChannelEventInterfaceTest, ConnectFailureReported) { |
1151 // true means failure. | 1160 // true means failure. |
Adam Rice
2013/12/09 07:41:12
Please remove this "// true means failure" comment
yhirano
2013/12/09 07:48:09
Done.
| |
1152 EXPECT_CALL(*event_interface_, OnAddChannelResponse(true, "")); | 1161 EXPECT_CALL(*event_interface_, OnFailChannel("hello")); |
1153 | 1162 |
1154 CreateChannelAndConnect(); | 1163 CreateChannelAndConnect(); |
1155 | 1164 |
1156 connect_data_.creator.connect_delegate->OnFailure( | 1165 connect_data_.creator.connect_delegate->OnFailure("hello"); |
1157 kWebSocketErrorNoStatusReceived); | |
1158 } | 1166 } |
1159 | 1167 |
1160 TEST_F(WebSocketChannelEventInterfaceTest, NonWebSocketSchemeRejected) { | 1168 TEST_F(WebSocketChannelEventInterfaceTest, NonWebSocketSchemeRejected) { |
1161 EXPECT_CALL(*event_interface_, OnAddChannelResponse(true, "")); | 1169 EXPECT_CALL(*event_interface_, OnAddChannelResponse(true, "")); |
1162 connect_data_.socket_url = GURL("http://www.google.com/"); | 1170 connect_data_.socket_url = GURL("http://www.google.com/"); |
1163 CreateChannelAndConnect(); | 1171 CreateChannelAndConnect(); |
1164 } | 1172 } |
1165 | 1173 |
1166 TEST_F(WebSocketChannelEventInterfaceTest, ProtocolPassed) { | 1174 TEST_F(WebSocketChannelEventInterfaceTest, ProtocolPassed) { |
1167 EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, "Bob")); | 1175 EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, "Bob")); |
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2369 channel_->StartClosingHandshake(kWebSocketNormalClosure, "OK"); | 2377 channel_->StartClosingHandshake(kWebSocketNormalClosure, "OK"); |
2370 ASSERT_TRUE(read_frames); | 2378 ASSERT_TRUE(read_frames); |
2371 // Provide the "Close" message from the server. | 2379 // Provide the "Close" message from the server. |
2372 *read_frames = CreateFrameVector(frames); | 2380 *read_frames = CreateFrameVector(frames); |
2373 read_callback.Run(OK); | 2381 read_callback.Run(OK); |
2374 completion.WaitForResult(); | 2382 completion.WaitForResult(); |
2375 } | 2383 } |
2376 | 2384 |
2377 } // namespace | 2385 } // namespace |
2378 } // namespace net | 2386 } // namespace net |
OLD | NEW |