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 |
| 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 |
| 17 namespace base { |
| 18 class TimeDelta; |
| 19 } |
| 20 |
12 namespace net { | 21 namespace net { |
13 namespace test { | 22 namespace test { |
14 | 23 |
| 24 class TestSocketPerformanceWatcherFactory |
| 25 : public SocketPerformanceWatcherFactory { |
| 26 public: |
| 27 TestSocketPerformanceWatcherFactory() |
| 28 : packets_missing_(0), |
| 29 packets_received_in_order_(0), |
| 30 packets_received_out_of_order_(0) {} |
| 31 |
| 32 ~TestSocketPerformanceWatcherFactory() override {} |
| 33 |
| 34 scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher( |
| 35 const Protocol protocol) override { |
| 36 if (protocol != PROTOCOL_QUIC) { |
| 37 NOTIMPLEMENTED(); |
| 38 } |
| 39 return scoped_ptr<SocketPerformanceWatcher>( |
| 40 new SocketPerformanceWatcher(protocol, this)); |
| 41 } |
| 42 |
| 43 void OnUpdatedRTTAvailable(const Protocol protocol, |
| 44 const base::TimeDelta& rtt) override {} |
| 45 |
| 46 void OnIncrementalPacketCountAvailable( |
| 47 Protocol protocol, |
| 48 size_t packets_missing, |
| 49 size_t packets_received_in_order, |
| 50 size_t packets_received_out_of_order) override { |
| 51 if (protocol != PROTOCOL_QUIC) { |
| 52 NOTIMPLEMENTED(); |
| 53 } |
| 54 packets_missing_ = packets_missing; |
| 55 packets_received_in_order_ = packets_received_in_order; |
| 56 packets_received_out_of_order_ = packets_received_out_of_order; |
| 57 } |
| 58 |
| 59 void VerifyAndResetPacketCounts(size_t packets_missing, |
| 60 size_t packets_received_in_order, |
| 61 size_t packets_received_out_of_order) { |
| 62 EXPECT_EQ(packets_missing, packets_missing_); |
| 63 EXPECT_EQ(packets_received_in_order, packets_received_in_order_); |
| 64 EXPECT_EQ(packets_received_out_of_order, packets_received_out_of_order_); |
| 65 packets_missing_ = 0; |
| 66 packets_received_in_order_ = 0; |
| 67 packets_received_out_of_order_ = 0; |
| 68 } |
| 69 |
| 70 private: |
| 71 size_t packets_missing_; |
| 72 size_t packets_received_in_order_; |
| 73 size_t packets_received_out_of_order_; |
| 74 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory); |
| 75 }; |
| 76 |
15 class QuicConnectionLoggerPeer { | 77 class QuicConnectionLoggerPeer { |
16 public: | 78 public: |
17 static size_t num_truncated_acks_sent(const QuicConnectionLogger& logger) { | 79 static size_t num_truncated_acks_sent(const QuicConnectionLogger* logger) { |
18 return logger.num_truncated_acks_sent_; | 80 return logger->num_truncated_acks_sent_; |
19 } | 81 } |
20 | 82 |
21 static void set_num_packets_received(QuicConnectionLogger& logger, | 83 static void set_num_packets_received(QuicConnectionLogger* logger, |
22 int value) { | 84 int value) { |
23 logger.num_packets_received_ = value; | 85 logger->num_packets_received_ = value; |
24 } | 86 } |
25 | 87 |
26 static void set_largest_received_packet_number(QuicConnectionLogger& logger, | 88 static void set_largest_received_packet_number(QuicConnectionLogger* logger, |
27 int value) { | 89 int value) { |
28 logger.largest_received_packet_number_ = value; | 90 logger->largest_received_packet_number_ = value; |
| 91 } |
| 92 |
| 93 static void ReportPacketCounts( |
| 94 QuicConnectionLogger* logger, |
| 95 size_t previous_largest_received_packet_number) { |
| 96 logger->ReportIncrementalPacketCounts( |
| 97 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 TEST_F(QuicConnectionLoggerTest, ReportIncrementalPacketCounts) { |
| 151 // Expecting packet 10. Received packet 10. |
| 152 QuicConnectionLoggerPeer::set_largest_received_packet_number(logger_.get(), |
| 153 10); |
| 154 QuicConnectionLoggerPeer::ReportPacketCounts(logger_.get(), 9); |
| 155 socket_performance_watcher_factory_.VerifyAndResetPacketCounts(0, 1, 0); |
| 156 |
| 157 // Expecting packet 11. Received packet 12. |
| 158 QuicConnectionLoggerPeer::set_largest_received_packet_number(logger_.get(), |
| 159 12); |
| 160 QuicConnectionLoggerPeer::ReportPacketCounts(logger_.get(), 10); |
| 161 socket_performance_watcher_factory_.VerifyAndResetPacketCounts(1, 1, 0); |
| 162 |
| 163 // Expecting packet 13. Received packet with sequence number less than 13. |
| 164 QuicConnectionLoggerPeer::set_largest_received_packet_number(logger_.get(), |
| 165 12); |
| 166 QuicConnectionLoggerPeer::ReportPacketCounts(logger_.get(), 12); |
| 167 socket_performance_watcher_factory_.VerifyAndResetPacketCounts(0, 0, 1); |
72 } | 168 } |
73 | 169 |
74 } // namespace test | 170 } // namespace test |
75 } // namespace net | 171 } // namespace net |
OLD | NEW |