// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_
#define CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_
#include "base/basictypes.h"
#include "base/bind.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
namespace net {
class DnsClient;
class DnsResponse;
class DnsTransaction;
}
namespace chrome_browser_net {
// Runs DNS probes using a single DnsClient and evaluates the responses.
// (Currently requests A records for google.com and expects at least one IP
// address in the response.)
// Used by DnsProbeService to probe the system and public DNS configurations.
class DnsProbeRunner {
public:
static const char* kKnownGoodHostname;
// Used in histograms; add new entries at the bottom, and don't remove any.
enum Result {
UNKNOWN,
CORRECT, // Response contains at least one A record.
INCORRECT, // Response claimed success but included no A records.
FAILING, // Response included an error or was malformed.
UNREACHABLE // No response received (timeout, network unreachable, etc.).
};
DnsProbeRunner();
~DnsProbeRunner();
// Sets the DnsClient that will be used for DNS probes sent by this runner.
// Must be called before RunProbe; can be called repeatedly, including during
// a probe. It will not affect an in-flight probe, if one is running.
void SetClient(scoped_ptr<net::DnsClient> client);
// Starts a probe using the client specified with SetClient, which must have
// been called before RunProbe. |callback| will be called asynchronously
// when the result is ready, even if it is ready synchronously. Must not
// be called again until the callback is called, but may be called during the
// callback.
void RunProbe(const base::Closure& callback);
// Returns true if a probe is running. Guaranteed to return true after
// RunProbe returns, and false during and after the callback.
bool IsRunning() const;
// Returns the result of the last probe.
Result result() const { return result_; }
private:
void OnTransactionComplete(net::DnsTransaction* transaction,
int net_error,
const net::DnsResponse* response);
void CallCallback();
base::WeakPtrFactory<DnsProbeRunner> weak_factory_;
scoped_ptr<net::DnsClient> client_;
// The callback passed to |RunProbe|. Cleared right before calling the
// callback.
base::Closure callback_;
// The transaction started in |RunProbe| for the DNS probe. Reset once the
// results have been examined.
scoped_ptr<net::DnsTransaction> transaction_;
Result result_;
DISALLOW_COPY_AND_ASSIGN(DnsProbeRunner);
};
} // namespace chrome_browser_net
#endif // CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_