| 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 |