Chromium Code Reviews| Index: chrome/browser/net/network_stats.cc |
| =================================================================== |
| --- chrome/browser/net/network_stats.cc (revision 135678) |
| +++ 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,19 @@ |
| 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(host_resolver); |
| 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 +139,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 +150,7 @@ |
| packets_to_send_ = packets_to_send; |
| histogram_port_ = histogram_port; |
| + has_proxy_server_ = has_proxy_server; |
| finished_callback_ = finished_callback; |
| } |
| @@ -538,7 +549,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 +558,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 +581,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 +734,52 @@ |
| delete this; |
| } |
| +// ProxyDetector methods and members. |
| +ProxyDetector::ProxyDetector(net::ProxyService* proxy_service, |
| + const net::HostPortPair& server_address, |
| + ProxyDetectorCallback callback) |
| + : proxy_service_(proxy_service), |
| + server_address_(server_address), |
| + callback_(callback), |
| + has_pending_proxy_resolution_(false) { |
| +} |
| + |
| +ProxyDetector::~ProxyDetector() { |
| + CHECK(!has_pending_proxy_resolution_); |
| +} |
| + |
| +void ProxyDetector::ResolveProxy() { |
|
eroman
2012/05/08 01:02:27
[optional] nit: I suggest calling this StartResolv
ramant (doing other things)
2012/05/08 05:28:19
Done.
|
| + std::string url = |
| + base::StringPrintf("https://%s", server_address_.ToString().c_str()); |
| + GURL gurl(url); |
| + |
| + has_pending_proxy_resolution_ = true; |
| + DCHECK(proxy_service_); |
| + int rv = proxy_service_->ResolveProxy( |
| + gurl, |
| + &proxy_info_, |
| + base::Bind(&ProxyDetector::OnResolveProxyComplete, |
| + base::Unretained(this)), |
| + NULL, |
| + net::BoundNetLog()); |
| + if (rv == net::OK) |
|
eroman
2012/05/08 01:02:27
this should actually be:
rv != net::ERR_IO_PENDI
ramant (doing other things)
2012/05/08 05:28:19
Done.
|
| + OnResolveProxyComplete(rv); |
| +} |
| + |
| +void ProxyDetector::OnResolveProxyComplete(int result) { |
| + DCHECK(result == net::OK); |
|
eroman
2012/05/08 01:02:27
Delete this. (Errors are possible).
ramant (doing other things)
2012/05/08 05:28:19
Done.
|
| + |
| + has_pending_proxy_resolution_ = false; |
| + bool has_proxy_server = (proxy_info_.proxy_server().is_valid() && |
|
eroman
2012/05/08 01:02:27
Please also add result == net::OK at the start.
ramant (doing other things)
2012/05/08 05:28:19
Done.
|
| + !proxy_info_.proxy_server().is_direct()); |
| + |
| + callback_.Run(has_proxy_server); |
| + |
| + // TODO(rtenneti): Will we leak if ProxtResolve is cancelled (or proxy |
| + // resolution never completes). |
| + delete this; |
| +} |
| + |
| // static |
| void CollectNetworkStats(const std::string& network_stats_server, |
| IOThread* io_thread) { |
| @@ -742,8 +805,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 +843,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]; |
| } |
| } |
| @@ -800,15 +860,34 @@ |
| net::HostResolver* host_resolver = io_thread->globals()->host_resolver.get(); |
| DCHECK(host_resolver); |
| - net::HostPortPair server_address(network_stats_server, port); |
| + net::HostPortPair server_address(network_stats_server, |
| + kPorts[histogram_port]); |
| + net::ProxyService* proxy_service = |
| + io_thread->globals()->system_proxy_service.get(); |
| + DCHECK(proxy_service); |
| + |
| + ProxyDetector::ProxyDetectorCallback callback = |
| + base::Bind(&StartNetworkStatsTest, |
| + host_resolver, server_address, histogram_port); |
| + |
| + ProxyDetector* proxy_client = new ProxyDetector( |
| + proxy_service, server_address, callback); |
| + proxy_client->ResolveProxy(); |
| +} |
| + |
| +// static |
| +void StartNetworkStatsTest(net::HostResolver* host_resolver, |
| + const net::HostPortPair& server_address, |
| + NetworkStats::HistogramPortSelector histogram_port, |
| + bool has_proxy_server) { |
| int experiment_to_run = base::RandInt(1, 5); |
| switch (experiment_to_run) { |
| case 1: |
| { |
| 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 +896,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 +905,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 +914,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 +923,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; |