17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#ifndef CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_ 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_ 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/basictypes.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/scoped_ptr.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/weak_ptr.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace net { 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DnsClient; 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DnsResponse; 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DnsTransaction; 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace chrome_browser_net { 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Runs DNS probes using a single DnsClient and evaluates the responses. 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// (Currently requests A records for google.com and expects at least one IP 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// address in the response.) 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Used by DnsProbeService to probe the system and public DNS configurations. 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DnsProbeRunner { 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static const char* kKnownGoodHostname; 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Used in histograms; add new entries at the bottom, and don't remove any. 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enum Result { 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UNKNOWN, 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CORRECT, // Response contains at least one A record. 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch INCORRECT, // Response claimed success but included no A records. 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAILING, // Response included an error or was malformed. 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UNREACHABLE // No response received (timeout, network unreachable, etc.). 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeRunner(); 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ~DnsProbeRunner(); 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Sets the DnsClient that will be used for DNS probes sent by this runner. 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Must be called before RunProbe; can be called repeatedly, including during 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // a probe. It will not affect an in-flight probe, if one is running. 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetClient(scoped_ptr<net::DnsClient> client); 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Starts a probe using the client specified with SetClient, which must have 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // been called before RunProbe. |callback| will be called asynchronously 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // when the result is ready, even if it is ready synchronously. Must not 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // be called again until the callback is called, but may be called during the 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // callback. 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void RunProbe(const base::Closure& callback); 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Returns true if a probe is running. Guaranteed to return true after 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // RunProbe returns, and false during and after the callback. 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool IsRunning() const; 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Returns the result of the last probe. 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Result result() const { return result_; } 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void OnTransactionComplete(net::DnsTransaction* transaction, 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int net_error, 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const net::DnsResponse* response); 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void CallCallback(); 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::WeakPtrFactory<DnsProbeRunner> weak_factory_; 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<net::DnsClient> client_; 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The callback passed to |RunProbe|. Cleared right before calling the 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // callback. 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Closure callback_; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The transaction started in |RunProbe| for the DNS probe. Reset once the 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // results have been examined. 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<net::DnsTransaction> transaction_; 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Result result_; 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISALLOW_COPY_AND_ASSIGN(DnsProbeRunner); 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace chrome_browser_net 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_ 86