Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1349)

Unified Diff: components/certificate_transparency/log_dns_client_unittest.cc

Issue 2152143003: Automatically update LogDnsClient's DNS config (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Documents test members Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/certificate_transparency/log_dns_client.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/certificate_transparency/log_dns_client_unittest.cc
diff --git a/components/certificate_transparency/log_dns_client_unittest.cc b/components/certificate_transparency/log_dns_client_unittest.cc
index d8f11dae6ad886db43d754f754f15896485f10ce..7d25bafeab85024731de54683dbcb5c48b44498a 100644
--- a/components/certificate_transparency/log_dns_client_unittest.cc
+++ b/components/certificate_transparency/log_dns_client_unittest.cc
@@ -32,7 +32,9 @@
namespace certificate_transparency {
namespace {
+using ::testing::IsEmpty;
using ::testing::IsNull;
+using ::testing::Not;
using ::testing::NotNull;
using net::test::IsError;
using net::test::IsOk;
@@ -41,6 +43,18 @@ constexpr char kLeafHash[] =
"\x1f\x25\xe1\xca\xba\x4f\xf9\xb8\x27\x24\x83\x0f\xca\x60\xe4\xc2\xbe\xa8"
"\xc3\xa9\x44\x1c\x27\xb0\xb4\x3e\x6a\x96\x94\xc7\xb8\x04";
+// Necessary to expose SetDnsConfig for testing.
+class DnsChangeNotifier : public net::NetworkChangeNotifier {
+ public:
+ static void SetInitialDnsConfig(const net::DnsConfig& config) {
+ net::NetworkChangeNotifier::SetInitialDnsConfig(config);
+ }
+
+ static void SetDnsConfig(const net::DnsConfig& config) {
+ net::NetworkChangeNotifier::SetDnsConfig(config);
+ }
+};
+
// Always return min, to simplify testing.
// This should result in the DNS query ID always being 0.
int FakeRandInt(int min, int max) {
@@ -259,19 +273,23 @@ const net::MockRead MockSocketData::eof_(net::SYNCHRONOUS,
class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> {
protected:
- LogDnsClientTest() {
+ LogDnsClientTest() :
+ network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) {
+ net::DnsConfig dns_config;
// Use an invalid nameserver address. This prevents the tests accidentally
// sending real DNS queries. The mock sockets don't care that the address
// is invalid.
- dns_config_.nameservers.push_back(net::IPEndPoint());
+ dns_config.nameservers.push_back(net::IPEndPoint());
// Don't attempt retransmissions - just fail.
- dns_config_.attempts = 1;
+ dns_config.attempts = 1;
// This ensures timeouts are long enough for memory tests.
- dns_config_.timeout = TestTimeouts::action_timeout();
+ dns_config.timeout = TestTimeouts::action_timeout();
// Simplify testing - don't require random numbers for the source port.
// This means our FakeRandInt function should only be called to get query
// IDs.
- dns_config_.randomize_ports = false;
+ dns_config.randomize_ports = false;
+
+ DnsChangeNotifier::SetInitialDnsConfig(dns_config);
}
void ExpectRequestAndErrorResponse(base::StringPiece qname, uint8_t rcode) {
@@ -299,7 +317,10 @@ class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> {
mock_socket_data_.back()->AddToFactory(&socket_factory_);
// Speed up timeout tests.
- dns_config_.timeout = TestTimeouts::tiny_timeout();
+ net::DnsConfig dns_config;
+ DnsChangeNotifier::GetDnsConfig(&dns_config);
+ dns_config.timeout = TestTimeouts::tiny_timeout();
+ DnsChangeNotifier::SetDnsConfig(dns_config);
}
void ExpectLeafIndexRequestAndResponse(base::StringPiece qname,
@@ -332,6 +353,7 @@ class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> {
MockLeafIndexCallback* callback) {
std::unique_ptr<net::DnsClient> dns_client = CreateDnsClient();
LogDnsClient log_client(std::move(dns_client), net::BoundNetLog());
+ net::NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
log_client.QueryLeafIndex(log_domain, leaf_hash, callback->AsCallback());
callback->WaitUntilRun();
@@ -343,21 +365,20 @@ class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> {
MockAuditProofCallback* callback) {
std::unique_ptr<net::DnsClient> dns_client = CreateDnsClient();
LogDnsClient log_client(std::move(dns_client), net::BoundNetLog());
+ net::NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
log_client.QueryAuditProof(log_domain, leaf_index, tree_size,
callback->AsCallback());
callback->WaitUntilRun();
}
- private:
std::unique_ptr<net::DnsClient> CreateDnsClient() {
- std::unique_ptr<net::DnsClient> client =
- net::DnsClient::CreateClientForTesting(nullptr, &socket_factory_,
- base::Bind(&FakeRandInt));
- client->SetConfig(dns_config_);
- return client;
+ return net::DnsClient::CreateClientForTesting(nullptr, &socket_factory_,
+ base::Bind(&FakeRandInt));
}
+ private:
+
void ExpectRequestAndResponse(base::StringPiece qname,
base::StringPiece answer) {
std::vector<char> request = CreateDnsTxtRequest(qname);
@@ -368,9 +389,16 @@ class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> {
mock_socket_data_.back()->AddToFactory(&socket_factory_);
}
- net::DnsConfig dns_config_;
+ // This will be the NetworkChangeNotifier singleton for the duration of the
+ // test. It is accessed statically by LogDnsClient.
+ std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
+ // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient,
+ // the underlying net::DnsClient, and NetworkChangeNotifier.
base::MessageLoopForIO message_loop_;
+ // One MockSocketData for each socket that is created. This corresponds to one
+ // for each DNS request sent.
std::vector<std::unique_ptr<MockSocketData>> mock_socket_data_;
+ // Provides as many mock sockets as there are entries in |mock_socket_data_|.
net::MockClientSocketFactory socket_factory_;
};
@@ -737,6 +765,38 @@ TEST_P(LogDnsClientTest, QueryAuditProofReportsTimeout) {
EXPECT_THAT(callback.proof(), IsNull());
}
+TEST_P(LogDnsClientTest, AdoptsLatestDnsConfigIfValid) {
+ std::unique_ptr<net::DnsClient> tmp = CreateDnsClient();
+ net::DnsClient* dns_client = tmp.get();
+ LogDnsClient log_client(std::move(tmp), net::BoundNetLog());
+
+ // Get the current DNS config, modify it and broadcast the update.
+ net::DnsConfig config(*dns_client->GetConfig());
+ ASSERT_NE(123, config.attempts);
+ config.attempts = 123;
+ DnsChangeNotifier::SetDnsConfig(config);
+
+ // Let the DNS config change propogate.
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(123, dns_client->GetConfig()->attempts);
+}
+
+TEST_P(LogDnsClientTest, IgnoresLatestDnsConfigIfInvalid) {
+ std::unique_ptr<net::DnsClient> tmp = CreateDnsClient();
+ net::DnsClient* dns_client = tmp.get();
+ LogDnsClient log_client(std::move(tmp), net::BoundNetLog());
+
+ // Get the current DNS config, modify it and broadcast the update.
+ net::DnsConfig config(*dns_client->GetConfig());
+ ASSERT_THAT(config.nameservers, Not(IsEmpty()));
+ config.nameservers.clear(); // Makes config invalid
+ DnsChangeNotifier::SetDnsConfig(config);
+
+ // Let the DNS config change propogate.
+ base::RunLoop().RunUntilIdle();
+ EXPECT_THAT(dns_client->GetConfig()->nameservers, Not(IsEmpty()));
+}
+
INSTANTIATE_TEST_CASE_P(ReadMode,
LogDnsClientTest,
::testing::Values(net::IoMode::ASYNC,
« no previous file with comments | « components/certificate_transparency/log_dns_client.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698