OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/spdy/spdy_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" |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 const HttpRequestInfo& CreateGetRequest() { | 500 const HttpRequestInfo& CreateGetRequest() { |
501 if (!google_get_request_initialized_) { | 501 if (!google_get_request_initialized_) { |
502 google_get_request_.method = "GET"; | 502 google_get_request_.method = "GET"; |
503 google_get_request_.url = GURL("http://www.google.com/"); | 503 google_get_request_.url = GURL("http://www.google.com/"); |
504 google_get_request_.load_flags = 0; | 504 google_get_request_.load_flags = 0; |
505 google_get_request_initialized_ = true; | 505 google_get_request_initialized_ = true; |
506 } | 506 } |
507 return google_get_request_; | 507 return google_get_request_; |
508 } | 508 } |
509 | 509 |
510 SpdyStream* GetSpdyStream(SpdyNetworkTransaction* trans) { | |
511 return trans->stream_->stream(); | |
512 } | |
513 | |
514 private: | 510 private: |
515 bool google_get_request_initialized_; | 511 bool google_get_request_initialized_; |
516 HttpRequestInfo google_get_request_; | 512 HttpRequestInfo google_get_request_; |
517 }; | 513 }; |
518 | 514 |
519 //----------------------------------------------------------------------------- | 515 //----------------------------------------------------------------------------- |
520 | 516 |
521 // Verify SpdyNetworkTransaction constructor. | 517 // Verify SpdyNetworkTransaction constructor. |
522 TEST_F(SpdyNetworkTransactionTest, Constructor) { | 518 TEST_F(SpdyNetworkTransactionTest, Constructor) { |
523 SessionDependencies session_deps; | 519 SessionDependencies session_deps; |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 }; | 674 }; |
679 | 675 |
680 scoped_refptr<DelayedSocketData> data( | 676 scoped_refptr<DelayedSocketData> data( |
681 new DelayedSocketData(1, reads, arraysize(reads), NULL, 0)); | 677 new DelayedSocketData(1, reads, arraysize(reads), NULL, 0)); |
682 TransactionHelperResult out = TransactionHelper(CreateGetRequest(), | 678 TransactionHelperResult out = TransactionHelper(CreateGetRequest(), |
683 data.get(), | 679 data.get(), |
684 BoundNetLog()); | 680 BoundNetLog()); |
685 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv); | 681 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv); |
686 } | 682 } |
687 | 683 |
688 class CloseStreamCallback : public CallbackRunner< Tuple1<int> > { | |
689 public: | |
690 explicit CloseStreamCallback(SpdyStream* stream) | |
691 : stream_(stream) {} | |
692 | |
693 // This callback should occur immediately after the SpdyStream has been | |
694 // closed. We check that the stream has been marked half closed from the | |
695 // client side. | |
696 virtual void RunWithParams(const Tuple1<int>& params) { | |
697 EXPECT_TRUE(stream_->half_closed_client_side()); | |
698 } | |
699 | |
700 private: | |
701 const SpdyStream* stream_; | |
702 }; | |
703 | |
704 // Test that spdy_session marks a stream as half closed immediately upon closing | |
705 // the stream. | |
706 TEST_F(SpdyNetworkTransactionTest, StreamHalfClosedClientSide) { | |
707 MockWrite writes[] = { | |
708 MockWrite(true, reinterpret_cast<const char*>(kGetSyn), | |
709 arraysize(kGetSyn), 1), | |
710 }; | |
711 | |
712 MockRead reads[] = { | |
713 MockRead(true, reinterpret_cast<const char*>(kGetSynReply), | |
714 arraysize(kGetSynReply), 2), | |
715 MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame), | |
716 arraysize(kGetBodyFrame), 3), | |
717 MockRead(true, 0, 0, 4), // EOF | |
718 }; | |
719 | |
720 HttpRequestInfo request; | |
721 request.method = "GET"; | |
722 request.url = GURL("http://www.google.com/"); | |
723 request.load_flags = 0; | |
724 | |
725 // We disable SSL for this test. | |
726 SpdySession::SetSSLMode(false); | |
727 | |
728 SessionDependencies session_deps; | |
729 scoped_ptr<SpdyNetworkTransaction> trans( | |
730 new SpdyNetworkTransaction(CreateSession(&session_deps))); | |
731 scoped_refptr<OrderedSocketData> data( | |
732 new OrderedSocketData(reads, arraysize(reads), | |
733 writes, arraysize(writes))); | |
734 session_deps.socket_factory.AddSocketDataProvider(data); | |
735 | |
736 // Start the transaction with basic parameters. | |
737 TestCompletionCallback callback; | |
738 int rv = trans->Start(&request, &callback, BoundNetLog()); | |
739 EXPECT_EQ(ERR_IO_PENDING, rv); | |
740 rv = callback.WaitForResult(); | |
741 | |
742 SpdyStream* stream = GetSpdyStream(trans.get()); | |
743 | |
744 // Setup a user callback which will check that the half closed flag is marked | |
745 // immediately after the stream is closed. | |
746 CloseStreamCallback callback2(stream); | |
747 const int kSize = 3000; | |
748 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); | |
749 rv = trans->Read(buf, kSize, &callback2); | |
750 | |
751 // Finish running rest of tasks. | |
752 MessageLoop::current()->RunAllPending(); | |
753 } | |
754 | |
755 // Test that the transaction doesn't crash when we get two replies on the same | 684 // Test that the transaction doesn't crash when we get two replies on the same |
756 // stream ID. See http://crbug.com/45639. | 685 // stream ID. See http://crbug.com/45639. |
757 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { | 686 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { |
758 SessionDependencies session_deps; | 687 SessionDependencies session_deps; |
759 HttpNetworkSession* session = CreateSession(&session_deps); | 688 HttpNetworkSession* session = CreateSession(&session_deps); |
760 | 689 |
761 // We disable SSL for this test. | 690 // We disable SSL for this test. |
762 SpdySession::SetSSLMode(false); | 691 SpdySession::SetSSLMode(false); |
763 | 692 |
764 MockWrite writes[] = { | 693 MockWrite writes[] = { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
833 TestCompletionCallback callback; | 762 TestCompletionCallback callback; |
834 | 763 |
835 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog()); | 764 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog()); |
836 EXPECT_EQ(ERR_IO_PENDING, rv); | 765 EXPECT_EQ(ERR_IO_PENDING, rv); |
837 trans.reset(); // Cancel the transaction. | 766 trans.reset(); // Cancel the transaction. |
838 | 767 |
839 // Flush the MessageLoop while the SessionDependencies (in particular, the | 768 // Flush the MessageLoop while the SessionDependencies (in particular, the |
840 // MockClientSocketFactory) are still alive. | 769 // MockClientSocketFactory) are still alive. |
841 MessageLoop::current()->RunAllPending(); | 770 MessageLoop::current()->RunAllPending(); |
842 } | 771 } |
843 // The client upon cancellation tries to send a RST_STREAM frame. The mock | |
844 // socket causes the TCP write to return zero. This test checks that the client | |
845 // tries to queue up the RST_STREAM frame again. | |
846 TEST_F(SpdyNetworkTransactionTest, SocketWriteReturnsZero) { | |
847 MockWrite writes[] = { | |
848 MockWrite(true, reinterpret_cast<const char*>(kGetSyn), | |
849 arraysize(kGetSyn), 1), | |
850 MockWrite(true, 0, 0, 3), | |
851 MockWrite(true, reinterpret_cast<const char*>(kGetRst), | |
852 arraysize(kGetRst), 4), | |
853 }; | |
854 | |
855 MockRead reads[] = { | |
856 MockRead(true, reinterpret_cast<const char*>(kGetSynReply), | |
857 arraysize(kGetSynReply), 2), | |
858 MockRead(true, 0, 0, 5) // EOF | |
859 }; | |
860 | |
861 HttpRequestInfo request; | |
862 request.method = "GET"; | |
863 request.url = GURL("http://www.google.com/"); | |
864 request.load_flags = 0; | |
865 | |
866 // We disable SSL for this test. | |
867 SpdySession::SetSSLMode(false); | |
868 | |
869 SessionDependencies session_deps; | |
870 scoped_ptr<SpdyNetworkTransaction> trans( | |
871 new SpdyNetworkTransaction(CreateSession(&session_deps))); | |
872 scoped_refptr<OrderedSocketData> data( | |
873 new OrderedSocketData(reads, arraysize(reads), | |
874 writes, arraysize(writes))); | |
875 session_deps.socket_factory.AddSocketDataProvider(data); | |
876 | |
877 TestCompletionCallback callback; | |
878 | |
879 int rv = trans->Start(&request, &callback, BoundNetLog()); | |
880 EXPECT_EQ(ERR_IO_PENDING, rv); | |
881 rv = callback.WaitForResult(); | |
882 trans.reset(); // Cancel the transaction. | |
883 | |
884 // Finish running rest of tasks. | |
885 MessageLoop::current()->RunAllPending(); | |
886 EXPECT_TRUE(data->at_write_eof()) << "Write count: " << data->write_count() | |
887 << ". Write index: " << data->write_index() << "."; | |
888 } | |
889 | |
890 | |
891 // Verify that the client sends a Rst Frame upon cancelling the stream. | |
892 TEST_F(SpdyNetworkTransactionTest, CancelledTransactionSendRst) { | |
893 MockWrite writes[] = { | |
894 MockWrite(true, reinterpret_cast<const char*>(kGetSyn), | |
895 arraysize(kGetSyn), 1), | |
896 MockWrite(true, reinterpret_cast<const char*>(kGetRst), | |
897 arraysize(kGetRst), 3), | |
898 }; | |
899 | |
900 MockRead reads[] = { | |
901 MockRead(true, reinterpret_cast<const char*>(kGetSynReply), | |
902 arraysize(kGetSynReply), 2), | |
903 MockRead(true, 0, 0, 4) // EOF | |
904 }; | |
905 | |
906 HttpRequestInfo request; | |
907 request.method = "GET"; | |
908 request.url = GURL("http://www.google.com/"); | |
909 request.load_flags = 0; | |
910 | |
911 // We disable SSL for this test. | |
912 SpdySession::SetSSLMode(false); | |
913 | |
914 SessionDependencies session_deps; | |
915 scoped_ptr<SpdyNetworkTransaction> trans( | |
916 new SpdyNetworkTransaction(CreateSession(&session_deps))); | |
917 scoped_refptr<OrderedSocketData> data( | |
918 new OrderedSocketData(reads, arraysize(reads), | |
919 writes, arraysize(writes))); | |
920 session_deps.socket_factory.AddSocketDataProvider(data); | |
921 | |
922 TestCompletionCallback callback; | |
923 | |
924 int rv = trans->Start(&request, &callback, BoundNetLog()); | |
925 EXPECT_EQ(ERR_IO_PENDING, rv); | |
926 rv = callback.WaitForResult(); | |
927 trans.reset(); // Cancel the transaction. | |
928 | |
929 // Finish running rest of tasks. | |
930 MessageLoop::current()->RunAllPending(); | |
931 EXPECT_TRUE(data->at_write_eof()) << "Write count: " << data->write_count() | |
932 << ". Write index: " << data->write_index() << "."; | |
933 } | |
934 | 772 |
935 class DeleteSessionCallback : public CallbackRunner< Tuple1<int> > { | 773 class DeleteSessionCallback : public CallbackRunner< Tuple1<int> > { |
936 public: | 774 public: |
937 explicit DeleteSessionCallback(SpdyNetworkTransaction* trans1) : | 775 explicit DeleteSessionCallback(SpdyNetworkTransaction* trans1) : |
938 trans(trans1) {} | 776 trans(trans1) {} |
939 | 777 |
940 // We kill the transaction, which deletes the session and stream. However, the | 778 // We kill the transaction, which deletes the session and stream. However, the |
941 // memory is still accessible, so we also have to zero out the memory of the | 779 // memory is still accessible, so we also have to zero out the memory of the |
942 // stream. This is not a well defined operation, and can cause failures. | 780 // stream. This is not a well defined operation, and can cause failures. |
943 virtual void RunWithParams(const Tuple1<int>& params) { | 781 virtual void RunWithParams(const Tuple1<int>& params) { |
(...skipping 24 matching lines...) Expand all Loading... |
968 | 806 |
969 HttpRequestInfo request; | 807 HttpRequestInfo request; |
970 request.method = "GET"; | 808 request.method = "GET"; |
971 request.url = GURL("http://www.google.com/"); | 809 request.url = GURL("http://www.google.com/"); |
972 request.load_flags = 0; | 810 request.load_flags = 0; |
973 | 811 |
974 // We disable SSL for this test. | 812 // We disable SSL for this test. |
975 SpdySession::SetSSLMode(false); | 813 SpdySession::SetSSLMode(false); |
976 | 814 |
977 SessionDependencies session_deps; | 815 SessionDependencies session_deps; |
978 SpdyNetworkTransaction* trans = | 816 SpdyNetworkTransaction * trans = |
979 new SpdyNetworkTransaction(CreateSession(&session_deps)); | 817 new SpdyNetworkTransaction(CreateSession(&session_deps)); |
980 scoped_refptr<OrderedSocketData> data( | 818 scoped_refptr<OrderedSocketData> data( |
981 new OrderedSocketData(reads, arraysize(reads), | 819 new OrderedSocketData(reads, arraysize(reads), |
982 writes, arraysize(writes))); | 820 writes, arraysize(writes))); |
983 session_deps.socket_factory.AddSocketDataProvider(data); | 821 session_deps.socket_factory.AddSocketDataProvider(data); |
984 | 822 |
985 // Start the transaction with basic parameters. | 823 // Start the transaction with basic parameters. |
986 TestCompletionCallback callback; | 824 TestCompletionCallback callback; |
987 int rv = trans->Start(&request, &callback, BoundNetLog()); | 825 int rv = trans->Start(&request, &callback, BoundNetLog()); |
988 EXPECT_EQ(ERR_IO_PENDING, rv); | 826 EXPECT_EQ(ERR_IO_PENDING, rv); |
(...skipping 1681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2670 EXPECT_TRUE(response->was_fetched_via_spdy); | 2508 EXPECT_TRUE(response->was_fetched_via_spdy); |
2671 out.rv = ReadTransaction(trans.get(), &out.response_data); | 2509 out.rv = ReadTransaction(trans.get(), &out.response_data); |
2672 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); | 2510 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); |
2673 | 2511 |
2674 // Verify that we consumed all test data. | 2512 // Verify that we consumed all test data. |
2675 EXPECT_TRUE(data->at_read_eof()); | 2513 EXPECT_TRUE(data->at_read_eof()); |
2676 EXPECT_TRUE(data->at_write_eof()); | 2514 EXPECT_TRUE(data->at_write_eof()); |
2677 } | 2515 } |
2678 | 2516 |
2679 } // namespace net | 2517 } // namespace net |
OLD | NEW |