| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/tools/quic/quic_server_session.h" | 5 #include "net/tools/quic/quic_server_session.h" |
| 6 | 6 |
| 7 #include "net/quic/crypto/quic_crypto_server_config.h" | 7 #include "net/quic/crypto/quic_crypto_server_config.h" |
| 8 #include "net/quic/crypto/quic_random.h" | 8 #include "net/quic/crypto/quic_random.h" |
| 9 #include "net/quic/proto/cached_network_parameters.pb.h" | 9 #include "net/quic/proto/cached_network_parameters.pb.h" |
| 10 #include "net/quic/quic_connection.h" | 10 #include "net/quic/quic_connection.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "net/quic/test_tools/quic_test_utils.h" | 22 #include "net/quic/test_tools/quic_test_utils.h" |
| 23 #include "net/test/gtest_util.h" | 23 #include "net/test/gtest_util.h" |
| 24 #include "net/tools/quic/quic_spdy_server_stream.h" | 24 #include "net/tools/quic/quic_spdy_server_stream.h" |
| 25 #include "net/tools/quic/test_tools/mock_quic_server_session_visitor.h" | 25 #include "net/tools/quic/test_tools/mock_quic_server_session_visitor.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" | 26 #include "testing/gmock/include/gmock/gmock.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
| 28 | 28 |
| 29 using __gnu_cxx::vector; | 29 using __gnu_cxx::vector; |
| 30 using net::test::CryptoTestUtils; | 30 using net::test::CryptoTestUtils; |
| 31 using net::test::MockConnection; | 31 using net::test::MockConnection; |
| 32 using net::test::MockHelper; | 32 using net::test::MockConnectionHelper; |
| 33 using net::test::QuicConfigPeer; | 33 using net::test::QuicConfigPeer; |
| 34 using net::test::QuicConnectionPeer; | 34 using net::test::QuicConnectionPeer; |
| 35 using net::test::QuicSpdyStreamPeer; | 35 using net::test::QuicSpdyStreamPeer; |
| 36 using net::test::QuicSentPacketManagerPeer; | 36 using net::test::QuicSentPacketManagerPeer; |
| 37 using net::test::QuicSessionPeer; | 37 using net::test::QuicSessionPeer; |
| 38 using net::test::QuicSpdySessionPeer; | 38 using net::test::QuicSpdySessionPeer; |
| 39 using net::test::QuicSustainedBandwidthRecorderPeer; | 39 using net::test::QuicSustainedBandwidthRecorderPeer; |
| 40 using net::test::SupportedVersions; | 40 using net::test::SupportedVersions; |
| 41 using net::test::ValueRestore; | 41 using net::test::ValueRestore; |
| 42 using net::test::kClientDataStreamId1; | 42 using net::test::kClientDataStreamId1; |
| 43 using net::test::kClientDataStreamId2; | 43 using net::test::kClientDataStreamId2; |
| 44 using net::test::kClientDataStreamId3; | 44 using net::test::kClientDataStreamId3; |
| 45 using net::test::kInitialSessionFlowControlWindowForTest; | 45 using net::test::kInitialSessionFlowControlWindowForTest; |
| 46 using net::test::kInitialStreamFlowControlWindowForTest; | 46 using net::test::kInitialStreamFlowControlWindowForTest; |
| 47 using std::string; | 47 using std::string; |
| 48 using testing::StrictMock; | 48 using testing::StrictMock; |
| 49 using testing::_; | 49 using testing::_; |
| 50 | 50 |
| 51 namespace net { | 51 namespace net { |
| 52 namespace tools { | 52 namespace tools { |
| 53 namespace test { | 53 namespace test { |
| 54 | 54 |
| 55 class QuicServerSessionPeer { | 55 class QuicServerSessionPeer { |
| 56 public: | 56 public: |
| 57 static ReliableQuicStream* GetIncomingDynamicStream(QuicServerSession* s, | 57 static ReliableQuicStream* GetOrCreateDynamicStream(QuicServerSession* s, |
| 58 QuicStreamId id) { | 58 QuicStreamId id) { |
| 59 return s->GetIncomingDynamicStream(id); | 59 return s->GetOrCreateDynamicStream(id); |
| 60 } | 60 } |
| 61 static void SetCryptoStream(QuicServerSession* s, | 61 static void SetCryptoStream(QuicServerSession* s, |
| 62 QuicCryptoServerStream* crypto_stream) { | 62 QuicCryptoServerStream* crypto_stream) { |
| 63 s->crypto_stream_.reset(crypto_stream); | 63 s->crypto_stream_.reset(crypto_stream); |
| 64 s->static_streams()[kCryptoStreamId] = crypto_stream; | 64 s->static_streams()[kCryptoStreamId] = crypto_stream; |
| 65 } | 65 } |
| 66 static bool IsBandwidthResumptionEnabled(QuicServerSession* s) { | 66 static bool IsBandwidthResumptionEnabled(QuicServerSession* s) { |
| 67 return s->bandwidth_resumption_enabled_; | 67 return s->bandwidth_resumption_enabled_; |
| 68 } | 68 } |
| 69 }; | 69 }; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 91 new QuicServerSession(config_, connection_, &owner_, &crypto_config_)); | 91 new QuicServerSession(config_, connection_, &owner_, &crypto_config_)); |
| 92 MockClock clock; | 92 MockClock clock; |
| 93 handshake_message_.reset(crypto_config_.AddDefaultConfig( | 93 handshake_message_.reset(crypto_config_.AddDefaultConfig( |
| 94 QuicRandom::GetInstance(), &clock, | 94 QuicRandom::GetInstance(), &clock, |
| 95 QuicCryptoServerConfig::ConfigOptions())); | 95 QuicCryptoServerConfig::ConfigOptions())); |
| 96 session_->Initialize(); | 96 session_->Initialize(); |
| 97 visitor_ = QuicConnectionPeer::GetVisitor(connection_); | 97 visitor_ = QuicConnectionPeer::GetVisitor(connection_); |
| 98 } | 98 } |
| 99 | 99 |
| 100 StrictMock<MockQuicServerSessionVisitor> owner_; | 100 StrictMock<MockQuicServerSessionVisitor> owner_; |
| 101 MockHelper helper_; | 101 MockConnectionHelper helper_; |
| 102 StrictMock<MockConnection>* connection_; | 102 StrictMock<MockConnection>* connection_; |
| 103 QuicConfig config_; | 103 QuicConfig config_; |
| 104 QuicCryptoServerConfig crypto_config_; | 104 QuicCryptoServerConfig crypto_config_; |
| 105 scoped_ptr<QuicServerSession> session_; | 105 scoped_ptr<QuicServerSession> session_; |
| 106 scoped_ptr<CryptoHandshakeMessage> handshake_message_; | 106 scoped_ptr<CryptoHandshakeMessage> handshake_message_; |
| 107 QuicConnectionVisitorInterface* visitor_; | 107 QuicConnectionVisitorInterface* visitor_; |
| 108 }; | 108 }; |
| 109 | 109 |
| 110 // Compares CachedNetworkParameters. | 110 // Compares CachedNetworkParameters. |
| 111 MATCHER_P(EqualsProto, network_params, "") { | 111 MATCHER_P(EqualsProto, network_params, "") { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 127 ::testing::ValuesIn(QuicSupportedVersions())); | 127 ::testing::ValuesIn(QuicSupportedVersions())); |
| 128 | 128 |
| 129 TEST_P(QuicServerSessionTest, CloseStreamDueToReset) { | 129 TEST_P(QuicServerSessionTest, CloseStreamDueToReset) { |
| 130 // Open a stream, then reset it. | 130 // Open a stream, then reset it. |
| 131 // Send two bytes of payload to open it. | 131 // Send two bytes of payload to open it. |
| 132 QuicStreamFrame data1(kClientDataStreamId1, false, 0, StringPiece("HT")); | 132 QuicStreamFrame data1(kClientDataStreamId1, false, 0, StringPiece("HT")); |
| 133 session_->OnStreamFrame(data1); | 133 session_->OnStreamFrame(data1); |
| 134 EXPECT_EQ(1u, session_->GetNumOpenStreams()); | 134 EXPECT_EQ(1u, session_->GetNumOpenStreams()); |
| 135 | 135 |
| 136 // Send a reset (and expect the peer to send a RST in response). | 136 // Send a reset (and expect the peer to send a RST in response). |
| 137 QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 0); | 137 QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM, |
| 138 0); |
| 138 EXPECT_CALL(*connection_, | 139 EXPECT_CALL(*connection_, |
| 139 SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); | 140 SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); |
| 140 visitor_->OnRstStream(rst1); | 141 visitor_->OnRstStream(rst1); |
| 141 EXPECT_EQ(0u, session_->GetNumOpenStreams()); | 142 EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
| 142 | 143 |
| 143 // Send the same two bytes of payload in a new packet. | 144 // Send the same two bytes of payload in a new packet. |
| 144 visitor_->OnStreamFrame(data1); | 145 visitor_->OnStreamFrame(data1); |
| 145 | 146 |
| 146 // The stream should not be re-opened. | 147 // The stream should not be re-opened. |
| 147 EXPECT_EQ(0u, session_->GetNumOpenStreams()); | 148 EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
| 148 EXPECT_TRUE(connection_->connected()); | 149 EXPECT_TRUE(connection_->connected()); |
| 149 } | 150 } |
| 150 | 151 |
| 151 TEST_P(QuicServerSessionTest, NeverOpenStreamDueToReset) { | 152 TEST_P(QuicServerSessionTest, NeverOpenStreamDueToReset) { |
| 152 // Send a reset (and expect the peer to send a RST in response). | 153 // Send a reset (and expect the peer to send a RST in response). |
| 153 QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 0); | 154 QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM, |
| 155 0); |
| 154 EXPECT_CALL(*connection_, | 156 EXPECT_CALL(*connection_, |
| 155 SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); | 157 SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); |
| 156 visitor_->OnRstStream(rst1); | 158 visitor_->OnRstStream(rst1); |
| 157 EXPECT_EQ(0u, session_->GetNumOpenStreams()); | 159 EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
| 158 | 160 |
| 159 // Send two bytes of payload. | 161 // Send two bytes of payload. |
| 160 QuicStreamFrame data1(kClientDataStreamId1, false, 0, StringPiece("HT")); | 162 QuicStreamFrame data1(kClientDataStreamId1, false, 0, StringPiece("HT")); |
| 161 visitor_->OnStreamFrame(data1); | 163 visitor_->OnStreamFrame(data1); |
| 162 | 164 |
| 163 // The stream should never be opened, now that the reset is received. | 165 // The stream should never be opened, now that the reset is received. |
| 164 EXPECT_EQ(0u, session_->GetNumOpenStreams()); | 166 EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
| 165 EXPECT_TRUE(connection_->connected()); | 167 EXPECT_TRUE(connection_->connected()); |
| 166 } | 168 } |
| 167 | 169 |
| 168 TEST_P(QuicServerSessionTest, AcceptClosedStream) { | 170 TEST_P(QuicServerSessionTest, AcceptClosedStream) { |
| 169 // Send (empty) compressed headers followed by two bytes of data. | 171 // Send (empty) compressed headers followed by two bytes of data. |
| 170 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, | 172 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, |
| 171 StringPiece("\1\0\0\0\0\0\0\0HT")); | 173 StringPiece("\1\0\0\0\0\0\0\0HT")); |
| 172 QuicStreamFrame frame2(kClientDataStreamId2, false, 0, | 174 QuicStreamFrame frame2(kClientDataStreamId2, false, 0, |
| 173 StringPiece("\2\0\0\0\0\0\0\0HT")); | 175 StringPiece("\2\0\0\0\0\0\0\0HT")); |
| 174 visitor_->OnStreamFrame(frame1); | 176 visitor_->OnStreamFrame(frame1); |
| 175 visitor_->OnStreamFrame(frame2); | 177 visitor_->OnStreamFrame(frame2); |
| 176 EXPECT_EQ(2u, session_->GetNumOpenStreams()); | 178 EXPECT_EQ(2u, session_->GetNumOpenStreams()); |
| 177 | 179 |
| 178 // Send a reset (and expect the peer to send a RST in response). | 180 // Send a reset (and expect the peer to send a RST in response). |
| 179 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 0); | 181 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM, 0); |
| 180 EXPECT_CALL(*connection_, | 182 EXPECT_CALL(*connection_, |
| 181 SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); | 183 SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); |
| 182 visitor_->OnRstStream(rst); | 184 visitor_->OnRstStream(rst); |
| 183 | 185 |
| 184 // If we were tracking, we'd probably want to reject this because it's data | 186 // If we were tracking, we'd probably want to reject this because it's data |
| 185 // past the reset point of stream 3. As it's a closed stream we just drop the | 187 // past the reset point of stream 3. As it's a closed stream we just drop the |
| 186 // data on the floor, but accept the packet because it has data for stream 5. | 188 // data on the floor, but accept the packet because it has data for stream 5. |
| 187 QuicStreamFrame frame3(kClientDataStreamId1, false, 2, StringPiece("TP")); | 189 QuicStreamFrame frame3(kClientDataStreamId1, false, 2, StringPiece("TP")); |
| 188 QuicStreamFrame frame4(kClientDataStreamId2, false, 2, StringPiece("TP")); | 190 QuicStreamFrame frame4(kClientDataStreamId2, false, 2, StringPiece("TP")); |
| 189 visitor_->OnStreamFrame(frame3); | 191 visitor_->OnStreamFrame(frame3); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 204 EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams()); | 206 EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams()); |
| 205 session_->OnConfigNegotiated(); | 207 session_->OnConfigNegotiated(); |
| 206 EXPECT_LT(kMaxStreamsMultiplier * kMaxStreamsForTest, | 208 EXPECT_LT(kMaxStreamsMultiplier * kMaxStreamsForTest, |
| 207 kMaxStreamsForTest + kMaxStreamsMinimumIncrement); | 209 kMaxStreamsForTest + kMaxStreamsMinimumIncrement); |
| 208 EXPECT_EQ(kMaxStreamsForTest + kMaxStreamsMinimumIncrement, | 210 EXPECT_EQ(kMaxStreamsForTest + kMaxStreamsMinimumIncrement, |
| 209 session_->get_max_open_streams()); | 211 session_->get_max_open_streams()); |
| 210 EXPECT_EQ(0u, session_->GetNumOpenStreams()); | 212 EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
| 211 QuicStreamId stream_id = kClientDataStreamId1; | 213 QuicStreamId stream_id = kClientDataStreamId1; |
| 212 // Open the max configured number of streams, should be no problem. | 214 // Open the max configured number of streams, should be no problem. |
| 213 for (size_t i = 0; i < kMaxStreamsForTest; ++i) { | 215 for (size_t i = 0; i < kMaxStreamsForTest; ++i) { |
| 214 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), | 216 EXPECT_TRUE(QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(), |
| 215 stream_id)); | 217 stream_id)); |
| 216 stream_id += 2; | 218 stream_id += 2; |
| 217 } | 219 } |
| 218 | 220 |
| 219 // Open more streams: server should accept slightly more than the limit. | 221 // Open more streams: server should accept slightly more than the limit. |
| 220 for (size_t i = 0; i < kMaxStreamsMinimumIncrement; ++i) { | 222 for (size_t i = 0; i < kMaxStreamsMinimumIncrement; ++i) { |
| 221 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), | 223 EXPECT_TRUE(QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(), |
| 222 stream_id)); | 224 stream_id)); |
| 223 stream_id += 2; | 225 stream_id += 2; |
| 224 } | 226 } |
| 225 | 227 |
| 226 // Now violate the server's internal stream limit. | 228 // Now violate the server's internal stream limit. |
| 227 stream_id += 2; | 229 stream_id += 2; |
| 228 if (connection_->version() <= QUIC_VERSION_27) { | 230 if (connection_->version() <= QUIC_VERSION_27) { |
| 229 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); | 231 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); |
| 230 EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(0); | 232 EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(0); |
| 231 } else { | 233 } else { |
| 232 EXPECT_CALL(*connection_, SendConnectionClose(_)).Times(0); | 234 EXPECT_CALL(*connection_, SendConnectionClose(_)).Times(0); |
| 233 EXPECT_CALL(*connection_, SendRstStream(stream_id, QUIC_REFUSED_STREAM, 0)); | 235 EXPECT_CALL(*connection_, SendRstStream(stream_id, QUIC_REFUSED_STREAM, 0)); |
| 234 } | 236 } |
| 235 // Even if the connection remains open, the stream creation should fail. | 237 // Even if the connection remains open, the stream creation should fail. |
| 236 EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), | 238 EXPECT_FALSE(QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(), |
| 237 stream_id)); | 239 stream_id)); |
| 238 } | 240 } |
| 239 | 241 |
| 240 TEST_P(QuicServerSessionTest, MaxAvailableStreams) { | 242 TEST_P(QuicServerSessionTest, MaxAvailableStreams) { |
| 241 // Test that the server closes the connection if a client makes too many data | 243 // Test that the server closes the connection if a client makes too many data |
| 242 // streams available. The server accepts slightly more than the negotiated | 244 // streams available. The server accepts slightly more than the negotiated |
| 243 // stream limit to deal with rare cases where a client FIN/RST is lost. | 245 // stream limit to deal with rare cases where a client FIN/RST is lost. |
| 244 | 246 |
| 245 // The slightly increased stream limit is set during config negotiation. | 247 // The slightly increased stream limit is set during config negotiation. |
| 246 EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams()); | 248 EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams()); |
| 247 session_->OnConfigNegotiated(); | 249 session_->OnConfigNegotiated(); |
| 248 const size_t kAvailableStreamLimit = session_->get_max_available_streams(); | 250 const size_t kAvailableStreamLimit = session_->get_max_available_streams(); |
| 249 EXPECT_EQ(session_->get_max_open_streams() * kMaxAvailableStreamsMultiplier, | 251 EXPECT_EQ(session_->get_max_open_streams() * kMaxAvailableStreamsMultiplier, |
| 250 session_->get_max_available_streams()); | 252 session_->get_max_available_streams()); |
| 251 // The protocol specification requires that there can be at least 10 times | 253 // The protocol specification requires that there can be at least 10 times |
| 252 // as many available streams as the connection's maximum open streams. | 254 // as many available streams as the connection's maximum open streams. |
| 253 EXPECT_LE(10 * kMaxStreamsForTest, kAvailableStreamLimit); | 255 EXPECT_LE(10 * kMaxStreamsForTest, kAvailableStreamLimit); |
| 254 | 256 |
| 255 EXPECT_EQ(0u, session_->GetNumOpenStreams()); | 257 EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
| 256 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDynamicStream( | 258 EXPECT_TRUE(QuicServerSessionPeer::GetOrCreateDynamicStream( |
| 257 session_.get(), kClientDataStreamId1)); | 259 session_.get(), kClientDataStreamId1)); |
| 258 | 260 |
| 259 // Establish available streams up to the server's limit. | 261 // Establish available streams up to the server's limit. |
| 260 const int kLimitingStreamId = | 262 const int kLimitingStreamId = |
| 261 FLAGS_allow_many_available_streams | 263 FLAGS_allow_many_available_streams |
| 262 ? kClientDataStreamId1 + (kAvailableStreamLimit)*2 + 2 | 264 ? kClientDataStreamId1 + (kAvailableStreamLimit)*2 + 2 |
| 263 : kClientDataStreamId1 + (session_->get_max_open_streams() - 1) * 2; | 265 : kClientDataStreamId1 + (session_->get_max_open_streams() - 1) * 2; |
| 264 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDynamicStream( | 266 EXPECT_TRUE(QuicServerSessionPeer::GetOrCreateDynamicStream( |
| 265 session_.get(), kLimitingStreamId)); | 267 session_.get(), kLimitingStreamId)); |
| 266 | 268 |
| 267 // A further available stream will result in connection close. | 269 // A further available stream will result in connection close. |
| 268 if (FLAGS_allow_many_available_streams) { | 270 if (FLAGS_allow_many_available_streams) { |
| 269 EXPECT_CALL(*connection_, | 271 EXPECT_CALL(*connection_, |
| 270 SendConnectionClose(QUIC_TOO_MANY_AVAILABLE_STREAMS)); | 272 SendConnectionClose(QUIC_TOO_MANY_AVAILABLE_STREAMS)); |
| 271 } else { | 273 } else { |
| 272 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); | 274 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); |
| 273 } | 275 } |
| 274 // This forces stream kLimitingStreamId + 2 to become available, which | 276 // This forces stream kLimitingStreamId + 2 to become available, which |
| 275 // violates the quota. | 277 // violates the quota. |
| 276 EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDynamicStream( | 278 EXPECT_FALSE(QuicServerSessionPeer::GetOrCreateDynamicStream( |
| 277 session_.get(), kLimitingStreamId + 4)); | 279 session_.get(), kLimitingStreamId + 4)); |
| 278 } | 280 } |
| 279 | 281 |
| 280 TEST_P(QuicServerSessionTest, GetEvenIncomingError) { | 282 TEST_P(QuicServerSessionTest, GetEvenIncomingError) { |
| 281 // Incoming streams on the server session must be odd. | 283 // Incoming streams on the server session must be odd. |
| 282 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_STREAM_ID)); | 284 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_STREAM_ID)); |
| 283 EXPECT_EQ(nullptr, | 285 EXPECT_EQ(nullptr, |
| 284 QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), 4)); | 286 QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(), 4)); |
| 285 } | 287 } |
| 286 | 288 |
| 287 TEST_P(QuicServerSessionTest, GetStreamDisconnected) { | 289 TEST_P(QuicServerSessionTest, GetStreamDisconnected) { |
| 288 // Don't create new streams if the connection is disconnected. | 290 // Don't create new streams if the connection is disconnected. |
| 289 QuicConnectionPeer::CloseConnection(connection_); | 291 QuicConnectionPeer::CloseConnection(connection_); |
| 290 EXPECT_DFATAL( | 292 EXPECT_DFATAL( |
| 291 QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), 5), | 293 QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(), 5), |
| 292 "ShouldCreateIncomingDynamicStream called when disconnected"); | 294 "ShouldCreateIncomingDynamicStream called when disconnected"); |
| 293 } | 295 } |
| 294 | 296 |
| 295 TEST_P(QuicServerSessionTest, SetFecProtectionFromConfig) { | 297 TEST_P(QuicServerSessionTest, SetFecProtectionFromConfig) { |
| 296 ValueRestore<bool> old_flag(&FLAGS_enable_quic_fec, true); | 298 ValueRestore<bool> old_flag(&FLAGS_enable_quic_fec, true); |
| 297 | 299 |
| 298 // Set received config to have FEC connection option. | 300 // Set received config to have FEC connection option. |
| 299 QuicTagVector copt; | 301 QuicTagVector copt; |
| 300 copt.push_back(kFHDR); | 302 copt.push_back(kFHDR); |
| 301 QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt); | 303 QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt); |
| 302 session_->OnConfigNegotiated(); | 304 session_->OnConfigNegotiated(); |
| 303 | 305 |
| 304 // Verify that headers stream is always protected and data streams are | 306 // Verify that headers stream is always protected and data streams are |
| 305 // optionally protected. | 307 // optionally protected. |
| 306 EXPECT_EQ(FEC_PROTECT_ALWAYS, QuicSpdySessionPeer::GetHeadersStream( | 308 EXPECT_EQ(FEC_PROTECT_ALWAYS, QuicSpdySessionPeer::GetHeadersStream( |
| 307 session_.get())->fec_policy()); | 309 session_.get())->fec_policy()); |
| 308 ReliableQuicStream* stream = QuicServerSessionPeer::GetIncomingDynamicStream( | 310 ReliableQuicStream* stream = QuicServerSessionPeer::GetOrCreateDynamicStream( |
| 309 session_.get(), kClientDataStreamId1); | 311 session_.get(), kClientDataStreamId1); |
| 310 ASSERT_TRUE(stream); | 312 ASSERT_TRUE(stream); |
| 311 EXPECT_EQ(FEC_PROTECT_OPTIONAL, stream->fec_policy()); | 313 EXPECT_EQ(FEC_PROTECT_OPTIONAL, stream->fec_policy()); |
| 312 } | 314 } |
| 313 | 315 |
| 314 class MockQuicCryptoServerStream : public QuicCryptoServerStream { | 316 class MockQuicCryptoServerStream : public QuicCryptoServerStream { |
| 315 public: | 317 public: |
| 316 explicit MockQuicCryptoServerStream( | 318 explicit MockQuicCryptoServerStream( |
| 317 const QuicCryptoServerConfig* crypto_config, QuicSession* session) | 319 const QuicCryptoServerConfig* crypto_config, QuicSession* session) |
| 318 : QuicCryptoServerStream(crypto_config, session) {} | 320 : QuicCryptoServerStream(crypto_config, session) {} |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 QuicServerSessionPeer::IsBandwidthResumptionEnabled(session_.get())); | 492 QuicServerSessionPeer::IsBandwidthResumptionEnabled(session_.get())); |
| 491 session_->OnConfigNegotiated(); | 493 session_->OnConfigNegotiated(); |
| 492 EXPECT_FALSE( | 494 EXPECT_FALSE( |
| 493 QuicServerSessionPeer::IsBandwidthResumptionEnabled(session_.get())); | 495 QuicServerSessionPeer::IsBandwidthResumptionEnabled(session_.get())); |
| 494 } | 496 } |
| 495 | 497 |
| 496 } // namespace | 498 } // namespace |
| 497 } // namespace test | 499 } // namespace test |
| 498 } // namespace tools | 500 } // namespace tools |
| 499 } // namespace net | 501 } // namespace net |
| OLD | NEW |