| OLD | NEW | 
|    1 // Copyright 2016 The Chromium Authors. All rights reserved. |    1 // Copyright 2016 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "components/certificate_transparency/log_dns_client.h" |    5 #include "components/certificate_transparency/log_dns_client.h" | 
|    6  |    6  | 
|    7 #include <memory> |    7 #include <memory> | 
|    8 #include <string> |    8 #include <string> | 
|    9 #include <utility> |    9 #include <utility> | 
|   10 #include <vector> |   10 #include <vector> | 
|   11  |   11  | 
 |   12 #include "base/memory/ptr_util.h" | 
|   12 #include "base/message_loop/message_loop.h" |   13 #include "base/message_loop/message_loop.h" | 
|   13 #include "base/run_loop.h" |   14 #include "base/run_loop.h" | 
|   14 #include "components/certificate_transparency/mock_log_dns_traffic.h" |   15 #include "components/certificate_transparency/mock_log_dns_traffic.h" | 
|   15 #include "crypto/sha2.h" |   16 #include "crypto/sha2.h" | 
|   16 #include "net/base/net_errors.h" |   17 #include "net/base/net_errors.h" | 
|   17 #include "net/cert/merkle_audit_proof.h" |   18 #include "net/cert/merkle_audit_proof.h" | 
|   18 #include "net/cert/signed_certificate_timestamp.h" |   19 #include "net/cert/signed_certificate_timestamp.h" | 
|   19 #include "net/dns/dns_client.h" |   20 #include "net/dns/dns_client.h" | 
|   20 #include "net/dns/dns_config_service.h" |   21 #include "net/dns/dns_config_service.h" | 
|   21 #include "net/dns/dns_protocol.h" |   22 #include "net/dns/dns_protocol.h" | 
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  113 }; |  114 }; | 
|  114  |  115  | 
|  115 class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> { |  116 class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> { | 
|  116  protected: |  117  protected: | 
|  117   LogDnsClientTest() |  118   LogDnsClientTest() | 
|  118       : network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) { |  119       : network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) { | 
|  119     mock_dns_.SetSocketReadMode(GetParam()); |  120     mock_dns_.SetSocketReadMode(GetParam()); | 
|  120     mock_dns_.InitializeDnsConfig(); |  121     mock_dns_.InitializeDnsConfig(); | 
|  121   } |  122   } | 
|  122  |  123  | 
 |  124   std::unique_ptr<LogDnsClient> CreateLogDnsClient() { | 
 |  125     return base::MakeUnique<LogDnsClient>(mock_dns_.CreateDnsClient(), | 
 |  126                                           net::BoundNetLog()); | 
 |  127   } | 
 |  128  | 
 |  129   void QueryLeafIndexAsync(LogDnsClient* log_client, | 
 |  130                            base::StringPiece log_domain, | 
 |  131                            base::StringPiece leaf_hash, | 
 |  132                            const LogDnsClient::LeafIndexCallback& callback) { | 
 |  133     log_client->QueryLeafIndex(log_domain, leaf_hash, callback); | 
 |  134   } | 
 |  135  | 
|  123   void QueryLeafIndex(base::StringPiece log_domain, |  136   void QueryLeafIndex(base::StringPiece log_domain, | 
|  124                       base::StringPiece leaf_hash, |  137                       base::StringPiece leaf_hash, | 
|  125                       MockLeafIndexCallback* callback) { |  138                       MockLeafIndexCallback* callback) { | 
|  126     LogDnsClient log_client(mock_dns_.CreateDnsClient(), net::BoundNetLog()); |  139     auto log_client = CreateLogDnsClient(); | 
|  127     log_client.QueryLeafIndex(log_domain, leaf_hash, callback->AsCallback()); |  140     QueryLeafIndexAsync(log_client.get(), log_domain, leaf_hash, | 
 |  141                         callback->AsCallback()); | 
|  128     callback->WaitUntilRun(); |  142     callback->WaitUntilRun(); | 
|  129   } |  143   } | 
|  130  |  144  | 
 |  145   void QueryAuditProofAsync(LogDnsClient* log_client, | 
 |  146                             base::StringPiece log_domain, | 
 |  147                             uint64_t leaf_index, | 
 |  148                             uint64_t tree_size, | 
 |  149                             const LogDnsClient::AuditProofCallback& callback) { | 
 |  150     log_client->QueryAuditProof(log_domain, leaf_index, tree_size, callback); | 
 |  151   } | 
 |  152  | 
