• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_
6 #define CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_
7 
8 #include "base/basictypes.h"
9 #include "base/bind.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/weak_ptr.h"
12 
13 namespace net {
14 class DnsClient;
15 class DnsResponse;
16 class DnsTransaction;
17 }
18 
19 namespace chrome_browser_net {
20 
21 // Runs DNS probes using a single DnsClient and evaluates the responses.
22 // (Currently requests A records for google.com and expects at least one IP
23 // address in the response.)
24 // Used by DnsProbeService to probe the system and public DNS configurations.
25 class DnsProbeRunner {
26  public:
27   static const char* kKnownGoodHostname;
28 
29   // Used in histograms; add new entries at the bottom, and don't remove any.
30   enum Result {
31     UNKNOWN,
32     CORRECT,     // Response contains at least one A record.
33     INCORRECT,   // Response claimed success but included no A records.
34     FAILING,     // Response included an error or was malformed.
35     UNREACHABLE  // No response received (timeout, network unreachable, etc.).
36   };
37 
38   DnsProbeRunner();
39   ~DnsProbeRunner();
40 
41   // Sets the DnsClient that will be used for DNS probes sent by this runner.
42   // Must be called before RunProbe; can be called repeatedly, including during
43   // a probe.  It will not affect an in-flight probe, if one is running.
44   void SetClient(scoped_ptr<net::DnsClient> client);
45 
46   // Starts a probe using the client specified with SetClient, which must have
47   // been called before RunProbe.  |callback| will be called asynchronously
48   // when the result is ready, even if it is ready synchronously.  Must not
49   // be called again until the callback is called, but may be called during the
50   // callback.
51   void RunProbe(const base::Closure& callback);
52 
53   // Returns true if a probe is running.  Guaranteed to return true after
54   // RunProbe returns, and false during and after the callback.
55   bool IsRunning() const;
56 
57   // Returns the result of the last probe.
result()58   Result result() const { return result_; }
59 
60  private:
61   void OnTransactionComplete(net::DnsTransaction* transaction,
62                              int net_error,
63                              const net::DnsResponse* response);
64   void CallCallback();
65 
66   base::WeakPtrFactory<DnsProbeRunner> weak_factory_;
67 
68   scoped_ptr<net::DnsClient> client_;
69 
70   // The callback passed to |RunProbe|.  Cleared right before calling the
71   // callback.
72   base::Closure callback_;
73 
74   // The transaction started in |RunProbe| for the DNS probe.  Reset once the
75   // results have been examined.
76   scoped_ptr<net::DnsTransaction> transaction_;
77 
78   Result result_;
79 
80   DISALLOW_COPY_AND_ASSIGN(DnsProbeRunner);
81 };
82 
83 }  // namespace chrome_browser_net
84 
85 #endif  // CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_
86