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