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

Side by Side Diff: components/certificate_transparency/log_dns_client_unittest.cc

Issue 2369373002: LogDnsClient now returns some errors synchronously (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698