| 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/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "net/base/capturing_net_log.h" | 10 #include "net/base/capturing_net_log.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 EXPECT_TRUE(stream); | 70 EXPECT_TRUE(stream); |
| 71 streams.push_back(stream); | 71 streams.push_back(stream); |
| 72 } | 72 } |
| 73 EXPECT_FALSE(session_.CreateOutgoingReliableStream()); | 73 EXPECT_FALSE(session_.CreateOutgoingReliableStream()); |
| 74 | 74 |
| 75 // Close a stream and ensure I can now open a new one. | 75 // Close a stream and ensure I can now open a new one. |
| 76 session_.CloseStream(streams[0]->id()); | 76 session_.CloseStream(streams[0]->id()); |
| 77 EXPECT_TRUE(session_.CreateOutgoingReliableStream()); | 77 EXPECT_TRUE(session_.CreateOutgoingReliableStream()); |
| 78 } | 78 } |
| 79 | 79 |
| 80 TEST_F(QuicClientSessionTest, GoAwayReceived) { |
| 81 // Initialize crypto before the client session will create a stream. |
| 82 ASSERT_TRUE(session_.CryptoConnect(callback_.callback())); |
| 83 // Simulate the server crypto handshake. |
| 84 CryptoHandshakeMessage server_message; |
| 85 server_message.tag = kSHLO; |
| 86 session_.GetCryptoStream()->OnHandshakeMessage(server_message); |
| 87 |
| 88 // After receiving a GoAway, I should no longer be able to create outgoing |
| 89 // streams. |
| 90 session_.OnGoAway(QuicGoAwayFrame(QUIC_PEER_GOING_AWAY, 1u, "Going away.")); |
| 91 EXPECT_EQ(NULL, session_.CreateOutgoingReliableStream()); |
| 92 } |
| 93 |
| 80 TEST_F(QuicClientSessionTest, Logging) { | 94 TEST_F(QuicClientSessionTest, Logging) { |
| 81 // Initialize crypto before the client session will create a stream. | 95 // Initialize crypto before the client session will create a stream. |
| 82 ASSERT_EQ(ERR_IO_PENDING, session_.CryptoConnect(callback_.callback())); | 96 ASSERT_EQ(ERR_IO_PENDING, session_.CryptoConnect(callback_.callback())); |
| 83 // Simulate the server crypto handshake. | 97 // Simulate the server crypto handshake. |
| 84 CryptoHandshakeMessage server_message; | 98 CryptoHandshakeMessage server_message; |
| 85 server_message.tag = kSHLO; | 99 server_message.tag = kSHLO; |
| 86 session_.GetCryptoStream()->OnHandshakeMessage(server_message); | 100 session_.GetCryptoStream()->OnHandshakeMessage(server_message); |
| 87 callback_.WaitForResult(); | 101 callback_.WaitForResult(); |
| 88 | 102 |
| 89 // TODO(rch): Add some helper methods to simplify packet creation in tests. | 103 // TODO(rch): Add some helper methods to simplify packet creation in tests. |
| 90 // Receive a packet, and verify that it was logged. | 104 // Receive a packet, and verify that it was logged. |
| 91 QuicFramer framer(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)); | 105 QuicFramer framer(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)); |
| 92 QuicRstStreamFrame frame; | 106 QuicRstStreamFrame frame; |
| 93 frame.stream_id = 2; | 107 frame.stream_id = 2; |
| 94 frame.offset = 7; | |
| 95 frame.error_code = QUIC_CONNECTION_TIMED_OUT; | 108 frame.error_code = QUIC_CONNECTION_TIMED_OUT; |
| 96 frame.error_details = "doh!"; | 109 frame.error_details = "doh!"; |
| 97 | 110 |
| 98 QuicFrames frames; | 111 QuicFrames frames; |
| 99 frames.push_back(QuicFrame(&frame)); | 112 frames.push_back(QuicFrame(&frame)); |
| 100 QuicPacketHeader header; | 113 QuicPacketHeader header; |
| 101 header.public_header.guid = 1; | 114 header.public_header.guid = 1; |
| 102 header.public_header.flags = PACKET_PUBLIC_FLAGS_NONE; | 115 header.public_header.reset_flag = false; |
| 116 header.public_header.version_flag = false; |
| 103 header.packet_sequence_number = 1; | 117 header.packet_sequence_number = 1; |
| 104 header.private_flags = PACKET_PRIVATE_FLAGS_NONE; | 118 header.entropy_flag = false; |
| 119 header.fec_flag = false; |
| 120 header.fec_entropy_flag = false; |
| 105 header.fec_group = 0; | 121 header.fec_group = 0; |
| 106 scoped_ptr<QuicPacket> p(framer.ConstructFrameDataPacket(header, frames)); | 122 scoped_ptr<QuicPacket> p( |
| 107 scoped_ptr<QuicEncryptedPacket> packet(framer.EncryptPacket(*p)); | 123 framer.ConstructFrameDataPacket(header, frames).packet); |
| 124 scoped_ptr<QuicEncryptedPacket> packet(framer.EncryptPacket(1, *p)); |
| 108 IPAddressNumber ip; | 125 IPAddressNumber ip; |
| 109 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); | 126 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); |
| 110 IPEndPoint peer_addr = IPEndPoint(ip, 443); | 127 IPEndPoint peer_addr = IPEndPoint(ip, 443); |
| 111 IPEndPoint self_addr = IPEndPoint(ip, 8435); | 128 IPEndPoint self_addr = IPEndPoint(ip, 8435); |
| 112 | 129 |
| 113 connection_->ProcessUdpPacketInternal(self_addr, peer_addr, *packet); | 130 connection_->ProcessUdpPacketInternal(self_addr, peer_addr, *packet); |
| 114 | 131 |
| 115 // Check that the NetLog was filled reasonably. | 132 // Check that the NetLog was filled reasonably. |
| 116 net::CapturingNetLog::CapturedEntryList entries; | 133 net::CapturingNetLog::CapturedEntryList entries; |
| 117 net_log_.GetEntries(&entries); | 134 net_log_.GetEntries(&entries); |
| 118 EXPECT_LT(0u, entries.size()); | 135 EXPECT_LT(0u, entries.size()); |
| 119 | 136 |
| 120 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED. | 137 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED. |
| 121 int pos = net::ExpectLogContainsSomewhere( | 138 int pos = net::ExpectLogContainsSomewhere( |
| 122 entries, 0, | 139 entries, 0, |
| 123 net::NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED, | 140 net::NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED, |
| 124 net::NetLog::PHASE_NONE); | 141 net::NetLog::PHASE_NONE); |
| 125 EXPECT_LT(0, pos); | 142 EXPECT_LT(0, pos); |
| 126 | 143 |
| 127 // ... and also a QUIC_SESSION_RST_STREAM_FRAME_RECEIVED. | 144 // ... and also a QUIC_SESSION_RST_STREAM_FRAME_RECEIVED. |
| 128 pos = net::ExpectLogContainsSomewhere( | 145 pos = net::ExpectLogContainsSomewhere( |
| 129 entries, 0, | 146 entries, 0, |
| 130 net::NetLog::TYPE_QUIC_SESSION_RST_STREAM_FRAME_RECEIVED, | 147 net::NetLog::TYPE_QUIC_SESSION_RST_STREAM_FRAME_RECEIVED, |
| 131 net::NetLog::PHASE_NONE); | 148 net::NetLog::PHASE_NONE); |
| 132 EXPECT_LT(0, pos); | 149 EXPECT_LT(0, pos); |
| 133 | 150 |
| 134 int stream_id; | 151 int stream_id; |
| 135 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id)); | 152 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id)); |
| 136 EXPECT_EQ(frame.stream_id, static_cast<QuicStreamId>(stream_id)); | 153 EXPECT_EQ(frame.stream_id, static_cast<QuicStreamId>(stream_id)); |
| 137 int offset; | |
| 138 ASSERT_TRUE(entries[pos].GetIntegerValue("offset", &offset)); | |
| 139 EXPECT_EQ(frame.offset, static_cast<QuicStreamOffset>(offset)); | |
| 140 int error_code; | 154 int error_code; |
| 141 ASSERT_TRUE(entries[pos].GetIntegerValue("error_code", &error_code)); | 155 ASSERT_TRUE(entries[pos].GetIntegerValue("error_code", &error_code)); |
| 142 EXPECT_EQ(frame.error_code, static_cast<QuicErrorCode>(error_code)); | 156 EXPECT_EQ(frame.error_code, static_cast<QuicErrorCode>(error_code)); |
| 143 std::string details; | 157 std::string details; |
| 144 ASSERT_TRUE(entries[pos].GetStringValue("details", &details)); | 158 ASSERT_TRUE(entries[pos].GetStringValue("details", &details)); |
| 145 EXPECT_EQ(frame.error_details, details); | 159 EXPECT_EQ(frame.error_details, details); |
| 146 } | 160 } |
| 147 | 161 |
| 148 } // namespace | 162 } // namespace |
| 149 } // namespace test | 163 } // namespace test |
| 150 } // namespace net | 164 } // namespace net |
| OLD | NEW |