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 <numeric> | 8 #include <numeric> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/format_macros.h" | 13 #include "base/format_macros.h" |
| 14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
| 16 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
| 17 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
| 18 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
| 19 #include "base/test/test_timeouts.h" | |
| 19 #include "components/certificate_transparency/mock_log_dns_traffic.h" | 20 #include "components/certificate_transparency/mock_log_dns_traffic.h" |
| 20 #include "crypto/sha2.h" | 21 #include "crypto/sha2.h" |
| 21 #include "net/base/net_errors.h" | 22 #include "net/base/net_errors.h" |
| 22 #include "net/cert/merkle_audit_proof.h" | 23 #include "net/cert/merkle_audit_proof.h" |
| 23 #include "net/cert/signed_certificate_timestamp.h" | 24 #include "net/cert/signed_certificate_timestamp.h" |
| 24 #include "net/dns/dns_client.h" | 25 #include "net/dns/dns_client.h" |
| 25 #include "net/dns/dns_config_service.h" | 26 #include "net/dns/dns_config_service.h" |
| 26 #include "net/dns/dns_protocol.h" | 27 #include "net/dns/dns_protocol.h" |
| 28 #include "net/log/net_log.h" | |
| 27 #include "net/test/gtest_util.h" | 29 #include "net/test/gtest_util.h" |
| 28 #include "testing/gmock/include/gmock/gmock.h" | 30 #include "testing/gmock/include/gmock/gmock.h" |
| 29 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
| 30 | 32 |
| 31 namespace certificate_transparency { | 33 namespace certificate_transparency { |
| 32 namespace { | 34 namespace { |
| 33 | 35 |
| 34 using ::testing::AllOf; | 36 using ::testing::AllOf; |
| 35 using ::testing::Eq; | 37 using ::testing::Eq; |
| 36 using ::testing::IsEmpty; | 38 using ::testing::IsEmpty; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 63 const uint64_t kLeafIndices[] = {0, 1, 2}; | 65 const uint64_t kLeafIndices[] = {0, 1, 2}; |
| 64 const uint64_t kTreeSizes[] = {100, 10000, 1000000}; | 66 const uint64_t kTreeSizes[] = {100, 10000, 1000000}; |
| 65 | 67 |
| 66 // Only 7 audit proof nodes can fit into a DNS response, because they are sent | 68 // 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 | 69 // 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. | 70 // 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 | 71 // This means audit proofs consisting of more than 7 nodes require multiple DNS |
| 70 // requests to retrieve. | 72 // requests to retrieve. |
| 71 const size_t kMaxProofNodesPerDnsResponse = 7; | 73 const size_t kMaxProofNodesPerDnsResponse = 7; |
| 72 | 74 |
| 75 // Returns an example Merkle audit proof containing |length| nodes. | |
| 76 // The proof cannot be used for cryptographic purposes; it is merely a | |
| 77 // placeholder. | |
| 73 std::vector<std::string> GetSampleAuditProof(size_t length) { | 78 std::vector<std::string> GetSampleAuditProof(size_t length) { |
| 74 std::vector<std::string> audit_proof(length); | 79 std::vector<std::string> audit_proof(length); |
| 75 // Makes each node of the audit proof different, so that tests are able to | 80 // 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. | 81 // confirm that the audit proof is reconstructed in the correct order. |
| 77 for (size_t i = 0; i < length; ++i) { | 82 for (size_t i = 0; i < length; ++i) { |
| 78 std::string node(crypto::kSHA256Length, '\0'); | 83 std::string node(crypto::kSHA256Length, '\0'); |
| 79 // Each node is 32 bytes, with each byte having a different value. | 84 // Each node is 32 bytes, with each byte having a different value. |
| 80 for (size_t j = 0; j < crypto::kSHA256Length; ++j) { | 85 for (size_t j = 0; j < crypto::kSHA256Length; ++j) { |
| 81 node[j] = static_cast<char>((-127 + i + j) % 128); | 86 node[j] = static_cast<char>((-127 + i + j) % 128); |
| 82 } | 87 } |
| 83 audit_proof[i].assign(std::move(node)); | 88 audit_proof[i].assign(std::move(node)); |
| 84 } | 89 } |
| 85 | 90 |
| 86 return audit_proof; | 91 return audit_proof; |
| 87 } | 92 } |
| 88 | 93 |
| 89 class MockAuditProofCallback { | |
| 90 public: | |
| 91 MockAuditProofCallback() : called_(false) {} | |
| 92 | |
| 93 bool called() const { return called_; } | |
| 94 int net_error() const { return net_error_; } | |
| 95 const net::ct::MerkleAuditProof* proof() const { return proof_.get(); } | |
| 96 | |
| 97 void Run(int net_error, std::unique_ptr<net::ct::MerkleAuditProof> proof) { | |
| 98 EXPECT_FALSE(called_); | |
| 99 called_ = true; | |
| 100 net_error_ = net_error; | |
| 101 proof_ = std::move(proof); | |
| 102 run_loop_.Quit(); | |
| 103 } | |
| 104 | |
| 105 LogDnsClient::AuditProofCallback AsCallback() { | |
| 106 return base::Bind(&MockAuditProofCallback::Run, base::Unretained(this)); | |
| 107 } | |
| 108 | |
| 109 void WaitUntilRun() { run_loop_.Run(); } | |
| 110 | |
| 111 private: | |
| 112 bool called_; | |
| 113 int net_error_; | |
| 114 std::unique_ptr<net::ct::MerkleAuditProof> proof_; | |
| 115 base::RunLoop run_loop_; | |
| 116 }; | |
| 117 | |
| 118 class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> { | 94 class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> { |
| 119 protected: | 95 protected: |
| 120 LogDnsClientTest() | 96 LogDnsClientTest() |
| 121 : network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) { | 97 : network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) { |
| 122 mock_dns_.SetSocketReadMode(GetParam()); | 98 mock_dns_.SetSocketReadMode(GetParam()); |
| 123 mock_dns_.InitializeDnsConfig(); | 99 mock_dns_.InitializeDnsConfig(); |
| 124 } | 100 } |
| 125 | 101 |
| 126 std::unique_ptr<LogDnsClient> CreateLogDnsClient( | 102 std::unique_ptr<LogDnsClient> CreateLogDnsClient( |
| 127 size_t max_concurrent_queries) { | 103 size_t max_concurrent_queries) { |
| 128 return base::MakeUnique<LogDnsClient>(mock_dns_.CreateDnsClient(), | 104 return base::MakeUnique<LogDnsClient>(mock_dns_.CreateDnsClient(), |
| 129 net::NetLogWithSource(), | 105 net::NetLogWithSource(), |
| 130 max_concurrent_queries); | 106 max_concurrent_queries); |
| 131 } | 107 } |
| 132 | 108 |
| 133 void QueryAuditProofAsync(LogDnsClient* log_client, | 109 // Convenience function for calling QueryAuditProof synchronously. |
| 134 const std::string& log_domain, | 110 template <typename... Types> |
|
Eran Messeri
2016/10/14 11:05:13
According to https://chromium-cpp.appspot.com/, us
Rob Percival
2016/10/20 10:49:07
That's correct. This is mostly just forwarding to
| |
| 135 const char leaf_hash[crypto::kSHA256Length], | 111 net::Error QueryAuditProof(Types... args) { |
| 136 uint64_t tree_size, | 112 std::unique_ptr<LogDnsClient> log_client = CreateLogDnsClient(0); |
| 137 const LogDnsClient::AuditProofCallback& callback) { | 113 net::TestCompletionCallback callback; |
| 138 log_client->QueryAuditProof(log_domain, leaf_hash, tree_size, callback); | 114 const net::Error result = log_client->QueryAuditProof( |
| 139 } | 115 std::forward<Types>(args)..., callback.callback()); |
| 140 | 116 |
| 141 // Convenience function for calling QueryAuditProofAsync synchronously. | 117 return result != net::ERR_IO_PENDING |
| 142 void QueryAuditProof(const std::string& log_domain, | 118 ? result |
| 143 const char leaf_hash[crypto::kSHA256Length], | 119 : static_cast<net::Error>(callback.WaitForResult()); |
| 144 uint64_t tree_size, | |
| 145 MockAuditProofCallback* callback) { | |
| 146 std::unique_ptr<LogDnsClient> log_client = CreateLogDnsClient(0); | |
| 147 QueryAuditProofAsync(log_client.get(), log_domain, leaf_hash, tree_size, | |
| 148 callback->AsCallback()); | |
| 149 callback->WaitUntilRun(); | |
| 150 } | 120 } |
| 151 | 121 |
| 152 // This will be the NetworkChangeNotifier singleton for the duration of the | 122 // This will be the NetworkChangeNotifier singleton for the duration of the |
| 153 // test. It is accessed statically by LogDnsClient. | 123 // test. It is accessed statically by LogDnsClient. |
| 154 std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; | 124 std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; |
| 155 // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient, | 125 // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient, |
| 156 // the underlying net::DnsClient, and NetworkChangeNotifier. | 126 // the underlying net::DnsClient, and NetworkChangeNotifier. |
| 157 base::MessageLoopForIO message_loop_; | 127 base::MessageLoopForIO message_loop_; |
| 158 // Allows mock DNS sockets to be setup. | 128 // Allows mock DNS sockets to be setup. |
| 159 MockLogDnsTraffic mock_dns_; | 129 MockLogDnsTraffic mock_dns_; |
| 160 }; | 130 }; |
| 161 | 131 |
| 162 TEST_P(LogDnsClientTest, QueryAuditProofReportsThatLogDomainDoesNotExist) { | 132 TEST_P(LogDnsClientTest, QueryAuditProofReportsThatLogDomainDoesNotExist) { |
| 163 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], | 133 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], |
| 164 net::dns_protocol::kRcodeNXDOMAIN); | 134 net::dns_protocol::kRcodeNXDOMAIN); |
| 165 | 135 |
| 166 MockAuditProofCallback callback; | 136 net::ct::MerkleAuditProof proof; |
| 167 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 137 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 168 ASSERT_TRUE(callback.called()); | 138 IsError(net::ERR_NAME_NOT_RESOLVED)); |
| 169 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); | |
| 170 EXPECT_THAT(callback.proof(), IsNull()); | |
| 171 } | 139 } |
| 172 | 140 |
| 173 TEST_P(LogDnsClientTest, | 141 TEST_P(LogDnsClientTest, |
| 174 QueryAuditProofReportsServerFailuresDuringLeafIndexRequests) { | 142 QueryAuditProofReportsServerFailuresDuringLeafIndexRequests) { |
| 175 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], | 143 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], |
| 176 net::dns_protocol::kRcodeSERVFAIL); | 144 net::dns_protocol::kRcodeSERVFAIL); |
| 177 | 145 |
| 178 MockAuditProofCallback callback; | 146 net::ct::MerkleAuditProof proof; |
| 179 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 147 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 180 ASSERT_TRUE(callback.called()); | 148 IsError(net::ERR_DNS_SERVER_FAILED)); |
| 181 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); | |
| 182 EXPECT_THAT(callback.proof(), IsNull()); | |
| 183 } | 149 } |
| 184 | 150 |
| 185 TEST_P(LogDnsClientTest, | 151 TEST_P(LogDnsClientTest, |
| 186 QueryAuditProofReportsServerRefusalsDuringLeafIndexRequests) { | 152 QueryAuditProofReportsServerRefusalsDuringLeafIndexRequests) { |
| 187 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], | 153 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], |
| 188 net::dns_protocol::kRcodeREFUSED); | 154 net::dns_protocol::kRcodeREFUSED); |
| 189 | 155 |
| 190 MockAuditProofCallback callback; | 156 net::ct::MerkleAuditProof proof; |
| 191 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 157 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 192 ASSERT_TRUE(callback.called()); | 158 IsError(net::ERR_DNS_SERVER_FAILED)); |
| 193 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); | |
| 194 EXPECT_THAT(callback.proof(), IsNull()); | |
| 195 } | 159 } |
| 196 | 160 |
| 197 TEST_P(LogDnsClientTest, | 161 TEST_P( |
| 198 QueryAuditProofReportsMalformedResponseIfLeafIndexResponseContainsNoStrin gs) { | 162 LogDnsClientTest, |
| 163 QueryAuditProofReportsMalformedResponseIfLeafIndexResponseContainsNoStrings) { | |
| 199 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], | 164 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], |
| 200 std::vector<base::StringPiece>()); | 165 std::vector<base::StringPiece>()); |
| 201 | 166 |
| 202 MockAuditProofCallback callback; | 167 net::ct::MerkleAuditProof proof; |
| 203 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 168 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 204 ASSERT_TRUE(callback.called()); | 169 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 205 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 206 EXPECT_THAT(callback.proof(), IsNull()); | |
| 207 } | 170 } |
| 208 | 171 |
| 209 TEST_P(LogDnsClientTest, | 172 TEST_P( |
| 210 QueryAuditProofReportsMalformedResponseIfLeafIndexResponseContainsMoreTha nOneString) { | 173 LogDnsClientTest, |
| 174 QueryAuditProofReportsMalformedResponseIfLeafIndexResponseContainsMoreThanOn eString) { | |
| 211 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456", "7"}); | 175 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456", "7"}); |
| 212 | 176 |
| 213 MockAuditProofCallback callback; | 177 net::ct::MerkleAuditProof proof; |
| 214 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 178 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 215 ASSERT_TRUE(callback.called()); | 179 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 216 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 217 EXPECT_THAT(callback.proof(), IsNull()); | |
| 218 } | 180 } |
| 219 | 181 |
| 220 TEST_P(LogDnsClientTest, | 182 TEST_P(LogDnsClientTest, |
| 221 QueryAuditProofReportsMalformedResponseIfLeafIndexIsNotNumeric) { | 183 QueryAuditProofReportsMalformedResponseIfLeafIndexIsNotNumeric) { |
| 222 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"foo"}); | 184 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"foo"}); |
| 223 | 185 |
| 224 MockAuditProofCallback callback; | 186 net::ct::MerkleAuditProof proof; |
| 225 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 187 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 226 ASSERT_TRUE(callback.called()); | 188 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 227 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 228 EXPECT_THAT(callback.proof(), IsNull()); | |
| 229 } | 189 } |
| 230 | 190 |
| 231 TEST_P(LogDnsClientTest, | 191 TEST_P(LogDnsClientTest, |
| 232 QueryAuditProofReportsMalformedResponseIfLeafIndexIsFloatingPoint) { | 192 QueryAuditProofReportsMalformedResponseIfLeafIndexIsFloatingPoint) { |
| 233 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456.0"}); | 193 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456.0"}); |
| 234 | 194 |
| 235 MockAuditProofCallback callback; | 195 net::ct::MerkleAuditProof proof; |
| 236 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 196 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 237 ASSERT_TRUE(callback.called()); | 197 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 238 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 239 EXPECT_THAT(callback.proof(), IsNull()); | |
| 240 } | 198 } |
| 241 | 199 |
| 242 TEST_P(LogDnsClientTest, | 200 TEST_P(LogDnsClientTest, |
| 243 QueryAuditProofReportsMalformedResponseIfLeafIndexIsEmpty) { | 201 QueryAuditProofReportsMalformedResponseIfLeafIndexIsEmpty) { |
| 244 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {""}); | 202 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {""}); |
| 245 | 203 |
| 246 MockAuditProofCallback callback; | 204 net::ct::MerkleAuditProof proof; |
| 247 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 205 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 248 ASSERT_TRUE(callback.called()); | 206 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 249 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 250 EXPECT_THAT(callback.proof(), IsNull()); | |
| 251 } | 207 } |
| 252 | 208 |
| 253 TEST_P(LogDnsClientTest, | 209 TEST_P(LogDnsClientTest, |
| 254 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericPrefix) { | 210 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericPrefix) { |
| 255 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"foo123456"}); | 211 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"foo123456"}); |
| 256 | 212 |
| 257 MockAuditProofCallback callback; | 213 net::ct::MerkleAuditProof proof; |
| 258 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 214 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 259 ASSERT_TRUE(callback.called()); | 215 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 260 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 261 EXPECT_THAT(callback.proof(), IsNull()); | |
| 262 } | 216 } |
| 263 | 217 |
| 264 TEST_P(LogDnsClientTest, | 218 TEST_P(LogDnsClientTest, |
| 265 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericSuffix) { | 219 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericSuffix) { |
| 266 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456foo"}); | 220 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456foo"}); |
| 267 | 221 |
| 268 MockAuditProofCallback callback; | 222 net::ct::MerkleAuditProof proof; |
| 269 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 223 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 270 ASSERT_TRUE(callback.called()); | 224 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 271 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 272 EXPECT_THAT(callback.proof(), IsNull()); | |
| 273 } | 225 } |
| 274 | 226 |
| 275 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLogDomainIsEmpty) { | 227 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLogDomainIsEmpty) { |
| 276 MockAuditProofCallback callback; | 228 net::ct::MerkleAuditProof proof; |
| 277 QueryAuditProof("", kLeafHashes[0], kTreeSizes[0], &callback); | 229 ASSERT_THAT(QueryAuditProof("", kLeafHashes[0], kTreeSizes[0], &proof), |
| 278 ASSERT_TRUE(callback.called()); | 230 IsError(net::ERR_INVALID_ARGUMENT)); |
| 279 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | |
| 280 EXPECT_THAT(callback.proof(), IsNull()); | |
| 281 } | 231 } |
| 282 | 232 |
| 283 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsInvalid) { | 233 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsInvalid) { |
| 284 MockAuditProofCallback callback; | 234 net::ct::MerkleAuditProof proof; |
| 285 QueryAuditProof("ct.test", "foo", kTreeSizes[0], &callback); | 235 ASSERT_THAT(QueryAuditProof("ct.test", "foo", kTreeSizes[0], &proof), |
| 286 ASSERT_TRUE(callback.called()); | 236 IsError(net::ERR_INVALID_ARGUMENT)); |
| 287 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | |
| 288 EXPECT_THAT(callback.proof(), IsNull()); | |
| 289 } | 237 } |
| 290 | 238 |
| 291 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsEmpty) { | 239 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsEmpty) { |
| 292 MockAuditProofCallback callback; | 240 net::ct::MerkleAuditProof proof; |
| 293 QueryAuditProof("ct.test", "", kTreeSizes[0], &callback); | 241 ASSERT_THAT(QueryAuditProof("ct.test", "", kTreeSizes[0], &proof), |
| 294 ASSERT_TRUE(callback.called()); | 242 IsError(net::ERR_INVALID_ARGUMENT)); |
| 295 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | |
| 296 EXPECT_THAT(callback.proof(), IsNull()); | |
| 297 } | 243 } |
| 298 | 244 |
| 299 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsNull) { | 245 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsNull) { |
| 300 MockAuditProofCallback callback; | 246 net::ct::MerkleAuditProof proof; |
| 301 QueryAuditProof("ct.test", nullptr, kTreeSizes[0], &callback); | 247 ASSERT_THAT(QueryAuditProof("ct.test", nullptr, kTreeSizes[0], &proof), |
| 302 ASSERT_TRUE(callback.called()); | 248 IsError(net::ERR_INVALID_ARGUMENT)); |
| 303 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | |
| 304 EXPECT_THAT(callback.proof(), IsNull()); | |
| 305 } | 249 } |
| 306 | 250 |
| 307 TEST_P(LogDnsClientTest, | 251 TEST_P(LogDnsClientTest, |
| 308 QueryAuditProofReportsSocketErrorsDuringLeafIndexRequests) { | 252 QueryAuditProofReportsSocketErrorsDuringLeafIndexRequests) { |
| 309 mock_dns_.ExpectRequestAndSocketError(kLeafIndexQnames[0], | 253 mock_dns_.ExpectRequestAndSocketError(kLeafIndexQnames[0], |
| 310 net::ERR_CONNECTION_REFUSED); | 254 net::ERR_CONNECTION_REFUSED); |
| 311 | 255 |
| 312 MockAuditProofCallback callback; | 256 net::ct::MerkleAuditProof proof; |
| 313 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 257 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 314 ASSERT_TRUE(callback.called()); | 258 IsError(net::ERR_CONNECTION_REFUSED)); |
| 315 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); | |
| 316 EXPECT_THAT(callback.proof(), IsNull()); | |
| 317 } | 259 } |
| 318 | 260 |
| 319 TEST_P(LogDnsClientTest, | 261 TEST_P(LogDnsClientTest, |
| 320 QueryAuditProofReportsTimeoutsDuringLeafIndexRequests) { | 262 QueryAuditProofReportsTimeoutsDuringLeafIndexRequests) { |
| 321 mock_dns_.ExpectRequestAndTimeout(kLeafIndexQnames[0]); | 263 mock_dns_.ExpectRequestAndTimeout(kLeafIndexQnames[0]); |
| 322 | 264 |
| 323 MockAuditProofCallback callback; | 265 net::ct::MerkleAuditProof proof; |
| 324 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); | 266 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &proof), |
| 325 ASSERT_TRUE(callback.called()); | 267 IsError(net::ERR_DNS_TIMED_OUT)); |
| 326 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); | |
| 327 EXPECT_THAT(callback.proof(), IsNull()); | |
| 328 } | 268 } |
| 329 | 269 |
| 330 TEST_P(LogDnsClientTest, QueryAuditProof) { | 270 TEST_P(LogDnsClientTest, QueryAuditProof) { |
| 331 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); | 271 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); |
| 332 | 272 |
| 333 // Expect a leaf index query first, to map the leaf hash to a leaf index. | 273 // Expect a leaf index query first, to map the leaf hash to a leaf index. |
| 334 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 274 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 335 | 275 |
| 336 // It takes a number of DNS requests to retrieve the entire |audit_proof| | 276 // It takes a number of DNS requests to retrieve the entire |audit_proof| |
| 337 // (see |kMaxProofNodesPerDnsResponse|). | 277 // (see |kMaxProofNodesPerDnsResponse|). |
| 338 for (size_t nodes_begin = 0; nodes_begin < audit_proof.size(); | 278 for (size_t nodes_begin = 0; nodes_begin < audit_proof.size(); |
| 339 nodes_begin += kMaxProofNodesPerDnsResponse) { | 279 nodes_begin += kMaxProofNodesPerDnsResponse) { |
| 340 const size_t nodes_end = std::min( | 280 const size_t nodes_end = std::min( |
| 341 nodes_begin + kMaxProofNodesPerDnsResponse, audit_proof.size()); | 281 nodes_begin + kMaxProofNodesPerDnsResponse, audit_proof.size()); |
| 342 | 282 |
| 343 mock_dns_.ExpectAuditProofRequestAndResponse( | 283 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 344 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), | 284 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), |
| 345 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); | 285 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); |
| 346 } | 286 } |
| 347 | 287 |
| 348 MockAuditProofCallback callback; | 288 net::ct::MerkleAuditProof proof; |
| 349 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 289 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 350 ASSERT_TRUE(callback.called()); | 290 IsOk()); |
| 351 EXPECT_THAT(callback.net_error(), IsOk()); | 291 EXPECT_THAT(proof.leaf_index, Eq(123456u)); |
| 352 ASSERT_THAT(callback.proof(), NotNull()); | |
| 353 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); | |
| 354 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 292 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 355 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); | 293 // EXPECT_THAT(proof.tree_size, Eq(999999)); |
| 356 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); | 294 EXPECT_THAT(proof.nodes, Eq(audit_proof)); |
| 357 } | 295 } |
| 358 | 296 |
| 359 TEST_P(LogDnsClientTest, QueryAuditProofHandlesResponsesWithShortAuditPaths) { | 297 TEST_P(LogDnsClientTest, QueryAuditProofHandlesResponsesWithShortAuditPaths) { |
| 360 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); | 298 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); |
| 361 | 299 |
| 362 // Expect a leaf index query first, to map the leaf hash to a leaf index. | 300 // Expect a leaf index query first, to map the leaf hash to a leaf index. |
| 363 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 301 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 364 | 302 |
| 365 // Make some of the responses contain fewer proof nodes than they can hold. | 303 // Make some of the responses contain fewer proof nodes than they can hold. |
| 366 mock_dns_.ExpectAuditProofRequestAndResponse("0.123456.999999.tree.ct.test.", | 304 mock_dns_.ExpectAuditProofRequestAndResponse("0.123456.999999.tree.ct.test.", |
| 367 audit_proof.begin(), | 305 audit_proof.begin(), |
| 368 audit_proof.begin() + 1); | 306 audit_proof.begin() + 1); |
| 369 mock_dns_.ExpectAuditProofRequestAndResponse("1.123456.999999.tree.ct.test.", | 307 mock_dns_.ExpectAuditProofRequestAndResponse("1.123456.999999.tree.ct.test.", |
| 370 audit_proof.begin() + 1, | 308 audit_proof.begin() + 1, |
| 371 audit_proof.begin() + 3); | 309 audit_proof.begin() + 3); |
| 372 mock_dns_.ExpectAuditProofRequestAndResponse("3.123456.999999.tree.ct.test.", | 310 mock_dns_.ExpectAuditProofRequestAndResponse("3.123456.999999.tree.ct.test.", |
| 373 audit_proof.begin() + 3, | 311 audit_proof.begin() + 3, |
| 374 audit_proof.begin() + 6); | 312 audit_proof.begin() + 6); |
| 375 mock_dns_.ExpectAuditProofRequestAndResponse("6.123456.999999.tree.ct.test.", | 313 mock_dns_.ExpectAuditProofRequestAndResponse("6.123456.999999.tree.ct.test.", |
| 376 audit_proof.begin() + 6, | 314 audit_proof.begin() + 6, |
| 377 audit_proof.begin() + 10); | 315 audit_proof.begin() + 10); |
| 378 mock_dns_.ExpectAuditProofRequestAndResponse("10.123456.999999.tree.ct.test.", | 316 mock_dns_.ExpectAuditProofRequestAndResponse("10.123456.999999.tree.ct.test.", |
| 379 audit_proof.begin() + 10, | 317 audit_proof.begin() + 10, |
| 380 audit_proof.begin() + 13); | 318 audit_proof.begin() + 13); |
| 381 mock_dns_.ExpectAuditProofRequestAndResponse("13.123456.999999.tree.ct.test.", | 319 mock_dns_.ExpectAuditProofRequestAndResponse("13.123456.999999.tree.ct.test.", |
| 382 audit_proof.begin() + 13, | 320 audit_proof.begin() + 13, |
| 383 audit_proof.end()); | 321 audit_proof.end()); |
| 384 | 322 |
| 385 MockAuditProofCallback callback; | 323 net::ct::MerkleAuditProof proof; |
| 386 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 324 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 387 ASSERT_TRUE(callback.called()); | 325 IsOk()); |
| 388 EXPECT_THAT(callback.net_error(), IsOk()); | 326 EXPECT_THAT(proof.leaf_index, Eq(123456u)); |
| 389 ASSERT_THAT(callback.proof(), NotNull()); | |
| 390 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); | |
| 391 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 327 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 392 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); | 328 // EXPECT_THAT(proof.tree_size, Eq(999999)); |
| 393 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); | 329 EXPECT_THAT(proof.nodes, Eq(audit_proof)); |
| 394 } | 330 } |
| 395 | 331 |
| 396 TEST_P(LogDnsClientTest, | 332 TEST_P(LogDnsClientTest, |
| 397 QueryAuditProofReportsThatAuditProofQnameDoesNotExist) { | 333 QueryAuditProofReportsThatAuditProofQnameDoesNotExist) { |
| 398 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 334 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 399 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", | 335 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", |
| 400 net::dns_protocol::kRcodeNXDOMAIN); | 336 net::dns_protocol::kRcodeNXDOMAIN); |
| 401 | 337 |
| 402 MockAuditProofCallback callback; | 338 net::ct::MerkleAuditProof proof; |
| 403 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 339 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 404 ASSERT_TRUE(callback.called()); | 340 IsError(net::ERR_NAME_NOT_RESOLVED)); |
| 405 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); | |
| 406 EXPECT_THAT(callback.proof(), IsNull()); | |
| 407 } | 341 } |
| 408 | 342 |
| 409 TEST_P(LogDnsClientTest, | 343 TEST_P(LogDnsClientTest, |
| 410 QueryAuditProofReportsServerFailureDuringAuditProofRequests) { | 344 QueryAuditProofReportsServerFailuresDuringAuditProofRequests) { |
| 411 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 345 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 412 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", | 346 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", |
| 413 net::dns_protocol::kRcodeSERVFAIL); | 347 net::dns_protocol::kRcodeSERVFAIL); |
| 414 | 348 |
| 415 MockAuditProofCallback callback; | 349 net::ct::MerkleAuditProof proof; |
| 416 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 350 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 417 ASSERT_TRUE(callback.called()); | 351 IsError(net::ERR_DNS_SERVER_FAILED)); |
| 418 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); | |
| 419 EXPECT_THAT(callback.proof(), IsNull()); | |
| 420 } | 352 } |
| 421 | 353 |
| 422 TEST_P(LogDnsClientTest, | 354 TEST_P(LogDnsClientTest, |
| 423 QueryAuditProofReportsServerRefusalDuringAuditProofRequests) { | 355 QueryAuditProofReportsServerRefusalsDuringAuditProofRequests) { |
| 424 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 356 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 425 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", | 357 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", |
| 426 net::dns_protocol::kRcodeREFUSED); | 358 net::dns_protocol::kRcodeREFUSED); |
| 427 | 359 |
| 428 MockAuditProofCallback callback; | 360 net::ct::MerkleAuditProof proof; |
| 429 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 361 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 430 ASSERT_TRUE(callback.called()); | 362 IsError(net::ERR_DNS_SERVER_FAILED)); |
| 431 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); | |
| 432 EXPECT_THAT(callback.proof(), IsNull()); | |
| 433 } | 363 } |
| 434 | 364 |
| 435 TEST_P(LogDnsClientTest, | 365 TEST_P( |
| 436 QueryAuditProofReportsResponseMalformedIfProofNodesResponseContainsNoStri ngs) { | 366 LogDnsClientTest, |
| 367 QueryAuditProofReportsResponseMalformedIfProofNodesResponseContainsNoStrings ) { | |
| 437 // Expect a leaf index query first, to map the leaf hash to a leaf index. | 368 // Expect a leaf index query first, to map the leaf hash to a leaf index. |
| 438 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 369 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 439 | 370 |
| 440 mock_dns_.ExpectRequestAndResponse("0.123456.999999.tree.ct.test.", | 371 mock_dns_.ExpectRequestAndResponse("0.123456.999999.tree.ct.test.", |
| 441 std::vector<base::StringPiece>()); | 372 std::vector<base::StringPiece>()); |
| 442 | 373 |
| 443 MockAuditProofCallback callback; | 374 net::ct::MerkleAuditProof proof; |
| 444 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 375 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 445 ASSERT_TRUE(callback.called()); | 376 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 446 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 447 EXPECT_THAT(callback.proof(), IsNull()); | |
| 448 } | 377 } |
| 449 | 378 |
| 450 TEST_P(LogDnsClientTest, | 379 TEST_P( |
| 451 QueryAuditProofReportsResponseMalformedIfProofNodesResponseContainsMoreTh anOneString) { | 380 LogDnsClientTest, |
| 381 QueryAuditProofReportsResponseMalformedIfProofNodesResponseContainsMoreThanO neString) { | |
| 452 // The CT-over-DNS draft RFC states that the response will contain "exactly | 382 // The CT-over-DNS draft RFC states that the response will contain "exactly |
| 453 // one character-string." | 383 // one character-string." |
| 454 const std::vector<std::string> audit_proof = GetSampleAuditProof(10); | 384 const std::vector<std::string> audit_proof = GetSampleAuditProof(10); |
| 455 | 385 |
| 456 std::string first_chunk_of_proof = std::accumulate( | 386 std::string first_chunk_of_proof = std::accumulate( |
| 457 audit_proof.begin(), audit_proof.begin() + 7, std::string()); | 387 audit_proof.begin(), audit_proof.begin() + 7, std::string()); |
| 458 std::string second_chunk_of_proof = std::accumulate( | 388 std::string second_chunk_of_proof = std::accumulate( |
| 459 audit_proof.begin() + 7, audit_proof.end(), std::string()); | 389 audit_proof.begin() + 7, audit_proof.end(), std::string()); |
| 460 | 390 |
| 461 // Expect a leaf index query first, to map the leaf hash to a leaf index. | 391 // Expect a leaf index query first, to map the leaf hash to a leaf index. |
| 462 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 392 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 463 | 393 |
| 464 mock_dns_.ExpectRequestAndResponse( | 394 mock_dns_.ExpectRequestAndResponse( |
| 465 "0.123456.999999.tree.ct.test.", | 395 "0.123456.999999.tree.ct.test.", |
| 466 {first_chunk_of_proof, second_chunk_of_proof}); | 396 {first_chunk_of_proof, second_chunk_of_proof}); |
| 467 | 397 |
| 468 MockAuditProofCallback callback; | 398 net::ct::MerkleAuditProof proof; |
| 469 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 399 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 470 ASSERT_TRUE(callback.called()); | 400 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 471 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 472 EXPECT_THAT(callback.proof(), IsNull()); | |
| 473 } | 401 } |
| 474 | 402 |
| 475 TEST_P(LogDnsClientTest, | 403 TEST_P(LogDnsClientTest, |
| 476 QueryAuditProofReportsResponseMalformedIfNodeTooShort) { | 404 QueryAuditProofReportsResponseMalformedIfNodeTooShort) { |
| 477 // node is shorter than a SHA-256 hash (31 vs 32 bytes) | 405 // node is shorter than a SHA-256 hash (31 vs 32 bytes) |
| 478 const std::vector<std::string> audit_proof(1, std::string(31, 'a')); | 406 const std::vector<std::string> audit_proof(1, std::string(31, 'a')); |
| 479 | 407 |
| 480 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 408 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 481 mock_dns_.ExpectAuditProofRequestAndResponse( | 409 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 482 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); | 410 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); |
| 483 | 411 |
| 484 MockAuditProofCallback callback; | 412 net::ct::MerkleAuditProof proof; |
| 485 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 413 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 486 ASSERT_TRUE(callback.called()); | 414 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 487 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 488 EXPECT_THAT(callback.proof(), IsNull()); | |
| 489 } | 415 } |
| 490 | 416 |
| 491 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfNodeTooLong) { | 417 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfNodeTooLong) { |
| 492 // node is longer than a SHA-256 hash (33 vs 32 bytes) | 418 // node is longer than a SHA-256 hash (33 vs 32 bytes) |
| 493 const std::vector<std::string> audit_proof(1, std::string(33, 'a')); | 419 const std::vector<std::string> audit_proof(1, std::string(33, 'a')); |
| 494 | 420 |
| 495 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 421 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 496 mock_dns_.ExpectAuditProofRequestAndResponse( | 422 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 497 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); | 423 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); |
| 498 | 424 |
| 499 MockAuditProofCallback callback; | 425 net::ct::MerkleAuditProof proof; |
| 500 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 426 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 501 ASSERT_TRUE(callback.called()); | 427 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 502 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 503 EXPECT_THAT(callback.proof(), IsNull()); | |
| 504 } | 428 } |
| 505 | 429 |
| 506 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfEmpty) { | 430 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfEmpty) { |
| 507 const std::vector<std::string> audit_proof; | 431 const std::vector<std::string> audit_proof; |
| 508 | 432 |
| 509 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 433 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 510 mock_dns_.ExpectAuditProofRequestAndResponse( | 434 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 511 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); | 435 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); |
| 512 | 436 |
| 513 MockAuditProofCallback callback; | 437 net::ct::MerkleAuditProof proof; |
| 514 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 438 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 515 ASSERT_TRUE(callback.called()); | 439 IsError(net::ERR_DNS_MALFORMED_RESPONSE)); |
| 516 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); | |
| 517 EXPECT_THAT(callback.proof(), IsNull()); | |
| 518 } | 440 } |
| 519 | 441 |
| 520 TEST_P(LogDnsClientTest, | 442 TEST_P(LogDnsClientTest, |
| 521 QueryAuditProofReportsInvalidArgIfLeafIndexEqualToTreeSize) { | 443 QueryAuditProofReportsInvalidArgIfLeafIndexEqualToTreeSize) { |
| 522 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 444 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 523 | 445 |
| 524 MockAuditProofCallback callback; | 446 net::ct::MerkleAuditProof proof; |
| 525 QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback); | 447 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 123456, &proof), |
| 526 ASSERT_TRUE(callback.called()); | 448 IsError(net::ERR_INVALID_ARGUMENT)); |
| 527 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | |
| 528 EXPECT_THAT(callback.proof(), IsNull()); | |
| 529 } | 449 } |
| 530 | 450 |
| 531 TEST_P(LogDnsClientTest, | 451 TEST_P(LogDnsClientTest, |
| 532 QueryAuditProofReportsInvalidArgIfLeafIndexGreaterThanTreeSize) { | 452 QueryAuditProofReportsInvalidArgIfLeafIndexGreaterThanTreeSize) { |
| 533 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 999999); | 453 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 999999); |
| 534 | 454 |
| 535 MockAuditProofCallback callback; | 455 net::ct::MerkleAuditProof proof; |
| 536 QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback); | 456 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 123456, &proof), |
| 537 ASSERT_TRUE(callback.called()); | 457 IsError(net::ERR_INVALID_ARGUMENT)); |
| 538 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); | |
| 539 EXPECT_THAT(callback.proof(), IsNull()); | |
| 540 } | 458 } |
| 541 | 459 |
| 542 TEST_P(LogDnsClientTest, | 460 TEST_P(LogDnsClientTest, |
| 543 QueryAuditProofReportsSocketErrorsDuringAuditProofRequests) { | 461 QueryAuditProofReportsSocketErrorsDuringAuditProofRequests) { |
| 544 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 462 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 545 mock_dns_.ExpectRequestAndSocketError("0.123456.999999.tree.ct.test.", | 463 mock_dns_.ExpectRequestAndSocketError("0.123456.999999.tree.ct.test.", |
| 546 net::ERR_CONNECTION_REFUSED); | 464 net::ERR_CONNECTION_REFUSED); |
| 547 | 465 |
| 548 MockAuditProofCallback callback; | 466 net::ct::MerkleAuditProof proof; |
| 549 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 467 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 550 ASSERT_TRUE(callback.called()); | 468 IsError(net::ERR_CONNECTION_REFUSED)); |
| 551 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); | |
| 552 EXPECT_THAT(callback.proof(), IsNull()); | |
| 553 } | 469 } |
| 554 | 470 |
| 555 TEST_P(LogDnsClientTest, | 471 TEST_P(LogDnsClientTest, |
| 556 QueryAuditProofReportsTimeoutsDuringAuditProofRequests) { | 472 QueryAuditProofReportsTimeoutsDuringAuditProofRequests) { |
| 557 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); | 473 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); |
| 558 mock_dns_.ExpectRequestAndTimeout("0.123456.999999.tree.ct.test."); | 474 mock_dns_.ExpectRequestAndTimeout("0.123456.999999.tree.ct.test."); |
| 559 | 475 |
| 560 MockAuditProofCallback callback; | 476 net::ct::MerkleAuditProof proof; |
| 561 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); | 477 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &proof), |
| 562 ASSERT_TRUE(callback.called()); | 478 IsError(net::ERR_DNS_TIMED_OUT)); |
| 563 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); | |
| 564 EXPECT_THAT(callback.proof(), IsNull()); | |
| 565 } | 479 } |
| 566 | 480 |
| 567 TEST_P(LogDnsClientTest, AdoptsLatestDnsConfigIfValid) { | 481 TEST_P(LogDnsClientTest, AdoptsLatestDnsConfigIfValid) { |
| 568 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); | 482 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); |
| 569 net::DnsClient* dns_client = tmp.get(); | 483 net::DnsClient* dns_client = tmp.get(); |
| 570 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0); | 484 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0); |
| 571 | 485 |
| 572 // Get the current DNS config, modify it and broadcast the update. | 486 // Get the current DNS config, modify it and broadcast the update. |
| 573 net::DnsConfig config(*dns_client->GetConfig()); | 487 net::DnsConfig config(*dns_client->GetConfig()); |
| 574 ASSERT_NE(123, config.attempts); | 488 ASSERT_NE(123, config.attempts); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 614 mock_dns_.ExpectAuditProofRequestAndResponse( | 528 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 615 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), | 529 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), |
| 616 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); | 530 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); |
| 617 } | 531 } |
| 618 | 532 |
| 619 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); | 533 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); |
| 620 net::DnsClient* dns_client = tmp.get(); | 534 net::DnsClient* dns_client = tmp.get(); |
| 621 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0); | 535 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0); |
| 622 | 536 |
| 623 // Start query. | 537 // Start query. |
| 624 MockAuditProofCallback callback; | 538 net::ct::MerkleAuditProof proof; |
| 625 QueryAuditProofAsync(&log_client, "ct.test", kLeafHashes[0], 999999, | 539 net::TestCompletionCallback callback; |
| 626 callback.AsCallback()); | 540 ASSERT_THAT(log_client.QueryAuditProof("ct.test", kLeafHashes[0], 999999, |
| 541 &proof, callback.callback()), | |
| 542 IsError(net::ERR_IO_PENDING)); | |
| 627 | 543 |
| 628 // Get the current DNS config, modify it and broadcast the update. | 544 // Get the current DNS config, modify it and publish the update. |
| 545 // The new config is distributed asynchronously via NetworkChangeNotifier. | |
| 629 net::DnsConfig config(*dns_client->GetConfig()); | 546 net::DnsConfig config(*dns_client->GetConfig()); |
| 630 ASSERT_NE(123, config.attempts); | 547 ASSERT_NE(123, config.attempts); |
| 631 config.attempts = 123; | 548 config.attempts = 123; |
| 632 mock_dns_.SetDnsConfig(config); | 549 mock_dns_.SetDnsConfig(config); |
| 550 // The new config is distributed asynchronously via NetworkChangeNotifier. | |
| 551 // Config change shouldn't have taken effect yet. | |
| 552 ASSERT_NE(123, dns_client->GetConfig()->attempts); | |
| 633 | 553 |
| 634 callback.WaitUntilRun(); | 554 // Wait for the query to complete, then check that it was successful. |
| 635 // Check that the DNS changes propogated before the query completed. | 555 // The DNS config should be updated during this time. |
| 636 EXPECT_EQ(123, dns_client->GetConfig()->attempts); | 556 ASSERT_THAT(callback.WaitForResult(), IsOk()); |
| 557 EXPECT_THAT(proof.leaf_index, Eq(123456u)); | |
| 558 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | |
| 559 // EXPECT_THAT(proof.tree_size, Eq(999999)); | |
| 560 EXPECT_THAT(proof.nodes, Eq(audit_proof)); | |
| 637 | 561 |
| 638 ASSERT_TRUE(callback.called()); | 562 // Check that the DNS config change was adopted. |
| 639 EXPECT_THAT(callback.net_error(), IsOk()); | 563 ASSERT_EQ(123, dns_client->GetConfig()->attempts); |
| 640 ASSERT_THAT(callback.proof(), NotNull()); | |
| 641 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); | |
| 642 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | |
| 643 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); | |
| 644 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); | |
| 645 } | 564 } |
| 646 | 565 |
| 647 TEST_P(LogDnsClientTest, CanPerformQueriesInParallel) { | 566 TEST_P(LogDnsClientTest, CanPerformQueriesInParallel) { |
| 648 // Check that 3 queries can be performed in parallel. | 567 // Check that 3 queries can be performed in parallel. |
| 649 constexpr size_t kNumOfParallelQueries = 3; | 568 constexpr size_t kNumOfParallelQueries = 3; |
| 650 ASSERT_THAT(kNumOfParallelQueries, | 569 ASSERT_THAT(kNumOfParallelQueries, |
| 651 AllOf(Le(arraysize(kLeafIndexQnames)), | 570 AllOf(Le(arraysize(kLeafIndexQnames)), |
| 652 Le(arraysize(kLeafIndices)), Le(arraysize(kTreeSizes)))) | 571 Le(arraysize(kLeafIndices)), Le(arraysize(kTreeSizes)))) |
| 653 << "Not enough test data for this many parallel queries"; | 572 << "Not enough test data for this many parallel queries"; |
| 654 | 573 |
| 655 std::unique_ptr<LogDnsClient> log_client = | 574 std::unique_ptr<LogDnsClient> log_client = |
| 656 CreateLogDnsClient(kNumOfParallelQueries); | 575 CreateLogDnsClient(kNumOfParallelQueries); |
| 657 MockAuditProofCallback callbacks[kNumOfParallelQueries]; | 576 net::TestCompletionCallback callbacks[kNumOfParallelQueries]; |
| 658 | 577 |
| 659 // Expect multiple leaf index requests. | 578 // Expect multiple leaf index requests. |
| 660 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { | 579 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { |
| 661 mock_dns_.ExpectLeafIndexRequestAndResponse( | 580 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[i], |
| 662 kLeafIndexQnames[i], kLeafIndices[i]); | 581 kLeafIndices[i]); |
| 663 } | 582 } |
| 664 | 583 |
| 665 // Make each query require one more audit proof request than the last, by | 584 // Make each query require one more audit proof request than the last, by |
| 666 // increasing the number of nodes in the audit proof by | 585 // increasing the number of nodes in the audit proof by |
| 667 // kMaxProofNodesPerDnsResponse for each query. This helps to test that | 586 // kMaxProofNodesPerDnsResponse for each query. This helps to test that |
| 668 // parallel queries do not intefere with each other, e.g. one query causing | 587 // parallel queries do not intefere with each other, e.g. one query causing |
| 669 // another to end prematurely. | 588 // another to end prematurely. |
| 670 std::vector<std::string> audit_proofs[kNumOfParallelQueries]; | 589 std::vector<std::string> audit_proofs[kNumOfParallelQueries]; |
| 671 for (size_t query_i = 0; query_i < kNumOfParallelQueries; ++query_i) { | 590 for (size_t query_i = 0; query_i < kNumOfParallelQueries; ++query_i) { |
| 672 const size_t dns_requests_required = query_i + 1; | 591 const size_t dns_requests_required = query_i + 1; |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 695 if (start_node < end_node) { | 614 if (start_node < end_node) { |
| 696 mock_dns_.ExpectAuditProofRequestAndResponse( | 615 mock_dns_.ExpectAuditProofRequestAndResponse( |
| 697 base::StringPrintf("%zu.%" PRIu64 ".%" PRIu64 ".tree.ct.test.", | 616 base::StringPrintf("%zu.%" PRIu64 ".%" PRIu64 ".tree.ct.test.", |
| 698 start_node, kLeafIndices[query_i], | 617 start_node, kLeafIndices[query_i], |
| 699 kTreeSizes[query_i]), | 618 kTreeSizes[query_i]), |
| 700 proof.begin() + start_node, proof.begin() + end_node); | 619 proof.begin() + start_node, proof.begin() + end_node); |
| 701 } | 620 } |
| 702 } | 621 } |
| 703 } | 622 } |
| 704 | 623 |
| 624 net::ct::MerkleAuditProof proofs[kNumOfParallelQueries]; | |
| 625 | |
| 705 // Start the queries. | 626 // Start the queries. |
| 706 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { | 627 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { |
| 707 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[i], | 628 ASSERT_THAT( |
| 708 kTreeSizes[i], callbacks[i].AsCallback()); | 629 log_client->QueryAuditProof("ct.test", kLeafHashes[i], kTreeSizes[i], |
| 630 &proofs[i], callbacks[i].callback()), | |
| 631 IsError(net::ERR_IO_PENDING)) | |
| 632 << "query #" << i; | |
| 709 } | 633 } |
| 710 | 634 |
| 711 // Wait for each query to complete and check its results. | 635 // Wait for each query to complete and check its results. |
| 712 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { | 636 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { |
| 713 MockAuditProofCallback& callback = callbacks[i]; | 637 net::TestCompletionCallback& callback = callbacks[i]; |
| 714 callbacks[i].WaitUntilRun(); | |
| 715 | 638 |
| 716 SCOPED_TRACE(testing::Message() << "callbacks[" << i << "]"); | 639 SCOPED_TRACE(testing::Message() << "callbacks[" << i << "]"); |
| 717 ASSERT_TRUE(callback.called()); | 640 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 718 EXPECT_THAT(callback.net_error(), IsOk()); | 641 EXPECT_THAT(proofs[i].leaf_index, Eq(kLeafIndices[i])); |
| 719 ASSERT_THAT(callback.proof(), NotNull()); | |
| 720 EXPECT_THAT(callback.proof()->leaf_index, Eq(kLeafIndices[i])); | |
| 721 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 642 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 722 // EXPECT_THAT(callback.proof()->tree_size, kTreeSizes[i]); | 643 // EXPECT_THAT(proofs[i].tree_size, kTreeSizes[i]); |
| 723 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proofs[i])); | 644 EXPECT_THAT(proofs[i].nodes, Eq(audit_proofs[i])); |
| 724 } | 645 } |
| 725 } | 646 } |
| 726 | 647 |
| 727 TEST_P(LogDnsClientTest, CanBeThrottledToOneQueryAtATime) { | 648 TEST_P(LogDnsClientTest, CanBeThrottledToOneQueryAtATime) { |
| 728 // Check that queries can be rate-limited to one at a time. | 649 // Check that queries can be rate-limited to one at a time. |
| 729 // The second query, initiated while the first is in progress, should fail. | 650 // The second query, initiated while the first is in progress, should fail. |
| 730 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); | 651 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); |
| 731 | 652 |
| 732 // Expect the first query to send leaf index and audit proof requests, but the | 653 // Expect the first query to send leaf index and audit proof requests, but the |
| 733 // second should not due to throttling. | 654 // second should not due to throttling. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 744 audit_proof.begin() + 7, | 665 audit_proof.begin() + 7, |
| 745 audit_proof.begin() + 14); | 666 audit_proof.begin() + 14); |
| 746 mock_dns_.ExpectAuditProofRequestAndResponse("14.123456.999999.tree.ct.test.", | 667 mock_dns_.ExpectAuditProofRequestAndResponse("14.123456.999999.tree.ct.test.", |
| 747 audit_proof.begin() + 14, | 668 audit_proof.begin() + 14, |
| 748 audit_proof.end()); | 669 audit_proof.end()); |
| 749 | 670 |
| 750 const size_t kMaxConcurrentQueries = 1; | 671 const size_t kMaxConcurrentQueries = 1; |
| 751 std::unique_ptr<LogDnsClient> log_client = | 672 std::unique_ptr<LogDnsClient> log_client = |
| 752 CreateLogDnsClient(kMaxConcurrentQueries); | 673 CreateLogDnsClient(kMaxConcurrentQueries); |
| 753 | 674 |
| 754 // Start the queries. | 675 // Try to start the queries. |
| 755 MockAuditProofCallback callback1; | 676 net::ct::MerkleAuditProof proof1; |
| 756 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[0], 999999, | 677 net::TestCompletionCallback callback1; |
| 757 callback1.AsCallback()); | 678 ASSERT_THAT(log_client->QueryAuditProof("ct.test", kLeafHashes[0], 999999, |
| 758 MockAuditProofCallback callback2; | 679 &proof1, callback1.callback()), |
| 759 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[1], 999999, | 680 IsError(net::ERR_IO_PENDING)); |
| 760 callback2.AsCallback()); | |
| 761 | 681 |
| 762 callback1.WaitUntilRun(); | 682 net::ct::MerkleAuditProof proof2; |
| 763 callback2.WaitUntilRun(); | 683 net::TestCompletionCallback callback2; |
| 684 ASSERT_THAT(log_client->QueryAuditProof("ct.test", kLeafHashes[1], 999999, | |
| 685 &proof2, callback2.callback()), | |
| 686 IsError(net::ERR_TEMPORARILY_THROTTLED)); | |
| 764 | 687 |
| 765 // Check that the first query succeeded. | 688 // Check that the first query succeeded. |
| 766 ASSERT_TRUE(callback1.called()); | 689 EXPECT_THAT(callback1.WaitForResult(), IsOk()); |
| 767 EXPECT_THAT(callback1.net_error(), IsOk()); | 690 EXPECT_THAT(proof1.leaf_index, Eq(123456u)); |
| 768 ASSERT_THAT(callback1.proof(), NotNull()); | |
| 769 EXPECT_THAT(callback1.proof()->leaf_index, Eq(123456u)); | |
| 770 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 691 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 771 // EXPECT_THAT(callback1.proof()->tree_size, Eq(999999)); | 692 // EXPECT_THAT(proof1.tree_size, Eq(999999)); |
| 772 EXPECT_THAT(callback1.proof()->nodes, Eq(audit_proof)); | 693 EXPECT_THAT(proof1.nodes, Eq(audit_proof)); |
| 773 | |
| 774 // Check that the second query failed. | |
| 775 ASSERT_TRUE(callback2.called()); | |
| 776 EXPECT_THAT(callback2.net_error(), IsError(net::ERR_TEMPORARILY_THROTTLED)); | |
| 777 EXPECT_THAT(callback2.proof(), IsNull()); | |
| 778 | 694 |
| 779 // Try a third query, which should succeed now that the first is finished. | 695 // Try a third query, which should succeed now that the first is finished. |
| 780 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[2], 666); | 696 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[2], 666); |
| 781 mock_dns_.ExpectAuditProofRequestAndResponse("0.666.999999.tree.ct.test.", | 697 mock_dns_.ExpectAuditProofRequestAndResponse("0.666.999999.tree.ct.test.", |
| 782 audit_proof.begin(), | 698 audit_proof.begin(), |
| 783 audit_proof.begin() + 7); | 699 audit_proof.begin() + 7); |
| 784 mock_dns_.ExpectAuditProofRequestAndResponse("7.666.999999.tree.ct.test.", | 700 mock_dns_.ExpectAuditProofRequestAndResponse("7.666.999999.tree.ct.test.", |
| 785 audit_proof.begin() + 7, | 701 audit_proof.begin() + 7, |
| 786 audit_proof.begin() + 14); | 702 audit_proof.begin() + 14); |
| 787 mock_dns_.ExpectAuditProofRequestAndResponse("14.666.999999.tree.ct.test.", | 703 mock_dns_.ExpectAuditProofRequestAndResponse("14.666.999999.tree.ct.test.", |
| 788 audit_proof.begin() + 14, | 704 audit_proof.begin() + 14, |
| 789 audit_proof.end()); | 705 audit_proof.end()); |
| 790 | 706 |
| 791 MockAuditProofCallback callback3; | 707 net::ct::MerkleAuditProof proof3; |
| 792 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[2], 999999, | 708 net::TestCompletionCallback callback3; |
| 793 callback3.AsCallback()); | 709 ASSERT_THAT(log_client->QueryAuditProof("ct.test", kLeafHashes[2], 999999, |
| 794 | 710 &proof3, callback3.callback()), |
| 795 callback3.WaitUntilRun(); | 711 IsError(net::ERR_IO_PENDING)); |
| 796 | 712 |
| 797 // Check that the third query succeeded. | 713 // Check that the third query succeeded. |
| 798 ASSERT_TRUE(callback3.called()); | 714 EXPECT_THAT(callback3.WaitForResult(), IsOk()); |
| 799 EXPECT_THAT(callback3.net_error(), IsOk()); | 715 EXPECT_THAT(proof3.leaf_index, Eq(666u)); |
| 800 ASSERT_THAT(callback3.proof(), NotNull()); | |
| 801 EXPECT_THAT(callback3.proof()->leaf_index, Eq(666u)); | |
| 802 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. | 716 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. |
| 803 // EXPECT_THAT(callback3.proof()->tree_size, Eq(999999)); | 717 // EXPECT_THAT(proof3.tree_size, Eq(999999)); |
| 804 EXPECT_THAT(callback3.proof()->nodes, Eq(audit_proof)); | 718 EXPECT_THAT(proof3.nodes, Eq(audit_proof)); |
| 805 } | 719 } |
| 806 | 720 |
| 807 INSTANTIATE_TEST_CASE_P(ReadMode, | 721 INSTANTIATE_TEST_CASE_P(ReadMode, |
| 808 LogDnsClientTest, | 722 LogDnsClientTest, |
| 809 ::testing::Values(net::IoMode::ASYNC, | 723 ::testing::Values(net::IoMode::ASYNC, |
| 810 net::IoMode::SYNCHRONOUS)); | 724 net::IoMode::SYNCHRONOUS)); |
| 811 | 725 |
| 812 } // namespace | 726 } // namespace |
| 813 } // namespace certificate_transparency | 727 } // namespace certificate_transparency |
| OLD | NEW |