OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/spdy/spdy_proxy_client_socket.h" | 5 #include "net/spdy/spdy_proxy_client_socket.h" |
6 | 6 |
7 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
8 #include "net/base/address_list.h" | 8 #include "net/base/address_list.h" |
9 #include "net/base/net_log.h" | 9 #include "net/base/net_log.h" |
10 #include "net/base/net_log_unittest.h" | 10 #include "net/base/net_log_unittest.h" |
(...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 935 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
936 MockRead reads[] = { | 936 MockRead reads[] = { |
937 CreateMockRead(*resp, 1, true), | 937 CreateMockRead(*resp, 1, true), |
938 MockRead(true, 0, 2), // EOF | 938 MockRead(true, 0, 2), // EOF |
939 }; | 939 }; |
940 | 940 |
941 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 941 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
942 | 942 |
943 AssertConnectSucceeds(); | 943 AssertConnectSucceeds(); |
944 | 944 |
945 sock_->Disconnect(); | 945 Run(1); |
946 | 946 |
947 ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); | 947 ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); |
948 ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); | 948 ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); |
949 ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); | 949 ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); |
950 } | 950 } |
951 | 951 |
| 952 // Read pending when socket is closed should return 0 |
| 953 TEST_F(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { |
| 954 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 955 MockWrite writes[] = { |
| 956 CreateMockWrite(*conn, 0, false), |
| 957 }; |
| 958 |
| 959 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 960 MockRead reads[] = { |
| 961 CreateMockRead(*resp, 1, true), |
| 962 MockRead(true, 0, 2), // EOF |
| 963 }; |
| 964 |
| 965 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 966 |
| 967 AssertConnectSucceeds(); |
| 968 |
| 969 AssertReadStarts(kMsg1, kLen1); |
| 970 |
| 971 Run(1); |
| 972 |
| 973 ASSERT_EQ(0, read_callback_.WaitForResult()); |
| 974 } |
| 975 |
| 976 // Reading from a disconnected socket is an error |
| 977 TEST_F(SpdyProxyClientSocketTest, ReadOnDisconnectSocketReturnsNotConnected) { |
| 978 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 979 MockWrite writes[] = { |
| 980 CreateMockWrite(*conn, 0, false), |
| 981 }; |
| 982 |
| 983 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 984 MockRead reads[] = { |
| 985 CreateMockRead(*resp, 1, true), |
| 986 MockRead(true, 0, 2), // EOF |
| 987 }; |
| 988 |
| 989 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 990 |
| 991 AssertConnectSucceeds(); |
| 992 |
| 993 sock_->Disconnect(); |
| 994 |
| 995 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->Read(NULL, 1, NULL)); |
| 996 } |
| 997 |
| 998 // Reading buffered data from an already closed socket should return |
| 999 // buffered data, then 0. |
| 1000 TEST_F(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { |
| 1001 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1002 MockWrite writes[] = { |
| 1003 CreateMockWrite(*conn, 0, false), |
| 1004 }; |
| 1005 |
| 1006 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1007 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1008 MockRead reads[] = { |
| 1009 CreateMockRead(*resp, 1, true), |
| 1010 CreateMockRead(*msg1, 2, true), |
| 1011 MockRead(true, 0, 3), // EOF |
| 1012 }; |
| 1013 |
| 1014 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1015 |
| 1016 AssertConnectSucceeds(); |
| 1017 |
| 1018 Run(2); |
| 1019 |
| 1020 AssertSyncReadEquals(kMsg1, kLen1); |
| 1021 ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); |
| 1022 ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); |
| 1023 // Verify that read *still* returns ERR_CONNECTION_CLOSED |
| 1024 ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); |
| 1025 } |
| 1026 |
952 // Calling Write() on a closed socket is an error | 1027 // Calling Write() on a closed socket is an error |
953 TEST_F(SpdyProxyClientSocketTest, WriteOnClosedStream) { | 1028 TEST_F(SpdyProxyClientSocketTest, WriteOnClosedStream) { |
954 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1029 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
955 MockWrite writes[] = { | 1030 MockWrite writes[] = { |
956 CreateMockWrite(*conn, 0, false), | 1031 CreateMockWrite(*conn, 0, false), |
957 }; | 1032 }; |
958 | 1033 |
959 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1034 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
960 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1035 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
961 MockRead reads[] = { | 1036 MockRead reads[] = { |
962 CreateMockRead(*resp, 1, true), | 1037 CreateMockRead(*resp, 1, true), |
963 MockRead(true, 0, 2), // EOF | 1038 MockRead(true, 0, 2), // EOF |
964 }; | 1039 }; |
965 | 1040 |
966 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1041 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
967 | 1042 |
968 AssertConnectSucceeds(); | 1043 AssertConnectSucceeds(); |
969 | 1044 |
970 Run(1); // Read EOF which will close the stream | 1045 Run(1); // Read EOF which will close the stream |
971 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1046 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
972 EXPECT_EQ(ERR_CONNECTION_CLOSED, sock_->Write(buf, buf->size(), NULL)); | 1047 EXPECT_EQ(ERR_CONNECTION_CLOSED, sock_->Write(buf, buf->size(), NULL)); |
973 } | 1048 } |
974 | 1049 |
975 // ----------- Pending read/write when closed | 1050 // Calling Write() on a disconnected socket is an error |
| 1051 TEST_F(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { |
| 1052 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1053 MockWrite writes[] = { |
| 1054 CreateMockWrite(*conn, 0, false), |
| 1055 }; |
| 1056 |
| 1057 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1058 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1059 MockRead reads[] = { |
| 1060 CreateMockRead(*resp, 1, true), |
| 1061 MockRead(true, 0, 2), // EOF |
| 1062 }; |
| 1063 |
| 1064 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1065 |
| 1066 AssertConnectSucceeds(); |
| 1067 |
| 1068 sock_->Disconnect(); |
| 1069 |
| 1070 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1071 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->Write(buf, buf->size(), NULL)); |
| 1072 } |
976 | 1073 |
977 // If the socket is closed with a pending Write(), the callback | 1074 // If the socket is closed with a pending Write(), the callback |
| 1075 // should be called with ERR_CONNECTION_CLOSED. |
| 1076 TEST_F(SpdyProxyClientSocketTest, WritePendingOnClose) { |
| 1077 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1078 MockWrite writes[] = { |
| 1079 CreateMockWrite(*conn, 0, false), |
| 1080 MockWrite(true, ERR_IO_PENDING, 2), |
| 1081 }; |
| 1082 |
| 1083 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1084 MockRead reads[] = { |
| 1085 CreateMockRead(*resp, 1, true), |
| 1086 MockRead(true, 0, 3), // EOF |
| 1087 }; |
| 1088 |
| 1089 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1090 |
| 1091 AssertConnectSucceeds(); |
| 1092 |
| 1093 EXPECT_TRUE(sock_->IsConnected()); |
| 1094 |
| 1095 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1096 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), &write_callback_)); |
| 1097 |
| 1098 Run(1); |
| 1099 |
| 1100 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); |
| 1101 } |
| 1102 |
| 1103 // If the socket is Disconnected with a pending Write(), the callback |
978 // should not be called. | 1104 // should not be called. |
979 TEST_F(SpdyProxyClientSocketTest, DisconnectWithWritePending) { | 1105 TEST_F(SpdyProxyClientSocketTest, DisconnectWithWritePending) { |
980 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1106 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
981 MockWrite writes[] = { | 1107 MockWrite writes[] = { |
982 CreateMockWrite(*conn, 0, false), | 1108 CreateMockWrite(*conn, 0, false), |
983 MockWrite(false, 0, 2), // EOF | 1109 MockWrite(false, 0, 2), // EOF |
984 }; | 1110 }; |
985 | 1111 |
986 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1112 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
987 MockRead reads[] = { | 1113 MockRead reads[] = { |
988 CreateMockRead(*resp, 1, true), | 1114 CreateMockRead(*resp, 1, true), |
989 MockRead(true, 0, 3), // EOF | 1115 MockRead(true, 0, 3), // EOF |
990 }; | 1116 }; |
991 | 1117 |
992 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1118 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
993 | 1119 |
994 AssertConnectSucceeds(); | 1120 AssertConnectSucceeds(); |
995 | 1121 |
996 EXPECT_TRUE(sock_->IsConnected()); | 1122 EXPECT_TRUE(sock_->IsConnected()); |
997 | 1123 |
998 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1124 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
999 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), &write_callback_)); | 1125 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), &write_callback_)); |
1000 | 1126 |
1001 sock_->Disconnect(); | 1127 sock_->Disconnect(); |
1002 | 1128 |
1003 EXPECT_FALSE(sock_->IsConnected()); | 1129 EXPECT_FALSE(sock_->IsConnected()); |
1004 EXPECT_FALSE(write_callback_.have_result()); | 1130 EXPECT_FALSE(write_callback_.have_result()); |
1005 } | 1131 } |
1006 | 1132 |
1007 // If the socket is closed with a pending Read(), the callback | 1133 // If the socket is Disconnected with a pending Read(), the callback |
1008 // should not be called. | 1134 // should not be called. |
1009 TEST_F(SpdyProxyClientSocketTest, DisconnectWithReadPending) { | 1135 TEST_F(SpdyProxyClientSocketTest, DisconnectWithReadPending) { |
1010 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1136 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
1011 MockWrite writes[] = { | 1137 MockWrite writes[] = { |
1012 CreateMockWrite(*conn, 0, false), | 1138 CreateMockWrite(*conn, 0, false), |
1013 }; | 1139 }; |
1014 | 1140 |
1015 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1141 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
1016 MockRead reads[] = { | 1142 MockRead reads[] = { |
1017 CreateMockRead(*resp, 1, true), | 1143 CreateMockRead(*resp, 1, true), |
1018 MockRead(true, 0, 2), // EOF | 1144 MockRead(true, 0, 2), // EOF |
1019 }; | 1145 }; |
1020 | 1146 |
1021 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1147 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1022 | 1148 |
1023 AssertConnectSucceeds(); | 1149 AssertConnectSucceeds(); |
1024 | 1150 |
1025 EXPECT_TRUE(sock_->IsConnected()); | 1151 EXPECT_TRUE(sock_->IsConnected()); |
1026 | 1152 |
1027 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1153 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
1028 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(buf, kLen1, &read_callback_)); | 1154 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(buf, kLen1, &read_callback_)); |
1029 | 1155 |
1030 sock_->Disconnect(); | 1156 sock_->Disconnect(); |
1031 | 1157 |
1032 EXPECT_FALSE(sock_->IsConnected()); | 1158 EXPECT_FALSE(sock_->IsConnected()); |
1033 EXPECT_FALSE(read_callback_.have_result()); | 1159 EXPECT_FALSE(read_callback_.have_result()); |
1034 } | 1160 } |
1035 | 1161 |
1036 } // namespace net | 1162 } // namespace net |
OLD | NEW |