|  131   void QueryAuditProof(base::StringPiece log_domain, |  153   void QueryAuditProof(base::StringPiece log_domain, | 
|  132                        uint64_t leaf_index, |  154                        uint64_t leaf_index, | 
|  133                        uint64_t tree_size, |  155                        uint64_t tree_size, | 
|  134                        MockAuditProofCallback* callback) { |  156                        MockAuditProofCallback* callback) { | 
|  135     LogDnsClient log_client(mock_dns_.CreateDnsClient(), net::BoundNetLog()); |  157     auto log_client = CreateLogDnsClient(); | 
|  136     log_client.QueryAuditProof(log_domain, leaf_index, tree_size, |  158     QueryAuditProofAsync(log_client.get(), log_domain, leaf_index, tree_size, | 
|  137                                callback->AsCallback()); |  159                          callback->AsCallback()); | 
|  138     callback->WaitUntilRun(); |  160     callback->WaitUntilRun(); | 
|  139   } |  161   } | 
|  140  |  162  | 
|  141   // This will be the NetworkChangeNotifier singleton for the duration of the |  163   // This will be the NetworkChangeNotifier singleton for the duration of the | 
|  142   // test. It is accessed statically by LogDnsClient. |  164   // test. It is accessed statically by LogDnsClient. | 
|  143   std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; |  165   std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; | 
|  144   // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient, |  166   // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient, | 
|  145   // the underlying net::DnsClient, and NetworkChangeNotifier. |  167   // the underlying net::DnsClient, and NetworkChangeNotifier. | 
|  146   base::MessageLoopForIO message_loop_; |  168   base::MessageLoopForIO message_loop_; | 
|  147   // Allows mock DNS sockets to be setup. |  169   // Allows mock DNS sockets to be setup. | 
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  536   net::DnsConfig config(*dns_client->GetConfig()); |  558   net::DnsConfig config(*dns_client->GetConfig()); | 
|  537   ASSERT_THAT(config.nameservers, Not(IsEmpty())); |  559   ASSERT_THAT(config.nameservers, Not(IsEmpty())); | 
|  538   config.nameservers.clear();  // Makes config invalid |  560   config.nameservers.clear();  // Makes config invalid | 
|  539   mock_dns_.SetDnsConfig(config); |  561   mock_dns_.SetDnsConfig(config); | 
|  540  |  562  | 
|  541   // Let the DNS config change propogate. |  563   // Let the DNS config change propogate. | 
|  542   base::RunLoop().RunUntilIdle(); |  564   base::RunLoop().RunUntilIdle(); | 
|  543   EXPECT_THAT(dns_client->GetConfig()->nameservers, Not(IsEmpty())); |  565   EXPECT_THAT(dns_client->GetConfig()->nameservers, Not(IsEmpty())); | 
|  544 } |  566 } | 
|  545  |  567  | 
 |  568 TEST_P(LogDnsClientTest, CanBeThrottledToOneQueryAtATime) { | 
 |  569   const std::vector<std::string> audit_proof = GetSampleAuditProof(20); | 
 |  570  | 
 |  571   // It should require 3 queries to collect the entire audit proof, as there is | 
 |  572   // only space for 7 nodes per UDP packet. | 
 |  573   mock_dns_.ExpectAuditProofRequestAndResponse("0.123456.999999.tree.ct.test.", | 
 |  574                                                audit_proof.begin(), | 
 |  575                                                audit_proof.begin() + 7); | 
 |  576   mock_dns_.ExpectAuditProofRequestAndResponse("7.123456.999999.tree.ct.test.", | 
 |  577                                                audit_proof.begin() + 7, | 
 |  578                                                audit_proof.begin() + 14); | 
 |  579   mock_dns_.ExpectAuditProofRequestAndResponse("14.123456.999999.tree.ct.test.", | 
 |  580                                                audit_proof.begin() + 14, | 
 |  581                                                audit_proof.end()); | 
 |  582  | 
 |  583   auto log_client = CreateLogDnsClient(); | 
 |  584   log_client->SetMaxConcurrentQueries(1); | 
 |  585  | 
 |  586   MockAuditProofCallback callback1; | 
 |  587   QueryAuditProofAsync(log_client.get(), "ct.test", 123456, 999999, | 
 |  588                        callback1.AsCallback()); | 
 |  589   MockAuditProofCallback callback2; | 
 |  590   QueryAuditProofAsync(log_client.get(), "ct.test", 123456, 999999, | 
 |  591                        callback2.AsCallback()); | 
 |  592  | 
 |  593   callback1.WaitUntilRun(); | 
 |  594   callback2.WaitUntilRun(); | 
 |  595  | 
 |  596   ASSERT_TRUE(callback1.called()); | 
 |  597   EXPECT_THAT(callback1.net_error(), IsOk()); | 
 |  598   ASSERT_THAT(callback1.proof(), NotNull()); | 
 |  599   EXPECT_THAT(callback1.proof()->leaf_index, 123456); | 
 |  600   // EXPECT_THAT(callback1.proof()->tree_size, 999999); | 
 |  601   EXPECT_THAT(callback1.proof()->nodes, audit_proof); | 
 |  602  | 
 |  603   ASSERT_TRUE(callback2.called()); | 
 |  604   EXPECT_THAT(callback2.net_error(), IsError(net::ERR_TEMPORARILY_THROTTLED)); | 
 |  605   EXPECT_THAT(callback2.proof(), IsNull()); | 
 |  606 } | 
 |  607  | 
|  546 INSTANTIATE_TEST_CASE_P(ReadMode, |  608 INSTANTIATE_TEST_CASE_P(ReadMode, | 
|  547                         LogDnsClientTest, |  609                         LogDnsClientTest, | 
|  548                         ::testing::Values(net::IoMode::ASYNC, |  610                         ::testing::Values(net::IoMode::ASYNC, | 
|  549                                           net::IoMode::SYNCHRONOUS)); |  611                                           net::IoMode::SYNCHRONOUS)); | 
|  550  |  612  | 
|  551 }  // namespace |  613 }  // namespace | 
|  552 }  // namespace certificate_transparency |  614 }  // namespace certificate_transparency | 
| OLD | NEW |