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

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

Issue 2369373002: LogDnsClient now returns some errors synchronously (Closed)
Patch Set: Change int to net::Error 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";
Eran Messeri 2016/09/30 09:26:51 nit: EXPECT_FALSE ?
Rob Percival 2016/09/30 12:03:21 Done.
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>(mock_dns_.CreateDnsClient(), 158 return base::MakeUnique<LogDnsClient>(mock_dns_.CreateDnsClient(),
129 net::NetLogWithSource(), 159 net::NetLogWithSource(),
130 kMaxConcurrentQueries); 160 kMaxConcurrentQueries);
131 } 161 }
132 162
133 void QueryAuditProofAsync(LogDnsClient* log_client, 163 net::Error QueryAuditProofAsync(
Eran Messeri 2016/09/30 09:26:52 Seems like this method is not justified anymore, a
Rob Percival 2016/09/30 12:03:21 Done.
134 const std::string& log_domain, 164 LogDnsClient* log_client,
135 const char leaf_hash[crypto::kSHA256Length], 165 const std::string& log_domain,
136 uint64_t tree_size, 166 const char leaf_hash[crypto::kSHA256Length],
137 const LogDnsClient::AuditProofCallback& callback) { 167 uint64_t tree_size,
138 log_client->QueryAuditProof(log_domain, leaf_hash, tree_size, callback); 168 const LogDnsClient::AuditProofCallback& callback) {
169 return log_client->QueryAuditProof(log_domain, leaf_hash, tree_size,
170 callback);
139 } 171 }
140 172
141 // Convenience function for calling QueryAuditProofAsync synchronously. 173 // Convenience function for calling ASSERT_THAT(QueryAuditProofAsync
142 void QueryAuditProof(const std::string& log_domain, 174 // synchronously.
143 const char leaf_hash[crypto::kSHA256Length], 175 net::Error QueryAuditProof(const std::string& log_domain,
144 uint64_t tree_size, 176 const char leaf_hash[crypto::kSHA256Length],
145 MockAuditProofCallback* callback) { 177 uint64_t tree_size,
178 MockAuditProofCallback* callback) {
146 std::unique_ptr<LogDnsClient> log_client = CreateLogDnsClient(0); 179 std::unique_ptr<LogDnsClient> log_client = CreateLogDnsClient(0);
147 QueryAuditProofAsync(log_client.get(), log_domain, leaf_hash, tree_size, 180 net::Error result =
148 callback->AsCallback()); 181 QueryAuditProofAsync(log_client.get(), log_domain, leaf_hash, tree_size,
149 callback->WaitUntilRun(); 182 callback->AsCallback());
183
184 if (result == net::ERR_IO_PENDING) {
185 callback->WaitUntilRun(TestTimeouts::action_max_timeout());
186 } else {
187 // The callback isn't expected to be invoked, but pump the message loop
188 // anyway to confirm that it indeed isn't run. Give up as soon as the
189 // message loop is empty (zero timeout).
190 callback->WaitUntilRun(base::TimeDelta());
191 }
192
193 return result;
150 } 194 }
151 195
152 // This will be the NetworkChangeNotifier singleton for the duration of the 196 // This will be the NetworkChangeNotifier singleton for the duration of the
153 // test. It is accessed statically by LogDnsClient. 197 // test. It is accessed statically by LogDnsClient.
154 std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; 198 std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
155 // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient, 199 // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient,
156 // the underlying net::DnsClient, and NetworkChangeNotifier. 200 // the underlying net::DnsClient, and NetworkChangeNotifier.
157 base::MessageLoopForIO message_loop_; 201 base::MessageLoopForIO message_loop_;
158 // Allows mock DNS sockets to be setup. 202 // Allows mock DNS sockets to be setup.
159 MockLogDnsTraffic mock_dns_; 203 MockLogDnsTraffic mock_dns_;
160 }; 204 };
161 205
162 TEST_P(LogDnsClientTest, QueryAuditProofReportsThatLogDomainDoesNotExist) { 206 TEST_P(LogDnsClientTest, QueryAuditProofReportsThatLogDomainDoesNotExist) {
163 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], 207 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0],
164 net::dns_protocol::kRcodeNXDOMAIN); 208 net::dns_protocol::kRcodeNXDOMAIN);
165 209
166 MockAuditProofCallback callback; 210 MockAuditProofCallback callback;
167 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 211 ASSERT_THAT(
212 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
213 IsError(net::ERR_IO_PENDING));
168 ASSERT_TRUE(callback.called()); 214 ASSERT_TRUE(callback.called());
169 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); 215 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED));
170 EXPECT_THAT(callback.proof(), IsNull()); 216 EXPECT_THAT(callback.proof(), IsNull());
171 } 217 }
172 218
173 TEST_P(LogDnsClientTest, 219 TEST_P(LogDnsClientTest,
174 QueryAuditProofReportsServerFailuresDuringLeafIndexRequests) { 220 QueryAuditProofReportsServerFailuresDuringLeafIndexRequests) {
175 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], 221 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0],
176 net::dns_protocol::kRcodeSERVFAIL); 222 net::dns_protocol::kRcodeSERVFAIL);
177 223
178 MockAuditProofCallback callback; 224 MockAuditProofCallback callback;
179 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 225 ASSERT_THAT(
226 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
227 IsError(net::ERR_IO_PENDING));
180 ASSERT_TRUE(callback.called()); 228 ASSERT_TRUE(callback.called());
181 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); 229 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED));
182 EXPECT_THAT(callback.proof(), IsNull()); 230 EXPECT_THAT(callback.proof(), IsNull());
183 } 231 }
184 232
185 TEST_P(LogDnsClientTest, 233 TEST_P(LogDnsClientTest,
186 QueryAuditProofReportsServerRefusalsDuringLeafIndexRequests) { 234 QueryAuditProofReportsServerRefusalsDuringLeafIndexRequests) {
187 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], 235 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0],
188 net::dns_protocol::kRcodeREFUSED); 236 net::dns_protocol::kRcodeREFUSED);
189 237
190 MockAuditProofCallback callback; 238 MockAuditProofCallback callback;
191 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 239 ASSERT_THAT(
240 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
241 IsError(net::ERR_IO_PENDING));
192 ASSERT_TRUE(callback.called()); 242 ASSERT_TRUE(callback.called());
193 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); 243 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED));
194 EXPECT_THAT(callback.proof(), IsNull()); 244 EXPECT_THAT(callback.proof(), IsNull());
195 } 245 }
196 246
197 TEST_P(LogDnsClientTest, 247 TEST_P(LogDnsClientTest,
198 QueryAuditProofReportsMalformedResponseIfLeafIndexIsNotNumeric) { 248 QueryAuditProofReportsMalformedResponseIfLeafIndexIsNotNumeric) {
199 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "foo"); 249 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "foo");
200 250
201 MockAuditProofCallback callback; 251 MockAuditProofCallback callback;
202 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 252 ASSERT_THAT(
253 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
254 IsError(net::ERR_IO_PENDING));
203 ASSERT_TRUE(callback.called()); 255 ASSERT_TRUE(callback.called());
204 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 256 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
205 EXPECT_THAT(callback.proof(), IsNull()); 257 EXPECT_THAT(callback.proof(), IsNull());
206 } 258 }
207 259
208 TEST_P(LogDnsClientTest, 260 TEST_P(LogDnsClientTest,
209 QueryAuditProofReportsMalformedResponseIfLeafIndexIsFloatingPoint) { 261 QueryAuditProofReportsMalformedResponseIfLeafIndexIsFloatingPoint) {
210 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456.0"); 262 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456.0");
211 263
212 MockAuditProofCallback callback; 264 MockAuditProofCallback callback;
213 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 265 ASSERT_THAT(
266 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
267 IsError(net::ERR_IO_PENDING));
214 ASSERT_TRUE(callback.called()); 268 ASSERT_TRUE(callback.called());
215 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 269 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
216 EXPECT_THAT(callback.proof(), IsNull()); 270 EXPECT_THAT(callback.proof(), IsNull());
217 } 271 }
218 272
219 TEST_P(LogDnsClientTest, 273 TEST_P(LogDnsClientTest,
220 QueryAuditProofReportsMalformedResponseIfLeafIndexIsEmpty) { 274 QueryAuditProofReportsMalformedResponseIfLeafIndexIsEmpty) {
221 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], ""); 275 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "");
222 276
223 MockAuditProofCallback callback; 277 MockAuditProofCallback callback;
224 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 278 ASSERT_THAT(
279 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
280 IsError(net::ERR_IO_PENDING));
225 ASSERT_TRUE(callback.called()); 281 ASSERT_TRUE(callback.called());
226 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 282 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
227 EXPECT_THAT(callback.proof(), IsNull()); 283 EXPECT_THAT(callback.proof(), IsNull());
228 } 284 }
229 285
230 TEST_P(LogDnsClientTest, 286 TEST_P(LogDnsClientTest,
231 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericPrefix) { 287 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericPrefix) {
232 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "foo123456"); 288 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "foo123456");
233 289
234 MockAuditProofCallback callback; 290 MockAuditProofCallback callback;
235 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 291 ASSERT_THAT(
292 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
293 IsError(net::ERR_IO_PENDING));
236 ASSERT_TRUE(callback.called()); 294 ASSERT_TRUE(callback.called());
237 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 295 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
238 EXPECT_THAT(callback.proof(), IsNull()); 296 EXPECT_THAT(callback.proof(), IsNull());
239 } 297 }
240 298
241 TEST_P(LogDnsClientTest, 299 TEST_P(LogDnsClientTest,
242 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericSuffix) { 300 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericSuffix) {
243 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456foo"); 301 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456foo");
244 302
245 MockAuditProofCallback callback; 303 MockAuditProofCallback callback;
246 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 304 ASSERT_THAT(
305 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
306 IsError(net::ERR_IO_PENDING));
247 ASSERT_TRUE(callback.called()); 307 ASSERT_TRUE(callback.called());
248 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 308 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
249 EXPECT_THAT(callback.proof(), IsNull()); 309 EXPECT_THAT(callback.proof(), IsNull());
250 } 310 }
251 311
252 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLogDomainIsEmpty) { 312 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLogDomainIsEmpty) {
253 MockAuditProofCallback callback; 313 MockAuditProofCallback callback;
254 QueryAuditProof("", kLeafHashes[0], kTreeSizes[0], &callback); 314 ASSERT_THAT(QueryAuditProof("", kLeafHashes[0], kTreeSizes[0], &callback),
255 ASSERT_TRUE(callback.called()); 315 IsError(net::ERR_INVALID_ARGUMENT));
256 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 316 ASSERT_FALSE(callback.called());
257 EXPECT_THAT(callback.proof(), IsNull());
258 } 317 }
259 318
260 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsInvalid) { 319 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsInvalid) {
261 MockAuditProofCallback callback; 320 MockAuditProofCallback callback;
262 QueryAuditProof("ct.test", "foo", kTreeSizes[0], &callback); 321 ASSERT_THAT(QueryAuditProof("ct.test", "foo", kTreeSizes[0], &callback),
263 ASSERT_TRUE(callback.called()); 322 IsError(net::ERR_INVALID_ARGUMENT));
264 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 323 ASSERT_FALSE(callback.called());
265 EXPECT_THAT(callback.proof(), IsNull());
266 } 324 }
267 325
268 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsEmpty) { 326 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsEmpty) {
269 MockAuditProofCallback callback; 327 MockAuditProofCallback callback;
270 QueryAuditProof("ct.test", "", kTreeSizes[0], &callback); 328 ASSERT_THAT(QueryAuditProof("ct.test", "", kTreeSizes[0], &callback),
271 ASSERT_TRUE(callback.called()); 329 IsError(net::ERR_INVALID_ARGUMENT));
272 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 330 ASSERT_FALSE(callback.called());
273 EXPECT_THAT(callback.proof(), IsNull());
274 } 331 }
275 332
276 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsNull) { 333 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsNull) {
277 MockAuditProofCallback callback; 334 MockAuditProofCallback callback;
278 QueryAuditProof("ct.test", nullptr, kTreeSizes[0], &callback); 335 ASSERT_THAT(QueryAuditProof("ct.test", nullptr, kTreeSizes[0], &callback),
279 ASSERT_TRUE(callback.called()); 336 IsError(net::ERR_INVALID_ARGUMENT));
280 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 337 ASSERT_FALSE(callback.called());
281 EXPECT_THAT(callback.proof(), IsNull());
282 } 338 }
283 339
284 TEST_P(LogDnsClientTest, 340 TEST_P(LogDnsClientTest,
285 QueryAuditProofReportsSocketErrorsDuringLeafIndexRequests) { 341 QueryAuditProofReportsSocketErrorsDuringLeafIndexRequests) {
286 mock_dns_.ExpectRequestAndSocketError(kLeafIndexQnames[0], 342 mock_dns_.ExpectRequestAndSocketError(kLeafIndexQnames[0],
287 net::ERR_CONNECTION_REFUSED); 343 net::ERR_CONNECTION_REFUSED);
288 344
289 MockAuditProofCallback callback; 345 MockAuditProofCallback callback;
290 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 346 ASSERT_THAT(
347 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
348 IsError(net::ERR_IO_PENDING));
291 ASSERT_TRUE(callback.called()); 349 ASSERT_TRUE(callback.called());
292 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); 350 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED));
293 EXPECT_THAT(callback.proof(), IsNull()); 351 EXPECT_THAT(callback.proof(), IsNull());
294 } 352 }
295 353
296 TEST_P(LogDnsClientTest, 354 TEST_P(LogDnsClientTest,
297 QueryAuditProofReportsTimeoutsDuringLeafIndexRequests) { 355 QueryAuditProofReportsTimeoutsDuringLeafIndexRequests) {
298 mock_dns_.ExpectRequestAndTimeout(kLeafIndexQnames[0]); 356 mock_dns_.ExpectRequestAndTimeout(kLeafIndexQnames[0]);
299 357
300 MockAuditProofCallback callback; 358 MockAuditProofCallback callback;
301 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 359 ASSERT_THAT(
360 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
361 IsError(net::ERR_IO_PENDING));
362
363 callback.WaitUntilRun(TestTimeouts::action_max_timeout());
302 ASSERT_TRUE(callback.called()); 364 ASSERT_TRUE(callback.called());
303 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); 365 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT));
304 EXPECT_THAT(callback.proof(), IsNull()); 366 EXPECT_THAT(callback.proof(), IsNull());
305 } 367 }
306 368
307 TEST_P(LogDnsClientTest, QueryAuditProof) { 369 TEST_P(LogDnsClientTest, QueryAuditProof) {
308 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); 370 const std::vector<std::string> audit_proof = GetSampleAuditProof(20);
309 371
310 // Expect a leaf index query first, to map the leaf hash to a leaf index. 372 // Expect a leaf index query first, to map the leaf hash to a leaf index.
311 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 373 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
312 374
313 // It takes a number of DNS requests to retrieve the entire |audit_proof| 375 // It takes a number of DNS requests to retrieve the entire |audit_proof|
314 // (see |kMaxProofNodesPerDnsResponse|). 376 // (see |kMaxProofNodesPerDnsResponse|).
315 for (size_t nodes_begin = 0; nodes_begin < audit_proof.size(); 377 for (size_t nodes_begin = 0; nodes_begin < audit_proof.size();
316 nodes_begin += kMaxProofNodesPerDnsResponse) { 378 nodes_begin += kMaxProofNodesPerDnsResponse) {
317 const size_t nodes_end = std::min( 379 const size_t nodes_end = std::min(
318 nodes_begin + kMaxProofNodesPerDnsResponse, audit_proof.size()); 380 nodes_begin + kMaxProofNodesPerDnsResponse, audit_proof.size());
319 381
320 mock_dns_.ExpectAuditProofRequestAndResponse( 382 mock_dns_.ExpectAuditProofRequestAndResponse(
321 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), 383 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin),
322 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); 384 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end);
323 } 385 }
324 386
325 MockAuditProofCallback callback; 387 MockAuditProofCallback callback;
326 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 388 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
389 IsError(net::ERR_IO_PENDING));
327 ASSERT_TRUE(callback.called()); 390 ASSERT_TRUE(callback.called());
328 EXPECT_THAT(callback.net_error(), IsOk()); 391 EXPECT_THAT(callback.net_error(), IsOk());
329 ASSERT_THAT(callback.proof(), NotNull()); 392 ASSERT_THAT(callback.proof(), NotNull());
330 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); 393 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u));
331 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 394 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
332 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); 395 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999));
333 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); 396 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof));
334 } 397 }
335 398
336 TEST_P(LogDnsClientTest, QueryAuditProofHandlesResponsesWithShortAuditPaths) { 399 TEST_P(LogDnsClientTest, QueryAuditProofHandlesResponsesWithShortAuditPaths) {
(...skipping 16 matching lines...) Expand all
353 audit_proof.begin() + 6, 416 audit_proof.begin() + 6,
354 audit_proof.begin() + 10); 417 audit_proof.begin() + 10);
355 mock_dns_.ExpectAuditProofRequestAndResponse("10.123456.999999.tree.ct.test.", 418 mock_dns_.ExpectAuditProofRequestAndResponse("10.123456.999999.tree.ct.test.",
356 audit_proof.begin() + 10, 419 audit_proof.begin() + 10,
357 audit_proof.begin() + 13); 420 audit_proof.begin() + 13);
358 mock_dns_.ExpectAuditProofRequestAndResponse("13.123456.999999.tree.ct.test.", 421 mock_dns_.ExpectAuditProofRequestAndResponse("13.123456.999999.tree.ct.test.",
359 audit_proof.begin() + 13, 422 audit_proof.begin() + 13,
360 audit_proof.end()); 423 audit_proof.end());
361 424
362 MockAuditProofCallback callback; 425 MockAuditProofCallback callback;
363 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 426 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
427 IsError(net::ERR_IO_PENDING));
364 ASSERT_TRUE(callback.called()); 428 ASSERT_TRUE(callback.called());
365 EXPECT_THAT(callback.net_error(), IsOk()); 429 EXPECT_THAT(callback.net_error(), IsOk());
366 ASSERT_THAT(callback.proof(), NotNull()); 430 ASSERT_THAT(callback.proof(), NotNull());
367 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); 431 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u));
368 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 432 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
369 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); 433 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999));
370 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); 434 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof));
371 } 435 }
372 436
373 TEST_P(LogDnsClientTest, 437 TEST_P(LogDnsClientTest,
374 QueryAuditProofReportsThatAuditProofQnameDoesNotExist) { 438 QueryAuditProofReportsThatAuditProofQnameDoesNotExist) {
375 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 439 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
376 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", 440 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.",
377 net::dns_protocol::kRcodeNXDOMAIN); 441 net::dns_protocol::kRcodeNXDOMAIN);
378 442
379 MockAuditProofCallback callback; 443 MockAuditProofCallback callback;
380 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 444 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
445 IsError(net::ERR_IO_PENDING));
381 ASSERT_TRUE(callback.called()); 446 ASSERT_TRUE(callback.called());
382 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); 447 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED));
383 EXPECT_THAT(callback.proof(), IsNull()); 448 EXPECT_THAT(callback.proof(), IsNull());
384 } 449 }
385 450
386 TEST_P(LogDnsClientTest, 451 TEST_P(LogDnsClientTest,
387 QueryAuditProofReportsServerFailureDuringAuditProofRequests) { 452 QueryAuditProofReportsServerFailuresDuringAuditProofRequests) {
388 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 453 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
389 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", 454 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.",
390 net::dns_protocol::kRcodeSERVFAIL); 455 net::dns_protocol::kRcodeSERVFAIL);
391 456
392 MockAuditProofCallback callback; 457 MockAuditProofCallback callback;
393 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 458 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
459 IsError(net::ERR_IO_PENDING));
394 ASSERT_TRUE(callback.called()); 460 ASSERT_TRUE(callback.called());
395 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); 461 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED));
396 EXPECT_THAT(callback.proof(), IsNull()); 462 EXPECT_THAT(callback.proof(), IsNull());
397 } 463 }
398 464
399 TEST_P(LogDnsClientTest, 465 TEST_P(LogDnsClientTest,
400 QueryAuditProofReportsServerRefusalDuringAuditProofRequests) { 466 QueryAuditProofReportsServerRefusalsDuringAuditProofRequests) {
401 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 467 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
402 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", 468 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.",
403 net::dns_protocol::kRcodeREFUSED); 469 net::dns_protocol::kRcodeREFUSED);
404 470
405 MockAuditProofCallback callback; 471 MockAuditProofCallback callback;
406 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 472 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
473 IsError(net::ERR_IO_PENDING));
407 ASSERT_TRUE(callback.called()); 474 ASSERT_TRUE(callback.called());
408 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); 475 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED));
409 EXPECT_THAT(callback.proof(), IsNull()); 476 EXPECT_THAT(callback.proof(), IsNull());
410 } 477 }
411 478
412 TEST_P(LogDnsClientTest, 479 TEST_P(LogDnsClientTest,
413 QueryAuditProofReportsResponseMalformedIfNodeTooShort) { 480 QueryAuditProofReportsResponseMalformedIfNodeTooShort) {
414 // node is shorter than a SHA-256 hash (31 vs 32 bytes) 481 // node is shorter than a SHA-256 hash (31 vs 32 bytes)
415 const std::vector<std::string> audit_proof(1, std::string(31, 'a')); 482 const std::vector<std::string> audit_proof(1, std::string(31, 'a'));
416 483
417 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 484 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
418 mock_dns_.ExpectAuditProofRequestAndResponse( 485 mock_dns_.ExpectAuditProofRequestAndResponse(
419 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); 486 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end());
420 487
421 MockAuditProofCallback callback; 488 MockAuditProofCallback callback;
422 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 489 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
490 IsError(net::ERR_IO_PENDING));
423 ASSERT_TRUE(callback.called()); 491 ASSERT_TRUE(callback.called());
424 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 492 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
425 EXPECT_THAT(callback.proof(), IsNull()); 493 EXPECT_THAT(callback.proof(), IsNull());
426 } 494 }
427 495
428 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfNodeTooLong) { 496 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfNodeTooLong) {
429 // node is longer than a SHA-256 hash (33 vs 32 bytes) 497 // node is longer than a SHA-256 hash (33 vs 32 bytes)
430 const std::vector<std::string> audit_proof(1, std::string(33, 'a')); 498 const std::vector<std::string> audit_proof(1, std::string(33, 'a'));
431 499
432 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 500 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
433 mock_dns_.ExpectAuditProofRequestAndResponse( 501 mock_dns_.ExpectAuditProofRequestAndResponse(
434 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); 502 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end());
435 503
436 MockAuditProofCallback callback; 504 MockAuditProofCallback callback;
437 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 505 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
506 IsError(net::ERR_IO_PENDING));
438 ASSERT_TRUE(callback.called()); 507 ASSERT_TRUE(callback.called());
439 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 508 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
440 EXPECT_THAT(callback.proof(), IsNull()); 509 EXPECT_THAT(callback.proof(), IsNull());
441 } 510 }
442 511
443 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfEmpty) { 512 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfEmpty) {
444 const std::vector<std::string> audit_proof; 513 const std::vector<std::string> audit_proof;
445 514
446 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 515 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
447 mock_dns_.ExpectAuditProofRequestAndResponse( 516 mock_dns_.ExpectAuditProofRequestAndResponse(
448 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); 517 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end());
449 518
450 MockAuditProofCallback callback; 519 MockAuditProofCallback callback;
451 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 520 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
521 IsError(net::ERR_IO_PENDING));
452 ASSERT_TRUE(callback.called()); 522 ASSERT_TRUE(callback.called());
453 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 523 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
454 EXPECT_THAT(callback.proof(), IsNull()); 524 EXPECT_THAT(callback.proof(), IsNull());
455 } 525 }
456 526
457 TEST_P(LogDnsClientTest, 527 TEST_P(LogDnsClientTest,
458 QueryAuditProofReportsInvalidArgIfLeafIndexEqualToTreeSize) { 528 QueryAuditProofReportsInvalidArgIfLeafIndexEqualToTreeSize) {
459 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 529 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
460 530
461 MockAuditProofCallback callback; 531 MockAuditProofCallback callback;
462 QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback); 532 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback),
533 IsError(net::ERR_IO_PENDING));
463 ASSERT_TRUE(callback.called()); 534 ASSERT_TRUE(callback.called());
464 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 535 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT));
465 EXPECT_THAT(callback.proof(), IsNull()); 536 EXPECT_THAT(callback.proof(), IsNull());
466 } 537 }
467 538
468 TEST_P(LogDnsClientTest, 539 TEST_P(LogDnsClientTest,
469 QueryAuditProofReportsInvalidArgIfLeafIndexGreaterThanTreeSize) { 540 QueryAuditProofReportsInvalidArgIfLeafIndexGreaterThanTreeSize) {
470 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "999999"); 541 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "999999");
471 542
472 MockAuditProofCallback callback; 543 MockAuditProofCallback callback;
473 QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback); 544 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback),
545 IsError(net::ERR_IO_PENDING));
474 ASSERT_TRUE(callback.called()); 546 ASSERT_TRUE(callback.called());
475 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 547 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT));
476 EXPECT_THAT(callback.proof(), IsNull()); 548 EXPECT_THAT(callback.proof(), IsNull());
477 } 549 }
478 550
479 TEST_P(LogDnsClientTest, 551 TEST_P(LogDnsClientTest,
480 QueryAuditProofReportsSocketErrorsDuringAuditProofRequests) { 552 QueryAuditProofReportsSocketErrorsDuringAuditProofRequests) {
481 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 553 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
482 mock_dns_.ExpectRequestAndSocketError("0.123456.999999.tree.ct.test.", 554 mock_dns_.ExpectRequestAndSocketError("0.123456.999999.tree.ct.test.",
483 net::ERR_CONNECTION_REFUSED); 555 net::ERR_CONNECTION_REFUSED);
484 556
485 MockAuditProofCallback callback; 557 MockAuditProofCallback callback;
486 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 558 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
559 IsError(net::ERR_IO_PENDING));
487 ASSERT_TRUE(callback.called()); 560 ASSERT_TRUE(callback.called());
488 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); 561 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED));
489 EXPECT_THAT(callback.proof(), IsNull()); 562 EXPECT_THAT(callback.proof(), IsNull());
490 } 563 }
491 564
492 TEST_P(LogDnsClientTest, 565 TEST_P(LogDnsClientTest,
493 QueryAuditProofReportsTimeoutsDuringAuditProofRequests) { 566 QueryAuditProofReportsTimeoutsDuringAuditProofRequests) {
494 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456"); 567 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], "123456");
495 mock_dns_.ExpectRequestAndTimeout("0.123456.999999.tree.ct.test."); 568 mock_dns_.ExpectRequestAndTimeout("0.123456.999999.tree.ct.test.");
496 569
497 MockAuditProofCallback callback; 570 MockAuditProofCallback callback;
498 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 571 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
572 IsError(net::ERR_IO_PENDING));
573
574 callback.WaitUntilRun(TestTimeouts::action_max_timeout());
499 ASSERT_TRUE(callback.called()); 575 ASSERT_TRUE(callback.called());
500 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); 576 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT));
501 EXPECT_THAT(callback.proof(), IsNull()); 577 EXPECT_THAT(callback.proof(), IsNull());
502 } 578 }
503 579
504 TEST_P(LogDnsClientTest, AdoptsLatestDnsConfigIfValid) { 580 TEST_P(LogDnsClientTest, AdoptsLatestDnsConfigIfValid) {
505 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); 581 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient();
506 net::DnsClient* dns_client = tmp.get(); 582 net::DnsClient* dns_client = tmp.get();
507 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0); 583 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0);
508 584
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), 628 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin),
553 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); 629 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end);
554 } 630 }
555 631
556 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); 632 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient();
557 net::DnsClient* dns_client = tmp.get(); 633 net::DnsClient* dns_client = tmp.get();
558 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0); 634 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0);
559 635
560 // Start query. 636 // Start query.
561 MockAuditProofCallback callback; 637 MockAuditProofCallback callback;
562 QueryAuditProofAsync(&log_client, "ct.test", kLeafHashes[0], 999999, 638 ASSERT_THAT(QueryAuditProofAsync(&log_client, "ct.test", kLeafHashes[0],
563 callback.AsCallback()); 639 999999, callback.AsCallback()),
640 IsError(net::ERR_IO_PENDING));
564 641
565 // Get the current DNS config, modify it and broadcast the update. 642 // Get the current DNS config, modify it and broadcast the update.
566 net::DnsConfig config(*dns_client->GetConfig()); 643 net::DnsConfig config(*dns_client->GetConfig());
567 ASSERT_NE(123, config.attempts); 644 ASSERT_NE(123, config.attempts);
568 config.attempts = 123; 645 config.attempts = 123;
569 mock_dns_.SetDnsConfig(config); 646 mock_dns_.SetDnsConfig(config);
570 647
571 callback.WaitUntilRun(); 648 callback.WaitUntilRun(TestTimeouts::action_max_timeout());
572 // Check that the DNS changes propogated before the query completed. 649 // Check that the DNS changes propogated before the query completed.
573 EXPECT_EQ(123, dns_client->GetConfig()->attempts); 650 EXPECT_EQ(123, dns_client->GetConfig()->attempts);
574 651
575 ASSERT_TRUE(callback.called()); 652 ASSERT_TRUE(callback.called());
576 EXPECT_THAT(callback.net_error(), IsOk()); 653 EXPECT_THAT(callback.net_error(), IsOk());
577 ASSERT_THAT(callback.proof(), NotNull()); 654 ASSERT_THAT(callback.proof(), NotNull());
578 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); 655 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u));
579 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 656 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
580 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); 657 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999));
581 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); 658 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 base::StringPrintf("%zu.%" PRIu64 ".%" PRIu64 ".tree.ct.test.", 711 base::StringPrintf("%zu.%" PRIu64 ".%" PRIu64 ".tree.ct.test.",
635 start_node, kLeafIndices[query_i], 712 start_node, kLeafIndices[query_i],
636 kTreeSizes[query_i]), 713 kTreeSizes[query_i]),
637 proof.begin() + start_node, proof.begin() + end_node); 714 proof.begin() + start_node, proof.begin() + end_node);
638 } 715 }
639 } 716 }
640 } 717 }
641 718
642 // Start the queries. 719 // Start the queries.
643 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { 720 for (size_t i = 0; i < kNumOfParallelQueries; ++i) {
644 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[i], 721 ASSERT_THAT(
645 kTreeSizes[i], callbacks[i].AsCallback()); 722 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[i],
723 kTreeSizes[i], callbacks[i].AsCallback()),
724 IsError(net::ERR_IO_PENDING))
725 << "query #" << i;
646 } 726 }
647 727
648 // Wait for each query to complete and check its results. 728 // Wait for each query to complete and check its results.
649 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { 729 for (size_t i = 0; i < kNumOfParallelQueries; ++i) {
650 MockAuditProofCallback& callback = callbacks[i]; 730 MockAuditProofCallback& callback = callbacks[i];
651 callbacks[i].WaitUntilRun(); 731 callbacks[i].WaitUntilRun(TestTimeouts::action_max_timeout());
652 732
653 SCOPED_TRACE(testing::Message() << "callbacks[" << i << "]"); 733 SCOPED_TRACE(testing::Message() << "callbacks[" << i << "]");
654 ASSERT_TRUE(callback.called()); 734 ASSERT_TRUE(callback.called());
655 EXPECT_THAT(callback.net_error(), IsOk()); 735 EXPECT_THAT(callback.net_error(), IsOk());
656 ASSERT_THAT(callback.proof(), NotNull()); 736 ASSERT_THAT(callback.proof(), NotNull());
657 EXPECT_THAT(callback.proof()->leaf_index, Eq(kLeafIndices[i])); 737 EXPECT_THAT(callback.proof()->leaf_index, Eq(kLeafIndices[i]));
658 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 738 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
659 // EXPECT_THAT(callback.proof()->tree_size, kTreeSizes[i]); 739 // EXPECT_THAT(callback.proof()->tree_size, kTreeSizes[i]);
660 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proofs[i])); 740 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proofs[i]));
661 } 741 }
(...skipping 19 matching lines...) Expand all
681 audit_proof.begin() + 7, 761 audit_proof.begin() + 7,
682 audit_proof.begin() + 14); 762 audit_proof.begin() + 14);
683 mock_dns_.ExpectAuditProofRequestAndResponse("14.123456.999999.tree.ct.test.", 763 mock_dns_.ExpectAuditProofRequestAndResponse("14.123456.999999.tree.ct.test.",
684 audit_proof.begin() + 14, 764 audit_proof.begin() + 14,
685 audit_proof.end()); 765 audit_proof.end());
686 766
687 const size_t kMaxConcurrentQueries = 1; 767 const size_t kMaxConcurrentQueries = 1;
688 std::unique_ptr<LogDnsClient> log_client = 768 std::unique_ptr<LogDnsClient> log_client =
689 CreateLogDnsClient(kMaxConcurrentQueries); 769 CreateLogDnsClient(kMaxConcurrentQueries);
690 770
691 // Start the queries. 771 // Try to start the queries.
692 MockAuditProofCallback callback1; 772 MockAuditProofCallback callback1;
693 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[0], 999999, 773 ASSERT_THAT(QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[0],
694 callback1.AsCallback()); 774 999999, callback1.AsCallback()),
775 IsError(net::ERR_IO_PENDING));
776
695 MockAuditProofCallback callback2; 777 MockAuditProofCallback callback2;
696 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[1], 999999, 778 ASSERT_THAT(QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[1],
697 callback2.AsCallback()); 779 999999, callback2.AsCallback()),
780 IsError(net::ERR_TEMPORARILY_THROTTLED));
698 781
699 callback1.WaitUntilRun(); 782 // Give the queries a chance to run.
700 callback2.WaitUntilRun(); 783 callback1.WaitUntilRun(TestTimeouts::action_max_timeout());
784 // This callback shouldn't run, so don't wait much longer for it.
785 callback2.WaitUntilRun(TestTimeouts::tiny_timeout());
Eran Messeri 2016/09/30 09:26:52 Nit: Would it make sense to move that to line 795,
Rob Percival 2016/09/30 12:03:21 Done.
701 786
702 // Check that the first query succeeded. 787 // Check that the first query succeeded.
703 ASSERT_TRUE(callback1.called()); 788 ASSERT_TRUE(callback1.called());
704 EXPECT_THAT(callback1.net_error(), IsOk()); 789 EXPECT_THAT(callback1.net_error(), IsOk());
705 ASSERT_THAT(callback1.proof(), NotNull()); 790 ASSERT_THAT(callback1.proof(), NotNull());
706 EXPECT_THAT(callback1.proof()->leaf_index, Eq(123456u)); 791 EXPECT_THAT(callback1.proof()->leaf_index, Eq(123456u));
707 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 792 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
708 // EXPECT_THAT(callback1.proof()->tree_size, Eq(999999)); 793 // EXPECT_THAT(callback1.proof()->tree_size, Eq(999999));
709 EXPECT_THAT(callback1.proof()->nodes, Eq(audit_proof)); 794 EXPECT_THAT(callback1.proof()->nodes, Eq(audit_proof));
710 795
711 // Check that the second query failed. 796 // Check that the second query did not run.
712 ASSERT_TRUE(callback2.called()); 797 ASSERT_FALSE(callback2.called());
713 EXPECT_THAT(callback2.net_error(), IsError(net::ERR_TEMPORARILY_THROTTLED));
714 EXPECT_THAT(callback2.proof(), IsNull());
715 } 798 }
716 799
717 INSTANTIATE_TEST_CASE_P(ReadMode, 800 INSTANTIATE_TEST_CASE_P(ReadMode,
718 LogDnsClientTest, 801 LogDnsClientTest,
719 ::testing::Values(net::IoMode::ASYNC, 802 ::testing::Values(net::IoMode::ASYNC,
720 net::IoMode::SYNCHRONOUS)); 803 net::IoMode::SYNCHRONOUS));
721 804
722 } // namespace 805 } // namespace
723 } // namespace certificate_transparency 806 } // namespace certificate_transparency
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698