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

Side by Side Diff: net/spdy/spdy_network_transaction_unittest.cc

Issue 2919011: Implement MAX_CONCURRENT_STREAMS SETTINGS header (Closed)
Patch Set: landing soon on a repo near you Created 10 years, 5 months 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
« no previous file with comments | « net/spdy/spdy_network_transaction.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. Use
2 // Use of this source code is governed by a BSD-style license that can be 2 // 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_network_transaction.h" 5 #include "net/spdy/spdy_network_transaction.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/ref_counted.h" 8 #include "base/ref_counted.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "net/base/completion_callback.h" 10 #include "net/base/completion_callback.h"
11 #include "net/base/mock_host_resolver.h" 11 #include "net/base/mock_host_resolver.h"
12 #include "net/base/net_log_unittest.h" 12 #include "net/base/net_log_unittest.h"
13 #include "net/base/request_priority.h"
13 #include "net/base/ssl_config_service_defaults.h" 14 #include "net/base/ssl_config_service_defaults.h"
14 #include "net/base/test_completion_callback.h" 15 #include "net/base/test_completion_callback.h"
15 #include "net/base/upload_data.h" 16 #include "net/base/upload_data.h"
16 #include "net/http/http_auth_handler_factory.h" 17 #include "net/http/http_auth_handler_factory.h"
17 #include "net/http/http_network_session.h" 18 #include "net/http/http_network_session.h"
18 #include "net/http/http_transaction_unittest.h" 19 #include "net/http/http_transaction_unittest.h"
19 #include "net/proxy/proxy_config_service_fixed.h" 20 #include "net/proxy/proxy_config_service_fixed.h"
20 #include "net/socket/socket_test_util.h" 21 #include "net/socket/socket_test_util.h"
21 #include "net/spdy/spdy_framer.h" 22 #include "net/spdy/spdy_framer.h"
22 #include "net/spdy/spdy_http_stream.h" 23 #include "net/spdy/spdy_http_stream.h"
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 // Verify HttpNetworkTransaction constructor. 298 // Verify HttpNetworkTransaction constructor.
298 TEST_F(SpdyNetworkTransactionTest, Constructor) { 299 TEST_F(SpdyNetworkTransactionTest, Constructor) {
299 SessionDependencies session_deps; 300 SessionDependencies session_deps;
300 scoped_refptr<HttpNetworkSession> session = 301 scoped_refptr<HttpNetworkSession> session =
301 CreateSession(&session_deps); 302 CreateSession(&session_deps);
302 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); 303 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session));
303 } 304 }
304 305
305 TEST_F(SpdyNetworkTransactionTest, Get) { 306 TEST_F(SpdyNetworkTransactionTest, Get) {
306 // Construct the request. 307 // Construct the request.
307 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 308 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
308 MockWrite writes[] = { CreateMockWrite(*req) }; 309 MockWrite writes[] = { CreateMockWrite(*req) };
309 310
310 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 311 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
311 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 312 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
312 MockRead reads[] = { 313 MockRead reads[] = {
313 CreateMockRead(*resp), 314 CreateMockRead(*resp),
314 CreateMockRead(*body), 315 CreateMockRead(*body),
315 MockRead(true, 0, 0) // EOF 316 MockRead(true, 0, 0) // EOF
316 }; 317 };
317 318
318 scoped_refptr<DelayedSocketData> data( 319 scoped_refptr<DelayedSocketData> data(
319 new DelayedSocketData(1, reads, arraysize(reads), 320 new DelayedSocketData(1, reads, arraysize(reads),
320 writes, arraysize(writes))); 321 writes, arraysize(writes)));
321 NormalSpdyTransactionHelper helper(CreateGetRequest(), 322 NormalSpdyTransactionHelper helper(CreateGetRequest(),
322 BoundNetLog()); 323 BoundNetLog());
323 helper.RunToCompletion(data.get()); 324 helper.RunToCompletion(data.get());
324 TransactionHelperResult out = helper.output(); 325 TransactionHelperResult out = helper.output();
325 EXPECT_EQ(OK, out.rv); 326 EXPECT_EQ(OK, out.rv);
326 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 327 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
327 EXPECT_EQ("hello!", out.response_data); 328 EXPECT_EQ("hello!", out.response_data);
328 } 329 }
329 330
331 // Start three gets simultaniously; making sure that multiplexed
332 // streams work properly.
333
334 // This can't use the TransactionHelper method, since it only
335 // handles a single transaction, and finishes them as soon
336 // as it launches them.
337
338 // TODO(gavinp): create a working generalized TransactionHelper that
339 // can allow multiple streams in flight.
340
341 TEST_F(SpdyNetworkTransactionTest, ThreeGets) {
342 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
343 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
344 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false));
345 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true));
346
347 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST));
348 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3));
349 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false));
350 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true));
351
352 scoped_ptr<spdy::SpdyFrame> req3(ConstructSpdyGet(NULL, 0, false, 5, LOWEST));
353 scoped_ptr<spdy::SpdyFrame> resp3(ConstructSpdyGetSynReply(NULL, 0, 5));
354 scoped_ptr<spdy::SpdyFrame> body3(ConstructSpdyBodyFrame(5, false));
355 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(5, true));
356
357 MockWrite writes[] = { CreateMockWrite(*req),
358 CreateMockWrite(*req2),
359 CreateMockWrite(*req3),
360 };
361 MockRead reads[] = {
362 CreateMockRead(*resp, 1),
363 CreateMockRead(*body),
364 CreateMockRead(*resp2, 4),
365 CreateMockRead(*body2),
366 CreateMockRead(*resp3, 7),
367 CreateMockRead(*body3),
368
369 CreateMockRead(*fbody),
370 CreateMockRead(*fbody2),
371 CreateMockRead(*fbody3),
372
373 MockRead(true, 0, 0), // EOF
374 };
375
376 scoped_refptr<OrderedSocketData> data(
377 new OrderedSocketData(reads, arraysize(reads),
378 writes, arraysize(writes)));
379
380 BoundNetLog log;
381 TransactionHelperResult out;
382 {
383 SessionDependencies session_deps;
384 HttpNetworkSession* session = CreateSession(&session_deps);
385 SpdySession::SetSSLMode(false);
386 scoped_ptr<SpdyNetworkTransaction> trans1(
387 new SpdyNetworkTransaction(session));
388 scoped_ptr<SpdyNetworkTransaction> trans2(
389 new SpdyNetworkTransaction(session));
390 scoped_ptr<SpdyNetworkTransaction> trans3(
391 new SpdyNetworkTransaction(session));
392
393 session_deps.socket_factory.AddSocketDataProvider(data);
394
395 TestCompletionCallback callback1;
396 TestCompletionCallback callback2;
397 TestCompletionCallback callback3;
398
399 HttpRequestInfo httpreq1 = CreateGetRequest();
400 HttpRequestInfo httpreq2 = CreateGetRequest();
401 HttpRequestInfo httpreq3 = CreateGetRequest();
402
403 out.rv = trans1->Start(&httpreq1, &callback1, log);
404 ASSERT_EQ(ERR_IO_PENDING, out.rv);
405 out.rv = trans2->Start(&httpreq2, &callback2, log);
406 ASSERT_EQ(ERR_IO_PENDING, out.rv);
407 out.rv = trans3->Start(&httpreq3, &callback3, log);
408 ASSERT_EQ(ERR_IO_PENDING, out.rv);
409
410 out.rv = callback1.WaitForResult();
411 ASSERT_EQ(OK, out.rv);
412 out.rv = callback3.WaitForResult();
413 ASSERT_EQ(OK, out.rv);
414
415 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
416 EXPECT_TRUE(response1->headers != NULL);
417 EXPECT_TRUE(response1->was_fetched_via_spdy);
418 out.status_line = response1->headers->GetStatusLine();
419 out.response_info = *response1;
420
421 trans2->GetResponseInfo();
422
423 out.rv = ReadTransaction(trans1.get(), &out.response_data);
424 }
425 EXPECT_EQ(OK, out.rv);
426
427 EXPECT_TRUE(data->at_read_eof());
428 EXPECT_TRUE(data->at_write_eof());
429
430 EXPECT_EQ(OK, out.rv);
431 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
432 EXPECT_EQ("hello!hello!", out.response_data);
433 }
434
435
436 // Similar to ThreeGets above, however this test adds a SETTINGS
437 // frame. The SETTINGS frame is read during the IO loop waiting on
438 // the first transaction completion, and sets a maximum concurrent
439 // stream limit of 1. This means that our IO loop exists after the
440 // second transaction completes, so we can assert on read_index().
441 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) {
442 // Construct the request.
443 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
444 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
445 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false));
446 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true));
447
448 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST));
449 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3));
450 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false));
451 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true));
452
453 scoped_ptr<spdy::SpdyFrame> req3(ConstructSpdyGet(NULL, 0, false, 5, LOWEST));
454 scoped_ptr<spdy::SpdyFrame> resp3(ConstructSpdyGetSynReply(NULL, 0, 5));
455 scoped_ptr<spdy::SpdyFrame> body3(ConstructSpdyBodyFrame(5, false));
456 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(5, true));
457
458 spdy::SpdySettings settings;
459 spdy::SettingsFlagsAndId id(0);
460 id.set_id(spdy::SETTINGS_MAX_CONCURRENT_STREAMS);
461 const size_t max_concurrent_streams = 1;
462
463 settings.push_back(spdy::SpdySetting(id, max_concurrent_streams));
464 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings));
465
466 MockWrite writes[] = { CreateMockWrite(*req),
467 CreateMockWrite(*req2),
468 CreateMockWrite(*req3),
469 };
470 MockRead reads[] = {
471 CreateMockRead(*settings_frame, 0),
472 CreateMockRead(*resp),
473 CreateMockRead(*body),
474 CreateMockRead(*fbody),
475 CreateMockRead(*resp2, 6),
476 CreateMockRead(*body2),
477 CreateMockRead(*fbody2),
478 CreateMockRead(*resp3, 11),
479 CreateMockRead(*body3),
480 CreateMockRead(*fbody3),
481
482 MockRead(true, 0, 0), // EOF
483 };
484
485 scoped_refptr<OrderedSocketData> data(
486 new OrderedSocketData(reads, arraysize(reads),
487 writes, arraysize(writes)));
488
489 BoundNetLog log;
490 TransactionHelperResult out;
491 {
492 SessionDependencies session_deps;
493 HttpNetworkSession* session = CreateSession(&session_deps);
494 SpdySession::SetSSLMode(false);
495 scoped_ptr<SpdyNetworkTransaction> trans1(
496 new SpdyNetworkTransaction(session));
497 scoped_ptr<SpdyNetworkTransaction> trans2(
498 new SpdyNetworkTransaction(session));
499 scoped_ptr<SpdyNetworkTransaction> trans3(
500 new SpdyNetworkTransaction(session));
501
502 session_deps.socket_factory.AddSocketDataProvider(data);
503
504 TestCompletionCallback callback1;
505 TestCompletionCallback callback2;
506 TestCompletionCallback callback3;
507
508 HttpRequestInfo httpreq1 = CreateGetRequest();
509 HttpRequestInfo httpreq2 = CreateGetRequest();
510 HttpRequestInfo httpreq3 = CreateGetRequest();
511
512 out.rv = trans1->Start(&httpreq1, &callback1, log);
513 ASSERT_EQ(out.rv, ERR_IO_PENDING);
514 // run transaction 1 through quickly to force a read of our SETTINGS
515 // frame
516 out.rv = callback1.WaitForResult();
517
518 out.rv = trans2->Start(&httpreq2, &callback2, log);
519 ASSERT_EQ(out.rv, ERR_IO_PENDING);
520 out.rv = trans3->Start(&httpreq3, &callback3, log);
521 ASSERT_EQ(out.rv, ERR_IO_PENDING);
522 out.rv = callback2.WaitForResult();
523 ASSERT_EQ(OK, out.rv);
524 EXPECT_EQ(7U, data->read_index()); // i.e. the third trans was queued
525
526 out.rv = callback3.WaitForResult();
527 ASSERT_EQ(OK, out.rv);
528
529 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
530 EXPECT_TRUE(response1->headers != NULL);
531 EXPECT_TRUE(response1->was_fetched_via_spdy);
532 out.status_line = response1->headers->GetStatusLine();
533 out.response_info = *response1;
534 out.rv = ReadTransaction(trans1.get(), &out.response_data);
535 EXPECT_EQ(OK, out.rv);
536 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
537 EXPECT_EQ("hello!hello!", out.response_data);
538
539 const HttpResponseInfo* response2 = trans2->GetResponseInfo();
540 out.status_line = response2->headers->GetStatusLine();
541 out.response_info = *response2;
542 out.rv = ReadTransaction(trans2.get(), &out.response_data);
543 EXPECT_EQ(OK, out.rv);
544 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
545 EXPECT_EQ("hello!hello!", out.response_data);
546
547 const HttpResponseInfo* response3 = trans3->GetResponseInfo();
548 out.status_line = response3->headers->GetStatusLine();
549 out.response_info = *response3;
550 out.rv = ReadTransaction(trans3.get(), &out.response_data);
551 EXPECT_EQ(OK, out.rv);
552 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
553 EXPECT_EQ("hello!hello!", out.response_data);
554 }
555 EXPECT_EQ(OK, out.rv);
556
557 EXPECT_TRUE(data->at_read_eof());
558 EXPECT_TRUE(data->at_write_eof());
559 }
560
561 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds
562 // a fourth transaction. The third and fourth transactions have
563 // different data ("hello!" vs "hello!hello!") and because of the
564 // user specified priority, we expect to see them inverted in
565 // the response from the server.
566 TEST_F(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) {
567 // Construct the request.
568 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
569 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
570 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false));
571 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true));
572
573 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST));
574 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3));
575 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false));
576 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true));
577
578 scoped_ptr<spdy::SpdyFrame> req4(
579 ConstructSpdyGet(NULL, 0, false, 5, HIGHEST));
580 scoped_ptr<spdy::SpdyFrame> resp4(ConstructSpdyGetSynReply(NULL, 0, 5));
581 scoped_ptr<spdy::SpdyFrame> fbody4(ConstructSpdyBodyFrame(5, true));
582
583 scoped_ptr<spdy::SpdyFrame> req3(ConstructSpdyGet(NULL, 0, false, 7, LOWEST));
584 scoped_ptr<spdy::SpdyFrame> resp3(ConstructSpdyGetSynReply(NULL, 0, 7));
585 scoped_ptr<spdy::SpdyFrame> body3(ConstructSpdyBodyFrame(7, false));
586 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(7, true));
587
588
589 spdy::SpdySettings settings;
590 spdy::SettingsFlagsAndId id(0);
591 id.set_id(spdy::SETTINGS_MAX_CONCURRENT_STREAMS);
592 const size_t max_concurrent_streams = 1;
593
594 settings.push_back(spdy::SpdySetting(id, max_concurrent_streams));
595 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings));
596
597 MockWrite writes[] = { CreateMockWrite(*req),
598 CreateMockWrite(*req2),
599 CreateMockWrite(*req4),
600 CreateMockWrite(*req3),
601 };
602 MockRead reads[] = {
603 CreateMockRead(*settings_frame, 0),
604 CreateMockRead(*resp),
605 CreateMockRead(*body),
606 CreateMockRead(*fbody),
607 CreateMockRead(*resp2, 6),
608 CreateMockRead(*body2),
609 CreateMockRead(*fbody2),
610 CreateMockRead(*resp4, 12),
611 CreateMockRead(*fbody4),
612 CreateMockRead(*resp3, 15),
613 CreateMockRead(*body3),
614 CreateMockRead(*fbody3),
615
616 MockRead(true, 0, 0), // EOF
617 };
618
619 scoped_refptr<OrderedSocketData> data(
620 new OrderedSocketData(reads, arraysize(reads),
621 writes, arraysize(writes)));
622
623 BoundNetLog log;
624 TransactionHelperResult out;
625 {
626 SessionDependencies session_deps;
627 HttpNetworkSession* session = CreateSession(&session_deps);
628 SpdySession::SetSSLMode(false);
629 scoped_ptr<SpdyNetworkTransaction> trans1(
630 new SpdyNetworkTransaction(session));
631 scoped_ptr<SpdyNetworkTransaction> trans2(
632 new SpdyNetworkTransaction(session));
633 scoped_ptr<SpdyNetworkTransaction> trans3(
634 new SpdyNetworkTransaction(session));
635 scoped_ptr<SpdyNetworkTransaction> trans4(
636 new SpdyNetworkTransaction(session));
637
638 session_deps.socket_factory.AddSocketDataProvider(data);
639
640 TestCompletionCallback callback1;
641 TestCompletionCallback callback2;
642 TestCompletionCallback callback3;
643 TestCompletionCallback callback4;
644
645 HttpRequestInfo httpreq1 = CreateGetRequest();
646 HttpRequestInfo httpreq2 = CreateGetRequest();
647 HttpRequestInfo httpreq3 = CreateGetRequest();
648 HttpRequestInfo httpreq4 = CreateGetRequest();
649 httpreq4.priority = HIGHEST;
650
651 out.rv = trans1->Start(&httpreq1, &callback1, log);
652 ASSERT_EQ(ERR_IO_PENDING, out.rv);
653 // run transaction 1 through quickly to force a read of our SETTINGS
654 // frame
655 out.rv = callback1.WaitForResult();
656 ASSERT_EQ(OK, out.rv);
657
658 out.rv = trans2->Start(&httpreq2, &callback2, log);
659 ASSERT_EQ(ERR_IO_PENDING, out.rv);
660 out.rv = trans3->Start(&httpreq3, &callback3, log);
661 ASSERT_EQ(ERR_IO_PENDING, out.rv);
662 out.rv = trans4->Start(&httpreq4, &callback4, log);
663 ASSERT_EQ(ERR_IO_PENDING, out.rv);
664
665 out.rv = callback2.WaitForResult();
666 ASSERT_EQ(OK, out.rv);
667 EXPECT_EQ(data->read_index(), 7U); // i.e. the third & fourth trans queued
668
669 out.rv = callback3.WaitForResult();
670 ASSERT_EQ(OK, out.rv);
671
672 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
673 EXPECT_TRUE(response1->headers != NULL);
674 EXPECT_TRUE(response1->was_fetched_via_spdy);
675 out.status_line = response1->headers->GetStatusLine();
676 out.response_info = *response1;
677 out.rv = ReadTransaction(trans1.get(), &out.response_data);
678 EXPECT_EQ(OK, out.rv);
679 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
680 EXPECT_EQ("hello!hello!", out.response_data);
681
682 const HttpResponseInfo* response2 = trans2->GetResponseInfo();
683 out.status_line = response2->headers->GetStatusLine();
684 out.response_info = *response2;
685 out.rv = ReadTransaction(trans2.get(), &out.response_data);
686 EXPECT_EQ(OK, out.rv);
687 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
688 EXPECT_EQ("hello!hello!", out.response_data);
689
690 // notice: response3 gets two hellos, response4 gets one
691 // hello, so we know dequeuing priority was respected.
692 const HttpResponseInfo* response3 = trans3->GetResponseInfo();
693 out.status_line = response3->headers->GetStatusLine();
694 out.response_info = *response3;
695 out.rv = ReadTransaction(trans3.get(), &out.response_data);
696 EXPECT_EQ(OK, out.rv);
697 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
698 EXPECT_EQ("hello!hello!", out.response_data);
699
700 out.rv = callback4.WaitForResult();
701 EXPECT_EQ(OK, out.rv);
702 const HttpResponseInfo* response4 = trans4->GetResponseInfo();
703 out.status_line = response4->headers->GetStatusLine();
704 out.response_info = *response4;
705 out.rv = ReadTransaction(trans4.get(), &out.response_data);
706 EXPECT_EQ(OK, out.rv);
707 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
708 EXPECT_EQ("hello!", out.response_data);
709 }
710 EXPECT_EQ(OK, out.rv);
711
712 EXPECT_TRUE(data->at_read_eof());
713 EXPECT_TRUE(data->at_write_eof());
714 }
715
716 // Similar to ThreeGetsMaxConcurrrent above, however, this test
717 // deletes a session in the middle of the transaction to insure
718 // that we properly remove pendingcreatestream objects from
719 // the spdy_session
720 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) {
721 // Construct the request.
722 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
723 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
724 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false));
725 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true));
726
727 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST));
728 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3));
729 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false));
730 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true));
731
732 scoped_ptr<spdy::SpdyFrame> req3(ConstructSpdyGet(NULL, 0, false, 5, LOWEST));
733 scoped_ptr<spdy::SpdyFrame> resp3(ConstructSpdyGetSynReply(NULL, 0, 5));
734 scoped_ptr<spdy::SpdyFrame> body3(ConstructSpdyBodyFrame(5, false));
735 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(5, true));
736
737 spdy::SpdySettings settings;
738 spdy::SettingsFlagsAndId id(0);
739 id.set_id(spdy::SETTINGS_MAX_CONCURRENT_STREAMS);
740 const size_t max_concurrent_streams = 1;
741
742 settings.push_back(spdy::SpdySetting(id, max_concurrent_streams));
743 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings));
744
745 MockWrite writes[] = { CreateMockWrite(*req),
746 CreateMockWrite(*req2),
747 };
748 MockRead reads[] = {
749 CreateMockRead(*settings_frame, 0),
750 CreateMockRead(*resp),
751 CreateMockRead(*body),
752 CreateMockRead(*fbody),
753 CreateMockRead(*resp2, 6),
754 CreateMockRead(*body2),
755 CreateMockRead(*fbody2),
756 MockRead(true, 0, 0), // EOF
757 };
758
759 scoped_refptr<OrderedSocketData> data(
760 new OrderedSocketData(reads, arraysize(reads),
761 writes, arraysize(writes)));
762
763 BoundNetLog log;
764 TransactionHelperResult out;
765 {
766 SessionDependencies session_deps;
767 HttpNetworkSession* session = CreateSession(&session_deps);
768 SpdySession::SetSSLMode(false);
769 scoped_ptr<SpdyNetworkTransaction> trans1(
770 new SpdyNetworkTransaction(session));
771 scoped_ptr<SpdyNetworkTransaction> trans2(
772 new SpdyNetworkTransaction(session));
773 scoped_ptr<SpdyNetworkTransaction> trans3(
774 new SpdyNetworkTransaction(session));
775
776 session_deps.socket_factory.AddSocketDataProvider(data);
777
778 TestCompletionCallback callback1;
779 TestCompletionCallback callback2;
780 TestCompletionCallback callback3;
781
782 HttpRequestInfo httpreq1 = CreateGetRequest();
783 HttpRequestInfo httpreq2 = CreateGetRequest();
784 HttpRequestInfo httpreq3 = CreateGetRequest();
785
786 out.rv = trans1->Start(&httpreq1, &callback1, log);
787 ASSERT_EQ(out.rv, ERR_IO_PENDING);
788 // run transaction 1 through quickly to force a read of our SETTINGS
789 // frame
790 out.rv = callback1.WaitForResult();
791
792 out.rv = trans2->Start(&httpreq2, &callback2, log);
793 ASSERT_EQ(out.rv, ERR_IO_PENDING);
794 out.rv = trans3->Start(&httpreq3, &callback3, log);
795 delete trans3.release();
796 ASSERT_EQ(out.rv, ERR_IO_PENDING);
797 out.rv = callback2.WaitForResult();
798
799 EXPECT_EQ(8U, data->read_index());
800
801 const HttpResponseInfo* response1 = trans1->GetResponseInfo();
802 EXPECT_TRUE(response1->headers != NULL);
803 EXPECT_TRUE(response1->was_fetched_via_spdy);
804 out.status_line = response1->headers->GetStatusLine();
805 out.response_info = *response1;
806 out.rv = ReadTransaction(trans1.get(), &out.response_data);
807 EXPECT_EQ(OK, out.rv);
808 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
809 EXPECT_EQ("hello!hello!", out.response_data);
810
811 const HttpResponseInfo* response2 = trans2->GetResponseInfo();
812 out.status_line = response2->headers->GetStatusLine();
813 out.response_info = *response2;
814 out.rv = ReadTransaction(trans2.get(), &out.response_data);
815 EXPECT_EQ(OK, out.rv);
816 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
817 EXPECT_EQ("hello!hello!", out.response_data);
818 }
819 EXPECT_EQ(OK, out.rv);
820
821 EXPECT_TRUE(data->at_read_eof());
822 EXPECT_TRUE(data->at_write_eof());
823 }
824
330 // Test that a simple POST works. 825 // Test that a simple POST works.
331 TEST_F(SpdyNetworkTransactionTest, Post) { 826 TEST_F(SpdyNetworkTransactionTest, Post) {
332 static const char upload[] = { "hello!" }; 827 static const char upload[] = { "hello!" };
333 828
334 // Setup the request 829 // Setup the request
335 HttpRequestInfo request; 830 HttpRequestInfo request;
336 request.method = "POST"; 831 request.method = "POST";
337 request.url = GURL("http://www.google.com/"); 832 request.url = GURL("http://www.google.com/");
338 request.upload_data = new UploadData(); 833 request.upload_data = new UploadData();
339 request.upload_data->AppendBytes(upload, strlen(upload)); 834 request.upload_data->AppendBytes(upload, strlen(upload));
340 835
341 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0)); 836 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0));
342 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 837 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
343 MockWrite writes[] = { 838 MockWrite writes[] = {
344 CreateMockWrite(*req), 839 CreateMockWrite(*req),
345 CreateMockWrite(*body), // POST upload frame 840 CreateMockWrite(*body), // POST upload frame
346 }; 841 };
347 842
348 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); 843 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0));
349 MockRead reads[] = { 844 MockRead reads[] = {
350 CreateMockRead(*resp), 845 CreateMockRead(*resp),
351 CreateMockRead(*body), 846 CreateMockRead(*body),
352 MockRead(true, 0, 0) // EOF 847 MockRead(true, 0, 0) // EOF
(...skipping 21 matching lines...) Expand all
374 request.upload_data = new UploadData(); 869 request.upload_data = new UploadData();
375 870
376 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0)); 871 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0));
377 // Set the FIN bit since there will be no body. 872 // Set the FIN bit since there will be no body.
378 req->set_flags(spdy::CONTROL_FLAG_FIN); 873 req->set_flags(spdy::CONTROL_FLAG_FIN);
379 MockWrite writes[] = { 874 MockWrite writes[] = {
380 CreateMockWrite(*req), 875 CreateMockWrite(*req),
381 }; 876 };
382 877
383 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); 878 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0));
384 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 879 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
385 MockRead reads[] = { 880 MockRead reads[] = {
386 CreateMockRead(*resp), 881 CreateMockRead(*resp),
387 CreateMockRead(*body), 882 CreateMockRead(*body),
388 MockRead(true, 0, 0) // EOF 883 MockRead(true, 0, 0) // EOF
389 }; 884 };
390 885
391 scoped_refptr<DelayedSocketData> data( 886 scoped_refptr<DelayedSocketData> data(
392 new DelayedSocketData(1, reads, arraysize(reads), 887 new DelayedSocketData(1, reads, arraysize(reads),
393 writes, arraysize(writes))); 888 writes, arraysize(writes)));
394 889
(...skipping 11 matching lines...) Expand all
406 static const char upload[] = { "hello!" }; 901 static const char upload[] = { "hello!" };
407 902
408 // Setup the request 903 // Setup the request
409 HttpRequestInfo request; 904 HttpRequestInfo request;
410 request.method = "POST"; 905 request.method = "POST";
411 request.url = GURL("http://www.google.com/"); 906 request.url = GURL("http://www.google.com/");
412 request.upload_data = new UploadData(); 907 request.upload_data = new UploadData();
413 request.upload_data->AppendBytes(upload, sizeof(upload)); 908 request.upload_data->AppendBytes(upload, sizeof(upload));
414 909
415 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0)); 910 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0));
416 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 911 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
417 MockWrite writes[] = { 912 MockWrite writes[] = {
418 CreateMockWrite(*req.get(), 2), 913 CreateMockWrite(*req.get(), 2),
419 CreateMockWrite(*body.get(), 3), // POST upload frame 914 CreateMockWrite(*body.get(), 3), // POST upload frame
420 }; 915 };
421 916
422 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); 917 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0));
423 MockRead reads[] = { 918 MockRead reads[] = {
424 CreateMockRead(*resp.get(), 2), 919 CreateMockRead(*resp.get(), 2),
425 CreateMockRead(*body.get(), 3), 920 CreateMockRead(*body.get(), 3),
426 MockRead(false, 0, 0) // EOF 921 MockRead(false, 0, 0) // EOF
427 }; 922 };
428 923
429 scoped_refptr<DelayedSocketData> data( 924 scoped_refptr<DelayedSocketData> data(
430 new DelayedSocketData(0, reads, arraysize(reads), 925 new DelayedSocketData(0, reads, arraysize(reads),
431 writes, arraysize(writes))); 926 writes, arraysize(writes)));
432 NormalSpdyTransactionHelper helper(request, 927 NormalSpdyTransactionHelper helper(request,
433 BoundNetLog()); 928 BoundNetLog());
434 helper.AddData(data.get()); 929 helper.AddData(data.get());
435 helper.RunPreTestSetup(); 930 helper.RunPreTestSetup();
436 helper.RunDefaultTest(); 931 helper.RunDefaultTest();
437 helper.VerifyDataNotConsumed(); 932 helper.VerifyDataNotConsumed();
438 TransactionHelperResult out = helper.output(); 933 TransactionHelperResult out = helper.output();
439 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 934 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
440 } 935 }
441 936
442 // Test that the transaction doesn't crash when we don't have a reply. 937 // Test that the transaction doesn't crash when we don't have a reply.
443 TEST_F(SpdyNetworkTransactionTest, ResponseWithoutSynReply) { 938 TEST_F(SpdyNetworkTransactionTest, ResponseWithoutSynReply) {
444 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 939 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
445 MockRead reads[] = { 940 MockRead reads[] = {
446 CreateMockRead(*body), 941 CreateMockRead(*body),
447 MockRead(true, 0, 0) // EOF 942 MockRead(true, 0, 0) // EOF
448 }; 943 };
449 944
450 scoped_refptr<DelayedSocketData> data( 945 scoped_refptr<DelayedSocketData> data(
451 new DelayedSocketData(1, reads, arraysize(reads), NULL, 0)); 946 new DelayedSocketData(1, reads, arraysize(reads), NULL, 0));
452 NormalSpdyTransactionHelper helper(CreateGetRequest(), 947 NormalSpdyTransactionHelper helper(CreateGetRequest(),
453 BoundNetLog()); 948 BoundNetLog());
454 helper.RunToCompletion(data.get()); 949 helper.RunToCompletion(data.get());
455 TransactionHelperResult out = helper.output(); 950 TransactionHelperResult out = helper.output();
456 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv); 951 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv);
457 } 952 }
458 953
459 // Test that the transaction doesn't crash when we get two replies on the same 954 // Test that the transaction doesn't crash when we get two replies on the same
460 // stream ID. See http://crbug.com/45639. 955 // stream ID. See http://crbug.com/45639.
461 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { 956 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) {
462 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 957 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
463 MockWrite writes[] = { CreateMockWrite(*req) }; 958 MockWrite writes[] = { CreateMockWrite(*req) };
464 959
465 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 960 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
466 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 961 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
467 MockRead reads[] = { 962 MockRead reads[] = {
468 CreateMockRead(*resp), 963 CreateMockRead(*resp),
469 CreateMockRead(*resp), 964 CreateMockRead(*resp),
470 CreateMockRead(*body), 965 CreateMockRead(*body),
471 MockRead(true, 0, 0) // EOF 966 MockRead(true, 0, 0) // EOF
472 }; 967 };
473 968
474 scoped_refptr<DelayedSocketData> data( 969 scoped_refptr<DelayedSocketData> data(
475 new DelayedSocketData(1, reads, arraysize(reads), 970 new DelayedSocketData(1, reads, arraysize(reads),
476 writes, arraysize(writes))); 971 writes, arraysize(writes)));
(...skipping 16 matching lines...) Expand all
493 EXPECT_TRUE(response->was_fetched_via_spdy); 988 EXPECT_TRUE(response->was_fetched_via_spdy);
494 std::string response_data; 989 std::string response_data;
495 rv = ReadTransaction(trans, &response_data); 990 rv = ReadTransaction(trans, &response_data);
496 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, rv); 991 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, rv);
497 992
498 helper.VerifyDataConsumed(); 993 helper.VerifyDataConsumed();
499 } 994 }
500 995
501 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) { 996 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) {
502 // Construct the request. 997 // Construct the request.
503 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 998 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
504 MockWrite writes[] = { 999 MockWrite writes[] = {
505 CreateMockWrite(*req), 1000 CreateMockWrite(*req),
506 }; 1001 };
507 1002
508 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 1003 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
509 MockRead reads[] = { 1004 MockRead reads[] = {
510 CreateMockRead(*resp), 1005 CreateMockRead(*resp),
511 // This following read isn't used by the test, except during the 1006 // This following read isn't used by the test, except during the
512 // RunAllPending() call at the end since the SpdySession survives the 1007 // RunAllPending() call at the end since the SpdySession survives the
513 // HttpNetworkTransaction and still tries to continue Read()'ing. Any 1008 // HttpNetworkTransaction and still tries to continue Read()'ing. Any
514 // MockRead will do here. 1009 // MockRead will do here.
515 MockRead(true, 0, 0) // EOF 1010 MockRead(true, 0, 0) // EOF
516 }; 1011 };
517 1012
518 StaticSocketDataProvider data(reads, arraysize(reads), 1013 StaticSocketDataProvider data(reads, arraysize(reads),
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 1054
560 private: 1055 private:
561 scoped_refptr<HttpNetworkSession>& session_; 1056 scoped_refptr<HttpNetworkSession>& session_;
562 NormalSpdyTransactionHelper& helper_; 1057 NormalSpdyTransactionHelper& helper_;
563 }; 1058 };
564 1059
565 // Verify that the client can correctly deal with the user callback attempting 1060 // Verify that the client can correctly deal with the user callback attempting
566 // to start another transaction on a session that is closing down. See 1061 // to start another transaction on a session that is closing down. See
567 // http://crbug.com/47455 1062 // http://crbug.com/47455
568 TEST_F(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) { 1063 TEST_F(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) {
569 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1064 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
570 MockWrite writes[] = { CreateMockWrite(*req) }; 1065 MockWrite writes[] = { CreateMockWrite(*req) };
571 MockWrite writes2[] = { CreateMockWrite(*req) }; 1066 MockWrite writes2[] = { CreateMockWrite(*req) };
572 1067
573 // The indicated length of this packet is longer than its actual length. When 1068 // The indicated length of this packet is longer than its actual length. When
574 // the session receives an empty packet after this one, it shuts down the 1069 // the session receives an empty packet after this one, it shuts down the
575 // session, and calls the read callback with the incomplete data. 1070 // session, and calls the read callback with the incomplete data.
576 const uint8 kGetBodyFrame2[] = { 1071 const uint8 kGetBodyFrame2[] = {
577 0x00, 0x00, 0x00, 0x01, 1072 0x00, 0x00, 0x00, 0x01,
578 0x01, 0x00, 0x00, 0x07, 1073 0x01, 0x00, 0x00, 0x07,
579 'h', 'e', 'l', 'l', 'o', '!', 1074 'h', 'e', 'l', 'l', 'o', '!',
580 }; 1075 };
581 1076
582 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 1077 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
583 MockRead reads[] = { 1078 MockRead reads[] = {
584 CreateMockRead(*resp, 2), 1079 CreateMockRead(*resp, 2),
585 MockRead(true, ERR_IO_PENDING, 3), // Force a pause 1080 MockRead(true, ERR_IO_PENDING, 3), // Force a pause
586 MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame2), 1081 MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame2),
587 arraysize(kGetBodyFrame2), 4), 1082 arraysize(kGetBodyFrame2), 4),
588 MockRead(true, ERR_IO_PENDING, 5), // Force a pause 1083 MockRead(true, ERR_IO_PENDING, 5), // Force a pause
589 MockRead(true, 0, 0, 6), // EOF 1084 MockRead(true, 0, 0, 6), // EOF
590 }; 1085 };
591 MockRead reads2[] = { 1086 MockRead reads2[] = {
592 CreateMockRead(*resp, 2), 1087 CreateMockRead(*resp, 2),
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 } 1131 }
637 1132
638 private: 1133 private:
639 NormalSpdyTransactionHelper& helper_; 1134 NormalSpdyTransactionHelper& helper_;
640 }; 1135 };
641 1136
642 // Verify that the client can correctly deal with the user callback deleting the 1137 // Verify that the client can correctly deal with the user callback deleting the
643 // transaction. Failures will usually be valgrind errors. See 1138 // transaction. Failures will usually be valgrind errors. See
644 // http://crbug.com/46925 1139 // http://crbug.com/46925
645 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) { 1140 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) {
646 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1141 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
647 MockWrite writes[] = { CreateMockWrite(*req) }; 1142 MockWrite writes[] = { CreateMockWrite(*req) };
648 1143
649 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 1144 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
650 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 1145 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
651 MockRead reads[] = { 1146 MockRead reads[] = {
652 CreateMockRead(*resp.get(), 2), 1147 CreateMockRead(*resp.get(), 2),
653 MockRead(true, ERR_IO_PENDING, 3), // Force a pause 1148 MockRead(true, ERR_IO_PENDING, 3), // Force a pause
654 CreateMockRead(*body.get(), 4), 1149 CreateMockRead(*body.get(), 4),
655 MockRead(true, 0, 0, 5), // EOF 1150 MockRead(true, 0, 0, 5), // EOF
656 }; 1151 };
657 1152
658 scoped_refptr<OrderedSocketData> data( 1153 scoped_refptr<OrderedSocketData> data(
659 new OrderedSocketData(reads, arraysize(reads), 1154 new OrderedSocketData(reads, arraysize(reads),
660 writes, arraysize(writes))); 1155 writes, arraysize(writes)));
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 }, 1216 },
722 "cookie: val1,val2\n" 1217 "cookie: val1,val2\n"
723 "hello: bye\n" 1218 "hello: bye\n"
724 "status: 200\n" 1219 "status: 200\n"
725 "url: /index.php\n" 1220 "url: /index.php\n"
726 "version: HTTP/1.1\n" 1221 "version: HTTP/1.1\n"
727 } 1222 }
728 }; 1223 };
729 1224
730 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 1225 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
731 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1226 scoped_ptr<spdy::SpdyFrame> req(
1227 ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
732 MockWrite writes[] = { CreateMockWrite(*req) }; 1228 MockWrite writes[] = { CreateMockWrite(*req) };
733 1229
734 scoped_ptr<spdy::SpdyFrame> resp( 1230 scoped_ptr<spdy::SpdyFrame> resp(
735 ConstructSpdyGetSynReply(test_cases[i].extra_headers, 1231 ConstructSpdyGetSynReply(test_cases[i].extra_headers,
736 test_cases[i].num_headers)); 1232 test_cases[i].num_headers,
737 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 1233 1));
1234 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
738 MockRead reads[] = { 1235 MockRead reads[] = {
739 CreateMockRead(*resp), 1236 CreateMockRead(*resp),
740 CreateMockRead(*body), 1237 CreateMockRead(*body),
741 MockRead(true, 0, 0) // EOF 1238 MockRead(true, 0, 0) // EOF
742 }; 1239 };
743 1240
744 scoped_refptr<DelayedSocketData> data( 1241 scoped_refptr<DelayedSocketData> data(
745 new DelayedSocketData(1, reads, arraysize(reads), 1242 new DelayedSocketData(1, reads, arraysize(reads),
746 writes, arraysize(writes))); 1243 writes, arraysize(writes)));
747 NormalSpdyTransactionHelper helper(CreateGetRequest(), 1244 NormalSpdyTransactionHelper helper(CreateGetRequest(),
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 NULL 1347 NULL
851 } 1348 }
852 } 1349 }
853 } 1350 }
854 }; 1351 };
855 1352
856 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 1353 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
857 // Construct the request. 1354 // Construct the request.
858 scoped_ptr<spdy::SpdyFrame> frame_req( 1355 scoped_ptr<spdy::SpdyFrame> frame_req(
859 ConstructSpdyGet(test_cases[i].extra_headers[0], 1356 ConstructSpdyGet(test_cases[i].extra_headers[0],
860 test_cases[i].num_headers[0])); 1357 test_cases[i].num_headers[0],
1358 false, 1, LOWEST));
861 1359
862 MockWrite writes[] = { 1360 MockWrite writes[] = {
863 CreateMockWrite(*frame_req), 1361 CreateMockWrite(*frame_req),
864 }; 1362 };
865 1363
866 // Construct the reply. 1364 // Construct the reply.
867 scoped_ptr<spdy::SpdyFrame> frame_reply( 1365 scoped_ptr<spdy::SpdyFrame> frame_reply(
868 ConstructSpdyPacket(*test_cases[i].syn_reply, 1366 ConstructSpdyPacket(*test_cases[i].syn_reply,
869 test_cases[i].extra_headers[1], 1367 test_cases[i].extra_headers[1],
870 test_cases[i].num_headers[1], 1368 test_cases[i].num_headers[1],
871 NULL, 1369 NULL,
872 0)); 1370 0));
873 1371
874 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 1372 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
875 MockRead reads[] = { 1373 MockRead reads[] = {
876 CreateMockRead(*frame_reply), 1374 CreateMockRead(*frame_reply),
877 CreateMockRead(*body), 1375 CreateMockRead(*body),
878 MockRead(true, 0, 0) // EOF 1376 MockRead(true, 0, 0) // EOF
879 }; 1377 };
880 1378
881 // Attach the headers to the request. 1379 // Attach the headers to the request.
882 int header_count = test_cases[i].num_headers[0]; 1380 int header_count = test_cases[i].num_headers[0];
883 1381
884 HttpRequestInfo request = CreateGetRequest(); 1382 HttpRequestInfo request = CreateGetRequest();
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 { "status", "200", 1466 { "status", "200",
969 "url", "/index.php", 1467 "url", "/index.php",
970 NULL 1468 NULL
971 }, 1469 },
972 }, 1470 },
973 // SYN_REPLY with no headers 1471 // SYN_REPLY with no headers
974 { 0, { NULL }, }, 1472 { 0, { NULL }, },
975 }; 1473 };
976 1474
977 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 1475 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
978 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1476 scoped_ptr<spdy::SpdyFrame> req(
1477 ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
979 MockWrite writes[] = { 1478 MockWrite writes[] = {
980 CreateMockWrite(*req), 1479 CreateMockWrite(*req),
981 }; 1480 };
982 1481
983 scoped_ptr<spdy::SpdyFrame> resp( 1482 scoped_ptr<spdy::SpdyFrame> resp(
984 ConstructSpdyPacket(kSynStartHeader, 1483 ConstructSpdyPacket(kSynStartHeader,
985 NULL, 0, 1484 NULL, 0,
986 test_cases[i].headers, 1485 test_cases[i].headers,
987 test_cases[i].num_headers)); 1486 test_cases[i].num_headers));
988 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 1487 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
989 MockRead reads[] = { 1488 MockRead reads[] = {
990 CreateMockRead(*resp), 1489 CreateMockRead(*resp),
991 CreateMockRead(*body), 1490 CreateMockRead(*body),
992 MockRead(true, 0, 0) // EOF 1491 MockRead(true, 0, 0) // EOF
993 }; 1492 };
994 1493
995 scoped_refptr<DelayedSocketData> data( 1494 scoped_refptr<DelayedSocketData> data(
996 new DelayedSocketData(1, reads, arraysize(reads), 1495 new DelayedSocketData(1, reads, arraysize(reads),
997 writes, arraysize(writes))); 1496 writes, arraysize(writes)));
998 NormalSpdyTransactionHelper helper(CreateGetRequest(), 1497 NormalSpdyTransactionHelper helper(CreateGetRequest(),
999 BoundNetLog()); 1498 BoundNetLog());
1000 helper.RunToCompletion(data.get()); 1499 helper.RunToCompletion(data.get());
1001 TransactionHelperResult out = helper.output(); 1500 TransactionHelperResult out = helper.output();
1002 EXPECT_EQ(ERR_INVALID_RESPONSE, out.rv); 1501 EXPECT_EQ(ERR_INVALID_RESPONSE, out.rv);
1003 } 1502 }
1004 } 1503 }
1005 1504
1006 // Verify that we don't crash on some corrupt frames. 1505 // Verify that we don't crash on some corrupt frames.
1007 // TODO(eroman): Renable this test, see http://crbug.com/48588 1506 // TODO(eroman): Renable this test, see http://crbug.com/48588
1008 TEST_F(SpdyNetworkTransactionTest, DISABLED_CorruptFrameSessionError) { 1507 TEST_F(SpdyNetworkTransactionTest, DISABLED_CorruptFrameSessionError) {
1009 // This is the length field with a big number 1508 // This is the length field with a big number
1010 scoped_ptr<spdy::SpdyFrame> syn_reply_massive_length( 1509 scoped_ptr<spdy::SpdyFrame> syn_reply_massive_length(
1011 ConstructSpdyGetSynReply(NULL, 0)); 1510 ConstructSpdyGetSynReply(NULL, 0, 1));
1012 syn_reply_massive_length->set_length(0x111126); 1511 syn_reply_massive_length->set_length(0x111126);
1013 1512
1014 struct SynReplyTests { 1513 struct SynReplyTests {
1015 const spdy::SpdyFrame* syn_reply; 1514 const spdy::SpdyFrame* syn_reply;
1016 } test_cases[] = { 1515 } test_cases[] = {
1017 { syn_reply_massive_length.get(), }, 1516 { syn_reply_massive_length.get(), },
1018 }; 1517 };
1019 1518
1020 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 1519 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
1021 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1520 scoped_ptr<spdy::SpdyFrame> req(
1521 ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1022 MockWrite writes[] = { 1522 MockWrite writes[] = {
1023 CreateMockWrite(*req), 1523 CreateMockWrite(*req),
1024 MockWrite(true, 0, 0) // EOF 1524 MockWrite(true, 0, 0) // EOF
1025 }; 1525 };
1026 1526
1027 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 1527 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
1028 MockRead reads[] = { 1528 MockRead reads[] = {
1029 CreateMockRead(*test_cases[i].syn_reply), 1529 CreateMockRead(*test_cases[i].syn_reply),
1030 CreateMockRead(*body), 1530 CreateMockRead(*body),
1031 MockRead(true, 0, 0) // EOF 1531 MockRead(true, 0, 0) // EOF
1032 }; 1532 };
1033 1533
1034 scoped_refptr<DelayedSocketData> data( 1534 scoped_refptr<DelayedSocketData> data(
1035 new DelayedSocketData(1, reads, arraysize(reads), 1535 new DelayedSocketData(1, reads, arraysize(reads),
1036 writes, arraysize(writes))); 1536 writes, arraysize(writes)));
1037 NormalSpdyTransactionHelper helper(CreateGetRequest(), 1537 NormalSpdyTransactionHelper helper(CreateGetRequest(),
1038 BoundNetLog()); 1538 BoundNetLog());
1039 helper.RunToCompletion(data.get()); 1539 helper.RunToCompletion(data.get());
1040 TransactionHelperResult out = helper.output(); 1540 TransactionHelperResult out = helper.output();
1041 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 1541 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
1042 } 1542 }
1043 } 1543 }
1044 1544
1045 // Test that we shutdown correctly on write errors. 1545 // Test that we shutdown correctly on write errors.
1046 TEST_F(SpdyNetworkTransactionTest, WriteError) { 1546 TEST_F(SpdyNetworkTransactionTest, WriteError) {
1047 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1547 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1048 MockWrite writes[] = { 1548 MockWrite writes[] = {
1049 // We'll write 10 bytes successfully 1549 // We'll write 10 bytes successfully
1050 MockWrite(true, req->data(), 10), 1550 MockWrite(true, req->data(), 10),
1051 // Followed by ERROR! 1551 // Followed by ERROR!
1052 MockWrite(true, ERR_FAILED), 1552 MockWrite(true, ERR_FAILED),
1053 }; 1553 };
1054 1554
1055 scoped_refptr<DelayedSocketData> data( 1555 scoped_refptr<DelayedSocketData> data(
1056 new DelayedSocketData(2, NULL, 0, 1556 new DelayedSocketData(2, NULL, 0,
1057 writes, arraysize(writes))); 1557 writes, arraysize(writes)));
1058 NormalSpdyTransactionHelper helper(CreateGetRequest(), 1558 NormalSpdyTransactionHelper helper(CreateGetRequest(),
1059 BoundNetLog()); 1559 BoundNetLog());
1060 helper.RunToCompletion(data.get()); 1560 helper.RunToCompletion(data.get());
1061 TransactionHelperResult out = helper.output(); 1561 TransactionHelperResult out = helper.output();
1062 EXPECT_EQ(ERR_FAILED, out.rv); 1562 EXPECT_EQ(ERR_FAILED, out.rv);
1063 data->Reset(); 1563 data->Reset();
1064 } 1564 }
1065 1565
1066 // Test that partial writes work. 1566 // Test that partial writes work.
1067 TEST_F(SpdyNetworkTransactionTest, PartialWrite) { 1567 TEST_F(SpdyNetworkTransactionTest, PartialWrite) {
1068 // Chop the SYN_STREAM frame into 5 chunks. 1568 // Chop the SYN_STREAM frame into 5 chunks.
1069 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1569 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1070 const int kChunks = 5; 1570 const int kChunks = 5;
1071 scoped_array<MockWrite> writes(ChopWriteFrame(*req.get(), kChunks)); 1571 scoped_array<MockWrite> writes(ChopWriteFrame(*req.get(), kChunks));
1072 1572
1073 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 1573 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
1074 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 1574 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
1075 MockRead reads[] = { 1575 MockRead reads[] = {
1076 CreateMockRead(*resp), 1576 CreateMockRead(*resp),
1077 CreateMockRead(*body), 1577 CreateMockRead(*body),
1078 MockRead(true, 0, 0) // EOF 1578 MockRead(true, 0, 0) // EOF
1079 }; 1579 };
1080 1580
1081 scoped_refptr<DelayedSocketData> data( 1581 scoped_refptr<DelayedSocketData> data(
1082 new DelayedSocketData(kChunks, reads, arraysize(reads), 1582 new DelayedSocketData(kChunks, reads, arraysize(reads),
1083 writes.get(), kChunks)); 1583 writes.get(), kChunks));
1084 NormalSpdyTransactionHelper helper(CreateGetRequest(), 1584 NormalSpdyTransactionHelper helper(CreateGetRequest(),
1085 BoundNetLog()); 1585 BoundNetLog());
1086 helper.RunToCompletion(data.get()); 1586 helper.RunToCompletion(data.get());
1087 TransactionHelperResult out = helper.output(); 1587 TransactionHelperResult out = helper.output();
1088 EXPECT_EQ(OK, out.rv); 1588 EXPECT_EQ(OK, out.rv);
1089 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1589 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1090 EXPECT_EQ("hello!", out.response_data); 1590 EXPECT_EQ("hello!", out.response_data);
1091 } 1591 }
1092 1592
1093 // In this test, we enable compression, but get a uncompressed SynReply from 1593 // In this test, we enable compression, but get a uncompressed SynReply from
1094 // the server. Verify that teardown is all clean. 1594 // the server. Verify that teardown is all clean.
1095 TEST_F(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) { 1595 TEST_F(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) {
1096 // For this test, we turn on the normal compression. 1596 // For this test, we turn on the normal compression.
1097 EnableCompression(true); 1597 EnableCompression(true);
1098 1598
1099 scoped_ptr<spdy::SpdyFrame> compressed(ConstructSpdyGet(NULL, 0, true)); 1599 scoped_ptr<spdy::SpdyFrame> compressed(
1600 ConstructSpdyGet(NULL, 0, true, 1, LOWEST));
1100 MockWrite writes[] = { 1601 MockWrite writes[] = {
1101 CreateMockWrite(*compressed), 1602 CreateMockWrite(*compressed),
1102 }; 1603 };
1103 1604
1104 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 1605 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
1105 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 1606 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
1106 MockRead reads[] = { 1607 MockRead reads[] = {
1107 CreateMockRead(*resp), 1608 CreateMockRead(*resp),
1108 CreateMockRead(*body), 1609 CreateMockRead(*body),
1109 MockRead(true, 0, 0) // EOF 1610 MockRead(true, 0, 0) // EOF
1110 }; 1611 };
1111 1612
1112 scoped_refptr<DelayedSocketData> data( 1613 scoped_refptr<DelayedSocketData> data(
1113 new DelayedSocketData(1, reads, arraysize(reads), 1614 new DelayedSocketData(1, reads, arraysize(reads),
1114 writes, arraysize(writes))); 1615 writes, arraysize(writes)));
1115 NormalSpdyTransactionHelper helper(CreateGetRequest(), 1616 NormalSpdyTransactionHelper helper(CreateGetRequest(),
1116 BoundNetLog()); 1617 BoundNetLog());
1117 helper.RunToCompletion(data.get()); 1618 helper.RunToCompletion(data.get());
1118 TransactionHelperResult out = helper.output(); 1619 TransactionHelperResult out = helper.output();
1119 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv); 1620 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv);
1120 data->Reset(); 1621 data->Reset();
1121 1622
1122 EnableCompression(false); 1623 EnableCompression(false);
1123 } 1624 }
1124 1625
1125 // Test that the NetLog contains good data for a simple GET request. 1626 // Test that the NetLog contains good data for a simple GET request.
1126 TEST_F(SpdyNetworkTransactionTest, NetLog) { 1627 TEST_F(SpdyNetworkTransactionTest, NetLog) {
1127 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1628 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1128 MockWrite writes[] = { CreateMockWrite(*req) }; 1629 MockWrite writes[] = { CreateMockWrite(*req) };
1129 1630
1130 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 1631 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
1131 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 1632 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
1132 MockRead reads[] = { 1633 MockRead reads[] = {
1133 CreateMockRead(*resp), 1634 CreateMockRead(*resp),
1134 CreateMockRead(*body), 1635 CreateMockRead(*body),
1135 MockRead(true, 0, 0) // EOF 1636 MockRead(true, 0, 0) // EOF
1136 }; 1637 };
1137 1638
1138 net::CapturingBoundNetLog log(net::CapturingNetLog::kUnbounded); 1639 net::CapturingBoundNetLog log(net::CapturingNetLog::kUnbounded);
1139 1640
1140 scoped_refptr<DelayedSocketData> data( 1641 scoped_refptr<DelayedSocketData> data(
1141 new DelayedSocketData(1, reads, arraysize(reads), 1642 new DelayedSocketData(1, reads, arraysize(reads),
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 net::NetLog::PHASE_END); 1675 net::NetLog::PHASE_END);
1175 } 1676 }
1176 1677
1177 // Since we buffer the IO from the stream to the renderer, this test verifies 1678 // Since we buffer the IO from the stream to the renderer, this test verifies
1178 // that when we read out the maximum amount of data (e.g. we received 50 bytes 1679 // that when we read out the maximum amount of data (e.g. we received 50 bytes
1179 // on the network, but issued a Read for only 5 of those bytes) that the data 1680 // on the network, but issued a Read for only 5 of those bytes) that the data
1180 // flow still works correctly. 1681 // flow still works correctly.
1181 TEST_F(SpdyNetworkTransactionTest, BufferFull) { 1682 TEST_F(SpdyNetworkTransactionTest, BufferFull) {
1182 spdy::SpdyFramer framer; 1683 spdy::SpdyFramer framer;
1183 1684
1184 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1685 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1185 MockWrite writes[] = { CreateMockWrite(*req) }; 1686 MockWrite writes[] = { CreateMockWrite(*req) };
1186 1687
1187 // 2 data frames in a single read. 1688 // 2 data frames in a single read.
1188 scoped_ptr<spdy::SpdyFrame> data_frame_1( 1689 scoped_ptr<spdy::SpdyFrame> data_frame_1(
1189 framer.CreateDataFrame(1, "goodby", 6, spdy::DATA_FLAG_NONE)); 1690 framer.CreateDataFrame(1, "goodby", 6, spdy::DATA_FLAG_NONE));
1190 scoped_ptr<spdy::SpdyFrame> data_frame_2( 1691 scoped_ptr<spdy::SpdyFrame> data_frame_2(
1191 framer.CreateDataFrame(1, "e worl", 6, spdy::DATA_FLAG_NONE)); 1692 framer.CreateDataFrame(1, "e worl", 6, spdy::DATA_FLAG_NONE));
1192 const spdy::SpdyFrame* data_frames[2] = { 1693 const spdy::SpdyFrame* data_frames[2] = {
1193 data_frame_1.get(), 1694 data_frame_1.get(),
1194 data_frame_2.get(), 1695 data_frame_2.get(),
1195 }; 1696 };
1196 char combined_data_frames[100]; 1697 char combined_data_frames[100];
1197 int combined_data_frames_len = 1698 int combined_data_frames_len =
1198 CombineFrames(data_frames, arraysize(data_frames), 1699 CombineFrames(data_frames, arraysize(data_frames),
1199 combined_data_frames, arraysize(combined_data_frames)); 1700 combined_data_frames, arraysize(combined_data_frames));
1200 scoped_ptr<spdy::SpdyFrame> last_frame( 1701 scoped_ptr<spdy::SpdyFrame> last_frame(
1201 framer.CreateDataFrame(1, "d", 1, spdy::DATA_FLAG_FIN)); 1702 framer.CreateDataFrame(1, "d", 1, spdy::DATA_FLAG_FIN));
1202 1703
1203 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 1704 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
1204 MockRead reads[] = { 1705 MockRead reads[] = {
1205 CreateMockRead(*resp), 1706 CreateMockRead(*resp),
1206 MockRead(true, ERR_IO_PENDING), // Force a pause 1707 MockRead(true, ERR_IO_PENDING), // Force a pause
1207 MockRead(true, combined_data_frames, combined_data_frames_len), 1708 MockRead(true, combined_data_frames, combined_data_frames_len),
1208 MockRead(true, ERR_IO_PENDING), // Force a pause 1709 MockRead(true, ERR_IO_PENDING), // Force a pause
1209 CreateMockRead(*last_frame), 1710 CreateMockRead(*last_frame),
1210 MockRead(true, 0, 0) // EOF 1711 MockRead(true, 0, 0) // EOF
1211 }; 1712 };
1212 1713
1213 scoped_refptr<DelayedSocketData> data( 1714 scoped_refptr<DelayedSocketData> data(
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1268 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1769 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1269 EXPECT_EQ("goodbye world", out.response_data); 1770 EXPECT_EQ("goodbye world", out.response_data);
1270 } 1771 }
1271 1772
1272 // Verify that basic buffering works; when multiple data frames arrive 1773 // Verify that basic buffering works; when multiple data frames arrive
1273 // at the same time, ensure that we don't notify a read completion for 1774 // at the same time, ensure that we don't notify a read completion for
1274 // each data frame individually. 1775 // each data frame individually.
1275 TEST_F(SpdyNetworkTransactionTest, Buffering) { 1776 TEST_F(SpdyNetworkTransactionTest, Buffering) {
1276 spdy::SpdyFramer framer; 1777 spdy::SpdyFramer framer;
1277 1778
1278 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1779 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1279 MockWrite writes[] = { CreateMockWrite(*req) }; 1780 MockWrite writes[] = { CreateMockWrite(*req) };
1280 1781
1281 // 4 data frames in a single read. 1782 // 4 data frames in a single read.
1282 scoped_ptr<spdy::SpdyFrame> data_frame( 1783 scoped_ptr<spdy::SpdyFrame> data_frame(
1283 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); 1784 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE));
1284 scoped_ptr<spdy::SpdyFrame> data_frame_fin( 1785 scoped_ptr<spdy::SpdyFrame> data_frame_fin(
1285 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_FIN)); 1786 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_FIN));
1286 const spdy::SpdyFrame* data_frames[4] = { 1787 const spdy::SpdyFrame* data_frames[4] = {
1287 data_frame.get(), 1788 data_frame.get(),
1288 data_frame.get(), 1789 data_frame.get(),
1289 data_frame.get(), 1790 data_frame.get(),
1290 data_frame_fin.get() 1791 data_frame_fin.get()
1291 }; 1792 };
1292 char combined_data_frames[100]; 1793 char combined_data_frames[100];
1293 int combined_data_frames_len = 1794 int combined_data_frames_len =
1294 CombineFrames(data_frames, arraysize(data_frames), 1795 CombineFrames(data_frames, arraysize(data_frames),
1295 combined_data_frames, arraysize(combined_data_frames)); 1796 combined_data_frames, arraysize(combined_data_frames));
1296 1797
1297 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 1798 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
1298 MockRead reads[] = { 1799 MockRead reads[] = {
1299 CreateMockRead(*resp), 1800 CreateMockRead(*resp),
1300 MockRead(true, ERR_IO_PENDING), // Force a pause 1801 MockRead(true, ERR_IO_PENDING), // Force a pause
1301 MockRead(true, combined_data_frames, combined_data_frames_len), 1802 MockRead(true, combined_data_frames, combined_data_frames_len),
1302 MockRead(true, 0, 0) // EOF 1803 MockRead(true, 0, 0) // EOF
1303 }; 1804 };
1304 1805
1305 scoped_refptr<DelayedSocketData> data( 1806 scoped_refptr<DelayedSocketData> data(
1306 new DelayedSocketData(1, reads, arraysize(reads), 1807 new DelayedSocketData(1, reads, arraysize(reads),
1307 writes, arraysize(writes))); 1808 writes, arraysize(writes)));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 1863
1363 EXPECT_EQ(OK, out.rv); 1864 EXPECT_EQ(OK, out.rv);
1364 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1865 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1365 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 1866 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
1366 } 1867 }
1367 1868
1368 // Verify the case where we buffer data but read it after it has been buffered. 1869 // Verify the case where we buffer data but read it after it has been buffered.
1369 TEST_F(SpdyNetworkTransactionTest, BufferedAll) { 1870 TEST_F(SpdyNetworkTransactionTest, BufferedAll) {
1370 spdy::SpdyFramer framer; 1871 spdy::SpdyFramer framer;
1371 1872
1372 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1873 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1373 MockWrite writes[] = { CreateMockWrite(*req) }; 1874 MockWrite writes[] = { CreateMockWrite(*req) };
1374 1875
1375 // 5 data frames in a single read. 1876 // 5 data frames in a single read.
1376 scoped_ptr<spdy::SpdyFrame> syn_reply( 1877 scoped_ptr<spdy::SpdyFrame> syn_reply(
1377 ConstructSpdyGetSynReply(NULL, 0)); 1878 ConstructSpdyGetSynReply(NULL, 0, 1));
1378 syn_reply->set_flags(spdy::CONTROL_FLAG_NONE); // turn off FIN bit 1879 syn_reply->set_flags(spdy::CONTROL_FLAG_NONE); // turn off FIN bit
1379 scoped_ptr<spdy::SpdyFrame> data_frame( 1880 scoped_ptr<spdy::SpdyFrame> data_frame(
1380 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); 1881 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE));
1381 scoped_ptr<spdy::SpdyFrame> data_frame_fin( 1882 scoped_ptr<spdy::SpdyFrame> data_frame_fin(
1382 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_FIN)); 1883 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_FIN));
1383 const spdy::SpdyFrame* frames[5] = { 1884 const spdy::SpdyFrame* frames[5] = {
1384 syn_reply.get(), 1885 syn_reply.get(),
1385 data_frame.get(), 1886 data_frame.get(),
1386 data_frame.get(), 1887 data_frame.get(),
1387 data_frame.get(), 1888 data_frame.get(),
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1453 1954
1454 EXPECT_EQ(OK, out.rv); 1955 EXPECT_EQ(OK, out.rv);
1455 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); 1956 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
1456 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 1957 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
1457 } 1958 }
1458 1959
1459 // Verify the case where we buffer data and close the connection. 1960 // Verify the case where we buffer data and close the connection.
1460 TEST_F(SpdyNetworkTransactionTest, BufferedClosed) { 1961 TEST_F(SpdyNetworkTransactionTest, BufferedClosed) {
1461 spdy::SpdyFramer framer; 1962 spdy::SpdyFramer framer;
1462 1963
1463 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 1964 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1464 MockWrite writes[] = { CreateMockWrite(*req) }; 1965 MockWrite writes[] = { CreateMockWrite(*req) };
1465 1966
1466 // All data frames in a single read. 1967 // All data frames in a single read.
1467 // NOTE: We don't FIN the stream. 1968 // NOTE: We don't FIN the stream.
1468 scoped_ptr<spdy::SpdyFrame> data_frame( 1969 scoped_ptr<spdy::SpdyFrame> data_frame(
1469 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); 1970 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE));
1470 const spdy::SpdyFrame* data_frames[4] = { 1971 const spdy::SpdyFrame* data_frames[4] = {
1471 data_frame.get(), 1972 data_frame.get(),
1472 data_frame.get(), 1973 data_frame.get(),
1473 data_frame.get(), 1974 data_frame.get(),
1474 data_frame.get() 1975 data_frame.get()
1475 }; 1976 };
1476 char combined_data_frames[100]; 1977 char combined_data_frames[100];
1477 int combined_data_frames_len = 1978 int combined_data_frames_len =
1478 CombineFrames(data_frames, arraysize(data_frames), 1979 CombineFrames(data_frames, arraysize(data_frames),
1479 combined_data_frames, arraysize(combined_data_frames)); 1980 combined_data_frames, arraysize(combined_data_frames));
1480 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 1981 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
1481 MockRead reads[] = { 1982 MockRead reads[] = {
1482 CreateMockRead(*resp), 1983 CreateMockRead(*resp),
1483 MockRead(true, ERR_IO_PENDING), // Force a wait 1984 MockRead(true, ERR_IO_PENDING), // Force a wait
1484 MockRead(true, combined_data_frames, combined_data_frames_len), 1985 MockRead(true, combined_data_frames, combined_data_frames_len),
1485 MockRead(true, 0, 0) // EOF 1986 MockRead(true, 0, 0) // EOF
1486 }; 1987 };
1487 1988
1488 scoped_refptr<DelayedSocketData> data( 1989 scoped_refptr<DelayedSocketData> data(
1489 new DelayedSocketData(1, reads, arraysize(reads), 1990 new DelayedSocketData(1, reads, arraysize(reads),
1490 writes, arraysize(writes))); 1991 writes, arraysize(writes)));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1543 MessageLoop::current()->RunAllPending(); 2044 MessageLoop::current()->RunAllPending();
1544 2045
1545 // Verify that we consumed all test data. 2046 // Verify that we consumed all test data.
1546 helper.VerifyDataConsumed(); 2047 helper.VerifyDataConsumed();
1547 } 2048 }
1548 2049
1549 // Verify the case where we buffer data and cancel the transaction. 2050 // Verify the case where we buffer data and cancel the transaction.
1550 TEST_F(SpdyNetworkTransactionTest, BufferedCancelled) { 2051 TEST_F(SpdyNetworkTransactionTest, BufferedCancelled) {
1551 spdy::SpdyFramer framer; 2052 spdy::SpdyFramer framer;
1552 2053
1553 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 2054 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1554 MockWrite writes[] = { CreateMockWrite(*req) }; 2055 MockWrite writes[] = { CreateMockWrite(*req) };
1555 2056
1556 // NOTE: We don't FIN the stream. 2057 // NOTE: We don't FIN the stream.
1557 scoped_ptr<spdy::SpdyFrame> data_frame( 2058 scoped_ptr<spdy::SpdyFrame> data_frame(
1558 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); 2059 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE));
1559 2060
1560 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 2061 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
1561 MockRead reads[] = { 2062 MockRead reads[] = {
1562 CreateMockRead(*resp), 2063 CreateMockRead(*resp),
1563 MockRead(true, ERR_IO_PENDING), // Force a wait 2064 MockRead(true, ERR_IO_PENDING), // Force a wait
1564 CreateMockRead(*data_frame), 2065 CreateMockRead(*data_frame),
1565 MockRead(true, 0, 0) // EOF 2066 MockRead(true, 0, 0) // EOF
1566 }; 2067 };
1567 2068
1568 scoped_refptr<DelayedSocketData> data( 2069 scoped_refptr<DelayedSocketData> data(
1569 new DelayedSocketData(1, reads, arraysize(reads), 2070 new DelayedSocketData(1, reads, arraysize(reads),
1570 writes, arraysize(writes))); 2071 writes, arraysize(writes)));
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1637 }; 2138 };
1638 2139
1639 NormalSpdyTransactionHelper helper(CreateGetRequest(), 2140 NormalSpdyTransactionHelper helper(CreateGetRequest(),
1640 BoundNetLog()); 2141 BoundNetLog());
1641 2142
1642 // Verify that no settings exist initially. 2143 // Verify that no settings exist initially.
1643 HostPortPair host_port_pair("www.google.com", 443); 2144 HostPortPair host_port_pair("www.google.com", 443);
1644 EXPECT_TRUE(helper.session()->spdy_settings().Get(host_port_pair).empty()); 2145 EXPECT_TRUE(helper.session()->spdy_settings().Get(host_port_pair).empty());
1645 2146
1646 // Construct the request. 2147 // Construct the request.
1647 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 2148 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1648 MockWrite writes[] = { CreateMockWrite(*req) }; 2149 MockWrite writes[] = { CreateMockWrite(*req) };
1649 2150
1650 // Construct the reply. 2151 // Construct the reply.
1651 scoped_ptr<spdy::SpdyFrame> reply( 2152 scoped_ptr<spdy::SpdyFrame> reply(
1652 ConstructSpdyPacket(kSynReplyInfo, 2153 ConstructSpdyPacket(kSynReplyInfo,
1653 kExtraHeaders, 2154 kExtraHeaders,
1654 arraysize(kExtraHeaders) / 2, 2155 arraysize(kExtraHeaders) / 2,
1655 NULL, 2156 NULL,
1656 0)); 2157 0));
1657 2158
(...skipping 16 matching lines...) Expand all
1674 setting.set_flags(0); 2175 setting.set_flags(0);
1675 setting.set_id(kSampleId2); 2176 setting.set_id(kSampleId2);
1676 settings.push_back(std::make_pair(setting, kSampleValue2)); 2177 settings.push_back(std::make_pair(setting, kSampleValue2));
1677 // Next add another persisted setting 2178 // Next add another persisted setting
1678 setting.set_flags(spdy::SETTINGS_FLAG_PLEASE_PERSIST); 2179 setting.set_flags(spdy::SETTINGS_FLAG_PLEASE_PERSIST);
1679 setting.set_id(kSampleId3); 2180 setting.set_id(kSampleId3);
1680 settings.push_back(std::make_pair(setting, kSampleValue3)); 2181 settings.push_back(std::make_pair(setting, kSampleValue3));
1681 settings_frame.reset(ConstructSpdySettings(settings)); 2182 settings_frame.reset(ConstructSpdySettings(settings));
1682 } 2183 }
1683 2184
1684 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 2185 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
1685 MockRead reads[] = { 2186 MockRead reads[] = {
1686 CreateMockRead(*reply), 2187 CreateMockRead(*reply),
1687 CreateMockRead(*body), 2188 CreateMockRead(*body),
1688 CreateMockRead(*settings_frame), 2189 CreateMockRead(*settings_frame),
1689 MockRead(true, 0, 0) // EOF 2190 MockRead(true, 0, 0) // EOF
1690 }; 2191 };
1691 2192
1692 scoped_refptr<DelayedSocketData> data( 2193 scoped_refptr<DelayedSocketData> data(
1693 new DelayedSocketData(1, reads, arraysize(reads), 2194 new DelayedSocketData(1, reads, arraysize(reads),
1694 writes, arraysize(writes))); 2195 writes, arraysize(writes)));
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1768 } 2269 }
1769 2270
1770 EXPECT_EQ(2u, helper.session()->spdy_settings().Get(host_port_pair).size()); 2271 EXPECT_EQ(2u, helper.session()->spdy_settings().Get(host_port_pair).size());
1771 2272
1772 // Construct the SETTINGS frame. 2273 // Construct the SETTINGS frame.
1773 const spdy::SpdySettings& settings = 2274 const spdy::SpdySettings& settings =
1774 helper.session()->spdy_settings().Get(host_port_pair); 2275 helper.session()->spdy_settings().Get(host_port_pair);
1775 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings)); 2276 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings));
1776 2277
1777 // Construct the request. 2278 // Construct the request.
1778 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 2279 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1779 2280
1780 MockWrite writes[] = { 2281 MockWrite writes[] = {
1781 CreateMockWrite(*settings_frame), 2282 CreateMockWrite(*settings_frame),
1782 CreateMockWrite(*req), 2283 CreateMockWrite(*req),
1783 }; 2284 };
1784 2285
1785 // Construct the reply. 2286 // Construct the reply.
1786 scoped_ptr<spdy::SpdyFrame> reply( 2287 scoped_ptr<spdy::SpdyFrame> reply(
1787 ConstructSpdyPacket(kSynReplyInfo, 2288 ConstructSpdyPacket(kSynReplyInfo,
1788 kExtraHeaders, 2289 kExtraHeaders,
1789 arraysize(kExtraHeaders) / 2, 2290 arraysize(kExtraHeaders) / 2,
1790 NULL, 2291 NULL,
1791 0)); 2292 0));
1792 2293
1793 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); 2294 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
1794 MockRead reads[] = { 2295 MockRead reads[] = {
1795 CreateMockRead(*reply), 2296 CreateMockRead(*reply),
1796 CreateMockRead(*body), 2297 CreateMockRead(*body),
1797 MockRead(true, 0, 0) // EOF 2298 MockRead(true, 0, 0) // EOF
1798 }; 2299 };
1799 2300
1800 scoped_refptr<DelayedSocketData> data( 2301 scoped_refptr<DelayedSocketData> data(
1801 new DelayedSocketData(2, reads, arraysize(reads), 2302 new DelayedSocketData(2, reads, arraysize(reads),
1802 writes, arraysize(writes))); 2303 writes, arraysize(writes)));
1803 helper.RunToCompletion(data.get()); 2304 helper.RunToCompletion(data.get());
(...skipping 18 matching lines...) Expand all
1822 // Verify the second persisted setting. 2323 // Verify the second persisted setting.
1823 setting = saved_settings.front(); 2324 setting = saved_settings.front();
1824 saved_settings.pop_front(); 2325 saved_settings.pop_front();
1825 EXPECT_EQ(spdy::SETTINGS_FLAG_PERSISTED, setting.first.flags()); 2326 EXPECT_EQ(spdy::SETTINGS_FLAG_PERSISTED, setting.first.flags());
1826 EXPECT_EQ(kSampleId2, setting.first.id()); 2327 EXPECT_EQ(kSampleId2, setting.first.id());
1827 EXPECT_EQ(kSampleValue2, setting.second); 2328 EXPECT_EQ(kSampleValue2, setting.second);
1828 } 2329 }
1829 } 2330 }
1830 2331
1831 TEST_F(SpdyNetworkTransactionTest, GoAwayWithActiveStream) { 2332 TEST_F(SpdyNetworkTransactionTest, GoAwayWithActiveStream) {
1832 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 2333 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1833 MockWrite writes[] = { CreateMockWrite(*req) }; 2334 MockWrite writes[] = { CreateMockWrite(*req) };
1834 2335
1835 scoped_ptr<spdy::SpdyFrame> go_away(ConstructSpdyGoAway()); 2336 scoped_ptr<spdy::SpdyFrame> go_away(ConstructSpdyGoAway());
1836 MockRead reads[] = { 2337 MockRead reads[] = {
1837 CreateMockRead(*go_away), 2338 CreateMockRead(*go_away),
1838 MockRead(true, 0, 0) // EOF 2339 MockRead(true, 0, 0) // EOF
1839 }; 2340 };
1840 2341
1841 scoped_refptr<DelayedSocketData> data( 2342 scoped_refptr<DelayedSocketData> data(
1842 new DelayedSocketData(1, reads, arraysize(reads), 2343 new DelayedSocketData(1, reads, arraysize(reads),
1843 writes, arraysize(writes))); 2344 writes, arraysize(writes)));
1844 NormalSpdyTransactionHelper helper(CreateGetRequest(), 2345 NormalSpdyTransactionHelper helper(CreateGetRequest(),
1845 BoundNetLog()); 2346 BoundNetLog());
1846 helper.RunToCompletion(data.get()); 2347 helper.RunToCompletion(data.get());
1847 TransactionHelperResult out = helper.output(); 2348 TransactionHelperResult out = helper.output();
1848 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); 2349 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv);
1849 } 2350 }
1850 2351
1851 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { 2352 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) {
1852 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); 2353 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1853 MockWrite writes[] = { CreateMockWrite(*req) }; 2354 MockWrite writes[] = { CreateMockWrite(*req) };
1854 2355
1855 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); 2356 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
1856 MockRead reads[] = { 2357 MockRead reads[] = {
1857 CreateMockRead(*resp), 2358 CreateMockRead(*resp),
1858 MockRead(false, 0, 0) // EOF 2359 MockRead(false, 0, 0) // EOF
1859 }; 2360 };
1860 2361
1861 scoped_refptr<DelayedSocketData> data( 2362 scoped_refptr<DelayedSocketData> data(
1862 new DelayedSocketData(1, reads, arraysize(reads), 2363 new DelayedSocketData(1, reads, arraysize(reads),
1863 writes, arraysize(writes))); 2364 writes, arraysize(writes)));
1864 BoundNetLog log; 2365 BoundNetLog log;
1865 NormalSpdyTransactionHelper helper(CreateGetRequest(), 2366 NormalSpdyTransactionHelper helper(CreateGetRequest(),
(...skipping 14 matching lines...) Expand all
1880 EXPECT_TRUE(response->headers != NULL); 2381 EXPECT_TRUE(response->headers != NULL);
1881 EXPECT_TRUE(response->was_fetched_via_spdy); 2382 EXPECT_TRUE(response->was_fetched_via_spdy);
1882 out.rv = ReadTransaction(trans, &out.response_data); 2383 out.rv = ReadTransaction(trans, &out.response_data);
1883 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); 2384 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv);
1884 2385
1885 // Verify that we consumed all test data. 2386 // Verify that we consumed all test data.
1886 helper.VerifyDataConsumed(); 2387 helper.VerifyDataConsumed();
1887 } 2388 }
1888 2389
1889 } // namespace net 2390 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_network_transaction.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698