Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(813)

Side by Side Diff: net/websockets/websocket_channel_test.cc

Issue 105833003: Fail WebSocket channel when handshake fails. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698