| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <cstddef> |
| 6 #include <string> |
| 7 |
| 5 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 6 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 7 #include "net/base/completion_callback.h" | 10 #include "net/base/completion_callback.h" |
| 8 #include "net/base/net_log_unittest.h" | 11 #include "net/base/net_log_unittest.h" |
| 9 #include "net/spdy/buffered_spdy_framer.h" | 12 #include "net/spdy/buffered_spdy_framer.h" |
| 10 #include "net/spdy/spdy_stream.h" | 13 #include "net/spdy/spdy_stream.h" |
| 11 #include "net/spdy/spdy_http_utils.h" | 14 #include "net/spdy/spdy_http_utils.h" |
| 12 #include "net/spdy/spdy_protocol.h" | 15 #include "net/spdy/spdy_protocol.h" |
| 13 #include "net/spdy/spdy_session.h" | 16 #include "net/spdy/spdy_session.h" |
| 14 #include "net/spdy/spdy_stream_test_util.h" | 17 #include "net/spdy/spdy_stream_test_util.h" |
| 15 #include "net/spdy/spdy_test_util_common.h" | 18 #include "net/spdy/spdy_test_util_common.h" |
| 16 #include "net/spdy/spdy_test_util_spdy2.h" | 19 #include "net/spdy/spdy_test_util_spdy2.h" |
| 17 #include "net/spdy/spdy_websocket_test_util_spdy2.h" | 20 #include "net/spdy/spdy_websocket_test_util_spdy2.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 22 |
| 20 using namespace net::test_spdy2; | 23 using namespace net::test_spdy2; |
| 21 | 24 |
| 22 // TODO(ukai): factor out common part with spdy_http_stream_unittest.cc | 25 // TODO(ukai): factor out common part with spdy_http_stream_unittest.cc |
| 23 // | 26 // |
| 24 namespace net { | 27 namespace net { |
| 25 | 28 |
| 26 namespace test { | 29 namespace test { |
| 27 | 30 |
| 28 namespace { | 31 namespace { |
| 29 | 32 |
| 30 const SpdyHeaderInfo kSynStartHeader = { | 33 const char kStreamUrl[] = "http://www.google.com/"; |
| 31 SYN_STREAM, | 34 const char kPostBody[] = "\0hello!\xff"; |
| 32 1, | 35 const size_t kPostBodyLength = arraysize(kPostBody); |
| 33 0, | |
| 34 ConvertRequestPriorityToSpdyPriority(LOWEST, 2), | |
| 35 CONTROL_FLAG_NONE, | |
| 36 false, | |
| 37 RST_STREAM_INVALID, | |
| 38 NULL, | |
| 39 0, | |
| 40 DATA_FLAG_NONE | |
| 41 }; | |
| 42 | |
| 43 const char* const kGetHeaders[] = { | |
| 44 "method", | |
| 45 "GET", | |
| 46 "scheme", | |
| 47 "http", | |
| 48 "host", | |
| 49 "www.google.com", | |
| 50 "url", | |
| 51 "/", | |
| 52 "version", | |
| 53 "HTTP/1.1", | |
| 54 }; | |
| 55 | |
| 56 scoped_ptr<SpdyFrame> ConstructSpdyGetRequest() { | |
| 57 return scoped_ptr<SpdyFrame>( | |
| 58 ConstructSpdyPacket( | |
| 59 kSynStartHeader, NULL, 0, kGetHeaders, arraysize(kGetHeaders) / 2)); | |
| 60 } | |
| 61 | |
| 62 scoped_ptr<SpdyHeaderBlock> ConstructSpdyGetHeaderBlock() { | |
| 63 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | |
| 64 for (size_t i = 0; i < arraysize(kGetHeaders) / 2; ++i) { | |
| 65 (*headers)[kGetHeaders[2*i]] = kGetHeaders[2*i+1]; | |
| 66 } | |
| 67 return headers.Pass(); | |
| 68 } | |
| 69 | |
| 70 scoped_ptr<SpdyFrame> ConstructSpdyBodyFrame(const char* data, int length) { | |
| 71 BufferedSpdyFramer framer(kSpdyVersion2, false); | |
| 72 return scoped_ptr<SpdyFrame>( | |
| 73 framer.CreateDataFrame(1, data, length, DATA_FLAG_NONE)); | |
| 74 } | |
| 75 | 36 |
| 76 class SpdyStreamSpdy2Test : public testing::Test { | 37 class SpdyStreamSpdy2Test : public testing::Test { |
| 77 protected: | 38 protected: |
| 78 SpdyStreamSpdy2Test() : host_port_pair_("www.google.com", 80) { | 39 SpdyStreamSpdy2Test() : host_port_pair_("www.google.com", 80) { |
| 79 } | 40 } |
| 80 | 41 |
| 81 scoped_refptr<SpdySession> CreateSpdySession() { | 42 scoped_refptr<SpdySession> CreateSpdySession() { |
| 82 HostPortProxyPair pair(host_port_pair_, ProxyServer::Direct()); | 43 HostPortProxyPair pair(host_port_pair_, ProxyServer::Direct()); |
| 83 scoped_refptr<SpdySession> session( | 44 scoped_refptr<SpdySession> session( |
| 84 session_->spdy_session_pool()->Get(pair, BoundNetLog())); | 45 session_->spdy_session_pool()->Get(pair, BoundNetLog())); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 103 virtual void TearDown() { | 64 virtual void TearDown() { |
| 104 MessageLoop::current()->RunUntilIdle(); | 65 MessageLoop::current()->RunUntilIdle(); |
| 105 } | 66 } |
| 106 | 67 |
| 107 HostPortPair host_port_pair_; | 68 HostPortPair host_port_pair_; |
| 108 SpdySessionDependencies session_deps_; | 69 SpdySessionDependencies session_deps_; |
| 109 scoped_refptr<HttpNetworkSession> session_; | 70 scoped_refptr<HttpNetworkSession> session_; |
| 110 }; | 71 }; |
| 111 | 72 |
| 112 TEST_F(SpdyStreamSpdy2Test, SendDataAfterOpen) { | 73 TEST_F(SpdyStreamSpdy2Test, SendDataAfterOpen) { |
| 74 GURL url(kStreamUrl); |
| 75 |
| 113 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 76 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 114 | 77 |
| 115 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(); | 78 scoped_ptr<SpdyFrame> req( |
| 116 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame("\0hello!\xff", 8); | 79 ConstructSpdyPost(kStreamUrl, kPostBodyLength, NULL, 0)); |
| 80 scoped_ptr<SpdyFrame> msg( |
| 81 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 117 MockWrite writes[] = { | 82 MockWrite writes[] = { |
| 118 CreateMockWrite(*req), | 83 CreateMockWrite(*req), |
| 119 CreateMockWrite(*msg), | 84 CreateMockWrite(*msg), |
| 120 }; | 85 }; |
| 121 writes[0].sequence_number = 0; | 86 writes[0].sequence_number = 0; |
| 122 writes[1].sequence_number = 2; | 87 writes[1].sequence_number = 2; |
| 123 | 88 |
| 124 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); | 89 scoped_ptr<SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); |
| 125 scoped_ptr<SpdyFrame> echo( | 90 scoped_ptr<SpdyFrame> echo( |
| 126 ConstructSpdyBodyFrame("\0hello!\xff", 8)); | 91 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 127 MockRead reads[] = { | 92 MockRead reads[] = { |
| 128 CreateMockRead(*resp), | 93 CreateMockRead(*resp), |
| 129 CreateMockRead(*echo), | 94 CreateMockRead(*echo), |
| 130 MockRead(ASYNC, 0, 0), // EOF | 95 MockRead(ASYNC, 0, 0), // EOF |
| 131 }; | 96 }; |
| 132 reads[0].sequence_number = 1; | 97 reads[0].sequence_number = 1; |
| 133 reads[1].sequence_number = 3; | 98 reads[1].sequence_number = 3; |
| 134 reads[2].sequence_number = 4; | 99 reads[2].sequence_number = 4; |
| 135 | 100 |
| 136 OrderedSocketData data(reads, arraysize(reads), | 101 OrderedSocketData data(reads, arraysize(reads), |
| 137 writes, arraysize(writes)); | 102 writes, arraysize(writes)); |
| 138 MockConnect connect_data(SYNCHRONOUS, OK); | 103 MockConnect connect_data(SYNCHRONOUS, OK); |
| 139 data.set_connect_data(connect_data); | 104 data.set_connect_data(connect_data); |
| 140 | 105 |
| 141 session_deps_.socket_factory->AddSocketDataProvider(&data); | 106 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 142 | 107 |
| 143 scoped_refptr<SpdySession> session(CreateSpdySession()); | 108 scoped_refptr<SpdySession> session(CreateSpdySession()); |
| 144 const char kStreamUrl[] = "http://www.google.com/"; | |
| 145 GURL url(kStreamUrl); | |
| 146 | 109 |
| 147 InitializeSpdySession(session, host_port_pair_); | 110 InitializeSpdySession(session, host_port_pair_); |
| 148 | 111 |
| 149 scoped_refptr<SpdyStream> stream = | 112 scoped_refptr<SpdyStream> stream = |
| 150 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); | 113 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); |
| 151 ASSERT_TRUE(stream.get() != NULL); | 114 ASSERT_TRUE(stream.get() != NULL); |
| 152 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(8)); | 115 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kPostBodyLength)); |
| 153 memcpy(buf->data(), "\0hello!\xff", 8); | 116 memcpy(buf->data(), kPostBody, kPostBodyLength); |
| 154 | 117 |
| 155 StreamDelegateSendImmediate delegate( | 118 StreamDelegateSendImmediate delegate( |
| 156 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); | 119 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); |
| 157 stream->SetDelegate(&delegate); | 120 stream->SetDelegate(&delegate); |
| 158 | 121 |
| 159 EXPECT_FALSE(stream->HasUrl()); | 122 EXPECT_FALSE(stream->HasUrl()); |
| 160 | 123 |
| 161 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); | 124 stream->set_spdy_headers( |
| 125 ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
| 162 EXPECT_TRUE(stream->HasUrl()); | 126 EXPECT_TRUE(stream->HasUrl()); |
| 163 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 127 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 164 | 128 |
| 165 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); | 129 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
| 166 | 130 |
| 167 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 131 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 168 | 132 |
| 169 EXPECT_TRUE(delegate.send_headers_completed()); | 133 EXPECT_TRUE(delegate.send_headers_completed()); |
| 170 EXPECT_EQ("200", delegate.GetResponseHeaderValue("status")); | 134 EXPECT_EQ("200", delegate.GetResponseHeaderValue("status")); |
| 171 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue("version")); | 135 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue("version")); |
| 172 EXPECT_EQ(std::string("\0hello!\xff", 8), delegate.received_data()); | 136 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), delegate.received_data()); |
| 173 EXPECT_EQ(8, delegate.data_sent()); | 137 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent()); |
| 174 } | 138 } |
| 175 | 139 |
| 176 TEST_F(SpdyStreamSpdy2Test, SendHeaderAndDataAfterOpen) { | 140 TEST_F(SpdyStreamSpdy2Test, SendHeaderAndDataAfterOpen) { |
| 177 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 141 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 178 | 142 |
| 179 scoped_ptr<SpdyFrame> expected_request(ConstructSpdyWebSocketSynStream( | 143 scoped_ptr<SpdyFrame> expected_request(ConstructSpdyWebSocketSynStream( |
| 180 1, | 144 1, |
| 181 "/chat", | 145 "/chat", |
| 182 "server.example.com", | 146 "server.example.com", |
| 183 "http://example.com")); | 147 "http://example.com")); |
| 184 scoped_ptr<SpdyFrame> expected_headers(ConstructSpdyWebSocketHeadersFrame( | 148 scoped_ptr<SpdyFrame> expected_headers(ConstructSpdyWebSocketHeadersFrame( |
| 185 1, "6", true)); | 149 1, "6", true)); |
| 186 scoped_ptr<SpdyFrame> expected_message = ConstructSpdyBodyFrame("hello!", 6); | 150 scoped_ptr<SpdyFrame> expected_message( |
| 151 ConstructSpdyBodyFrame(1, "hello!", 6, false)); |
| 187 MockWrite writes[] = { | 152 MockWrite writes[] = { |
| 188 CreateMockWrite(*expected_request), | 153 CreateMockWrite(*expected_request), |
| 189 CreateMockWrite(*expected_headers), | 154 CreateMockWrite(*expected_headers), |
| 190 CreateMockWrite(*expected_message) | 155 CreateMockWrite(*expected_message) |
| 191 }; | 156 }; |
| 192 writes[0].sequence_number = 0; | 157 writes[0].sequence_number = 0; |
| 193 writes[1].sequence_number = 2; | 158 writes[1].sequence_number = 2; |
| 194 writes[1].sequence_number = 3; | 159 writes[1].sequence_number = 3; |
| 195 | 160 |
| 196 scoped_ptr<SpdyFrame> response( | 161 scoped_ptr<SpdyFrame> response( |
| 197 ConstructSpdyWebSocketSynReply(1)); | 162 ConstructSpdyWebSocketSynReply(1)); |
| 198 MockRead reads[] = { | 163 MockRead reads[] = { |
| 199 CreateMockRead(*response), | 164 CreateMockRead(*response), |
| 200 MockRead(ASYNC, 0, 0), // EOF | 165 MockRead(ASYNC, 0, 0), // EOF |
| 201 }; | 166 }; |
| 202 reads[0].sequence_number = 1; | 167 reads[0].sequence_number = 1; |
| 203 reads[1].sequence_number = 4; | 168 reads[1].sequence_number = 4; |
| 204 | 169 |
| 205 OrderedSocketData data(reads, arraysize(reads), | 170 OrderedSocketData data(reads, arraysize(reads), |
| 206 writes, arraysize(writes)); | 171 writes, arraysize(writes)); |
| 207 MockConnect connect_data(SYNCHRONOUS, OK); | 172 MockConnect connect_data(SYNCHRONOUS, OK); |
| 208 data.set_connect_data(connect_data); | 173 data.set_connect_data(connect_data); |
| 209 | 174 |
| 210 session_deps_.socket_factory->AddSocketDataProvider(&data); | 175 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 211 | 176 |
| 212 scoped_refptr<SpdySession> session(CreateSpdySession()); | 177 scoped_refptr<SpdySession> session(CreateSpdySession()); |
| 213 const char kStreamUrl[] = "ws://server.example.com/chat"; | 178 GURL url("ws://server.example.com/chat"); |
| 214 GURL url(kStreamUrl); | |
| 215 | 179 |
| 216 HostPortPair host_port_pair("server.example.com", 80); | 180 HostPortPair host_port_pair("server.example.com", 80); |
| 217 InitializeSpdySession(session, host_port_pair); | 181 InitializeSpdySession(session, host_port_pair); |
| 218 | 182 |
| 219 scoped_refptr<SpdyStream> stream = | 183 scoped_refptr<SpdyStream> stream = |
| 220 CreateStreamSynchronously(session, url, HIGHEST, BoundNetLog()); | 184 CreateStreamSynchronously(session, url, HIGHEST, BoundNetLog()); |
| 221 ASSERT_TRUE(stream.get() != NULL); | 185 ASSERT_TRUE(stream.get() != NULL); |
| 222 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(6)); | 186 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(6)); |
| 223 memcpy(buf->data(), "hello!", 6); | 187 memcpy(buf->data(), "hello!", 6); |
| 224 scoped_ptr<SpdyHeaderBlock> message_headers(new SpdyHeaderBlock); | 188 scoped_ptr<SpdyHeaderBlock> message_headers(new SpdyHeaderBlock); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 246 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 210 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 247 | 211 |
| 248 EXPECT_TRUE(delegate.send_headers_completed()); | 212 EXPECT_TRUE(delegate.send_headers_completed()); |
| 249 EXPECT_EQ("101", delegate.GetResponseHeaderValue("status")); | 213 EXPECT_EQ("101", delegate.GetResponseHeaderValue("status")); |
| 250 EXPECT_EQ(1, delegate.headers_sent()); | 214 EXPECT_EQ(1, delegate.headers_sent()); |
| 251 EXPECT_EQ(std::string(), delegate.received_data()); | 215 EXPECT_EQ(std::string(), delegate.received_data()); |
| 252 EXPECT_EQ(6, delegate.data_sent()); | 216 EXPECT_EQ(6, delegate.data_sent()); |
| 253 } | 217 } |
| 254 | 218 |
| 255 TEST_F(SpdyStreamSpdy2Test, PushedStream) { | 219 TEST_F(SpdyStreamSpdy2Test, PushedStream) { |
| 256 const char kStreamUrl[] = "http://www.google.com/"; | |
| 257 | |
| 258 SpdySessionDependencies session_deps; | 220 SpdySessionDependencies session_deps; |
| 259 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 221 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 260 scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); | 222 scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); |
| 261 | 223 |
| 262 MockRead reads[] = { | 224 MockRead reads[] = { |
| 263 MockRead(ASYNC, 0, 0), // EOF | 225 MockRead(ASYNC, 0, 0), // EOF |
| 264 }; | 226 }; |
| 265 | 227 |
| 266 OrderedSocketData data(reads, arraysize(reads), NULL, 0); | 228 OrderedSocketData data(reads, arraysize(reads), NULL, 0); |
| 267 MockConnect connect_data(SYNCHRONOUS, OK); | 229 MockConnect connect_data(SYNCHRONOUS, OK); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 291 response["version"] = "OK"; | 253 response["version"] = "OK"; |
| 292 stream->OnHeaders(headers); | 254 stream->OnHeaders(headers); |
| 293 | 255 |
| 294 stream->set_response_received(); | 256 stream->set_response_received(); |
| 295 EXPECT_TRUE(stream->response_received()); | 257 EXPECT_TRUE(stream->response_received()); |
| 296 EXPECT_TRUE(stream->HasUrl()); | 258 EXPECT_TRUE(stream->HasUrl()); |
| 297 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 259 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 298 } | 260 } |
| 299 | 261 |
| 300 TEST_F(SpdyStreamSpdy2Test, StreamError) { | 262 TEST_F(SpdyStreamSpdy2Test, StreamError) { |
| 263 GURL url(kStreamUrl); |
| 264 |
| 301 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 265 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 302 | 266 |
| 303 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(); | 267 scoped_ptr<SpdyFrame> req( |
| 268 ConstructSpdyPost(kStreamUrl, kPostBodyLength, NULL, 0)); |
| 304 scoped_ptr<SpdyFrame> msg( | 269 scoped_ptr<SpdyFrame> msg( |
| 305 ConstructSpdyBodyFrame("\0hello!\xff", 8)); | 270 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 306 MockWrite writes[] = { | 271 MockWrite writes[] = { |
| 307 CreateMockWrite(*req), | 272 CreateMockWrite(*req), |
| 308 CreateMockWrite(*msg), | 273 CreateMockWrite(*msg), |
| 309 }; | 274 }; |
| 310 writes[0].sequence_number = 0; | 275 writes[0].sequence_number = 0; |
| 311 writes[1].sequence_number = 2; | 276 writes[1].sequence_number = 2; |
| 312 | 277 |
| 313 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); | 278 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 314 scoped_ptr<SpdyFrame> echo( | 279 scoped_ptr<SpdyFrame> echo( |
| 315 ConstructSpdyBodyFrame("\0hello!\xff", 8)); | 280 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| 316 MockRead reads[] = { | 281 MockRead reads[] = { |
| 317 CreateMockRead(*resp), | 282 CreateMockRead(*resp), |
| 318 CreateMockRead(*echo), | 283 CreateMockRead(*echo), |
| 319 MockRead(ASYNC, 0, 0), // EOF | 284 MockRead(ASYNC, 0, 0), // EOF |
| 320 }; | 285 }; |
| 321 reads[0].sequence_number = 1; | 286 reads[0].sequence_number = 1; |
| 322 reads[1].sequence_number = 3; | 287 reads[1].sequence_number = 3; |
| 323 reads[2].sequence_number = 4; | 288 reads[2].sequence_number = 4; |
| 324 | 289 |
| 325 CapturingBoundNetLog log; | 290 CapturingBoundNetLog log; |
| 326 | 291 |
| 327 OrderedSocketData data(reads, arraysize(reads), | 292 OrderedSocketData data(reads, arraysize(reads), |
| 328 writes, arraysize(writes)); | 293 writes, arraysize(writes)); |
| 329 MockConnect connect_data(SYNCHRONOUS, OK); | 294 MockConnect connect_data(SYNCHRONOUS, OK); |
| 330 data.set_connect_data(connect_data); | 295 data.set_connect_data(connect_data); |
| 331 | 296 |
| 332 session_deps_.socket_factory->AddSocketDataProvider(&data); | 297 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 333 | 298 |
| 334 scoped_refptr<SpdySession> session(CreateSpdySession()); | 299 scoped_refptr<SpdySession> session(CreateSpdySession()); |
| 335 const char kStreamUrl[] = "http://www.google.com/"; | |
| 336 GURL url(kStreamUrl); | |
| 337 | 300 |
| 338 InitializeSpdySession(session, host_port_pair_); | 301 InitializeSpdySession(session, host_port_pair_); |
| 339 | 302 |
| 340 scoped_refptr<SpdyStream> stream = | 303 scoped_refptr<SpdyStream> stream = |
| 341 CreateStreamSynchronously(session, url, LOWEST, log.bound()); | 304 CreateStreamSynchronously(session, url, LOWEST, log.bound()); |
| 342 ASSERT_TRUE(stream.get() != NULL); | 305 ASSERT_TRUE(stream.get() != NULL); |
| 343 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(8)); | 306 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kPostBodyLength)); |
| 344 memcpy(buf->data(), "\0hello!\xff", 8); | 307 memcpy(buf->data(), kPostBody, kPostBodyLength); |
| 345 | 308 |
| 346 StreamDelegateSendImmediate delegate( | 309 StreamDelegateSendImmediate delegate( |
| 347 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); | 310 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); |
| 348 stream->SetDelegate(&delegate); | 311 stream->SetDelegate(&delegate); |
| 349 | 312 |
| 350 EXPECT_FALSE(stream->HasUrl()); | 313 EXPECT_FALSE(stream->HasUrl()); |
| 351 | 314 |
| 352 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); | 315 stream->set_spdy_headers( |
| 316 ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
| 353 EXPECT_TRUE(stream->HasUrl()); | 317 EXPECT_TRUE(stream->HasUrl()); |
| 354 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 318 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 355 | 319 |
| 356 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); | 320 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
| 357 | 321 |
| 358 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 322 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 359 | 323 |
| 360 const SpdyStreamId stream_id = stream->stream_id(); | 324 const SpdyStreamId stream_id = stream->stream_id(); |
| 361 | 325 |
| 362 EXPECT_TRUE(delegate.send_headers_completed()); | 326 EXPECT_TRUE(delegate.send_headers_completed()); |
| 363 EXPECT_EQ("200", delegate.GetResponseHeaderValue("status")); | 327 EXPECT_EQ("200", delegate.GetResponseHeaderValue("status")); |
| 364 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue("version")); | 328 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue("version")); |
| 365 EXPECT_EQ(std::string("\0hello!\xff", 8), delegate.received_data()); | 329 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), delegate.received_data()); |
| 366 EXPECT_EQ(8, delegate.data_sent()); | 330 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent()); |
| 367 | 331 |
| 368 // Check that the NetLog was filled reasonably. | 332 // Check that the NetLog was filled reasonably. |
| 369 net::CapturingNetLog::CapturedEntryList entries; | 333 net::CapturingNetLog::CapturedEntryList entries; |
| 370 log.GetEntries(&entries); | 334 log.GetEntries(&entries); |
| 371 EXPECT_LT(0u, entries.size()); | 335 EXPECT_LT(0u, entries.size()); |
| 372 | 336 |
| 373 // Check that we logged SPDY_STREAM_ERROR correctly. | 337 // Check that we logged SPDY_STREAM_ERROR correctly. |
| 374 int pos = net::ExpectLogContainsSomewhere( | 338 int pos = net::ExpectLogContainsSomewhere( |
| 375 entries, 0, | 339 entries, 0, |
| 376 net::NetLog::TYPE_SPDY_STREAM_ERROR, | 340 net::NetLog::TYPE_SPDY_STREAM_ERROR, |
| 377 net::NetLog::PHASE_NONE); | 341 net::NetLog::PHASE_NONE); |
| 378 | 342 |
| 379 int stream_id2; | 343 int stream_id2; |
| 380 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); | 344 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); |
| 381 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); | 345 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); |
| 382 } | 346 } |
| 383 | 347 |
| 384 } // namespace | 348 } // namespace |
| 385 | 349 |
| 386 } // namespace test | 350 } // namespace test |
| 387 | 351 |
| 388 } // namespace net | 352 } // namespace net |
| OLD | NEW |