| 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/quic/core/quic_received_packet_manager.h" | 5 #include "net/quic/core/quic_received_packet_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "net/quic/core/quic_connection_stats.h" | 10 #include "net/quic/core/quic_connection_stats.h" |
| 11 #include "net/quic/core/quic_flags.h" | 11 #include "net/quic/core/quic_flags.h" |
| 12 #include "net/quic/test_tools/quic_received_packet_manager_peer.h" | 12 #include "net/quic/test_tools/quic_received_packet_manager_peer.h" |
| 13 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 namespace net { | 16 namespace net { |
| 17 namespace test { | 17 namespace test { |
| 18 | |
| 19 class EntropyTrackerPeer { | |
| 20 public: | |
| 21 static QuicPacketNumber first_gap( | |
| 22 const QuicReceivedPacketManager::EntropyTracker& tracker) { | |
| 23 return tracker.first_gap_; | |
| 24 } | |
| 25 static QuicPacketNumber largest_observed( | |
| 26 const QuicReceivedPacketManager::EntropyTracker& tracker) { | |
| 27 return tracker.largest_observed_; | |
| 28 } | |
| 29 static int packets_entropy_size( | |
| 30 const QuicReceivedPacketManager::EntropyTracker& tracker) { | |
| 31 return tracker.packets_entropy_.size(); | |
| 32 } | |
| 33 static bool IsTrackingPacket( | |
| 34 const QuicReceivedPacketManager::EntropyTracker& tracker, | |
| 35 QuicPacketNumber packet_number) { | |
| 36 return packet_number >= tracker.first_gap_ && | |
| 37 packet_number < | |
| 38 (tracker.first_gap_ + tracker.packets_entropy_.size()) && | |
| 39 tracker.packets_entropy_[packet_number - tracker.first_gap_].second; | |
| 40 } | |
| 41 }; | |
| 42 | |
| 43 namespace { | 18 namespace { |
| 44 | 19 |
| 45 // Entropy of individual packets is not tracked if there are no gaps. | |
| 46 TEST(EntropyTrackerTest, NoGaps) { | |
| 47 QuicReceivedPacketManager::EntropyTracker tracker; | |
| 48 | |
| 49 tracker.RecordPacketEntropyHash(1, 23); | |
| 50 tracker.RecordPacketEntropyHash(2, 42); | |
| 51 | |
| 52 EXPECT_EQ(23 ^ 42, tracker.EntropyHash(2)); | |
| 53 EXPECT_EQ(3u, EntropyTrackerPeer::first_gap(tracker)); | |
| 54 | |
| 55 EXPECT_EQ(2u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 56 EXPECT_EQ(0, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 57 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 1)); | |
| 58 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 2)); | |
| 59 } | |
| 60 | |
| 61 // Entropy of individual packets is tracked as long as there are gaps. | |
| 62 // Filling the first gap results in entropy getting garbage collected. | |
| 63 TEST(EntropyTrackerTest, FillGaps) { | |
| 64 QuicReceivedPacketManager::EntropyTracker tracker; | |
| 65 | |
| 66 tracker.RecordPacketEntropyHash(2, 5); | |
| 67 tracker.RecordPacketEntropyHash(5, 17); | |
| 68 tracker.RecordPacketEntropyHash(6, 23); | |
| 69 tracker.RecordPacketEntropyHash(9, 42); | |
| 70 | |
| 71 EXPECT_EQ(1u, EntropyTrackerPeer::first_gap(tracker)); | |
| 72 EXPECT_EQ(9u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 73 EXPECT_EQ(9, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 74 | |
| 75 EXPECT_EQ(5, tracker.EntropyHash(2)); | |
| 76 EXPECT_EQ(5 ^ 17, tracker.EntropyHash(5)); | |
| 77 EXPECT_EQ(5 ^ 17 ^ 23, tracker.EntropyHash(6)); | |
| 78 EXPECT_EQ(5 ^ 17 ^ 23 ^ 42, tracker.EntropyHash(9)); | |
| 79 | |
| 80 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 1)); | |
| 81 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 2)); | |
| 82 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 5)); | |
| 83 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 6)); | |
| 84 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 9)); | |
| 85 | |
| 86 // Fill the gap at 1. | |
| 87 tracker.RecordPacketEntropyHash(1, 2); | |
| 88 | |
| 89 EXPECT_EQ(3u, EntropyTrackerPeer::first_gap(tracker)); | |
| 90 EXPECT_EQ(9u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 91 EXPECT_EQ(7, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 92 | |
| 93 EXPECT_EQ(2 ^ 5 ^ 17, tracker.EntropyHash(5)); | |
| 94 EXPECT_EQ(2 ^ 5 ^ 17 ^ 23, tracker.EntropyHash(6)); | |
| 95 EXPECT_EQ(2 ^ 5 ^ 17 ^ 23 ^ 42, tracker.EntropyHash(9)); | |
| 96 | |
| 97 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 1)); | |
| 98 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 2)); | |
| 99 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 5)); | |
| 100 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 6)); | |
| 101 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 9)); | |
| 102 | |
| 103 // Fill the gap at 4. | |
| 104 tracker.RecordPacketEntropyHash(4, 2); | |
| 105 | |
| 106 EXPECT_EQ(3u, EntropyTrackerPeer::first_gap(tracker)); | |
| 107 EXPECT_EQ(9u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 108 EXPECT_EQ(7, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 109 | |
| 110 EXPECT_EQ(5, tracker.EntropyHash(4)); | |
| 111 EXPECT_EQ(5 ^ 17, tracker.EntropyHash(5)); | |
| 112 EXPECT_EQ(5 ^ 17 ^ 23, tracker.EntropyHash(6)); | |
| 113 EXPECT_EQ(5 ^ 17 ^ 23 ^ 42, tracker.EntropyHash(9)); | |
| 114 | |
| 115 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 3)); | |
| 116 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 4)); | |
| 117 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 5)); | |
| 118 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 6)); | |
| 119 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 9)); | |
| 120 | |
| 121 // Fill the gap at 3. Entropy for packets 3 to 6 are forgotten. | |
| 122 tracker.RecordPacketEntropyHash(3, 2); | |
| 123 | |
| 124 EXPECT_EQ(7u, EntropyTrackerPeer::first_gap(tracker)); | |
| 125 EXPECT_EQ(9u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 126 EXPECT_EQ(3, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 127 | |
| 128 EXPECT_EQ(2 ^ 5 ^ 17 ^ 23 ^ 42, tracker.EntropyHash(9)); | |
| 129 | |
| 130 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 3)); | |
| 131 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 4)); | |
| 132 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 5)); | |
| 133 EXPECT_FALSE(EntropyTrackerPeer::IsTrackingPacket(tracker, 6)); | |
| 134 EXPECT_TRUE(EntropyTrackerPeer::IsTrackingPacket(tracker, 9)); | |
| 135 | |
| 136 // Fill in the rest. | |
| 137 tracker.RecordPacketEntropyHash(7, 2); | |
| 138 tracker.RecordPacketEntropyHash(8, 2); | |
| 139 | |
| 140 EXPECT_EQ(10u, EntropyTrackerPeer::first_gap(tracker)); | |
| 141 EXPECT_EQ(9u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 142 EXPECT_EQ(0, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 143 | |
| 144 EXPECT_EQ(2 ^ 5 ^ 17 ^ 23 ^ 42, tracker.EntropyHash(9)); | |
| 145 } | |
| 146 | |
| 147 TEST(EntropyTrackerTest, SetCumulativeEntropyUpTo) { | |
| 148 QuicReceivedPacketManager::EntropyTracker tracker; | |
| 149 | |
| 150 tracker.RecordPacketEntropyHash(2, 5); | |
| 151 tracker.RecordPacketEntropyHash(5, 17); | |
| 152 tracker.RecordPacketEntropyHash(6, 23); | |
| 153 tracker.RecordPacketEntropyHash(9, 42); | |
| 154 | |
| 155 EXPECT_EQ(1u, EntropyTrackerPeer::first_gap(tracker)); | |
| 156 EXPECT_EQ(9u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 157 EXPECT_EQ(9, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 158 | |
| 159 // Inform the tracker about value of the hash at a gap. | |
| 160 tracker.SetCumulativeEntropyUpTo(3, 7); | |
| 161 EXPECT_EQ(3u, EntropyTrackerPeer::first_gap(tracker)); | |
| 162 EXPECT_EQ(9u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 163 EXPECT_EQ(7, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 164 | |
| 165 EXPECT_EQ(7 ^ 17, tracker.EntropyHash(5)); | |
| 166 EXPECT_EQ(7 ^ 17 ^ 23, tracker.EntropyHash(6)); | |
| 167 EXPECT_EQ(7 ^ 17 ^ 23 ^ 42, tracker.EntropyHash(9)); | |
| 168 | |
| 169 // Inform the tracker about value of the hash at a known location. | |
| 170 tracker.SetCumulativeEntropyUpTo(6, 1); | |
| 171 EXPECT_EQ(7u, EntropyTrackerPeer::first_gap(tracker)); | |
| 172 EXPECT_EQ(9u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 173 EXPECT_EQ(3, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 174 | |
| 175 EXPECT_EQ(1 ^ 23 ^ 42, tracker.EntropyHash(9)); | |
| 176 | |
| 177 // Inform the tracker about value of the hash at the last location. | |
| 178 tracker.SetCumulativeEntropyUpTo(9, 21); | |
| 179 EXPECT_EQ(10u, EntropyTrackerPeer::first_gap(tracker)); | |
| 180 EXPECT_EQ(9u, EntropyTrackerPeer::largest_observed(tracker)); | |
| 181 EXPECT_EQ(0, EntropyTrackerPeer::packets_entropy_size(tracker)); | |
| 182 | |
| 183 EXPECT_EQ(42 ^ 21, tracker.EntropyHash(9)); | |
| 184 } | |
| 185 | |
| 186 struct TestParams { | 20 struct TestParams { |
| 187 explicit TestParams(QuicVersion version) : version(version) {} | 21 explicit TestParams(QuicVersion version) : version(version) {} |
| 188 | 22 |
| 189 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) { | 23 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) { |
| 190 os << "{ version: " << QuicVersionToString(p.version) << " }"; | 24 os << "{ version: " << QuicVersionToString(p.version) << " }"; |
| 191 return os; | 25 return os; |
| 192 } | 26 } |
| 193 | 27 |
| 194 QuicVersion version; | 28 QuicVersion version; |
| 195 }; | 29 }; |
| 196 | 30 |
| 197 std::vector<TestParams> GetTestParams() { | 31 std::vector<TestParams> GetTestParams() { |
| 198 std::vector<TestParams> params; | 32 std::vector<TestParams> params; |
| 199 QuicVersionVector all_supported_versions = AllSupportedVersions(); | 33 QuicVersionVector all_supported_versions = AllSupportedVersions(); |
| 200 for (size_t i = 0; i < all_supported_versions.size(); ++i) { | 34 for (size_t i = 0; i < all_supported_versions.size(); ++i) { |
| 201 params.push_back(TestParams(all_supported_versions[i])); | 35 params.push_back(TestParams(all_supported_versions[i])); |
| 202 } | 36 } |
| 203 return params; | 37 return params; |
| 204 } | 38 } |
| 205 | 39 |
| 206 class QuicReceivedPacketManagerTest | 40 class QuicReceivedPacketManagerTest |
| 207 : public ::testing::TestWithParam<TestParams> { | 41 : public ::testing::TestWithParam<TestParams> { |
| 208 protected: | 42 protected: |
| 209 QuicReceivedPacketManagerTest() : received_manager_(&stats_) { | 43 QuicReceivedPacketManagerTest() : received_manager_(&stats_) {} |
| 210 received_manager_.SetVersion(GetParam().version); | 44 |
| 45 void RecordPacketReceipt(QuicPacketNumber packet_number) { |
| 46 RecordPacketReceipt(packet_number, QuicTime::Zero()); |
| 211 } | 47 } |
| 212 | 48 |
| 213 void RecordPacketReceipt(QuicPacketNumber packet_number, | 49 void RecordPacketReceipt(QuicPacketNumber packet_number, |
| 214 QuicPacketEntropyHash entropy_hash) { | |
| 215 RecordPacketReceipt(packet_number, entropy_hash, QuicTime::Zero()); | |
| 216 } | |
| 217 | |
| 218 void RecordPacketReceipt(QuicPacketNumber packet_number, | |
| 219 QuicPacketEntropyHash entropy_hash, | |
| 220 QuicTime receipt_time) { | 50 QuicTime receipt_time) { |
| 221 QuicPacketHeader header; | 51 QuicPacketHeader header; |
| 222 header.packet_number = packet_number; | 52 header.packet_number = packet_number; |
| 223 header.entropy_hash = entropy_hash; | |
| 224 received_manager_.RecordPacketReceived(header, receipt_time); | 53 received_manager_.RecordPacketReceived(header, receipt_time); |
| 225 } | 54 } |
| 226 | 55 |
| 227 QuicConnectionStats stats_; | 56 QuicConnectionStats stats_; |
| 228 QuicReceivedPacketManager received_manager_; | 57 QuicReceivedPacketManager received_manager_; |
| 229 }; | 58 }; |
| 230 | 59 |
| 231 INSTANTIATE_TEST_CASE_P(QuicReceivedPacketManagerTest, | 60 INSTANTIATE_TEST_CASE_P(QuicReceivedPacketManagerTest, |
| 232 QuicReceivedPacketManagerTest, | 61 QuicReceivedPacketManagerTest, |
| 233 ::testing::ValuesIn(GetTestParams())); | 62 ::testing::ValuesIn(GetTestParams())); |
| 234 | 63 |
| 235 TEST_P(QuicReceivedPacketManagerTest, ReceivedPacketEntropyHash) { | |
| 236 if (GetParam().version > QUIC_VERSION_33) { | |
| 237 return; | |
| 238 } | |
| 239 std::vector<std::pair<QuicPacketNumber, QuicPacketEntropyHash>> entropies; | |
| 240 entropies.push_back(std::make_pair(1, 12)); | |
| 241 entropies.push_back(std::make_pair(7, 1)); | |
| 242 entropies.push_back(std::make_pair(2, 33)); | |
| 243 entropies.push_back(std::make_pair(5, 3)); | |
| 244 entropies.push_back(std::make_pair(8, 34)); | |
| 245 | |
| 246 for (size_t i = 0; i < entropies.size(); ++i) { | |
| 247 RecordPacketReceipt(entropies[i].first, entropies[i].second); | |
| 248 } | |
| 249 | |
| 250 std::sort(entropies.begin(), entropies.end()); | |
| 251 | |
| 252 QuicPacketEntropyHash hash = 0; | |
| 253 size_t index = 0; | |
| 254 for (size_t i = 1; i <= (*entropies.rbegin()).first; ++i) { | |
| 255 if (entropies[index].first == i) { | |
| 256 hash ^= entropies[index].second; | |
| 257 ++index; | |
| 258 } | |
| 259 if (i < 3) | |
| 260 continue; | |
| 261 EXPECT_EQ(hash, received_manager_.EntropyHash(i)); | |
| 262 } | |
| 263 // Reorder by 5 when 2 is received after 7. | |
| 264 EXPECT_EQ(5u, stats_.max_sequence_reordering); | |
| 265 EXPECT_EQ(0, stats_.max_time_reordering_us); | |
| 266 EXPECT_EQ(2u, stats_.packets_reordered); | |
| 267 } | |
| 268 | |
| 269 TEST_P(QuicReceivedPacketManagerTest, EntropyHashBelowLeastObserved) { | |
| 270 if (GetParam().version > QUIC_VERSION_33) { | |
| 271 return; | |
| 272 } | |
| 273 EXPECT_EQ(0, received_manager_.EntropyHash(0)); | |
| 274 RecordPacketReceipt(4, 5); | |
| 275 EXPECT_EQ(0, received_manager_.EntropyHash(3)); | |
| 276 } | |
| 277 | |
| 278 TEST_P(QuicReceivedPacketManagerTest, EntropyHashAboveLargestObserved) { | |
| 279 if (GetParam().version > QUIC_VERSION_33) { | |
| 280 return; | |
| 281 } | |
| 282 EXPECT_EQ(0, received_manager_.EntropyHash(0)); | |
| 283 RecordPacketReceipt(4, 5); | |
| 284 EXPECT_EQ(0, received_manager_.EntropyHash(3)); | |
| 285 } | |
| 286 | |
| 287 TEST_P(QuicReceivedPacketManagerTest, SetCumulativeEntropyUpTo) { | |
| 288 if (GetParam().version > QUIC_VERSION_33) { | |
| 289 return; | |
| 290 } | |
| 291 std::vector<std::pair<QuicPacketNumber, QuicPacketEntropyHash>> entropies; | |
| 292 entropies.push_back(std::make_pair(1, 12)); | |
| 293 entropies.push_back(std::make_pair(2, 1)); | |
| 294 entropies.push_back(std::make_pair(3, 33)); | |
| 295 entropies.push_back(std::make_pair(4, 3)); | |
| 296 entropies.push_back(std::make_pair(6, 34)); | |
| 297 entropies.push_back(std::make_pair(7, 29)); | |
| 298 | |
| 299 QuicPacketEntropyHash entropy_hash = 0; | |
| 300 for (size_t i = 0; i < entropies.size(); ++i) { | |
| 301 RecordPacketReceipt(entropies[i].first, entropies[i].second); | |
| 302 entropy_hash ^= entropies[i].second; | |
| 303 } | |
| 304 EXPECT_EQ(entropy_hash, received_manager_.EntropyHash(7)); | |
| 305 | |
| 306 // Now set the entropy hash up to 5 to be 100. | |
| 307 entropy_hash ^= 100; | |
| 308 for (size_t i = 0; i < 4; ++i) { | |
| 309 entropy_hash ^= entropies[i].second; | |
| 310 } | |
| 311 QuicReceivedPacketManagerPeer::SetCumulativeEntropyUpTo(&received_manager_, 5, | |
| 312 100); | |
| 313 EXPECT_EQ(entropy_hash, received_manager_.EntropyHash(7)); | |
| 314 | |
| 315 QuicReceivedPacketManagerPeer::SetCumulativeEntropyUpTo(&received_manager_, 1, | |
| 316 50); | |
| 317 EXPECT_EQ(entropy_hash, received_manager_.EntropyHash(7)); | |
| 318 | |
| 319 // No reordering. | |
| 320 EXPECT_EQ(0u, stats_.max_sequence_reordering); | |
| 321 EXPECT_EQ(0, stats_.max_time_reordering_us); | |
| 322 EXPECT_EQ(0u, stats_.packets_reordered); | |
| 323 } | |
| 324 | |
| 325 TEST_P(QuicReceivedPacketManagerTest, DontWaitForPacketsBefore) { | 64 TEST_P(QuicReceivedPacketManagerTest, DontWaitForPacketsBefore) { |
| 326 QuicPacketHeader header; | 65 QuicPacketHeader header; |
| 327 header.packet_number = 2u; | 66 header.packet_number = 2u; |
| 328 received_manager_.RecordPacketReceived(header, QuicTime::Zero()); | 67 received_manager_.RecordPacketReceived(header, QuicTime::Zero()); |
| 329 header.packet_number = 7u; | 68 header.packet_number = 7u; |
| 330 received_manager_.RecordPacketReceived(header, QuicTime::Zero()); | 69 received_manager_.RecordPacketReceived(header, QuicTime::Zero()); |
| 331 EXPECT_TRUE(received_manager_.IsAwaitingPacket(3u)); | 70 EXPECT_TRUE(received_manager_.IsAwaitingPacket(3u)); |
| 332 EXPECT_TRUE(received_manager_.IsAwaitingPacket(6u)); | 71 EXPECT_TRUE(received_manager_.IsAwaitingPacket(6u)); |
| 333 EXPECT_TRUE(QuicReceivedPacketManagerPeer::DontWaitForPacketsBefore( | 72 EXPECT_TRUE(QuicReceivedPacketManagerPeer::DontWaitForPacketsBefore( |
| 334 &received_manager_, 4)); | 73 &received_manager_, 4)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 EXPECT_TRUE(received_manager_.ack_frame_updated()); | 109 EXPECT_TRUE(received_manager_.ack_frame_updated()); |
| 371 ack = received_manager_.GetUpdatedAckFrame(two_ms); | 110 ack = received_manager_.GetUpdatedAckFrame(two_ms); |
| 372 EXPECT_FALSE(received_manager_.ack_frame_updated()); | 111 EXPECT_FALSE(received_manager_.ack_frame_updated()); |
| 373 // UpdateReceivedPacketInfo should discard any times which can't be | 112 // UpdateReceivedPacketInfo should discard any times which can't be |
| 374 // expressed on the wire. | 113 // expressed on the wire. |
| 375 EXPECT_EQ(2u, ack.ack_frame->received_packet_times.size()); | 114 EXPECT_EQ(2u, ack.ack_frame->received_packet_times.size()); |
| 376 } | 115 } |
| 377 | 116 |
| 378 TEST_P(QuicReceivedPacketManagerTest, UpdateReceivedConnectionStats) { | 117 TEST_P(QuicReceivedPacketManagerTest, UpdateReceivedConnectionStats) { |
| 379 EXPECT_FALSE(received_manager_.ack_frame_updated()); | 118 EXPECT_FALSE(received_manager_.ack_frame_updated()); |
| 380 RecordPacketReceipt(1, 0); | 119 RecordPacketReceipt(1); |
| 381 EXPECT_TRUE(received_manager_.ack_frame_updated()); | 120 EXPECT_TRUE(received_manager_.ack_frame_updated()); |
| 382 RecordPacketReceipt(6, 0); | 121 RecordPacketReceipt(6); |
| 383 RecordPacketReceipt(2, 0, | 122 RecordPacketReceipt(2, |
| 384 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1)); | 123 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1)); |
| 385 | 124 |
| 386 EXPECT_EQ(4u, stats_.max_sequence_reordering); | 125 EXPECT_EQ(4u, stats_.max_sequence_reordering); |
| 387 EXPECT_EQ(1000, stats_.max_time_reordering_us); | 126 EXPECT_EQ(1000, stats_.max_time_reordering_us); |
| 388 EXPECT_EQ(1u, stats_.packets_reordered); | 127 EXPECT_EQ(1u, stats_.packets_reordered); |
| 389 } | 128 } |
| 390 | 129 |
| 391 } // namespace | 130 } // namespace |
| 392 } // namespace test | 131 } // namespace test |
| 393 } // namespace net | 132 } // namespace net |
| OLD | NEW |