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

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

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

Powered by Google App Engine
This is Rietveld 408576698