| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_client_session.h" | 5 #include "net/quic/quic_client_session.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/rand_util.h" | 9 #include "base/rand_util.h" |
| 10 #include "net/base/capturing_net_log.h" | 10 #include "net/base/capturing_net_log.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 | 26 |
| 27 namespace net { | 27 namespace net { |
| 28 namespace test { | 28 namespace test { |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 const char kServerHostname[] = "www.example.com"; | 31 const char kServerHostname[] = "www.example.com"; |
| 32 const uint16 kServerPort = 80; | 32 const uint16 kServerPort = 80; |
| 33 | 33 |
| 34 class TestPacketWriter : public QuicDefaultPacketWriter { | 34 class TestPacketWriter : public QuicDefaultPacketWriter { |
| 35 public: | 35 public: |
| 36 TestPacketWriter(QuicVersion version) : version_(version) { | 36 TestPacketWriter(QuicVersion version) : version_(version) {} |
| 37 } | |
| 38 | 37 |
| 39 // QuicPacketWriter | 38 // QuicPacketWriter |
| 40 virtual WriteResult WritePacket( | 39 virtual WriteResult WritePacket(const char* buffer, |
| 41 const char* buffer, size_t buf_len, | 40 size_t buf_len, |
| 42 const IPAddressNumber& self_address, | 41 const IPAddressNumber& self_address, |
| 43 const IPEndPoint& peer_address) OVERRIDE { | 42 const IPEndPoint& peer_address) OVERRIDE { |
| 44 SimpleQuicFramer framer(SupportedVersions(version_)); | 43 SimpleQuicFramer framer(SupportedVersions(version_)); |
| 45 QuicEncryptedPacket packet(buffer, buf_len); | 44 QuicEncryptedPacket packet(buffer, buf_len); |
| 46 EXPECT_TRUE(framer.ProcessPacket(packet)); | 45 EXPECT_TRUE(framer.ProcessPacket(packet)); |
| 47 header_ = framer.header(); | 46 header_ = framer.header(); |
| 48 return WriteResult(WRITE_STATUS_OK, packet.length()); | 47 return WriteResult(WRITE_STATUS_OK, packet.length()); |
| 49 } | 48 } |
| 50 | 49 |
| 51 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE { | 50 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE { |
| 52 // Chrome sockets' Write() methods buffer the data until the Write is | 51 // Chrome sockets' Write() methods buffer the data until the Write is |
| 53 // permitted. | 52 // permitted. |
| 54 return true; | 53 return true; |
| 55 } | 54 } |
| 56 | 55 |
| 57 // Returns the header from the last packet written. | 56 // Returns the header from the last packet written. |
| 58 const QuicPacketHeader& header() { return header_; } | 57 const QuicPacketHeader& header() { return header_; } |
| 59 | 58 |
| 60 private: | 59 private: |
| 61 QuicVersion version_; | 60 QuicVersion version_; |
| 62 QuicPacketHeader header_; | 61 QuicPacketHeader header_; |
| 63 }; | 62 }; |
| 64 | 63 |
| 65 class QuicClientSessionTest : public ::testing::TestWithParam<QuicVersion> { | 64 class QuicClientSessionTest : public ::testing::TestWithParam<QuicVersion> { |
| 66 protected: | 65 protected: |
| 67 QuicClientSessionTest() | 66 QuicClientSessionTest() |
| 68 : writer_(new TestPacketWriter(GetParam())), | 67 : writer_(new TestPacketWriter(GetParam())), |
| 69 connection_( | 68 connection_( |
| 70 new PacketSavingConnection(false, SupportedVersions(GetParam()))), | 69 new PacketSavingConnection(false, SupportedVersions(GetParam()))), |
| 71 session_(connection_, GetSocket().Pass(), writer_.Pass(), NULL, NULL, | 70 session_(connection_, |
| 71 GetSocket().Pass(), |
| 72 writer_.Pass(), |
| 73 NULL, |
| 74 NULL, |
| 72 make_scoped_ptr((QuicServerInfo*)NULL), | 75 make_scoped_ptr((QuicServerInfo*)NULL), |
| 73 QuicServerId(kServerHostname, kServerPort, false, | 76 QuicServerId(kServerHostname, |
| 77 kServerPort, |
| 78 false, |
| 74 PRIVACY_MODE_DISABLED), | 79 PRIVACY_MODE_DISABLED), |
| 75 DefaultQuicConfig(), &crypto_config_, &net_log_) { | 80 DefaultQuicConfig(), |
| 81 &crypto_config_, |
| 82 &net_log_) { |
| 76 session_.config()->SetDefaults(); | 83 session_.config()->SetDefaults(); |
| 77 crypto_config_.SetDefaults(); | 84 crypto_config_.SetDefaults(); |
| 78 } | 85 } |
| 79 | 86 |
| 80 virtual void TearDown() OVERRIDE { | 87 virtual void TearDown() OVERRIDE { |
| 81 session_.CloseSessionOnError(ERR_ABORTED); | 88 session_.CloseSessionOnError(ERR_ABORTED); |
| 82 } | 89 } |
| 83 | 90 |
| 84 scoped_ptr<DatagramClientSocket> GetSocket() { | 91 scoped_ptr<DatagramClientSocket> GetSocket() { |
| 85 socket_factory_.AddSocketDataProvider(&socket_data_); | 92 socket_factory_.AddSocketDataProvider(&socket_data_); |
| 86 return socket_factory_.CreateDatagramClientSocket( | 93 return socket_factory_.CreateDatagramClientSocket( |
| 87 DatagramSocket::DEFAULT_BIND, base::Bind(&base::RandInt), | 94 DatagramSocket::DEFAULT_BIND, |
| 88 &net_log_, NetLog::Source()); | 95 base::Bind(&base::RandInt), |
| 96 &net_log_, |
| 97 NetLog::Source()); |
| 89 } | 98 } |
| 90 | 99 |
| 91 void CompleteCryptoHandshake() { | 100 void CompleteCryptoHandshake() { |
| 92 ASSERT_EQ(ERR_IO_PENDING, | 101 ASSERT_EQ(ERR_IO_PENDING, |
| 93 session_.CryptoConnect(false, callback_.callback())); | 102 session_.CryptoConnect(false, callback_.callback())); |
| 94 CryptoTestUtils::HandshakeWithFakeServer( | 103 CryptoTestUtils::HandshakeWithFakeServer(connection_, |
| 95 connection_, session_.GetCryptoStream()); | 104 session_.GetCryptoStream()); |
| 96 ASSERT_EQ(OK, callback_.WaitForResult()); | 105 ASSERT_EQ(OK, callback_.WaitForResult()); |
| 97 } | 106 } |
| 98 | 107 |
| 99 scoped_ptr<QuicDefaultPacketWriter> writer_; | 108 scoped_ptr<QuicDefaultPacketWriter> writer_; |
| 100 PacketSavingConnection* connection_; | 109 PacketSavingConnection* connection_; |
| 101 CapturingNetLog net_log_; | 110 CapturingNetLog net_log_; |
| 102 MockClientSocketFactory socket_factory_; | 111 MockClientSocketFactory socket_factory_; |
| 103 StaticSocketDataProvider socket_data_; | 112 StaticSocketDataProvider socket_data_; |
| 104 QuicClientSession session_; | 113 QuicClientSession session_; |
| 105 MockClock clock_; | 114 MockClock clock_; |
| 106 MockRandom random_; | 115 MockRandom random_; |
| 107 QuicConnectionVisitorInterface* visitor_; | 116 QuicConnectionVisitorInterface* visitor_; |
| 108 TestCompletionCallback callback_; | 117 TestCompletionCallback callback_; |
| 109 QuicCryptoClientConfig crypto_config_; | 118 QuicCryptoClientConfig crypto_config_; |
| 110 }; | 119 }; |
| 111 | 120 |
| 112 INSTANTIATE_TEST_CASE_P(Tests, QuicClientSessionTest, | 121 INSTANTIATE_TEST_CASE_P(Tests, |
| 122 QuicClientSessionTest, |
| 113 ::testing::ValuesIn(QuicSupportedVersions())); | 123 ::testing::ValuesIn(QuicSupportedVersions())); |
| 114 | 124 |
| 115 TEST_P(QuicClientSessionTest, CryptoConnect) { | 125 TEST_P(QuicClientSessionTest, CryptoConnect) { |
| 116 CompleteCryptoHandshake(); | 126 CompleteCryptoHandshake(); |
| 117 } | 127 } |
| 118 | 128 |
| 119 TEST_P(QuicClientSessionTest, MaxNumStreams) { | 129 TEST_P(QuicClientSessionTest, MaxNumStreams) { |
| 120 CompleteCryptoHandshake(); | 130 CompleteCryptoHandshake(); |
| 121 | 131 |
| 122 std::vector<QuicReliableClientStream*> streams; | 132 std::vector<QuicReliableClientStream*> streams; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 139 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { | 149 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { |
| 140 QuicReliableClientStream* stream = session_.CreateOutgoingDataStream(); | 150 QuicReliableClientStream* stream = session_.CreateOutgoingDataStream(); |
| 141 EXPECT_TRUE(stream); | 151 EXPECT_TRUE(stream); |
| 142 streams.push_back(stream); | 152 streams.push_back(stream); |
| 143 } | 153 } |
| 144 | 154 |
| 145 QuicReliableClientStream* stream; | 155 QuicReliableClientStream* stream; |
| 146 QuicClientSession::StreamRequest stream_request; | 156 QuicClientSession::StreamRequest stream_request; |
| 147 TestCompletionCallback callback; | 157 TestCompletionCallback callback; |
| 148 ASSERT_EQ(ERR_IO_PENDING, | 158 ASSERT_EQ(ERR_IO_PENDING, |
| 149 stream_request.StartRequest(session_.GetWeakPtr(), &stream, | 159 stream_request.StartRequest( |
| 150 callback.callback())); | 160 session_.GetWeakPtr(), &stream, callback.callback())); |
| 151 | 161 |
| 152 // Close a stream and ensure I can now open a new one. | 162 // Close a stream and ensure I can now open a new one. |
| 153 session_.CloseStream(streams[0]->id()); | 163 session_.CloseStream(streams[0]->id()); |
| 154 ASSERT_TRUE(callback.have_result()); | 164 ASSERT_TRUE(callback.have_result()); |
| 155 EXPECT_EQ(OK, callback.WaitForResult()); | 165 EXPECT_EQ(OK, callback.WaitForResult()); |
| 156 EXPECT_TRUE(stream != NULL); | 166 EXPECT_TRUE(stream != NULL); |
| 157 } | 167 } |
| 158 | 168 |
| 159 TEST_P(QuicClientSessionTest, GoAwayReceived) { | 169 TEST_P(QuicClientSessionTest, GoAwayReceived) { |
| 160 CompleteCryptoHandshake(); | 170 CompleteCryptoHandshake(); |
| 161 | 171 |
| 162 // After receiving a GoAway, I should no longer be able to create outgoing | 172 // After receiving a GoAway, I should no longer be able to create outgoing |
| 163 // streams. | 173 // streams. |
| 164 session_.OnGoAway(QuicGoAwayFrame(QUIC_PEER_GOING_AWAY, 1u, "Going away.")); | 174 session_.OnGoAway(QuicGoAwayFrame(QUIC_PEER_GOING_AWAY, 1u, "Going away.")); |
| 165 EXPECT_EQ(NULL, session_.CreateOutgoingDataStream()); | 175 EXPECT_EQ(NULL, session_.CreateOutgoingDataStream()); |
| 166 } | 176 } |
| 167 | 177 |
| 168 } // namespace | 178 } // namespace |
| 169 } // namespace test | 179 } // namespace test |
| 170 } // namespace net | 180 } // namespace net |
| OLD | NEW |