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