| Index: net/base/network_quality_estimator.h
|
| diff --git a/net/base/network_quality_estimator.h b/net/base/network_quality_estimator.h
|
| index 6f3a4674cfcf3509d3b0004eac010fcb5988f4ee..61a441e8b88062ecda35015f8cacf53d2554aca8 100644
|
| --- a/net/base/network_quality_estimator.h
|
| +++ b/net/base/network_quality_estimator.h
|
| @@ -8,6 +8,8 @@
|
| #include <stdint.h>
|
|
|
| #include <deque>
|
| +#include <map>
|
| +#include <string>
|
|
|
| #include "base/gtest_prod_util.h"
|
| #include "base/macros.h"
|
| @@ -15,11 +17,10 @@
|
| #include "base/time/time.h"
|
| #include "net/base/net_export.h"
|
| #include "net/base/network_change_notifier.h"
|
| +#include "net/base/network_quality.h"
|
|
|
| namespace net {
|
|
|
| -class NetworkQuality;
|
| -
|
| // NetworkQualityEstimator provides network quality estimates (quality of the
|
| // full paths to all origins that have been connected to).
|
| // The estimates are based on the observed organic traffic.
|
| @@ -51,13 +52,110 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator
|
| int64_t cumulative_prefilter_bytes_read,
|
| int64_t prefiltered_bytes_read);
|
|
|
| + protected:
|
| + // NetworkID is used to uniquely identify a network.
|
| + // For the purpose of network quality estimation and caching, a network is
|
| + // uniquely identified by a combination of |type| and
|
| + // |id|. This approach is unable to distinguish networks with
|
| + // same name (e.g., different Wi-Fi networks with same SSID).
|
| + // This is a protected member to expose it to tests.
|
| + struct NetworkID {
|
| + NetworkID(NetworkChangeNotifier::ConnectionType type, const std::string& id)
|
| + : type(type), id(id) {}
|
| +
|
| + NetworkID(const NetworkID& other) : type(other.type), id(other.id) {}
|
| +
|
| + ~NetworkID() {}
|
| +
|
| + NetworkID& operator=(const NetworkID& other) {
|
| + type = other.type;
|
| + id = other.id;
|
| + return *this;
|
| + }
|
| +
|
| + // Overloaded because NetworkID is used as key in a map.
|
| + bool operator<(const NetworkID& other) const {
|
| + return type < other.type || (type == other.type && id < other.id);
|
| + }
|
| +
|
| + // Connection type of the network.
|
| + NetworkChangeNotifier::ConnectionType type;
|
| +
|
| + // Name of this network. This is set to:
|
| + // - Wi-Fi SSID (if the user is connected to a Wi-Fi access point and the
|
| + // SSID name is available), or
|
| + // - MCC/MNC code of the cellular carrier if the device is connected to a
|
| + // cellular network, or
|
| + // - An empty string in all other cases or if the network name is not
|
| + // exposed by platform APIs.
|
| + std::string id;
|
| + };
|
| +
|
| + // Construct a NetworkQualityEstimator instance allowing for test
|
| + // configuration.
|
| + // Registers for network type change notifications so estimates can be kept
|
| + // network specific.
|
| + // |allow_local_host_requests_for_tests| should only be true when testing
|
| + // against local HTTP server and allows the requests to local host to be
|
| + // used for network quality estimation.
|
| + // |allow_smaller_responses_for_tests| should only be true when testing
|
| + // against local HTTP server and allows the responses smaller than
|
| + // |kMinTransferSizeInBytes| or shorter than |kMinRequestDurationMicroseconds|
|
| + // to be used for network quality estimation.
|
| + NetworkQualityEstimator(bool allow_local_host_requests_for_tests,
|
| + bool allow_smaller_responses_for_tests);
|
| +
|
| + // Returns true if the cached network quality estimate was successfully read.
|
| + bool ReadCachedNetworkQualityEstimate();
|
| +
|
| + // NetworkChangeNotifier::ConnectionTypeObserver implementation.
|
| + // |type| is ignored.
|
| + void OnConnectionTypeChanged(
|
| + NetworkChangeNotifier::ConnectionType type) override;
|
| +
|
| + // Returns the number of entries in the network quality cache.
|
| + // Used only for testing.
|
| + size_t GetNetworkQualityCacheSizeForTests() const;
|
| +
|
| private:
|
| FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, StoreObservations);
|
| FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest,
|
| TestPeakKbpsFastestRTTUpdates);
|
| FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, TestAddObservation);
|
| + FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, TestCaching);
|
| + FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest,
|
| + TestLRUCacheMaximumSize);
|
| FRIEND_TEST_ALL_PREFIXES(URLRequestTestHTTP, NetworkQualityEstimator);
|
|
|
| + // CachedNetworkQuality stores the quality of a previously seen network.
|
| + class CachedNetworkQuality {
|
| + public:
|
| + explicit CachedNetworkQuality(const NetworkQuality& network_quality);
|
| +
|
| + ~CachedNetworkQuality();
|
| +
|
| + // Returns the network quality associated with this cached entry.
|
| + const NetworkQuality network_quality() const { return network_quality_; }
|
| +
|
| + // Updates the network quality to the specified |median_kbps| and
|
| + // |median_rtt|.
|
| + void UpdateNetworkQuality(int32_t median_kbps,
|
| + const base::TimeDelta& median_rtt);
|
| +
|
| + // Returns true if this cache entry was updated before
|
| + // |cached_network_quality|.
|
| + bool OlderThan(const CachedNetworkQuality& cached_network_quality) const;
|
| +
|
| + private:
|
| + // Time when this cache entry was last updated.
|
| + base::TimeTicks last_update_time_;
|
| +
|
| + // Quality of this cached network.
|
| + NetworkQuality network_quality_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CachedNetworkQuality);
|
| + };
|
| +
|
| // Records the round trip time or throughput observation, along with the time
|
| // the observation was made.
|
| struct Observation {
|
| @@ -99,6 +197,12 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator
|
| DISALLOW_COPY_AND_ASSIGN(ObservationBuffer);
|
| };
|
|
|
| + // This does not use a unordered_map or hash_map for code simplicity (key just
|
| + // implements operator<, rather than hash and equality) and because the map is
|
| + // tiny.
|
| + typedef std::map<NetworkID, scoped_ptr<CachedNetworkQuality>>
|
| + CachedNetworkQualities;
|
| +
|
| // Tiny transfer sizes may give inaccurate throughput results.
|
| // Minimum size of the transfer over which the throughput is computed.
|
| static const int kMinTransferSizeInBytes = 10000;
|
| @@ -107,31 +211,26 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator
|
| // throughput is computed.
|
| static const int kMinRequestDurationMicroseconds = 1000;
|
|
|
| - // Construct a NetworkQualityEstimator instance allowing for test
|
| - // configuration.
|
| - // Registers for network type change notifications so estimates can be kept
|
| - // network specific.
|
| - // |allow_local_host_requests_for_tests| should only be true when testing
|
| - // against local HTTP server and allows the requests to local host to be
|
| - // used for network quality estimation.
|
| - // |allow_smaller_responses_for_tests| should only be true when testing
|
| - // against local HTTP server and allows the responses smaller than
|
| - // |kMinTransferSizeInBytes| or shorter than |kMinRequestDurationMicroseconds|
|
| - // to be used for network quality estimation.
|
| - NetworkQualityEstimator(bool allow_local_host_requests_for_tests,
|
| - bool allow_smaller_responses_for_tests);
|
| + // Maximum size of the cache that holds network quality estimates.
|
| + // Smaller size may reduce the cache hit rate due to frequent evictions.
|
| + // Larger size may affect performance.
|
| + static const size_t kMaximumNetworkQualityCacheSize;
|
|
|
| - // Returns the maximum size of the observation buffer.
|
| - // Used for testing.
|
| + // Returns the maximum size of the observation buffers. 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;
|
| + // Returns the current size of the Kbps observation buffer. Used for testing.
|
| + size_t GetKbpsObservationBufferSizeForTests() const;
|
|
|
| - // NetworkChangeNotifier::ConnectionTypeObserver implementation.
|
| - void OnConnectionTypeChanged(
|
| - NetworkChangeNotifier::ConnectionType type) override;
|
| + // Returns the current size of the RTT observation buffer. Used for testing.
|
| + size_t GetRTTObservationBufferSizeForTests() const;
|
| +
|
| + // Returns the current network ID checking by calling the platform APIs.
|
| + // Virtualized for testing.
|
| + virtual NetworkID GetCurrentNetworkID() const;
|
| +
|
| + // Writes the estimated quality of the current network to the cache.
|
| + void CacheNetworkQualityEstimate();
|
|
|
| // Determines if the requests to local host can be used in estimating the
|
| // network quality. Set to true only for tests.
|
| @@ -145,14 +244,16 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator
|
| // Time when last connection change was observed.
|
| base::TimeTicks last_connection_change_;
|
|
|
| - // Last value passed to |OnConnectionTypeChanged|. This indicates the
|
| - // current connection type.
|
| - NetworkChangeNotifier::ConnectionType current_connection_type_;
|
| + // ID of the current network.
|
| + NetworkID current_network_id_;
|
|
|
| // 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_;
|
|
|
| + // Cache that stores quality of previously seen networks.
|
| + CachedNetworkQualities cached_network_qualities_;
|
| +
|
| // 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.
|
|
|