OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_connection_logger.h" | 5 #include "net/quic/quic_connection_logger.h" |
6 | 6 |
| 7 #include <stdint.h> |
| 8 |
| 9 #include "base/macros.h" |
| 10 #include "base/memory/scoped_ptr.h" |
7 #include "net/base/socket_performance_watcher.h" | 11 #include "net/base/socket_performance_watcher.h" |
| 12 #include "net/base/socket_performance_watcher_factory.h" |
8 #include "net/quic/quic_protocol.h" | 13 #include "net/quic/quic_protocol.h" |
9 #include "net/quic/test_tools/quic_test_utils.h" | 14 #include "net/quic/test_tools/quic_test_utils.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
11 | 16 |
12 namespace net { | 17 namespace net { |
13 namespace test { | 18 namespace test { |
14 | 19 |
| 20 class TestSocketPerformanceWatcherFactory |
| 21 : public SocketPerformanceWatcherFactory { |
| 22 public: |
| 23 TestSocketPerformanceWatcherFactory() |
| 24 : num_packets_lost_(0), |
| 25 num_packets_received_in_order_(0), |
| 26 num_packets_received_not_in_order_(0) {} |
| 27 |
| 28 ~TestSocketPerformanceWatcherFactory() override {} |
| 29 |
| 30 scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher( |
| 31 const Protocol protocol) override { |
| 32 if (protocol != PROTOCOL_QUIC) { |
| 33 NOTIMPLEMENTED(); |
| 34 } |
| 35 return scoped_ptr<SocketPerformanceWatcher>( |
| 36 new SocketPerformanceWatcher(protocol, this)); |
| 37 } |
| 38 |
| 39 void OnUpdatedRTTAvailable(const Protocol protocol, |
| 40 const base::TimeDelta& rtt) override {} |
| 41 |
| 42 void OnUpdatedPacketCountAvailable( |
| 43 Protocol protocol, |
| 44 uint64_t num_packets_lost, |
| 45 uint64_t num_packets_received_in_order, |
| 46 uint64_t num_packets_received_not_in_order) override { |
| 47 if (protocol != PROTOCOL_QUIC) { |
| 48 NOTIMPLEMENTED(); |
| 49 } |
| 50 num_packets_lost_ = num_packets_lost; |
| 51 num_packets_received_in_order_ = num_packets_received_in_order; |
| 52 num_packets_received_not_in_order_ = num_packets_received_not_in_order; |
| 53 } |
| 54 |
| 55 void VerifyAndResetPacketCounts(uint64_t num_packets_lost, |
| 56 uint64_t num_packets_received_in_order, |
| 57 uint64_t num_packets_received_not_in_order) { |
| 58 EXPECT_EQ(num_packets_lost, num_packets_lost_); |
| 59 EXPECT_EQ(num_packets_received_in_order, num_packets_received_in_order_); |
| 60 EXPECT_EQ(num_packets_received_not_in_order, |
| 61 num_packets_received_not_in_order_); |
| 62 num_packets_lost_ = 0; |
| 63 num_packets_received_in_order_ = 0; |
| 64 num_packets_received_not_in_order_ = 0; |
| 65 } |
| 66 |
| 67 private: |
| 68 uint64_t num_packets_lost_; |
| 69 uint64_t num_packets_received_in_order_; |
| 70 uint64_t num_packets_received_not_in_order_; |
| 71 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory); |
| 72 }; |
| 73 |
15 class QuicConnectionLoggerPeer { | 74 class QuicConnectionLoggerPeer { |
16 public: | 75 public: |
17 static size_t num_truncated_acks_sent(const QuicConnectionLogger& logger) { | 76 static size_t num_truncated_acks_sent(const QuicConnectionLogger* logger) { |
18 return logger.num_truncated_acks_sent_; | 77 return logger->num_truncated_acks_sent_; |
19 } | 78 } |
20 | 79 |
21 static void set_num_packets_received(QuicConnectionLogger& logger, | 80 static void set_num_packets_received(QuicConnectionLogger* logger, |
22 int value) { | 81 int value) { |
23 logger.num_packets_received_ = value; | 82 logger->num_packets_received_ = value; |
24 } | 83 } |
25 | 84 |
26 static void set_largest_received_packet_number(QuicConnectionLogger& logger, | 85 static void set_largest_received_packet_number(QuicConnectionLogger* logger, |
27 int value) { | 86 int value) { |
28 logger.largest_received_packet_number_ = value; | 87 logger->largest_received_packet_number_ = value; |
| 88 } |
| 89 |
| 90 static void ReportPacketCounts( |
| 91 QuicConnectionLogger* logger, |
| 92 size_t previous_largest_received_packet_number) { |
| 93 logger->ReportPacketCounts(previous_largest_received_packet_number); |
29 } | 94 } |
30 }; | 95 }; |
31 | 96 |
32 class QuicConnectionLoggerTest : public ::testing::Test { | 97 class QuicConnectionLoggerTest : public ::testing::Test { |
33 protected: | 98 protected: |
34 QuicConnectionLoggerTest() | 99 QuicConnectionLoggerTest() |
35 : session_(new MockConnection(&helper_, Perspective::IS_CLIENT)), | 100 : session_(new MockConnection(&helper_, Perspective::IS_CLIENT)) { |
36 logger_(&session_, | 101 logger_.reset(new QuicConnectionLogger( |
37 "CONNECTION_UNKNOWN", | 102 &session_, "CONNECTION_UNKNOWN", |
38 /*socket_performance_watcher=*/nullptr, | 103 socket_performance_watcher_factory_.CreateSocketPerformanceWatcher( |
39 net_log_) {} | 104 SocketPerformanceWatcherFactory::PROTOCOL_QUIC), |
| 105 net_log_)); |
| 106 } |
40 | 107 |
41 BoundNetLog net_log_; | 108 BoundNetLog net_log_; |
42 MockConnectionHelper helper_; | 109 MockConnectionHelper helper_; |
| 110 TestSocketPerformanceWatcherFactory socket_performance_watcher_factory_; |
43 MockQuicSpdySession session_; | 111 MockQuicSpdySession session_; |
44 QuicConnectionLogger logger_; | 112 scoped_ptr<QuicConnectionLogger> logger_; |
45 }; | 113 }; |
46 | 114 |
47 TEST_F(QuicConnectionLoggerTest, TruncatedAcksSentNotChanged) { | 115 TEST_F(QuicConnectionLoggerTest, TruncatedAcksSentNotChanged) { |
48 QuicAckFrame frame; | 116 QuicAckFrame frame; |
49 logger_.OnFrameAddedToPacket(QuicFrame(&frame)); | 117 logger_->OnFrameAddedToPacket(QuicFrame(&frame)); |
50 EXPECT_EQ(0u, QuicConnectionLoggerPeer::num_truncated_acks_sent(logger_)); | 118 EXPECT_EQ(0u, |
| 119 QuicConnectionLoggerPeer::num_truncated_acks_sent(logger_.get())); |
51 | 120 |
52 for (QuicPacketNumber i = 0; i < 256; ++i) { | 121 for (QuicPacketNumber i = 0; i < 256; ++i) { |
53 frame.missing_packets.Add(i); | 122 frame.missing_packets.Add(i); |
54 } | 123 } |
55 logger_.OnFrameAddedToPacket(QuicFrame(&frame)); | 124 logger_->OnFrameAddedToPacket(QuicFrame(&frame)); |
56 EXPECT_EQ(0u, QuicConnectionLoggerPeer::num_truncated_acks_sent(logger_)); | 125 EXPECT_EQ(0u, |
| 126 QuicConnectionLoggerPeer::num_truncated_acks_sent(logger_.get())); |
57 } | 127 } |
58 | 128 |
59 TEST_F(QuicConnectionLoggerTest, TruncatedAcksSent) { | 129 TEST_F(QuicConnectionLoggerTest, TruncatedAcksSent) { |
60 QuicAckFrame frame; | 130 QuicAckFrame frame; |
61 for (QuicPacketNumber i = 0; i < 512; i += 2) { | 131 for (QuicPacketNumber i = 0; i < 512; i += 2) { |
62 frame.missing_packets.Add(i); | 132 frame.missing_packets.Add(i); |
63 } | 133 } |
64 logger_.OnFrameAddedToPacket(QuicFrame(&frame)); | 134 logger_->OnFrameAddedToPacket(QuicFrame(&frame)); |
65 EXPECT_EQ(1u, QuicConnectionLoggerPeer::num_truncated_acks_sent(logger_)); | 135 EXPECT_EQ(1u, |
| 136 QuicConnectionLoggerPeer::num_truncated_acks_sent(logger_.get())); |
66 } | 137 } |
67 | 138 |
68 TEST_F(QuicConnectionLoggerTest, ReceivedPacketLossRate) { | 139 TEST_F(QuicConnectionLoggerTest, ReceivedPacketLossRate) { |
69 QuicConnectionLoggerPeer::set_num_packets_received(logger_, 1); | 140 QuicConnectionLoggerPeer::set_num_packets_received(logger_.get(), 1); |
70 QuicConnectionLoggerPeer::set_largest_received_packet_number(logger_, 2); | 141 QuicConnectionLoggerPeer::set_largest_received_packet_number(logger_.get(), |
71 EXPECT_EQ(0.5f, logger_.ReceivedPacketLossRate()); | 142 2); |
| 143 EXPECT_EQ(0.5f, logger_->ReceivedPacketLossRate()); |
| 144 } |
| 145 |
| 146 // Tests that packet counts reported to the socket performance watcher are |
| 147 // computed correctly. |
| 148 TEST_F(QuicConnectionLoggerTest, ReportUplinkPacketCounts) { |
| 149 // Expecting packet 10. Received packet 10. |
| 150 QuicConnectionLoggerPeer::set_largest_received_packet_number(logger_.get(), |
| 151 10); |
| 152 QuicConnectionLoggerPeer::ReportPacketCounts(logger_.get(), 9); |
| 153 socket_performance_watcher_factory_.VerifyAndResetPacketCounts(0, 1, 0); |
| 154 |
| 155 // Expecting packet 11. Received packet 12. |
| 156 QuicConnectionLoggerPeer::set_largest_received_packet_number(logger_.get(), |
| 157 12); |
| 158 QuicConnectionLoggerPeer::ReportPacketCounts(logger_.get(), 10); |
| 159 socket_performance_watcher_factory_.VerifyAndResetPacketCounts(1, 1, 0); |
| 160 |
| 161 // Expecting packet 13. Received packet with sequence number less than 13. |
| 162 QuicConnectionLoggerPeer::set_largest_received_packet_number(logger_.get(), |
| 163 12); |
| 164 QuicConnectionLoggerPeer::ReportPacketCounts(logger_.get(), 12); |
| 165 socket_performance_watcher_factory_.VerifyAndResetPacketCounts(0, 0, 1); |
72 } | 166 } |
73 | 167 |
74 } // namespace test | 168 } // namespace test |
75 } // namespace net | 169 } // namespace net |
OLD | NEW |