| 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/tools/flip_server/spdy_interface.h" | 5 #include "net/tools/flip_server/spdy_interface.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 | 8 |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/strings/string_piece.h" | 10 #include "base/strings/string_piece.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 using ::testing::InvokeWithoutArgs; | 25 using ::testing::InvokeWithoutArgs; |
| 26 using ::testing::Return; | 26 using ::testing::Return; |
| 27 using ::testing::SaveArg; | 27 using ::testing::SaveArg; |
| 28 using ::testing::Values; | 28 using ::testing::Values; |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 struct StringSaver { | 32 struct StringSaver { |
| 33 public: | 33 public: |
| 34 StringSaver() : data(NULL), size(0) {} | 34 StringSaver() : data(NULL), size(0) {} |
| 35 void Save() { | 35 void Save() { string = std::string(data, size); } |
| 36 string = std::string(data, size); | |
| 37 } | |
| 38 | 36 |
| 39 const char* data; | 37 const char* data; |
| 40 size_t size; | 38 size_t size; |
| 41 std::string string; | 39 std::string string; |
| 42 }; | 40 }; |
| 43 | 41 |
| 44 class SpdyFramerVisitor : public BufferedSpdyFramerVisitorInterface { | 42 class SpdyFramerVisitor : public BufferedSpdyFramerVisitorInterface { |
| 45 public: | 43 public: |
| 46 virtual ~SpdyFramerVisitor() {} | 44 virtual ~SpdyFramerVisitor() {} |
| 47 MOCK_METHOD1(OnError, void(SpdyFramer::SpdyError)); | 45 MOCK_METHOD1(OnError, void(SpdyFramer::SpdyError)); |
| 48 MOCK_METHOD2(OnStreamError, void(SpdyStreamId, const std::string&)); | 46 MOCK_METHOD2(OnStreamError, void(SpdyStreamId, const std::string&)); |
| 49 MOCK_METHOD7(OnSynStream, void(SpdyStreamId, | 47 MOCK_METHOD7(OnSynStream, |
| 50 SpdyStreamId, | 48 void(SpdyStreamId, |
| 51 SpdyPriority, | 49 SpdyStreamId, |
| 52 uint8, | 50 SpdyPriority, |
| 53 bool, | 51 uint8, |
| 54 bool, | 52 bool, |
| 55 const SpdyHeaderBlock&)); | 53 bool, |
| 54 const SpdyHeaderBlock&)); |
| 56 MOCK_METHOD3(OnSynStream, void(SpdyStreamId, bool, const SpdyHeaderBlock&)); | 55 MOCK_METHOD3(OnSynStream, void(SpdyStreamId, bool, const SpdyHeaderBlock&)); |
| 57 MOCK_METHOD3(OnSynReply, void(SpdyStreamId, bool, const SpdyHeaderBlock&)); | 56 MOCK_METHOD3(OnSynReply, void(SpdyStreamId, bool, const SpdyHeaderBlock&)); |
| 58 MOCK_METHOD3(OnHeaders, void(SpdyStreamId, bool, const SpdyHeaderBlock&)); | 57 MOCK_METHOD3(OnHeaders, void(SpdyStreamId, bool, const SpdyHeaderBlock&)); |
| 59 MOCK_METHOD4(OnStreamFrameData, void(SpdyStreamId, | 58 MOCK_METHOD4(OnStreamFrameData, |
| 60 const char*, | 59 void(SpdyStreamId, const char*, size_t, bool)); |
| 61 size_t, | |
| 62 bool)); | |
| 63 MOCK_METHOD1(OnSettings, void(bool clear_persisted)); | 60 MOCK_METHOD1(OnSettings, void(bool clear_persisted)); |
| 64 MOCK_METHOD3(OnSetting, void(SpdySettingsIds, uint8, uint32)); | 61 MOCK_METHOD3(OnSetting, void(SpdySettingsIds, uint8, uint32)); |
| 65 MOCK_METHOD1(OnPing, void(uint32 unique_id)); | 62 MOCK_METHOD1(OnPing, void(uint32 unique_id)); |
| 66 MOCK_METHOD2(OnRstStream, void(SpdyStreamId, SpdyRstStreamStatus)); | 63 MOCK_METHOD2(OnRstStream, void(SpdyStreamId, SpdyRstStreamStatus)); |
| 67 MOCK_METHOD2(OnGoAway, void(SpdyStreamId, SpdyGoAwayStatus)); | 64 MOCK_METHOD2(OnGoAway, void(SpdyStreamId, SpdyGoAwayStatus)); |
| 68 MOCK_METHOD2(OnWindowUpdate, void(SpdyStreamId, uint32)); | 65 MOCK_METHOD2(OnWindowUpdate, void(SpdyStreamId, uint32)); |
| 69 MOCK_METHOD2(OnPushPromise, void(SpdyStreamId, SpdyStreamId)); | 66 MOCK_METHOD2(OnPushPromise, void(SpdyStreamId, SpdyStreamId)); |
| 70 }; | 67 }; |
| 71 | 68 |
| 72 class FakeSMConnection : public SMConnection { | 69 class FakeSMConnection : public SMConnection { |
| 73 public: | 70 public: |
| 74 FakeSMConnection(EpollServer* epoll_server, | 71 FakeSMConnection(EpollServer* epoll_server, |
| 75 SSLState* ssl_state, | 72 SSLState* ssl_state, |
| 76 MemoryCache* memory_cache, | 73 MemoryCache* memory_cache, |
| 77 FlipAcceptor* acceptor, | 74 FlipAcceptor* acceptor, |
| 78 std::string log_prefix) | 75 std::string log_prefix) |
| 79 : SMConnection(epoll_server, | 76 : SMConnection(epoll_server, |
| 80 ssl_state, | 77 ssl_state, |
| 81 memory_cache, | 78 memory_cache, |
| 82 acceptor, | 79 acceptor, |
| 83 log_prefix) {} | 80 log_prefix) {} |
| 84 | 81 |
| 85 MOCK_METHOD0(Cleanup, void()); | 82 MOCK_METHOD0(Cleanup, void()); |
| 86 MOCK_METHOD8(InitSMConnection, void(SMConnectionPoolInterface*, | 83 MOCK_METHOD8(InitSMConnection, |
| 87 SMInterface*, | 84 void(SMConnectionPoolInterface*, |
| 88 EpollServer*, | 85 SMInterface*, |
| 89 int, | 86 EpollServer*, |
| 90 std::string, | 87 int, |
| 91 std::string, | 88 std::string, |
| 92 std::string, | 89 std::string, |
| 93 bool)); | 90 std::string, |
| 91 bool)); |
| 94 }; | 92 }; |
| 95 | 93 |
| 96 // This class is almost SpdySM, except one function. | 94 // This class is almost SpdySM, except one function. |
| 97 // This class is the test target of tests in this file. | 95 // This class is the test target of tests in this file. |
| 98 class TestSpdySM : public SpdySM { | 96 class TestSpdySM : public SpdySM { |
| 99 public: | 97 public: |
| 100 virtual ~TestSpdySM() {} | 98 virtual ~TestSpdySM() {} |
| 101 TestSpdySM(SMConnection* connection, | 99 TestSpdySM(SMConnection* connection, |
| 102 SMInterface* sm_http_interface, | 100 SMInterface* sm_http_interface, |
| 103 EpollServer* epoll_server, | 101 EpollServer* epoll_server, |
| 104 MemoryCache* memory_cache, | 102 MemoryCache* memory_cache, |
| 105 FlipAcceptor* acceptor, | 103 FlipAcceptor* acceptor, |
| 106 SpdyMajorVersion version) | 104 SpdyMajorVersion version) |
| 107 : SpdySM(connection, | 105 : SpdySM(connection, |
| 108 sm_http_interface, | 106 sm_http_interface, |
| 109 epoll_server, | 107 epoll_server, |
| 110 memory_cache, | 108 memory_cache, |
| 111 acceptor, | 109 acceptor, |
| 112 version) {} | 110 version) {} |
| 113 | 111 |
| 114 MOCK_METHOD2(FindOrMakeNewSMConnectionInterface, | 112 MOCK_METHOD2(FindOrMakeNewSMConnectionInterface, |
| 115 SMInterface*(const std::string&, const std::string&)); | 113 SMInterface*(const std::string&, const std::string&)); |
| 116 }; | 114 }; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 }; | 185 }; |
| 188 | 186 |
| 189 class SpdySMProxyTest : public SpdySMTestBase { | 187 class SpdySMProxyTest : public SpdySMTestBase { |
| 190 public: | 188 public: |
| 191 SpdySMProxyTest() : SpdySMTestBase(FLIP_HANDLER_PROXY) {} | 189 SpdySMProxyTest() : SpdySMTestBase(FLIP_HANDLER_PROXY) {} |
| 192 virtual ~SpdySMProxyTest() {} | 190 virtual ~SpdySMProxyTest() {} |
| 193 }; | 191 }; |
| 194 | 192 |
| 195 class SpdySMServerTest : public SpdySMTestBase { | 193 class SpdySMServerTest : public SpdySMTestBase { |
| 196 public: | 194 public: |
| 197 SpdySMServerTest(): SpdySMTestBase(FLIP_HANDLER_SPDY_SERVER) {} | 195 SpdySMServerTest() : SpdySMTestBase(FLIP_HANDLER_SPDY_SERVER) {} |
| 198 virtual ~SpdySMServerTest() {} | 196 virtual ~SpdySMServerTest() {} |
| 199 }; | 197 }; |
| 200 | 198 |
| 201 INSTANTIATE_TEST_CASE_P(SpdySMProxyTest, | 199 INSTANTIATE_TEST_CASE_P(SpdySMProxyTest, |
| 202 SpdySMProxyTest, | 200 SpdySMProxyTest, |
| 203 Values(SPDY2, SPDY3, SPDY4)); | 201 Values(SPDY2, SPDY3, SPDY4)); |
| 204 INSTANTIATE_TEST_CASE_P(SpdySMServerTest, | 202 INSTANTIATE_TEST_CASE_P(SpdySMServerTest, SpdySMServerTest, Values(SPDY2)); |
| 205 SpdySMServerTest, | |
| 206 Values(SPDY2)); | |
| 207 | 203 |
| 208 TEST_P(SpdySMProxyTest, InitSMConnection) { | 204 TEST_P(SpdySMProxyTest, InitSMConnection) { |
| 209 { | 205 { |
| 210 InSequence s; | 206 InSequence s; |
| 211 EXPECT_CALL(*connection_, InitSMConnection(_, _, _, _, _, _, _, _)); | 207 EXPECT_CALL(*connection_, InitSMConnection(_, _, _, _, _, _, _, _)); |
| 212 } | 208 } |
| 213 interface_->InitSMConnection(NULL, | 209 interface_->InitSMConnection( |
| 214 NULL, | 210 NULL, NULL, epoll_server_.get(), -1, "", "", "", false); |
| 215 epoll_server_.get(), | |
| 216 -1, | |
| 217 "", | |
| 218 "", | |
| 219 "", | |
| 220 false); | |
| 221 } | 211 } |
| 222 | 212 |
| 223 TEST_P(SpdySMProxyTest, OnSynStream) { | 213 TEST_P(SpdySMProxyTest, OnSynStream) { |
| 224 BufferedSpdyFramerVisitorInterface* visitor = interface_.get(); | 214 BufferedSpdyFramerVisitorInterface* visitor = interface_.get(); |
| 225 scoped_ptr<MockSMInterface> mock_interface(new MockSMInterface); | 215 scoped_ptr<MockSMInterface> mock_interface(new MockSMInterface); |
| 226 uint32 stream_id = 92; | 216 uint32 stream_id = 92; |
| 227 uint32 associated_id = 43; | 217 uint32 associated_id = 43; |
| 228 std::string expected = "GET /path HTTP/1.0\r\n" | 218 std::string expected = |
| 219 "GET /path HTTP/1.0\r\n" |
| 229 "method: GET\r\n" | 220 "method: GET\r\n" |
| 230 "scheme: http\r\n" | 221 "scheme: http\r\n" |
| 231 "url: http://www.example.com/path\r\n" | 222 "url: http://www.example.com/path\r\n" |
| 232 "version: HTTP/1.0\r\n\r\n"; | 223 "version: HTTP/1.0\r\n\r\n"; |
| 233 SpdyHeaderBlock block; | 224 SpdyHeaderBlock block; |
| 234 block["method"] = "GET"; | 225 block["method"] = "GET"; |
| 235 block["url"] = "http://www.example.com/path"; | 226 block["url"] = "http://www.example.com/path"; |
| 236 block["scheme"] = "http"; | 227 block["scheme"] = "http"; |
| 237 block["version"] = "HTTP/1.0"; | 228 block["version"] = "HTTP/1.0"; |
| 238 StringSaver saver; | 229 StringSaver saver; |
| 239 { | 230 { |
| 240 InSequence s; | 231 InSequence s; |
| 241 EXPECT_CALL(*interface_, | 232 EXPECT_CALL(*interface_, FindOrMakeNewSMConnectionInterface(_, _)) |
| 242 FindOrMakeNewSMConnectionInterface(_, _)) | |
| 243 .WillOnce(Return(mock_interface.get())); | 233 .WillOnce(Return(mock_interface.get())); |
| 244 EXPECT_CALL(*mock_interface, SetStreamID(stream_id)); | 234 EXPECT_CALL(*mock_interface, SetStreamID(stream_id)); |
| 245 EXPECT_CALL(*mock_interface, ProcessWriteInput(_, _)) | 235 EXPECT_CALL(*mock_interface, ProcessWriteInput(_, _)) |
| 246 .WillOnce(DoAll(SaveArg<0>(&saver.data), | 236 .WillOnce(DoAll(SaveArg<0>(&saver.data), |
| 247 SaveArg<1>(&saver.size), | 237 SaveArg<1>(&saver.size), |
| 248 InvokeWithoutArgs(&saver, &StringSaver::Save), | 238 InvokeWithoutArgs(&saver, &StringSaver::Save), |
| 249 Return(0))); | 239 Return(0))); |
| 250 } | 240 } |
| 251 visitor->OnSynStream(stream_id, associated_id, 0, 0, false, false, block); | 241 visitor->OnSynStream(stream_id, associated_id, 0, 0, false, false, block); |
| 252 ASSERT_EQ(expected, saver.string); | 242 ASSERT_EQ(expected, saver.string); |
| 253 } | 243 } |
| 254 | 244 |
| 255 TEST_P(SpdySMProxyTest, OnStreamFrameData) { | 245 TEST_P(SpdySMProxyTest, OnStreamFrameData) { |
| 256 BufferedSpdyFramerVisitorInterface* visitor = interface_.get(); | 246 BufferedSpdyFramerVisitorInterface* visitor = interface_.get(); |
| 257 scoped_ptr<MockSMInterface> mock_interface(new MockSMInterface); | 247 scoped_ptr<MockSMInterface> mock_interface(new MockSMInterface); |
| 258 uint32 stream_id = 92; | 248 uint32 stream_id = 92; |
| 259 uint32 associated_id = 43; | 249 uint32 associated_id = 43; |
| 260 SpdyHeaderBlock block; | 250 SpdyHeaderBlock block; |
| 261 testing::MockFunction<void(int)> checkpoint; // NOLINT | 251 testing::MockFunction<void(int)> checkpoint; // NOLINT |
| 262 | 252 |
| 263 scoped_ptr<SpdyFrame> frame(spdy_framer_->CreatePingFrame(12)); | 253 scoped_ptr<SpdyFrame> frame(spdy_framer_->CreatePingFrame(12)); |
| 264 block["method"] = "GET"; | 254 block["method"] = "GET"; |
| 265 block["url"] = "http://www.example.com/path"; | 255 block["url"] = "http://www.example.com/path"; |
| 266 block["scheme"] = "http"; | 256 block["scheme"] = "http"; |
| 267 block["version"] = "HTTP/1.0"; | 257 block["version"] = "HTTP/1.0"; |
| 268 { | 258 { |
| 269 InSequence s; | 259 InSequence s; |
| 270 EXPECT_CALL(*interface_, | 260 EXPECT_CALL(*interface_, FindOrMakeNewSMConnectionInterface(_, _)) |
| 271 FindOrMakeNewSMConnectionInterface(_, _)) | |
| 272 .WillOnce(Return(mock_interface.get())); | 261 .WillOnce(Return(mock_interface.get())); |
| 273 EXPECT_CALL(*mock_interface, SetStreamID(stream_id)); | 262 EXPECT_CALL(*mock_interface, SetStreamID(stream_id)); |
| 274 EXPECT_CALL(*mock_interface, ProcessWriteInput(_, _)).Times(1); | 263 EXPECT_CALL(*mock_interface, ProcessWriteInput(_, _)).Times(1); |
| 275 EXPECT_CALL(checkpoint, Call(0)); | 264 EXPECT_CALL(checkpoint, Call(0)); |
| 276 EXPECT_CALL(*mock_interface, | 265 EXPECT_CALL(*mock_interface, |
| 277 ProcessWriteInput(frame->data(), frame->size())).Times(1); | 266 ProcessWriteInput(frame->data(), frame->size())).Times(1); |
| 278 } | 267 } |
| 279 | 268 |
| 280 visitor->OnSynStream(stream_id, associated_id, 0, 0, false, false, block); | 269 visitor->OnSynStream(stream_id, associated_id, 0, 0, false, false, block); |
| 281 checkpoint.Call(0); | 270 checkpoint.Call(0); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 TEST_P(SpdySMProxyTest, PostAcceptHook) { | 324 TEST_P(SpdySMProxyTest, PostAcceptHook) { |
| 336 interface_->PostAcceptHook(); | 325 interface_->PostAcceptHook(); |
| 337 | 326 |
| 338 ASSERT_EQ(1u, connection_->output_list()->size()); | 327 ASSERT_EQ(1u, connection_->output_list()->size()); |
| 339 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 328 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
| 340 DataFrame* df = *i++; | 329 DataFrame* df = *i++; |
| 341 | 330 |
| 342 { | 331 { |
| 343 InSequence s; | 332 InSequence s; |
| 344 EXPECT_CALL(*spdy_framer_visitor_, OnSettings(false)); | 333 EXPECT_CALL(*spdy_framer_visitor_, OnSettings(false)); |
| 345 EXPECT_CALL(*spdy_framer_visitor_, OnSetting( | 334 EXPECT_CALL(*spdy_framer_visitor_, |
| 346 SETTINGS_MAX_CONCURRENT_STREAMS, 0u, 100u)); | 335 OnSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 0u, 100u)); |
| 347 } | 336 } |
| 348 spdy_framer_->ProcessInput(df->data, df->size); | 337 spdy_framer_->ProcessInput(df->data, df->size); |
| 349 } | 338 } |
| 350 | 339 |
| 351 TEST_P(SpdySMProxyTest, NewStream) { | 340 TEST_P(SpdySMProxyTest, NewStream) { |
| 352 // TODO(yhirano): SpdySM::NewStream leads to crash when | 341 // TODO(yhirano): SpdySM::NewStream leads to crash when |
| 353 // acceptor_->flip_handler_type_ != FLIP_HANDLER_SPDY_SERVER. | 342 // acceptor_->flip_handler_type_ != FLIP_HANDLER_SPDY_SERVER. |
| 354 // It should be fixed though I don't know the solution now. | 343 // It should be fixed though I don't know the solution now. |
| 355 } | 344 } |
| 356 | 345 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 376 const char* actual_data; | 365 const char* actual_data; |
| 377 size_t actual_size; | 366 size_t actual_size; |
| 378 testing::MockFunction<void(int)> checkpoint; // NOLINT | 367 testing::MockFunction<void(int)> checkpoint; // NOLINT |
| 379 | 368 |
| 380 interface_->SendErrorNotFound(stream_id); | 369 interface_->SendErrorNotFound(stream_id); |
| 381 | 370 |
| 382 ASSERT_EQ(2u, connection_->output_list()->size()); | 371 ASSERT_EQ(2u, connection_->output_list()->size()); |
| 383 | 372 |
| 384 { | 373 { |
| 385 InSequence s; | 374 InSequence s; |
| 386 EXPECT_CALL(*spdy_framer_visitor_, | 375 EXPECT_CALL(*spdy_framer_visitor_, OnSynReply(stream_id, false, _)) |
| 387 OnSynReply(stream_id, false, _)) | |
| 388 .WillOnce(SaveArg<2>(&actual_header_block)); | 376 .WillOnce(SaveArg<2>(&actual_header_block)); |
| 389 EXPECT_CALL(checkpoint, Call(0)); | 377 EXPECT_CALL(checkpoint, Call(0)); |
| 390 EXPECT_CALL(*spdy_framer_visitor_, | 378 EXPECT_CALL(*spdy_framer_visitor_, |
| 391 OnStreamFrameData(stream_id, _, _, false)).Times(1) | 379 OnStreamFrameData(stream_id, _, _, false)) |
| 392 .WillOnce(DoAll(SaveArg<1>(&actual_data), | 380 .Times(1) |
| 393 SaveArg<2>(&actual_size))); | 381 .WillOnce(DoAll(SaveArg<1>(&actual_data), SaveArg<2>(&actual_size))); |
| 394 EXPECT_CALL(*spdy_framer_visitor_, | 382 EXPECT_CALL(*spdy_framer_visitor_, |
| 395 OnStreamFrameData(stream_id, NULL, 0, true)).Times(1); | 383 OnStreamFrameData(stream_id, NULL, 0, true)).Times(1); |
| 396 } | 384 } |
| 397 | 385 |
| 398 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 386 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
| 399 DataFrame* df = *i++; | 387 DataFrame* df = *i++; |
| 400 spdy_framer_->ProcessInput(df->data, df->size); | 388 spdy_framer_->ProcessInput(df->data, df->size); |
| 401 checkpoint.Call(0); | 389 checkpoint.Call(0); |
| 402 df = *i++; | 390 df = *i++; |
| 403 spdy_framer_->ProcessInput(df->data, df->size); | 391 spdy_framer_->ProcessInput(df->data, df->size); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 interface_->SendDataFrame(stream_id, "hello", 5, flags, true); | 462 interface_->SendDataFrame(stream_id, "hello", 5, flags, true); |
| 475 | 463 |
| 476 ASSERT_EQ(1u, connection_->output_list()->size()); | 464 ASSERT_EQ(1u, connection_->output_list()->size()); |
| 477 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 465 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
| 478 DataFrame* df = *i++; | 466 DataFrame* df = *i++; |
| 479 | 467 |
| 480 { | 468 { |
| 481 InSequence s; | 469 InSequence s; |
| 482 EXPECT_CALL(*spdy_framer_visitor_, | 470 EXPECT_CALL(*spdy_framer_visitor_, |
| 483 OnStreamFrameData(stream_id, _, _, false)) | 471 OnStreamFrameData(stream_id, _, _, false)) |
| 484 .WillOnce(DoAll(SaveArg<1>(&actual_data), | 472 .WillOnce(DoAll(SaveArg<1>(&actual_data), SaveArg<2>(&actual_size))); |
| 485 SaveArg<2>(&actual_size))); | |
| 486 } | 473 } |
| 487 | 474 |
| 488 spdy_framer_->ProcessInput(df->data, df->size); | 475 spdy_framer_->ProcessInput(df->data, df->size); |
| 489 ASSERT_EQ(1, spdy_framer_->frames_received()); | 476 ASSERT_EQ(1, spdy_framer_->frames_received()); |
| 490 ASSERT_EQ("hello", StringPiece(actual_data, actual_size)); | 477 ASSERT_EQ("hello", StringPiece(actual_data, actual_size)); |
| 491 } | 478 } |
| 492 | 479 |
| 493 TEST_P(SpdySMProxyTest, SendLongDataFrame) { | 480 TEST_P(SpdySMProxyTest, SendLongDataFrame) { |
| 494 uint32 stream_id = 133; | 481 uint32 stream_id = 133; |
| 495 SpdyDataFlags flags = DATA_FLAG_NONE; | 482 SpdyDataFlags flags = DATA_FLAG_NONE; |
| 496 const char* actual_data; | 483 const char* actual_data; |
| 497 size_t actual_size; | 484 size_t actual_size; |
| 498 | 485 |
| 499 std::string data = | 486 std::string data = std::string(kSpdySegmentSize, 'a') + |
| 500 std::string(kSpdySegmentSize, 'a') + | 487 std::string(kSpdySegmentSize, 'b') + "c"; |
| 501 std::string(kSpdySegmentSize, 'b') + | |
| 502 "c"; | |
| 503 interface_->SendDataFrame(stream_id, data.data(), data.size(), flags, true); | 488 interface_->SendDataFrame(stream_id, data.data(), data.size(), flags, true); |
| 504 | 489 |
| 505 { | 490 { |
| 506 InSequence s; | 491 InSequence s; |
| 507 EXPECT_CALL(*spdy_framer_visitor_, | 492 EXPECT_CALL(*spdy_framer_visitor_, |
| 508 OnStreamFrameData(stream_id, _, _, false)).Times(3) | 493 OnStreamFrameData(stream_id, _, _, false)) |
| 509 .WillRepeatedly(DoAll(SaveArg<1>(&actual_data), | 494 .Times(3) |
| 510 SaveArg<2>(&actual_size))); | 495 .WillRepeatedly( |
| 496 DoAll(SaveArg<1>(&actual_data), SaveArg<2>(&actual_size))); |
| 511 } | 497 } |
| 512 | 498 |
| 513 ASSERT_EQ(3u, connection_->output_list()->size()); | 499 ASSERT_EQ(3u, connection_->output_list()->size()); |
| 514 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 500 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
| 515 DataFrame* df = *i++; | 501 DataFrame* df = *i++; |
| 516 spdy_framer_->ProcessInput(df->data, df->size); | 502 spdy_framer_->ProcessInput(df->data, df->size); |
| 517 ASSERT_EQ(std::string(kSpdySegmentSize, 'a'), | 503 ASSERT_EQ(std::string(kSpdySegmentSize, 'a'), |
| 518 StringPiece(actual_data, actual_size)); | 504 StringPiece(actual_data, actual_size)); |
| 519 | 505 |
| 520 df = *i++; | 506 df = *i++; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 const char* actual_data; | 600 const char* actual_data; |
| 615 size_t actual_size; | 601 size_t actual_size; |
| 616 testing::MockFunction<void(int)> checkpoint; // NOLINT | 602 testing::MockFunction<void(int)> checkpoint; // NOLINT |
| 617 | 603 |
| 618 interface_->NewStream(stream_id, 0, "nonexistingfile"); | 604 interface_->NewStream(stream_id, 0, "nonexistingfile"); |
| 619 | 605 |
| 620 ASSERT_EQ(2u, connection_->output_list()->size()); | 606 ASSERT_EQ(2u, connection_->output_list()->size()); |
| 621 | 607 |
| 622 { | 608 { |
| 623 InSequence s; | 609 InSequence s; |
| 624 EXPECT_CALL(*spdy_framer_visitor_, | 610 EXPECT_CALL(*spdy_framer_visitor_, OnSynReply(stream_id, false, _)) |
| 625 OnSynReply(stream_id, false, _)) | |
| 626 .WillOnce(SaveArg<2>(&actual_header_block)); | 611 .WillOnce(SaveArg<2>(&actual_header_block)); |
| 627 EXPECT_CALL(checkpoint, Call(0)); | 612 EXPECT_CALL(checkpoint, Call(0)); |
| 628 EXPECT_CALL(*spdy_framer_visitor_, | 613 EXPECT_CALL(*spdy_framer_visitor_, |
| 629 OnStreamFrameData(stream_id, _, _, false)).Times(1) | 614 OnStreamFrameData(stream_id, _, _, false)) |
| 630 .WillOnce(DoAll(SaveArg<1>(&actual_data), | 615 .Times(1) |
| 631 SaveArg<2>(&actual_size))); | 616 .WillOnce(DoAll(SaveArg<1>(&actual_data), SaveArg<2>(&actual_size))); |
| 632 EXPECT_CALL(*spdy_framer_visitor_, | 617 EXPECT_CALL(*spdy_framer_visitor_, |
| 633 OnStreamFrameData(stream_id, NULL, 0, true)).Times(1); | 618 OnStreamFrameData(stream_id, NULL, 0, true)).Times(1); |
| 634 } | 619 } |
| 635 | 620 |
| 636 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 621 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
| 637 DataFrame* df = *i++; | 622 DataFrame* df = *i++; |
| 638 spdy_framer_->ProcessInput(df->data, df->size); | 623 spdy_framer_->ProcessInput(df->data, df->size); |
| 639 checkpoint.Call(0); | 624 checkpoint.Call(0); |
| 640 df = *i++; | 625 df = *i++; |
| 641 spdy_framer_->ProcessInput(df->data, df->size); | 626 spdy_framer_->ProcessInput(df->data, df->size); |
| 642 | 627 |
| 643 ASSERT_EQ(2, spdy_framer_->frames_received()); | 628 ASSERT_EQ(2, spdy_framer_->frames_received()); |
| 644 ASSERT_EQ(2u, actual_header_block.size()); | 629 ASSERT_EQ(2u, actual_header_block.size()); |
| 645 ASSERT_EQ("404 Not Found", actual_header_block["status"]); | 630 ASSERT_EQ("404 Not Found", actual_header_block["status"]); |
| 646 ASSERT_EQ("HTTP/1.1", actual_header_block["version"]); | 631 ASSERT_EQ("HTTP/1.1", actual_header_block["version"]); |
| 647 ASSERT_EQ("wtf?", StringPiece(actual_data, actual_size)); | 632 ASSERT_EQ("wtf?", StringPiece(actual_data, actual_size)); |
| 648 } | 633 } |
| 649 | 634 |
| 650 } // namespace | 635 } // namespace |
| 651 | 636 |
| 652 } // namespace net | 637 } // namespace net |
| OLD | NEW |