Chromium Code Reviews| Index: chrome/browser/net/network_stats.cc |
| =================================================================== |
| --- chrome/browser/net/network_stats.cc (revision 135283) |
| +++ chrome/browser/net/network_stats.cc (working copy) |
| @@ -16,11 +16,13 @@ |
| #include "base/tuple.h" |
| #include "chrome/common/chrome_version_info.h" |
| #include "content/public/browser/browser_thread.h" |
| +#include "googleurl/src/gurl.h" |
| #include "net/base/net_errors.h" |
| #include "net/base/net_util.h" |
| #include "net/base/network_change_notifier.h" |
| #include "net/base/sys_addrinfo.h" |
| #include "net/base/test_completion_callback.h" |
| +#include "net/proxy/proxy_service.h" |
| #include "net/socket/tcp_client_socket.h" |
| #include "net/udp/udp_client_socket.h" |
| #include "net/udp/udp_server_socket.h" |
| @@ -94,6 +96,7 @@ |
| : load_size_(0), |
| bytes_to_read_(0), |
| bytes_to_send_(0), |
| + has_proxy_server_(false), |
| packets_to_send_(0), |
| packets_sent_(0), |
| base_packet_number_(0), |
| @@ -108,13 +111,18 @@ |
| bool NetworkStats::Start(net::HostResolver* host_resolver, |
| const net::HostPortPair& server_host_port_pair, |
| HistogramPortSelector histogram_port, |
| + bool has_proxy_server, |
| uint32 bytes_to_send, |
| uint32 packets_to_send, |
| const net::CompletionCallback& finished_callback) { |
| DCHECK(bytes_to_send); // We should have data to send. |
| DCHECK_LE(packets_to_send, kMaximumPackets); |
| - Initialize(bytes_to_send, histogram_port, packets_to_send, finished_callback); |
| + Initialize(bytes_to_send, |
| + histogram_port, |
| + has_proxy_server, |
| + packets_to_send, |
| + finished_callback); |
| net::HostResolver::RequestInfo request(server_host_port_pair); |
| int rv = host_resolver->Resolve( |
| @@ -130,6 +138,7 @@ |
| void NetworkStats::Initialize( |
| uint32 bytes_to_send, |
| HistogramPortSelector histogram_port, |
| + bool has_proxy_server, |
| uint32 packets_to_send, |
| const net::CompletionCallback& finished_callback) { |
| DCHECK(bytes_to_send); // We should have data to send. |
| @@ -140,6 +149,7 @@ |
| packets_to_send_ = packets_to_send; |
| histogram_port_ = histogram_port; |
| + has_proxy_server_ = has_proxy_server; |
| finished_callback_ = finished_callback; |
| } |
| @@ -538,7 +548,7 @@ |
| // Build "NetConnectivity.<protocol>.Status.<port>.<load_size>" histogram |
| // name. Total number of histograms are 2*5*2. |
| - *status_histogram_name = base::StringPrintf( |
| + *status_histogram_name = base::StringPrintf( |
| "NetConnectivity.%s.Status.%d.%s", |
| protocol_string, |
| kPorts[port], |
| @@ -547,7 +557,7 @@ |
| // Build "NetConnectivity.<protocol>.PacketLoss.<port>.<load_size>" histogram |
| // name. Total number of histograms are 5 (because we do this test for UDP |
| // only). |
| - *packet_loss_histogram_name = base::StringPrintf( |
| + *packet_loss_histogram_name = base::StringPrintf( |
| "NetConnectivity.%s.PacketLoss.%d.%s", |
| protocol_string, |
| kPorts[port], |
| @@ -570,31 +580,37 @@ |
| &status_histogram_name, |
| &packet_loss_histogram_name); |
| - // For packet loss test, just record packet loss data. |
| - if (packets_to_send_ > 1) { |
| - base::Histogram* packet_loss_histogram = base::LinearHistogram::FactoryGet( |
| - packet_loss_histogram_name, |
| - 1, |
| - 2 << kMaximumPackets, |
| - (2 << kMaximumPackets) + 1, |
| - base::Histogram::kUmaTargetedHistogramFlag); |
| - packet_loss_histogram->Add(packets_received_mask_); |
| - return; |
| - } |
| + size_t histogram_count = has_proxy_server_ ? 1 : 2; |
| + for (size_t i = 0; i < histogram_count; i++) { |
| + // For packet loss test, just record packet loss data. |
| + if (packets_to_send_ > 1) { |
| + base::Histogram* histogram = base::LinearHistogram::FactoryGet( |
| + packet_loss_histogram_name, |
| + 1, |
| + 2 << kMaximumPackets, |
| + (2 << kMaximumPackets) + 1, |
| + base::Histogram::kUmaTargetedHistogramFlag); |
| + histogram->Add(packets_received_mask_); |
| + packet_loss_histogram_name.append(".NoProxy"); |
| + continue; |
| + } |
| - if (result == net::OK) { |
| - base::Histogram* rtt_histogram = base::Histogram::FactoryTimeGet( |
| - rtt_histogram_name, |
| - base::TimeDelta::FromMilliseconds(10), |
| - base::TimeDelta::FromSeconds(60), 50, |
| + if (result == net::OK) { |
| + base::Histogram* rtt_histogram = base::Histogram::FactoryTimeGet( |
| + rtt_histogram_name, |
| + base::TimeDelta::FromMilliseconds(10), |
| + base::TimeDelta::FromSeconds(60), 50, |
| + base::Histogram::kUmaTargetedHistogramFlag); |
| + rtt_histogram->AddTime(duration); |
| + rtt_histogram_name.append(".NoProxy"); |
| + } |
| + |
| + base::Histogram* status_histogram = base::LinearHistogram::FactoryGet( |
| + status_histogram_name, 1, STATUS_MAX, STATUS_MAX+1, |
| base::Histogram::kUmaTargetedHistogramFlag); |
| - rtt_histogram->AddTime(duration); |
| + status_histogram->Add(status); |
| + status_histogram_name.append(".NoProxy"); |
| } |
| - |
| - base::Histogram* status_histogram = base::LinearHistogram::FactoryGet( |
| - status_histogram_name, 1, STATUS_MAX, STATUS_MAX+1, |
| - base::Histogram::kUmaTargetedHistogramFlag); |
| - status_histogram->Add(status); |
| } |
| // UDPStatsClient methods and members. |
| @@ -717,6 +733,43 @@ |
| delete this; |
| } |
| +// ProxyDetector methods and members. |
| +ProxyDetector::ProxyDetector(const std::string& network_stats_server, |
| + NetworkStats::HistogramPortSelector histogram_port, |
| + IOThread* io_thread) |
| + : network_stats_server_(network_stats_server), |
| + histogram_port_(histogram_port), |
| + io_thread_(io_thread) { |
| +} |
| + |
| +ProxyDetector::~ProxyDetector() { |
|
eroman
2012/05/04 23:08:48
When is ProxyDetector deleted? Note that if it is
ramant (doing other things)
2012/05/07 23:35:47
Implemented option a). Thanks for the above commen
|
| +} |
| + |
| +void ProxyDetector::ResolveProxy() { |
| + std::string url = base::StringPrintf( |
| + "https://%s:%d", network_stats_server_.c_str(), kPorts[histogram_port_]); |
|
eroman
2012/05/04 23:08:48
Assembling URLs in this fashion is generally not s
ramant (doing other things)
2012/05/07 23:35:47
Implemented option a). Thanks much for the suggest
|
| + GURL gurl(url); |
| + net::ProxyService* service = |
| + io_thread_->globals()->system_proxy_service.get(); |
| + |
| + int rv = service->ResolveProxy( |
| + gurl, |
| + &proxy_info_, |
| + base::Bind(&ProxyDetector::OnResolveProxyComplete, |
| + base::Unretained(this)), |
| + NULL, |
| + net::BoundNetLog()); |
| + if (rv == net::OK) |
| + OnResolveProxyComplete(rv); |
| +} |
| + |
| +void ProxyDetector::OnResolveProxyComplete(int result) { |
| + bool has_proxy_server = (proxy_info_.proxy_server().is_valid() && |
|
eroman
2012/05/04 23:08:48
One extra check to add is into that list is:
re
ramant (doing other things)
2012/05/07 23:35:47
Done.
|
| + !proxy_info_.proxy_server().is_direct()); |
| + StartNetworkStatsTest( |
|
eroman
2012/05/04 23:08:48
[optional] I suggest de-coupling this from ProxyDe
ramant (doing other things)
2012/05/07 23:35:47
Done.
|
| + network_stats_server_, histogram_port_, has_proxy_server, io_thread_); |
| +} |
| + |
| // static |
| void CollectNetworkStats(const std::string& network_stats_server, |
| IOThread* io_thread) { |
| @@ -742,8 +795,6 @@ |
| CR_DEFINE_STATIC_LOCAL(scoped_refptr<base::FieldTrial>, trial, ()); |
| static bool collect_stats = false; |
| - |
| - static uint32 port; |
| static NetworkStats::HistogramPortSelector histogram_port; |
| if (!trial.get()) { |
| @@ -782,7 +833,6 @@ |
| base::RandInt(NetworkStats::PORT_53, NetworkStats::PORT_8080)); |
| DCHECK_GE(histogram_port, NetworkStats::PORT_53); |
| DCHECK_LE(histogram_port, NetworkStats::PORT_8080); |
| - port = kPorts[histogram_port]; |
| } |
| } |
| @@ -797,10 +847,23 @@ |
| ++number_of_tests_done; |
| + ProxyDetector* proxy_client = new ProxyDetector( |
| + network_stats_server, histogram_port, io_thread); |
| + proxy_client->ResolveProxy(); |
| +} |
| + |
| +// static |
| +void StartNetworkStatsTest(const std::string& network_stats_server, |
| + NetworkStats::HistogramPortSelector histogram_port, |
| + bool has_proxy_server, |
| + IOThread* io_thread) { |
| net::HostResolver* host_resolver = io_thread->globals()->host_resolver.get(); |
| DCHECK(host_resolver); |
| - net::HostPortPair server_address(network_stats_server, port); |
| + DCHECK_GE(histogram_port, NetworkStats::PORT_53); |
| + DCHECK_LE(histogram_port, NetworkStats::PORT_8080); |
| + net::HostPortPair server_address(network_stats_server, |
| + kPorts[histogram_port]); |
| int experiment_to_run = base::RandInt(1, 5); |
| switch (experiment_to_run) { |
| @@ -808,7 +871,7 @@ |
| { |
| UDPStatsClient* small_udp_stats = new UDPStatsClient(); |
| small_udp_stats->Start( |
| - host_resolver, server_address, histogram_port, |
| + host_resolver, server_address, histogram_port, has_proxy_server, |
| kSmallTestBytesToSend, 1, net::CompletionCallback()); |
| } |
| break; |
| @@ -817,7 +880,7 @@ |
| { |
| UDPStatsClient* large_udp_stats = new UDPStatsClient(); |
| large_udp_stats->Start( |
| - host_resolver, server_address, histogram_port, |
| + host_resolver, server_address, histogram_port, has_proxy_server, |
| kLargeTestBytesToSend, 1, net::CompletionCallback()); |
| } |
| break; |
| @@ -826,7 +889,7 @@ |
| { |
| TCPStatsClient* small_tcp_client = new TCPStatsClient(); |
| small_tcp_client->Start( |
| - host_resolver, server_address, histogram_port, |
| + host_resolver, server_address, histogram_port, has_proxy_server, |
| kSmallTestBytesToSend, 1, net::CompletionCallback()); |
| } |
| break; |
| @@ -835,7 +898,7 @@ |
| { |
| TCPStatsClient* large_tcp_client = new TCPStatsClient(); |
| large_tcp_client->Start( |
| - host_resolver, server_address, histogram_port, |
| + host_resolver, server_address, histogram_port, has_proxy_server, |
| kLargeTestBytesToSend, 1, net::CompletionCallback()); |
| } |
| break; |
| @@ -844,7 +907,7 @@ |
| { |
| UDPStatsClient* packet_loss_udp_stats = new UDPStatsClient(); |
| packet_loss_udp_stats->Start( |
| - host_resolver, server_address, histogram_port, |
| + host_resolver, server_address, histogram_port, has_proxy_server, |
| kLargeTestBytesToSend, kMaximumPackets, net::CompletionCallback()); |
| } |
| break; |