Chromium Code Reviews| 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/format_macros.h" | 12 #include "base/format_macros.h" |
| 13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
| 14 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
| 15 #include "base/run_loop.h" | 15 #include "base/run_loop.h" |
| 16 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
| 17 #include "base/strings/stringprintf.h" | 17 #include "base/strings/stringprintf.h" |
| 18 #include "base/test/test_timeouts.h" | |
| 18 #include "components/certificate_transparency/mock_log_dns_traffic.h" | 19 #include "components/certificate_transparency/mock_log_dns_traffic.h" |
| 19 #include "crypto/sha2.h" | 20 #include "crypto/sha2.h" |
| 20 #include "net/base/net_errors.h" | 21 #include "net/base/net_errors.h" |
| 21 #include "net/cert/merkle_audit_proof.h" | 22 #include "net/cert/merkle_audit_proof.h" |
| 22 #include "net/cert/signed_certificate_timestamp.h" | 23 #include "net/cert/signed_certificate_timestamp.h" |
| 23 #include "net/dns/dns_client.h" | 24 #include "net/dns/dns_client.h" |
| 24 #include "net/dns/dns_config_service.h" | 25 #include "net/dns/dns_config_service.h" |
| 25 #include "net/dns/dns_protocol.h" | 26 #include "net/dns/dns_protocol.h" |
| 26 #include "net/log/net_log.h" | 27 #include "net/log/net_log.h" |
| 27 #include "net/test/gtest_util.h" | 28 #include "net/test/gtest_util.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 63 const uint64_t kLeafIndices[] = {0, 1, 2}; | 64 const uint64_t kLeafIndices[] = {0, 1, 2}; |
| 64 const uint64_t kTreeSizes[] = {100, 10000, 1000000}; | 65 const uint64_t kTreeSizes[] = {100, 10000, 1000000}; |
| 65 | 66 |
| 66 // Only 7 audit proof nodes can fit into a DNS response, because they are sent | 67 // Only 7 audit proof nodes can fit into a DNS response, because they are sent |
| 67 // in a TXT RDATA string, which has a maximum size of 255 bytes, and each node | 68 // in a TXT RDATA string, which has a maximum size of 255 bytes, and each node |
| 68 // is a SHA-256 hash (32 bytes), i.e. (255 / 32) == 7. | 69 // is a SHA-256 hash (32 bytes), i.e. (255 / 32) == 7. |
| 69 // This means audit proofs consisting of more than 7 nodes require multiple DNS | 70 // This means audit proofs consisting of more than 7 nodes require multiple DNS |
| 70 // requests to retrieve. | 71 // requests to retrieve. |
| 71 const size_t kMaxProofNodesPerDnsResponse = 7; | 72 const size_t kMaxProofNodesPerDnsResponse = 7; |
| 72 | 73 |
| 74 // Returns an example Merkle audit proof containing |length| nodes. | |
| 75 // The proof cannot be used for cryptographic purposes; it is merely a | |
| 76 // placeholder. | |
| 73 std::vector<std::string> GetSampleAuditProof(size_t length) { | 77 std::vector<std::string> GetSampleAuditProof(size_t length) { |
| 74 std::vector<std::string> audit_proof(length); | 78 std::vector<std::string> audit_proof(length); |
| 75 // Makes each node of the audit proof different, so that tests are able to | 79 // Makes each node of the audit proof different, so that tests are able to |
| 76 // confirm that the audit proof is reconstructed in the correct order. | 80 // confirm that the audit proof is reconstructed in the correct order. |
| 77 for (size_t i = 0; i < length; ++i) { | 81 for (size_t i = 0; i < length; ++i) { |
| 78 std::string node(crypto::kSHA256Length, '\0'); | 82 std::string node(crypto::kSHA256Length, '\0'); |
| 79 // Each node is 32 bytes, with each byte having a different value. | 83 // Each node is 32 bytes, with each byte having a different value. |
| 80 for (size_t j = 0; j < crypto::kSHA256Length; ++j) { | 84 for (size_t j = 0; j < crypto::kSHA256Length; ++j) { |
| 81 node[j] = static_cast<char>((-127 + i + j) % 128); | 85 node[j] = static_cast<char>((-127 + i + j) % 128); |
| 82 } | 86 } |
| 83 audit_proof[i].assign(std::move(node)); | 87 audit_proof[i].assign(std::move(node)); |
| 84 } | 88 } |
| 85 | 89 |
| 86 return audit_proof; | 90 return audit_proof; |
| 87 } | 91 } |
| 88 | 92 |
| 93 // MockAuditProofCallback can be used as an AuditProofCallback. | |
| 94 // It will record the arguments it is invoked with and provides a helpful | |
| 95 // method for pumping the message loop until it is invoked. | |
| 89 class MockAuditProofCallback { | 96 class MockAuditProofCallback { |
| 90 public: | 97 public: |
| 91 MockAuditProofCallback() : called_(false) {} | 98 MockAuditProofCallback() : called_(false) {} |
| 92 | 99 |
| 93 bool called() const { return called_; } | 100 bool called() const { return called_; } |
| 94 int net_error() const { return net_error_; } | 101 int net_error() const { return net_error_; } |
| 95 const net::ct::MerkleAuditProof* proof() const { return proof_.get(); } | 102 const net::ct::MerkleAuditProof* proof() const { return proof_.get(); } |
| 96 | 103 |
| 104 // Get this callback as an AuditProofCallback. | |
| 105 LogDnsClient::AuditProofCallback AsCallback() { | |
| 106 return base::Bind(&MockAuditProofCallback::Run, base::Unretained(this)); | |
| 107 } | |
| 108 | |
| 109 // Wait until either the callback is invoked or the message loop goes idle | |
| 110 // (after a specified |timeout|). Returns immediately if the callback has | |
| 111 // already been invoked. | |
| 112 void WaitUntilRun(base::TimeDelta timeout) { | |
| 113 if (called_) { | |
| 114 return; | |
| 115 } | |
| 116 | |
| 117 // Pump the message loop until the the callback is invoked, which quits the | |
| 118 // RunLoop, or a timeout expires and the message loop goes idle. | |
| 119 run_loop_.reset(new base::RunLoop()); | |
| 120 base::Closure quit_closure = run_loop_->QuitWhenIdleClosure(); | |
| 121 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE, | |
| 122 quit_closure, timeout); | |
| 123 run_loop_->Run(); | |
| 124 run_loop_.reset(); | |
| 125 } | |
| 126 | |
| 127 private: | |
| 97 void Run(int net_error, std::unique_ptr<net::ct::MerkleAuditProof> proof) { | 128 void Run(int net_error, std::unique_ptr<net::ct::MerkleAuditProof> proof) { |
| 98 EXPECT_TRUE(!called_) << "Callback invoked more than once"; | 129 EXPECT_TRUE(!called_) << "Callback invoked more than once"; |
| 99 called_ = true; | 130 called_ = true; |
| 100 net_error_ = net_error; | 131 net_error_ = net_error; |
| 101 proof_ = std::move(proof); | 132 proof_ = std::move(proof); |
| 102 run_loop_.Quit(); | 133 if (run_loop_) { |
| 134 run_loop_->Quit(); | |
| 135 } | |
| 103 } | 136 } |
| 104 | 137 |
| 105 LogDnsClient::AuditProofCallback AsCallback() { | 138 // True if the callback has been invoked. |
| 106 return base::Bind(&MockAuditProofCallback::Run, base::Unretained(this)); | |
| 107 } | |
| 108 | |
| 109 void WaitUntilRun() { run_loop_.Run(); } | |
| 110 | |
| 111 private: | |
| 112 bool called_; | 139 bool called_; |
| 140 // The arguments that the callback was invoked with. | |
| 113 int net_error_; | 141 int net_error_; |
| 114 std::unique_ptr<net::ct::MerkleAuditProof> proof_; | 142 std::unique_ptr<net::ct::MerkleAuditProof> proof_; |
| 115 base::RunLoop run_loop_; | 143 // The RunLoop currently being used to pump the message loop, as a means to |
| 144 // execute this callback. | |
| 145 std::unique_ptr<base::RunLoop> run_loop_; | |
| 116 }; | 146 }; |
| 117 | 147 |
| 118 class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> { | 148 class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> { |
| 119 protected: | 149 protected: |
| 120 LogDnsClientTest() | 150 LogDnsClientTest() |
| 121 : network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) { | 151 : network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) { |
| 122 mock_dns_.SetSocketReadMode(GetParam()); | 152 mock_dns_.SetSocketReadMode(GetParam()); |
| 123 mock_dns_.InitializeDnsConfig(); | 153 mock_dns_.InitializeDnsConfig(); |
| 124 } | 154 } |
| 125 | 155 |
| 126 std::unique_ptr<LogDnsClient> CreateLogDnsClient( | 156 std::unique_ptr<LogDnsClient> CreateLogDnsClient( |
| 127 size_t kMaxConcurrentQueries) { | 157 size_t kMaxConcurrentQueries) { |
| 128 return base::MakeUnique<LogDnsClient>( | 158 return base::MakeUnique<LogDnsClient>( |
| 129 mock_dns_.CreateDnsClient(), net::BoundNetLog(), kMaxConcurrentQueries); | 159 mock_dns_.CreateDnsClient(), net::BoundNetLog(), kMaxConcurrentQueries); |
| 130 } | 160 } |
| 131 | 161 |
| 132 void QueryAuditProofAsync(LogDnsClient* log_client, | 162 int QueryAuditProofAsync(LogDnsClient* log_client, |
| 133 const std::string& log_domain, | 163 const std::string& log_domain, |
| 134 const char leaf_hash[crypto::kSHA256Length], | 164 const char leaf_hash[crypto::kSHA256Length], |
| 135 uint64_t tree_size, | 165 uint64_t tree_size, |
| 136 const LogDnsClient::AuditProofCallback& callback) { | 166 const LogDnsClient::AuditProofCallback& callback) { |
| 137 log_client->QueryAuditProof(log_domain, leaf_hash, tree_size, callback); | 167 return log_client->QueryAuditProof(log_domain, leaf_hash, tree_size, |
| 168 callback); | |
| 138 } | 169 } |
| 139 | 170 |
| 140 // Convenience function for calling QueryAuditProofAsync synchronously. | 171 // Convenience function for calling ASSERT_THAT(QueryAuditProofAsync |
| 141 void QueryAuditProof(const std::string& log_domain, | 172 // synchronously. |
| 142 const char leaf_hash[crypto::kSHA256Length], | 173 int QueryAuditProof(const std::string& log_domain, |
| 143 uint64_t tree_size, | 174 const char leaf_hash[crypto::kSHA256Length], |
| 144 MockAuditProofCallback* callback) { | 175 uint64_t tree_size, |
| 176 MockAuditProofCallback* callback) { | |
| 145 std::unique_ptr<LogDnsClient> log_client = CreateLogDnsClient(0); | 177 std::unique_ptr<LogDnsClient> log_client = CreateLogDnsClient(0); |
| 146 QueryAuditProofAsync(log_client.get(), log_domain, leaf_hash, tree_size, | 178 int result = QueryAuditProofAsync(log_client.get(), log_domain, leaf_hash, |
| 147 callback->AsCallback()); | 179 tree_size, callback->AsCallback()); |
| 148 callback->WaitUntilRun(); | 180 if (result == net::ERR_IO_PENDING) { |
| 181 callback->WaitUntilRun(TestTimeouts::action_max_timeout()); | |
| 182 } else { | |
|
Eran Messeri
2016/09/28 13:44:08
It is unclear to me why the result from QueryAudit
Rob Percival
2016/09/28 16:19:14
If LogDnsClient::QueryAuditProof returns ERR_IO_PE
| |
| 183 // The callback isn't expected to be invoked, but pump the message loop | |
| 184 // anyway to confirm that it indeed isn't run. Give up as soon as the | |
| 185 // message loop is empty (zero timeout). | |
| 186 callback->WaitUntilRun(base::TimeDelta()); | |
| 187 } | |
| 188 return result; | |
| 149 } | 189 } |
| 150 | 190 |
| 151 // This will be the NetworkChangeNotifier singleton for the duration of the | 191 // This will be the NetworkChangeNotifier singleton for the duration of the |
| 152 // test. It is accessed statically by LogDnsClient. | 192 // test. It is accessed statically by LogDnsClient. |
| 153 std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; | 193 std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; |
| 154 // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient, | 194 // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient, |
| 155 // the underlying net::DnsClient, and NetworkChangeNotifier. | 195 // the underlying net::DnsClient, and NetworkChangeNotifier. |
| 156 base::MessageLoopForIO message_loop_; | 196 base::MessageLoopForIO message_loop_; |
| 157 // Allows mock DNS sockets to be setup. | 197 // Allows mock DNS sockets to be setup. |
| 158 MockLogDnsTraffic mock_dns_; | 198 MockLogDnsTraffic mock_dns_; |
| 159 }; | 199 }; |
| 160 | 200 |
| 161 TEST_P(LogDnsClientTest, QueryAuditProofReportsThatLogDomainDoesNotExist) { | 201 TEST_P(LogDnsClientTest, QueryAuditProofReportsThatLogDomainDoesNotExist) { |
| 162 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], | 202 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], |
| 163 net::dns_protocol::kRcodeNXDOMAIN); | 203 net::dns_protocol::kRcodeNXDOMAIN); |
| 164 | 204 |
| 165 MockAuditProofCallback callback; | 205 MockAuditProofCallback callback; |
| 166 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 206 ASSERT_THAT( |
| 207 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 208 IsError(net::ERR_IO_PENDING)); | |
| 167 ASSERT_TRUE(callback.called()); | 209 ASSERT_TRUE(callback.called()); |
| 168 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); | 210 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); |
| 169 EXPECT_THAT(callback.proof(), IsNull()); | 211 EXPECT_THAT(callback.proof(), IsNull()); |
| 170 } | 212 } |
| 171 | 213 |
| 172 TEST_P(LogDnsClientTest, | 214 TEST_P(LogDnsClientTest, |
| 173 QueryAuditProofReportsServerFailuresDuringLeafIndexRequests) { | 215 QueryAuditProofReportsServerFailuresDuringLeafIndexRequests) { |
| 174 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], | 216 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], |
| 175 net::dns_protocol::kRcodeSERVFAIL); | 217 net::dns_protocol::kRcodeSERVFAIL); |
| 176 | 218 |
| 177 MockAuditProofCallback callback; | 219 MockAuditProofCallback callback; |
| 178 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 220 ASSERT_THAT( |
| 221 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 222 IsError(net::ERR_IO_PENDING)); | |
| 179 ASSERT_TRUE(callback.called()); | 223 ASSERT_TRUE(callback.called()); |
| 180 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); | 224 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); |
| 181 EXPECT_THAT(callback.proof(), IsNull()); | 225 EXPECT_THAT(callback.proof(), IsNull()); |
| 182 } | 226 } |
| 183 | 227 |
| 184 TEST_P(LogDnsClientTest, | 228 TEST_P(LogDnsClientTest, |
| 185 QueryAuditProofReportsServerRefusalsDuringLeafIndexRequests) { | 229 QueryAuditProofReportsServerRefusalsDuringLeafIndexRequests) { |
| 186 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], | 230 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], |
| 187 net::dns_protocol::kRcodeREFUSED); | 231 net::dns_protocol::kRcodeREFUSED); |
| 188 | 232 |
| 189 MockAuditProofCallback callback; | 233 MockAuditProofCallback callback; |
| 190 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 234 ASSERT_THAT( |
| 235 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 236 IsError(net::ERR_IO_PENDING)); | |
| 191 ASSERT_TRUE(callback.called()); | 237 ASSERT_TRUE(callback.called()); |
| 192 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); | 238 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); |
| 193 EXPECT_THAT(callback.proof(), IsNull()); | 239 EXPECT_THAT(callback.proof(), IsNull()); |
| 194 } | 240 } |
| 195 | 241 |
| 196 TEST_P(LogDnsClientTest, | 242 TEST_P(LogDnsClientTest, |
| 197 QueryAuditProofReportsMalformedResponseIfLeafIndexIsNotNumeric) { | 243 QueryAuditProofReportsMalformedResponseIfLeafIndexIsNotNumeric) { |
| 198 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "foo"); | 244 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "foo"); |
| 199 | 245 |
| 200 MockAuditProofCallback callback; | 246 MockAuditProofCallback callback; |
| 201 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 247 ASSERT_THAT( |
| 248 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 249 IsError(net::ERR_IO_PENDING)); | |
| 202 ASSERT_TRUE(callback.called()); | 250 ASSERT_TRUE(callback.called()); |
| 203 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | 251 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 204 EXPECT_THAT(callback.proof(), IsNull()); | 252 EXPECT_THAT(callback.proof(), IsNull()); |
| 205 } | 253 } |
| 206 | 254 |
| 207 TEST_P(LogDnsClientTest, | 255 TEST_P(LogDnsClientTest, |
| 208 QueryAuditProofReportsMalformedResponseIfLeafIndexIsFloatingPoint) { | 256 QueryAuditProofReportsMalformedResponseIfLeafIndexIsFloatingPoint) { |
| 209 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456.0"); | 257 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456.0"); |
| 210 | 258 |
| 211 MockAuditProofCallback callback; | 259 MockAuditProofCallback callback; |
| 212 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 260 ASSERT_THAT( |
| 261 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 262 IsError(net::ERR_IO_PENDING)); | |
| 213 ASSERT_TRUE(callback.called()); | 263 ASSERT_TRUE(callback.called()); |
| 214 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | 264 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 215 EXPECT_THAT(callback.proof(), IsNull()); | 265 EXPECT_THAT(callback.proof(), IsNull()); |
| 216 } | 266 } |
| 217 | 267 |
| 218 TEST_P(LogDnsClientTest, | 268 TEST_P(LogDnsClientTest, |
| 219 QueryAuditProofReportsMalformedResponseIfLeafIndexIsEmpty) { | 269 QueryAuditProofReportsMalformedResponseIfLeafIndexIsEmpty) { |
| 220 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], ""); | 270 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], ""); |
| 221 | 271 |
| 222 MockAuditProofCallback callback; | 272 MockAuditProofCallback callback; |
| 223 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 273 ASSERT_THAT( |
| 274 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 275 IsError(net::ERR_IO_PENDING)); | |
| 224 ASSERT_TRUE(callback.called()); | 276 ASSERT_TRUE(callback.called()); |
| 225 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | 277 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 226 EXPECT_THAT(callback.proof(), IsNull()); | 278 EXPECT_THAT(callback.proof(), IsNull()); |
| 227 } | 279 } |
| 228 | 280 |
| 229 TEST_P(LogDnsClientTest, | 281 TEST_P(LogDnsClientTest, |
| 230 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericPrefix) { | 282 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericPrefix) { |
| 231 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "foo123456"); | 283 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "foo123456"); |
| 232 | 284 |
| 233 MockAuditProofCallback callback; | 285 MockAuditProofCallback callback; |
| 234 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 286 ASSERT_THAT( |
| 287 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 288 IsError(net::ERR_IO_PENDING)); | |
| 235 ASSERT_TRUE(callback.called()); | 289 ASSERT_TRUE(callback.called()); |
| 236 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | 290 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 237 EXPECT_THAT(callback.proof(), IsNull()); | 291 EXPECT_THAT(callback.proof(), IsNull()); |
| 238 } | 292 } |
| 239 | 293 |
| 240 TEST_P(LogDnsClientTest, | 294 TEST_P(LogDnsClientTest, |
| 241 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericSuffix) { | 295 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericSuffix) { |
| 242 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456foo"); | 296 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456foo"); |
| 243 | 297 |
| 244 MockAuditProofCallback callback; | 298 MockAuditProofCallback callback; |
| 245 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 299 ASSERT_THAT( |
| 300 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 301 IsError(net::ERR_IO_PENDING)); | |
| 246 ASSERT_TRUE(callback.called()); | 302 ASSERT_TRUE(callback.called()); |
| 247 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | 303 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 248 EXPECT_THAT(callback.proof(), IsNull()); | 304 EXPECT_THAT(callback.proof(), IsNull()); |
| 249 } | 305 } |
| 250 | 306 |
| 251 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLogDomainIsEmpty) { | 307 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLogDomainIsEmpty) { |
| 252 MockAuditProofCallback callback; | 308 MockAuditProofCallback callback; |
| 253 QueryAuditProof("", kLeafHashes[0], kTreeSizes[0], &callback); | 309 ASSERT_THAT(QueryAuditProof("", kLeafHashes[0], kTreeSizes[0], &callback), |
| 254 ASSERT_TRUE(callback.called()); | 310 IsError(net::ERR_INVALID_ARGUMENT)); |
| 255 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | 311 ASSERT_FALSE(callback.called()); |
| 256 EXPECT_THAT(callback.proof(), IsNull()); | |
| 257 } | 312 } |
| 258 | 313 |
| 259 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsInvalid) { | 314 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsInvalid) { |
| 260 MockAuditProofCallback callback; | 315 MockAuditProofCallback callback; |
| 261 QueryAuditProof("ct.test", "foo", kTreeSizes[0], &callback); | 316 ASSERT_THAT(QueryAuditProof("ct.test", "foo", kTreeSizes[0], &callback), |
| 262 ASSERT_TRUE(callback.called()); | 317 IsError(net::ERR_INVALID_ARGUMENT)); |
| 263 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | 318 ASSERT_FALSE(callback.called()); |
| 264 EXPECT_THAT(callback.proof(), IsNull()); | |
| 265 } | 319 } |
| 266 | 320 |
| 267 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsEmpty) { | 321 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsEmpty) { |
| 268 MockAuditProofCallback callback; | 322 MockAuditProofCallback callback; |
| 269 QueryAuditProof("ct.test", "", kTreeSizes[0], &callback); | 323 ASSERT_THAT(QueryAuditProof("ct.test", "", kTreeSizes[0], &callback), |
| 270 ASSERT_TRUE(callback.called()); | 324 IsError(net::ERR_INVALID_ARGUMENT)); |
| 271 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | 325 ASSERT_FALSE(callback.called()); |
| 272 EXPECT_THAT(callback.proof(), IsNull()); | |
| 273 } | 326 } |
| 274 | 327 |
| 275 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsNull) { | 328 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsNull) { |
| 276 MockAuditProofCallback callback; | 329 MockAuditProofCallback callback; |
| 277 QueryAuditProof("ct.test", nullptr, kTreeSizes[0], &callback); | 330 ASSERT_THAT(QueryAuditProof("ct.test", nullptr, kTreeSizes[0], &callback), |
| 278 ASSERT_TRUE(callback.called()); | 331 IsError(net::ERR_INVALID_ARGUMENT)); |
| 279 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | 332 ASSERT_FALSE(callback.called()); |
| 280 EXPECT_THAT(callback.proof(), IsNull()); | |
| 281 } | 333 } |
| 282 | 334 |
| 283 TEST_P(LogDnsClientTest, | 335 TEST_P(LogDnsClientTest, |
| 284 QueryAuditProofReportsSocketErrorsDuringLeafIndexRequests) { | 336 QueryAuditProofReportsSocketErrorsDuringLeafIndexRequests) { |
| 285 mock_dns_.ExpectRequestAndSocketError(kLeafIndexQnames[0], | 337 mock_dns_.ExpectRequestAndSocketError(kLeafIndexQnames[0], |
| 286 net::ERR_CONNECTION_REFUSED); | 338 net::ERR_CONNECTION_REFUSED); |
| 287 | 339 |
| 288 MockAuditProofCallback callback; | 340 MockAuditProofCallback callback; |
| 289 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 341 ASSERT_THAT( |
| 342 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 343 IsError(net::ERR_IO_PENDING)); | |
| 290 ASSERT_TRUE(callback.called()); | 344 ASSERT_TRUE(callback.called()); |
| 291 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); | 345 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); |
| 292 EXPECT_THAT(callback.proof(), IsNull()); | 346 EXPECT_THAT(callback.proof(), IsNull()); |
| 293 } | 347 } |
| 294 | 348 |
| 295 TEST_P(LogDnsClientTest, | 349 TEST_P(LogDnsClientTest, |
| 296 QueryAuditProofReportsTimeoutsDuringLeafIndexRequests) { | 350 QueryAuditProofReportsTimeoutsDuringLeafIndexRequests) { |
| 297 mock_dns_.ExpectRequestAndTimeout(kLeafIndexQnames[0]); | 351 mock_dns_.ExpectRequestAndTimeout(kLeafIndexQnames[0]); |
| 298 | 352 |
| 299 MockAuditProofCallback callback; | 353 MockAuditProofCallback callback; |
| 300 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 354 ASSERT_THAT( |
| 355 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback), | |
| 356 IsError(net::ERR_IO_PENDING)); | |
| 357 | |
| 358 callback.WaitUntilRun(TestTimeouts::action_max_timeout()); | |
| 301 ASSERT_TRUE(callback.called()); | 359 ASSERT_TRUE(callback.called()); |
| 302 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); | 360 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); |
| 303 EXPECT_THAT(callback.proof(), IsNull()); | 361 EXPECT_THAT(callback.proof(), IsNull()); |
| 304 } | 362 } |
| 305 | 363 |
| 306 TEST_P(LogDnsClientTest, QueryAuditProof) { | 364 TEST_P(LogDnsClientTest, QueryAuditProof) { |
| 307 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); | 365 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); |
| 308 | 366 |
| 309 // Expect a leaf index query first, to map the leaf hash to a leaf index. | 367 // Expect a leaf index query first, to map the leaf hash to a leaf index. |
| 310 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 368 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 311 | 369 |
| 312 // It takes a number of DNS requests to retrieve the entire |audit_proof| | 370 // It takes a number of DNS requests to retrieve the entire |audit_proof| |
| 313 // (see |kMaxProofNodesPerDnsResponse|). | 371 // (see |kMaxProofNodesPerDnsResponse|). |
| 314 for (size_t nodes_begin = 0; nodes_begin < audit_proof.size(); | 372 for (size_t nodes_begin = 0; nodes_begin < audit_proof.size(); |
| 315 nodes_begin += kMaxProofNodesPerDnsResponse) { | 373 nodes_begin += kMaxProofNodesPerDnsResponse) { |
| 316 const size_t nodes_end = std::min( | 374 const size_t nodes_end = std::min( |
| 317 nodes_begin + kMaxProofNodesPerDnsResponse, audit_proof.size()); | 375 nodes_begin + kMaxProofNodesPerDnsResponse, audit_proof.size()); |
| 318 | 376 |
| 319 mock_dns_.ExpectAuditProofRequestAndResponse( | 377 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 320 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), | 378 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), |
| 321 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); | 379 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); |
| 322 } | 380 } |
| 323 | 381 |
| 324 MockAuditProofCallback callback; | 382 MockAuditProofCallback callback; |
| 325 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 383 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 384 IsError(net::ERR_IO_PENDING)); | |
| 326 ASSERT_TRUE(callback.called()); | 385 ASSERT_TRUE(callback.called()); |
| 327 EXPECT_THAT(callback.net_error(), IsOk()); | 386 EXPECT_THAT(callback.net_error(), IsOk()); |
| 328 ASSERT_THAT(callback.proof(), NotNull()); | 387 ASSERT_THAT(callback.proof(), NotNull()); |
| 329 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); | 388 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); |
| 330 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 389 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 331 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); | 390 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); |
| 332 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); | 391 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); |
| 333 } | 392 } |
| 334 | 393 |
| 335 TEST_P(LogDnsClientTest, QueryAuditProofHandlesResponsesWithShortAuditPaths) { | 394 TEST_P(LogDnsClientTest, QueryAuditProofHandlesResponsesWithShortAuditPaths) { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 352 audit_proof.begin() + 6, | 411 audit_proof.begin() + 6, |
| 353 audit_proof.begin() + 10); | 412 audit_proof.begin() + 10); |
| 354 mock_dns_.ExpectAuditProofRequestAndResponse("10.123456.999999.tree.ct.test.", | 413 mock_dns_.ExpectAuditProofRequestAndResponse("10.123456.999999.tree.ct.test.", |
| 355 audit_proof.begin() + 10, | 414 audit_proof.begin() + 10, |
| 356 audit_proof.begin() + 13); | 415 audit_proof.begin() + 13); |
| 357 mock_dns_.ExpectAuditProofRequestAndResponse("13.123456.999999.tree.ct.test.", | 416 mock_dns_.ExpectAuditProofRequestAndResponse("13.123456.999999.tree.ct.test.", |
| 358 audit_proof.begin() + 13, | 417 audit_proof.begin() + 13, |
| 359 audit_proof.end()); | 418 audit_proof.end()); |
| 360 | 419 |
| 361 MockAuditProofCallback callback; | 420 MockAuditProofCallback callback; |
| 362 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 421 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 422 IsError(net::ERR_IO_PENDING)); | |
| 363 ASSERT_TRUE(callback.called()); | 423 ASSERT_TRUE(callback.called()); |
| 364 EXPECT_THAT(callback.net_error(), IsOk()); | 424 EXPECT_THAT(callback.net_error(), IsOk()); |
| 365 ASSERT_THAT(callback.proof(), NotNull()); | 425 ASSERT_THAT(callback.proof(), NotNull()); |
| 366 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); | 426 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); |
| 367 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 427 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 368 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); | 428 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); |
| 369 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); | 429 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); |
| 370 } | 430 } |
| 371 | 431 |
| 372 TEST_P(LogDnsClientTest, | 432 TEST_P(LogDnsClientTest, |
| 373 QueryAuditProofReportsThatAuditProofQnameDoesNotExist) { | 433 QueryAuditProofReportsThatAuditProofQnameDoesNotExist) { |
| 374 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 434 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 375 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", | 435 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", |
| 376 net::dns_protocol::kRcodeNXDOMAIN); | 436 net::dns_protocol::kRcodeNXDOMAIN); |
| 377 | 437 |
| 378 MockAuditProofCallback callback; | 438 MockAuditProofCallback callback; |
| 379 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 439 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 440 IsError(net::ERR_IO_PENDING)); | |
| 380 ASSERT_TRUE(callback.called()); | 441 ASSERT_TRUE(callback.called()); |
| 381 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); | 442 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); |
| 382 EXPECT_THAT(callback.proof(), IsNull()); | 443 EXPECT_THAT(callback.proof(), IsNull()); |
| 383 } | 444 } |
| 384 | 445 |
| 385 TEST_P(LogDnsClientTest, | 446 TEST_P(LogDnsClientTest, |
| 386 QueryAuditProofReportsServerFailureDuringAuditProofRequests) { | 447 QueryAuditProofReportsServerFailuresDuringAuditProofRequests) { |
| 387 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 448 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 388 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", | 449 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", |
| 389 net::dns_protocol::kRcodeSERVFAIL); | 450 net::dns_protocol::kRcodeSERVFAIL); |
| 390 | 451 |
| 391 MockAuditProofCallback callback; | 452 MockAuditProofCallback callback; |
| 392 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 453 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 454 IsError(net::ERR_IO_PENDING)); | |
| 393 ASSERT_TRUE(callback.called()); | 455 ASSERT_TRUE(callback.called()); |
| 394 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); | 456 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); |
| 395 EXPECT_THAT(callback.proof(), IsNull()); | 457 EXPECT_THAT(callback.proof(), IsNull()); |
| 396 } | 458 } |
| 397 | 459 |
| 398 TEST_P(LogDnsClientTest, | 460 TEST_P(LogDnsClientTest, |
| 399 QueryAuditProofReportsServerRefusalDuringAuditProofRequests) { | 461 QueryAuditProofReportsServerRefusalsDuringAuditProofRequests) { |
| 400 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 462 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 401 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", | 463 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", |
| 402 net::dns_protocol::kRcodeREFUSED); | 464 net::dns_protocol::kRcodeREFUSED); |
| 403 | 465 |
| 404 MockAuditProofCallback callback; | 466 MockAuditProofCallback callback; |
| 405 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 467 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 468 IsError(net::ERR_IO_PENDING)); | |
| 406 ASSERT_TRUE(callback.called()); | 469 ASSERT_TRUE(callback.called()); |
| 407 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); | 470 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); |
| 408 EXPECT_THAT(callback.proof(), IsNull()); | 471 EXPECT_THAT(callback.proof(), IsNull()); |
| 409 } | 472 } |
| 410 | 473 |
| 411 TEST_P(LogDnsClientTest, | 474 TEST_P(LogDnsClientTest, |
| 412 QueryAuditProofReportsResponseMalformedIfNodeTooShort) { | 475 QueryAuditProofReportsResponseMalformedIfNodeTooShort) { |
| 413 // node is shorter than a SHA-256 hash (31 vs 32 bytes) | 476 // node is shorter than a SHA-256 hash (31 vs 32 bytes) |
| 414 const std::vector<std::string> audit_proof(1, std::string(31, 'a')); | 477 const std::vector<std::string> audit_proof(1, std::string(31, 'a')); |
| 415 | 478 |
| 416 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 479 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 417 mock_dns_.ExpectAuditProofRequestAndResponse( | 480 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 418 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); | 481 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); |
| 419 | 482 |
| 420 MockAuditProofCallback callback; | 483 MockAuditProofCallback callback; |
| 421 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 484 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 485 IsError(net::ERR_IO_PENDING)); | |
| 422 ASSERT_TRUE(callback.called()); | 486 ASSERT_TRUE(callback.called()); |
| 423 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | 487 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 424 EXPECT_THAT(callback.proof(), IsNull()); | 488 EXPECT_THAT(callback.proof(), IsNull()); |
| 425 } | 489 } |
| 426 | 490 |
| 427 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfNodeTooLong) { | 491 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfNodeTooLong) { |
| 428 // node is longer than a SHA-256 hash (33 vs 32 bytes) | 492 // node is longer than a SHA-256 hash (33 vs 32 bytes) |
| 429 const std::vector<std::string> audit_proof(1, std::string(33, 'a')); | 493 const std::vector<std::string> audit_proof(1, std::string(33, 'a')); |
| 430 | 494 |
| 431 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 495 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 432 mock_dns_.ExpectAuditProofRequestAndResponse( | 496 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 433 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); | 497 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); |
| 434 | 498 |
| 435 MockAuditProofCallback callback; | 499 MockAuditProofCallback callback; |
| 436 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 500 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 501 IsError(net::ERR_IO_PENDING)); | |
| 437 ASSERT_TRUE(callback.called()); | 502 ASSERT_TRUE(callback.called()); |
| 438 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | 503 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 439 EXPECT_THAT(callback.proof(), IsNull()); | 504 EXPECT_THAT(callback.proof(), IsNull()); |
| 440 } | 505 } |
| 441 | 506 |
| 442 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfEmpty) { | 507 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfEmpty) { |
| 443 const std::vector<std::string> audit_proof; | 508 const std::vector<std::string> audit_proof; |
| 444 | 509 |
| 445 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 510 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 446 mock_dns_.ExpectAuditProofRequestAndResponse( | 511 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 447 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); | 512 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); |
| 448 | 513 |
| 449 MockAuditProofCallback callback; | 514 MockAuditProofCallback callback; |
| 450 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 515 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 516 IsError(net::ERR_IO_PENDING)); | |
| 451 ASSERT_TRUE(callback.called()); | 517 ASSERT_TRUE(callback.called()); |
| 452 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | 518 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 453 EXPECT_THAT(callback.proof(), IsNull()); | 519 EXPECT_THAT(callback.proof(), IsNull()); |
| 454 } | 520 } |
| 455 | 521 |
| 456 TEST_P(LogDnsClientTest, | 522 TEST_P(LogDnsClientTest, |
| 457 QueryAuditProofReportsInvalidArgIfLeafIndexEqualToTreeSize) { | 523 QueryAuditProofReportsInvalidArgIfLeafIndexEqualToTreeSize) { |
| 458 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 524 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 459 | 525 |
| 460 MockAuditProofCallback callback; | 526 MockAuditProofCallback callback; |
| 461 QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback); | 527 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback), |
| 528 IsError(net::ERR_IO_PENDING)); | |
| 462 ASSERT_TRUE(callback.called()); | 529 ASSERT_TRUE(callback.called()); |
| 463 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | 530 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); |
| 464 EXPECT_THAT(callback.proof(), IsNull()); | 531 EXPECT_THAT(callback.proof(), IsNull()); |
| 465 } | 532 } |
| 466 | 533 |
| 467 TEST_P(LogDnsClientTest, | 534 TEST_P(LogDnsClientTest, |
| 468 QueryAuditProofReportsInvalidArgIfLeafIndexGreaterThanTreeSize) { | 535 QueryAuditProofReportsInvalidArgIfLeafIndexGreaterThanTreeSize) { |
| 469 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "999999"); | 536 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "999999"); |
| 470 | 537 |
| 471 MockAuditProofCallback callback; | 538 MockAuditProofCallback callback; |
| 472 QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback); | 539 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback), |
| 540 IsError(net::ERR_IO_PENDING)); | |
| 473 ASSERT_TRUE(callback.called()); | 541 ASSERT_TRUE(callback.called()); |
| 474 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | 542 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); |
| 475 EXPECT_THAT(callback.proof(), IsNull()); | 543 EXPECT_THAT(callback.proof(), IsNull()); |
| 476 } | 544 } |
| 477 | 545 |
| 478 TEST_P(LogDnsClientTest, | 546 TEST_P(LogDnsClientTest, |
| 479 QueryAuditProofReportsSocketErrorsDuringAuditProofRequests) { | 547 QueryAuditProofReportsSocketErrorsDuringAuditProofRequests) { |
| 480 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 548 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 481 mock_dns_.ExpectRequestAndSocketError("0.123456.999999.tree.ct.test.", | 549 mock_dns_.ExpectRequestAndSocketError("0.123456.999999.tree.ct.test.", |
| 482 net::ERR_CONNECTION_REFUSED); | 550 net::ERR_CONNECTION_REFUSED); |
| 483 | 551 |
| 484 MockAuditProofCallback callback; | 552 MockAuditProofCallback callback; |
| 485 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 553 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 554 IsError(net::ERR_IO_PENDING)); | |
| 486 ASSERT_TRUE(callback.called()); | 555 ASSERT_TRUE(callback.called()); |
| 487 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); | 556 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); |
| 488 EXPECT_THAT(callback.proof(), IsNull()); | 557 EXPECT_THAT(callback.proof(), IsNull()); |
| 489 } | 558 } |
| 490 | 559 |
| 491 TEST_P(LogDnsClientTest, | 560 TEST_P(LogDnsClientTest, |
| 492 QueryAuditProofReportsTimeoutsDuringAuditProofRequests) { | 561 QueryAuditProofReportsTimeoutsDuringAuditProofRequests) { |
| 493 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); | 562 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); |
| 494 mock_dns_.ExpectRequestAndTimeout("0.123456.999999.tree.ct.test."); | 563 mock_dns_.ExpectRequestAndTimeout("0.123456.999999.tree.ct.test."); |
| 495 | 564 |
| 496 MockAuditProofCallback callback; | 565 MockAuditProofCallback callback; |
| 497 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 566 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback), |
| 567 IsError(net::ERR_IO_PENDING)); | |
| 568 | |
| 569 callback.WaitUntilRun(TestTimeouts::action_max_timeout()); | |
| 498 ASSERT_TRUE(callback.called()); | 570 ASSERT_TRUE(callback.called()); |
| 499 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); | 571 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); |
| 500 EXPECT_THAT(callback.proof(), IsNull()); | 572 EXPECT_THAT(callback.proof(), IsNull()); |
| 501 } | 573 } |
| 502 | 574 |
| 503 TEST_P(LogDnsClientTest, AdoptsLatestDnsConfigIfValid) { | 575 TEST_P(LogDnsClientTest, AdoptsLatestDnsConfigIfValid) { |
| 504 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); | 576 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); |
| 505 net::DnsClient* dns_client = tmp.get(); | 577 net::DnsClient* dns_client = tmp.get(); |
| 506 LogDnsClient log_client(std::move(tmp), net::BoundNetLog(), 0); | 578 LogDnsClient log_client(std::move(tmp), net::BoundNetLog(), 0); |
| 507 | 579 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 551 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), | 623 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), |
| 552 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); | 624 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); |
| 553 } | 625 } |
| 554 | 626 |
| 555 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); | 627 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); |
| 556 net::DnsClient* dns_client = tmp.get(); | 628 net::DnsClient* dns_client = tmp.get(); |
| 557 LogDnsClient log_client(std::move(tmp), net::BoundNetLog(), 0); | 629 LogDnsClient log_client(std::move(tmp), net::BoundNetLog(), 0); |
| 558 | 630 |
| 559 // Start query. | 631 // Start query. |
| 560 MockAuditProofCallback callback; | 632 MockAuditProofCallback callback; |
| 561 QueryAuditProofAsync(&log_client, "ct.test", kLeafHashes[0], 999999, | 633 ASSERT_THAT(QueryAuditProofAsync(&log_client, "ct.test", kLeafHashes[0], |
| 562 callback.AsCallback()); | 634 999999, callback.AsCallback()), |
| 635 IsError(net::ERR_IO_PENDING)); | |
| 563 | 636 |
| 564 // Get the current DNS config, modify it and broadcast the update. | 637 // Get the current DNS config, modify it and broadcast the update. |
| 565 net::DnsConfig config(*dns_client->GetConfig()); | 638 net::DnsConfig config(*dns_client->GetConfig()); |
| 566 ASSERT_NE(123, config.attempts); | 639 ASSERT_NE(123, config.attempts); |
| 567 config.attempts = 123; | 640 config.attempts = 123; |
| 568 mock_dns_.SetDnsConfig(config); | 641 mock_dns_.SetDnsConfig(config); |
| 569 | 642 |
| 570 callback.WaitUntilRun(); | 643 callback.WaitUntilRun(TestTimeouts::action_max_timeout()); |
| 571 // Check that the DNS changes propogated before the query completed. | 644 // Check that the DNS changes propogated before the query completed. |
| 572 EXPECT_EQ(123, dns_client->GetConfig()->attempts); | 645 EXPECT_EQ(123, dns_client->GetConfig()->attempts); |
| 573 | 646 |
| 574 ASSERT_TRUE(callback.called()); | 647 ASSERT_TRUE(callback.called()); |
| 575 EXPECT_THAT(callback.net_error(), IsOk()); | 648 EXPECT_THAT(callback.net_error(), IsOk()); |
| 576 ASSERT_THAT(callback.proof(), NotNull()); | 649 ASSERT_THAT(callback.proof(), NotNull()); |
| 577 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); | 650 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); |
| 578 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 651 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 579 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); | 652 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); |
| 580 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); | 653 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 633 base::StringPrintf("%zu.%" PRIu64 ".%" PRIu64 ".tree.ct.test.", | 706 base::StringPrintf("%zu.%" PRIu64 ".%" PRIu64 ".tree.ct.test.", |
| 634 start_node, kLeafIndices[query_i], | 707 start_node, kLeafIndices[query_i], |
| 635 kTreeSizes[query_i]), | 708 kTreeSizes[query_i]), |
| 636 proof.begin() + start_node, proof.begin() + end_node); | 709 proof.begin() + start_node, proof.begin() + end_node); |
| 637 } | 710 } |
| 638 } | 711 } |
| 639 } | 712 } |
| 640 | 713 |
| 641 // Start the queries. | 714 // Start the queries. |
| 642 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { | 715 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { |
| 643 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[i], | 716 ASSERT_THAT( |
| 644 kTreeSizes[i], callbacks[i].AsCallback()); | 717 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[i], |
| 718 kTreeSizes[i], callbacks[i].AsCallback()), | |
| 719 IsError(net::ERR_IO_PENDING)) | |
| 720 << "query #" << i; | |
| 645 } | 721 } |
| 646 | 722 |
| 647 // Wait for each query to complete and check its results. | 723 // Wait for each query to complete and check its results. |
| 648 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { | 724 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { |
| 649 MockAuditProofCallback& callback = callbacks[i]; | 725 MockAuditProofCallback& callback = callbacks[i]; |
| 650 callbacks[i].WaitUntilRun(); | 726 callbacks[i].WaitUntilRun(TestTimeouts::action_max_timeout()); |
| 651 | 727 |
| 652 SCOPED_TRACE(testing::Message() << "callbacks[" << i << "]"); | 728 SCOPED_TRACE(testing::Message() << "callbacks[" << i << "]"); |
| 653 ASSERT_TRUE(callback.called()); | 729 ASSERT_TRUE(callback.called()); |
| 654 EXPECT_THAT(callback.net_error(), IsOk()); | 730 EXPECT_THAT(callback.net_error(), IsOk()); |
| 655 ASSERT_THAT(callback.proof(), NotNull()); | 731 ASSERT_THAT(callback.proof(), NotNull()); |
| 656 EXPECT_THAT(callback.proof()->leaf_index, Eq(kLeafIndices[i])); | 732 EXPECT_THAT(callback.proof()->leaf_index, Eq(kLeafIndices[i])); |
| 657 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 733 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 658 // EXPECT_THAT(callback.proof()->tree_size, kTreeSizes[i]); | 734 // EXPECT_THAT(callback.proof()->tree_size, kTreeSizes[i]); |
| 659 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proofs[i])); | 735 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proofs[i])); |
| 660 } | 736 } |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 680 audit_proof.begin() + 7, | 756 audit_proof.begin() + 7, |
| 681 audit_proof.begin() + 14); | 757 audit_proof.begin() + 14); |
| 682 mock_dns_.ExpectAuditProofRequestAndResponse("14.123456.999999.tree.ct.test.", | 758 mock_dns_.ExpectAuditProofRequestAndResponse("14.123456.999999.tree.ct.test.", |
| 683 audit_proof.begin() + 14, | 759 audit_proof.begin() + 14, |
| 684 audit_proof.end()); | 760 audit_proof.end()); |
| 685 | 761 |
| 686 const size_t kMaxConcurrentQueries = 1; | 762 const size_t kMaxConcurrentQueries = 1; |
| 687 std::unique_ptr<LogDnsClient> log_client = | 763 std::unique_ptr<LogDnsClient> log_client = |
| 688 CreateLogDnsClient(kMaxConcurrentQueries); | 764 CreateLogDnsClient(kMaxConcurrentQueries); |
| 689 | 765 |
| 690 // Start the queries. | 766 // Try to start the queries. |
| 691 MockAuditProofCallback callback1; | 767 MockAuditProofCallback callback1; |
| 692 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[0], 999999, | 768 ASSERT_THAT(QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[0], |
| 693 callback1.AsCallback()); | 769 999999, callback1.AsCallback()), |
| 770 IsError(net::ERR_IO_PENDING)); | |
| 771 | |
| 694 MockAuditProofCallback callback2; | 772 MockAuditProofCallback callback2; |
| 695 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[1], 999999, | 773 ASSERT_THAT(QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[1], |
| 696 callback2.AsCallback()); | 774 999999, callback2.AsCallback()), |
| 775 IsError(net::ERR_TEMPORARILY_THROTTLED)); | |
| 697 | 776 |
| 698 callback1.WaitUntilRun(); | 777 // Give the queries a chance to run. |
| 699 callback2.WaitUntilRun(); | 778 callback1.WaitUntilRun(TestTimeouts::action_max_timeout()); |
| 779 // This callback shouldn't run, so don't wait much longer for it. | |
| 780 callback2.WaitUntilRun(TestTimeouts::tiny_timeout()); | |
| 700 | 781 |
| 701 // Check that the first query succeeded. | 782 // Check that the first query succeeded. |
| 702 ASSERT_TRUE(callback1.called()); | 783 ASSERT_TRUE(callback1.called()); |
| 703 EXPECT_THAT(callback1.net_error(), IsOk()); | 784 EXPECT_THAT(callback1.net_error(), IsOk()); |
| 704 ASSERT_THAT(callback1.proof(), NotNull()); | 785 ASSERT_THAT(callback1.proof(), NotNull()); |
| 705 EXPECT_THAT(callback1.proof()->leaf_index, Eq(123456u)); | 786 EXPECT_THAT(callback1.proof()->leaf_index, Eq(123456u)); |
| 706 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 787 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 707 // EXPECT_THAT(callback1.proof()->tree_size, Eq(999999)); | 788 // EXPECT_THAT(callback1.proof()->tree_size, Eq(999999)); |
| 708 EXPECT_THAT(callback1.proof()->nodes, Eq(audit_proof)); | 789 EXPECT_THAT(callback1.proof()->nodes, Eq(audit_proof)); |
| 709 | 790 |
| 710 // Check that the second query failed. | 791 // Check that the second query did not run. |
| 711 ASSERT_TRUE(callback2.called()); | 792 ASSERT_FALSE(callback2.called()); |
| 712 EXPECT_THAT(callback2.net_error(), IsError(net::ERR_TEMPORARILY_THROTTLED)); | |
| 713 EXPECT_THAT(callback2.proof(), IsNull()); | |
| 714 } | 793 } |
| 715 | 794 |
| 716 INSTANTIATE_TEST_CASE_P(ReadMode, | 795 INSTANTIATE_TEST_CASE_P(ReadMode, |
| 717 LogDnsClientTest, | 796 LogDnsClientTest, |
| 718 ::testing::Values(net::IoMode::ASYNC, | 797 ::testing::Values(net::IoMode::ASYNC, |
| 719 net::IoMode::SYNCHRONOUS)); | 798 net::IoMode::SYNCHRONOUS)); |
| 720 | 799 |
| 721 } // namespace | 800 } // namespace |
| 722 } // namespace certificate_transparency | 801 } // namespace certificate_transparency |
| OLD | NEW |