Index: net/base/network_quality_estimator.h |
diff --git a/net/base/network_quality_estimator.h b/net/base/network_quality_estimator.h |
index 8be76c34f2bd4646bc13c4a096111dd179a16e69..824bf4d6a448cc7cbf963e4c0008ee74e7fdbbc1 100644 |
--- a/net/base/network_quality_estimator.h |
+++ b/net/base/network_quality_estimator.h |
@@ -7,15 +7,18 @@ |
#include <stdint.h> |
+#include <deque> |
+ |
#include "base/gtest_prod_util.h" |
#include "base/macros.h" |
#include "base/threading/thread_checker.h" |
#include "base/time/time.h" |
+#include "net/base/net_export.h" |
#include "net/base/network_change_notifier.h" |
namespace net { |
-struct NetworkQuality; |
+class NetworkQuality; |
// NetworkQualityEstimator provides network quality estimates (quality of the |
// full paths to all origins that have been connected to). |
@@ -33,22 +36,69 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator |
~NetworkQualityEstimator() override; |
- // Returns an estimate of the current network quality. |
+ // Returns the peak estimates (fastest RTT and peak throughput) of the |
+ // current network. |
// Virtualized for testing. |
- virtual NetworkQuality GetEstimate() const; |
+ virtual NetworkQuality GetPeakEstimate() const; |
// Notifies NetworkQualityEstimator that a response has been received. |
- // |prefilter_bytes_read| is the count of the bytes received prior to |
- // applying filters (e.g. decompression, SDCH) from request creation time |
+ // |cumulative_prefilter_bytes_read| is the count of the bytes received prior |
+ // to applying filters (e.g. decompression, SDCH) from request creation time |
// until now. |
+ // |prefiltered_bytes_read| is the count of the bytes received prior |
+ // to applying filters in the most recent read. |
void NotifyDataReceived(const URLRequest& request, |
- int64_t prefilter_bytes_read); |
+ int64_t cumulative_prefilter_bytes_read, |
+ int64_t prefiltered_bytes_read); |
private: |
+ FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, StoreObservations); |
FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, |
TestPeakKbpsFastestRTTUpdates); |
+ FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, TestAddObservation); |
FRIEND_TEST_ALL_PREFIXES(URLRequestTestHTTP, NetworkQualityEstimator); |
+ // Records the round trip time or throughput observation, along with the time |
+ // the observation was made. |
+ struct Observation { |
+ Observation(int32_t value, base::TimeTicks timestamp); |
+ |
+ ~Observation(); |
+ |
+ // Value of the observation. |
+ const int32_t value; |
+ |
+ // Time when the observation was taken. |
+ const base::TimeTicks timestamp; |
+ }; |
+ |
+ // Stores observations sorted by time. |
+ class ObservationBuffer { |
+ public: |
+ ObservationBuffer(); |
+ |
+ ~ObservationBuffer(); |
+ |
+ // Adds |observation| to the buffer. The oldest observation in the buffer |
+ // will be evicted to make room if the buffer is already full. |
+ void AddObservation(const Observation& observation); |
+ |
+ // Returns the number of observations in this buffer. |
+ size_t Size() const; |
+ |
+ // Clears the observations stored in this buffer. |
+ void Clear(); |
+ |
+ private: |
+ FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, StoreObservations); |
+ |
+ // Holds observations sorted by time, with the oldest observation at the |
+ // front of the queue. |
+ std::deque<Observation> observations_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ObservationBuffer); |
+ }; |
+ |
// Tiny transfer sizes may give inaccurate throughput results. |
// Minimum size of the transfer over which the throughput is computed. |
static const int kMinTransferSizeInBytes = 10000; |
@@ -66,6 +116,14 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator |
// used for network quality estimation. |
explicit NetworkQualityEstimator(bool allow_local_host_requests_for_tests); |
+ // Returns the maximum size of the observation buffer. |
+ // Used for testing. |
+ size_t GetMaximumObservationBufferSizeForTests() const; |
+ |
+ // Returns true if the size of all observation buffers is equal to the |
+ // |expected_size|. Used for testing. |
+ bool VerifyBufferSizeForTests(size_t expected_size) const; |
+ |
// NetworkChangeNotifier::ConnectionTypeObserver implementation. |
void OnConnectionTypeChanged( |
NetworkChangeNotifier::ConnectionType type) override; |
@@ -81,18 +139,21 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator |
// current connection type. |
NetworkChangeNotifier::ConnectionType current_connection_type_; |
- // Set if any network data has been received since last connectivity change. |
- bool bytes_read_since_last_connection_change_; |
- |
// Fastest round-trip-time (RTT) since last connectivity change. RTT measured |
// from URLRequest creation until first byte received. |
- base::TimeDelta fastest_RTT_since_last_connection_change_; |
+ base::TimeDelta fastest_rtt_since_last_connection_change_; |
- // Rough measurement of downlink peak Kbps witnessed since last connectivity |
+ // Rough measurement of downstream peak Kbps witnessed since last connectivity |
// change. The accuracy is decreased by ignoring these factors: |
// 1) Multiple URLRequests can occur concurrently. |
// 2) The transfer time includes at least one RTT while no bytes are read. |
- uint64_t peak_kbps_since_last_connection_change_; |
+ int32_t peak_kbps_since_last_connection_change_; |
+ |
+ // Buffer that holds Kbps observations. |
+ ObservationBuffer kbps_observations_; |
+ |
+ // Buffer that holds RTT (in milliseconds) observations. |
+ ObservationBuffer rtt_msec_observations_; |
base::ThreadChecker thread_checker_; |