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

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

Issue 2369373002: LogDnsClient now returns some errors synchronously (Closed)
Patch Set: Rebase 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 <numeric> 8 #include <numeric>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/format_macros.h" 13 #include "base/format_macros.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/message_loop/message_loop.h" 15 #include "base/message_loop/message_loop.h"
16 #include "base/run_loop.h" 16 #include "base/run_loop.h"
17 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/stringprintf.h" 18 #include "base/strings/stringprintf.h"
19 #include "base/test/test_timeouts.h"
19 #include "components/certificate_transparency/mock_log_dns_traffic.h" 20 #include "components/certificate_transparency/mock_log_dns_traffic.h"
20 #include "crypto/sha2.h" 21 #include "crypto/sha2.h"
21 #include "net/base/net_errors.h" 22 #include "net/base/net_errors.h"
22 #include "net/cert/merkle_audit_proof.h" 23 #include "net/cert/merkle_audit_proof.h"
23 #include "net/cert/signed_certificate_timestamp.h" 24 #include "net/cert/signed_certificate_timestamp.h"
24 #include "net/dns/dns_client.h" 25 #include "net/dns/dns_client.h"
25 #include "net/dns/dns_config_service.h" 26 #include "net/dns/dns_config_service.h"
26 #include "net/dns/dns_protocol.h" 27 #include "net/dns/dns_protocol.h"
28 #include "net/log/net_log.h"
27 #include "net/test/gtest_util.h" 29 #include "net/test/gtest_util.h"
28 #include "testing/gmock/include/gmock/gmock.h" 30 #include "testing/gmock/include/gmock/gmock.h"
29 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
30 32
31 namespace certificate_transparency { 33 namespace certificate_transparency {
32 namespace { 34 namespace {
33 35
34 using ::testing::AllOf; 36 using ::testing::AllOf;
35 using ::testing::Eq; 37 using ::testing::Eq;
36 using ::testing::IsEmpty; 38 using ::testing::IsEmpty;
(...skipping 26 matching lines...) Expand all
63 const uint64_t kLeafIndices[] = {0, 1, 2}; 65 const uint64_t kLeafIndices[] = {0, 1, 2};
64 const uint64_t kTreeSizes[] = {100, 10000, 1000000}; 66 const uint64_t kTreeSizes[] = {100, 10000, 1000000};
65 67
66 // Only 7 audit proof nodes can fit into a DNS response, because they are sent 68 // Only 7 audit proof nodes can fit into a DNS response, because they are sent
67 // in a TXT RDATA string, which has a maximum size of 255 bytes, and each node 69 // in a TXT RDATA string, which has a maximum size of 255 bytes, and each node
68 // is a SHA-256 hash (32 bytes), i.e. (255 / 32) == 7. 70 // is a SHA-256 hash (32 bytes), i.e. (255 / 32) == 7.
69 // This means audit proofs consisting of more than 7 nodes require multiple DNS 71 // This means audit proofs consisting of more than 7 nodes require multiple DNS
70 // requests to retrieve. 72 // requests to retrieve.
71 const size_t kMaxProofNodesPerDnsResponse = 7; 73 const size_t kMaxProofNodesPerDnsResponse = 7;
72 74
75 // Returns an example Merkle audit proof containing |length| nodes.
76 // The proof cannot be used for cryptographic purposes; it is merely a
77 // placeholder.
73 std::vector<std::string> GetSampleAuditProof(size_t length) { 78 std::vector<std::string> GetSampleAuditProof(size_t length) {
74 std::vector<std::string> audit_proof(length); 79 std::vector<std::string> audit_proof(length);
75 // Makes each node of the audit proof different, so that tests are able to 80 // Makes each node of the audit proof different, so that tests are able to
76 // confirm that the audit proof is reconstructed in the correct order. 81 // confirm that the audit proof is reconstructed in the correct order.
77 for (size_t i = 0; i < length; ++i) { 82 for (size_t i = 0; i < length; ++i) {
78 std::string node(crypto::kSHA256Length, '\0'); 83 std::string node(crypto::kSHA256Length, '\0');
79 // Each node is 32 bytes, with each byte having a different value. 84 // Each node is 32 bytes, with each byte having a different value.
80 for (size_t j = 0; j < crypto::kSHA256Length; ++j) { 85 for (size_t j = 0; j < crypto::kSHA256Length; ++j) {
81 node[j] = static_cast<char>((-127 + i + j) % 128); 86 node[j] = static_cast<char>((-127 + i + j) % 128);
82 } 87 }
83 audit_proof[i].assign(std::move(node)); 88 audit_proof[i].assign(std::move(node));
84 } 89 }
85 90
86 return audit_proof; 91 return audit_proof;
87 } 92 }
88 93
94 // MockAuditProofCallback can be used as an AuditProofCallback.
95 // It will record the arguments it is invoked with and provides a helpful
96 // method for pumping the message loop until it is invoked.
89 class MockAuditProofCallback { 97 class MockAuditProofCallback {
90 public: 98 public:
91 MockAuditProofCallback() : called_(false) {} 99 MockAuditProofCallback() : called_(false) {}
92 100
93 bool called() const { return called_; } 101 bool called() const { return called_; }
94 int net_error() const { return net_error_; } 102 net::Error result() const { return result_; }
95 const net::ct::MerkleAuditProof* proof() const { return proof_.get(); } 103 const net::ct::MerkleAuditProof* proof() const { return proof_.get(); }
96 104
97 void Run(int net_error, std::unique_ptr<net::ct::MerkleAuditProof> proof) { 105 // Get this callback as an AuditProofCallback.
98 EXPECT_FALSE(called_);
99 called_ = true;
100 net_error_ = net_error;
101 proof_ = std::move(proof);
102 run_loop_.Quit();
103 }
104
105 LogDnsClient::AuditProofCallback AsCallback() { 106 LogDnsClient::AuditProofCallback AsCallback() {
106 return base::Bind(&MockAuditProofCallback::Run, base::Unretained(this)); 107 return base::Bind(&MockAuditProofCallback::Run, base::Unretained(this));
107 } 108 }
108 109
109 void WaitUntilRun() { run_loop_.Run(); } 110 // Wait until either the callback is invoked or the message loop goes idle
111 // (after a specified |timeout|). Returns immediately if the callback has
112 // already been invoked.
113 void WaitUntilRun(base::TimeDelta timeout) {
114 if (called_) {
115 return;
116 }
117
118 // Pump the message loop until the the callback is invoked, which quits the
119 // RunLoop, or a timeout expires and the message loop goes idle.
120 run_loop_.reset(new base::RunLoop());
121 base::Closure quit_closure = run_loop_->QuitWhenIdleClosure();
122 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE,
123 quit_closure, timeout);
124 run_loop_->Run();
125 run_loop_.reset();
126 }
110 127
111 private: 128 private:
129 void Run(net::Error result,
130 std::unique_ptr<net::ct::MerkleAuditProof> proof) {
131 EXPECT_FALSE(called_);
132 called_ = true;
133 result_ = result;
134 proof_ = std::move(proof);
135 if (run_loop_) {
136 run_loop_->Quit();
137 }
138 }
139
140 // True if the callback has been invoked.
112 bool called_; 141 bool called_;
113 int net_error_; 142 // The arguments that the callback was invoked with.
143 net::Error result_;
114 std::unique_ptr<net::ct::MerkleAuditProof> proof_; 144 std::unique_ptr<net::ct::MerkleAuditProof> proof_;
115 base::RunLoop run_loop_; 145 // The RunLoop currently being used to pump the message loop, as a means to
146 // execute this callback.
147 std::unique_ptr<base::RunLoop> run_loop_;
116 }; 148 };
117 149
118 class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> { 150 class LogDnsClientTest : public ::testing::TestWithParam<net::IoMode> {
119 protected: 151 protected:
120 LogDnsClientTest() 152 LogDnsClientTest()
121 : network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) { 153 : network_change_notifier_(net::NetworkChangeNotifier::CreateMock()) {
122 mock_dns_.SetSocketReadMode(GetParam()); 154 mock_dns_.SetSocketReadMode(GetParam());
123 mock_dns_.InitializeDnsConfig(); 155 mock_dns_.InitializeDnsConfig();
124 } 156 }
125 157
126 std::unique_ptr<LogDnsClient> CreateLogDnsClient( 158 std::unique_ptr<LogDnsClient> CreateLogDnsClient(
127 size_t max_concurrent_queries) { 159 size_t max_concurrent_queries) {
128 return base::MakeUnique<LogDnsClient>(mock_dns_.CreateDnsClient(), 160 return base::MakeUnique<LogDnsClient>(mock_dns_.CreateDnsClient(),
129 net::NetLogWithSource(), 161 net::NetLogWithSource(),
130 max_concurrent_queries); 162 max_concurrent_queries);
131 } 163 }
132 164
133 void QueryAuditProofAsync(LogDnsClient* log_client, 165 // Convenience function for calling QueryAuditProof synchronously.
134 const std::string& log_domain, 166 net::Error QueryAuditProof(const std::string& log_domain,
135 const char leaf_hash[crypto::kSHA256Length], 167 const char leaf_hash[crypto::kSHA256Length],
136 uint64_t tree_size, 168 uint64_t tree_size,
137 const LogDnsClient::AuditProofCallback& callback) { 169 MockAuditProofCallback* callback) {
138 log_client->QueryAuditProof(log_domain, leaf_hash, tree_size, callback); 170 std::unique_ptr<LogDnsClient> log_client = CreateLogDnsClient(0);
139 } 171 net::Error result = log_client->QueryAuditProof(
172 log_domain, leaf_hash, tree_size, callback->AsCallback());
140 173
141 // Convenience function for calling QueryAuditProofAsync synchronously. 174 if (result == net::ERR_IO_PENDING) {
142 void QueryAuditProof(const std::string& log_domain, 175 callback->WaitUntilRun(TestTimeouts::action_max_timeout());
143 const char leaf_hash[crypto::kSHA256Length], 176 } else {
144 uint64_t tree_size, 177 // The callback isn't expected to be invoked, but pump the message loop
145 MockAuditProofCallback* callback) { 178 // anyway to confirm that it indeed isn't run. Give up as soon as the
146 std::unique_ptr<LogDnsClient> log_client = CreateLogDnsClient(0); 179 // message loop is empty (zero timeout).
147 QueryAuditProofAsync(log_client.get(), log_domain, leaf_hash, tree_size, 180 callback->WaitUntilRun(base::TimeDelta());
148 callback->AsCallback()); 181 }
149 callback->WaitUntilRun(); 182
183 return result;
150 } 184 }
151 185
152 // This will be the NetworkChangeNotifier singleton for the duration of the 186 // This will be the NetworkChangeNotifier singleton for the duration of the
153 // test. It is accessed statically by LogDnsClient. 187 // test. It is accessed statically by LogDnsClient.
154 std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; 188 std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
155 // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient, 189 // Queues and handles asynchronous DNS tasks. Indirectly used by LogDnsClient,
156 // the underlying net::DnsClient, and NetworkChangeNotifier. 190 // the underlying net::DnsClient, and NetworkChangeNotifier.
157 base::MessageLoopForIO message_loop_; 191 base::MessageLoopForIO message_loop_;
158 // Allows mock DNS sockets to be setup. 192 // Allows mock DNS sockets to be setup.
159 MockLogDnsTraffic mock_dns_; 193 MockLogDnsTraffic mock_dns_;
160 }; 194 };
161 195
162 TEST_P(LogDnsClientTest, QueryAuditProofReportsThatLogDomainDoesNotExist) { 196 TEST_P(LogDnsClientTest, QueryAuditProofReportsThatLogDomainDoesNotExist) {
163 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], 197 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0],
164 net::dns_protocol::kRcodeNXDOMAIN); 198 net::dns_protocol::kRcodeNXDOMAIN);
165 199
166 MockAuditProofCallback callback; 200 MockAuditProofCallback callback;
167 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 201 ASSERT_THAT(
202 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
203 IsError(net::ERR_IO_PENDING));
168 ASSERT_TRUE(callback.called()); 204 ASSERT_TRUE(callback.called());
169 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); 205 EXPECT_THAT(callback.result(), IsError(net::ERR_NAME_NOT_RESOLVED));
170 EXPECT_THAT(callback.proof(), IsNull()); 206 EXPECT_THAT(callback.proof(), IsNull());
171 } 207 }
172 208
173 TEST_P(LogDnsClientTest, 209 TEST_P(LogDnsClientTest,
174 QueryAuditProofReportsServerFailuresDuringLeafIndexRequests) { 210 QueryAuditProofReportsServerFailuresDuringLeafIndexRequests) {
175 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], 211 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0],
176 net::dns_protocol::kRcodeSERVFAIL); 212 net::dns_protocol::kRcodeSERVFAIL);
177 213
178 MockAuditProofCallback callback; 214 MockAuditProofCallback callback;
179 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 215 ASSERT_THAT(
216 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
217 IsError(net::ERR_IO_PENDING));
180 ASSERT_TRUE(callback.called()); 218 ASSERT_TRUE(callback.called());
181 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); 219 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_SERVER_FAILED));
182 EXPECT_THAT(callback.proof(), IsNull()); 220 EXPECT_THAT(callback.proof(), IsNull());
183 } 221 }
184 222
185 TEST_P(LogDnsClientTest, 223 TEST_P(LogDnsClientTest,
186 QueryAuditProofReportsServerRefusalsDuringLeafIndexRequests) { 224 QueryAuditProofReportsServerRefusalsDuringLeafIndexRequests) {
187 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0], 225 mock_dns_.ExpectRequestAndErrorResponse(kLeafIndexQnames[0],
188 net::dns_protocol::kRcodeREFUSED); 226 net::dns_protocol::kRcodeREFUSED);
189 227
190 MockAuditProofCallback callback; 228 MockAuditProofCallback callback;
191 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 229 ASSERT_THAT(
230 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
231 IsError(net::ERR_IO_PENDING));
192 ASSERT_TRUE(callback.called()); 232 ASSERT_TRUE(callback.called());
193 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); 233 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_SERVER_FAILED));
194 EXPECT_THAT(callback.proof(), IsNull()); 234 EXPECT_THAT(callback.proof(), IsNull());
195 } 235 }
196 236
197 TEST_P(LogDnsClientTest, 237 TEST_P(LogDnsClientTest,
198 QueryAuditProofReportsMalformedResponseIfLeafIndexResponseContainsNoStrin gs) { 238 QueryAuditProofReportsMalformedResponseIfLeafIndexResponseContainsNoStrin gs) {
199 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], 239 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0],
200 std::vector<base::StringPiece>()); 240 std::vector<base::StringPiece>());
201 241
202 MockAuditProofCallback callback; 242 MockAuditProofCallback callback;
203 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 243 ASSERT_THAT(
244 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
245 IsError(net::ERR_IO_PENDING));
204 ASSERT_TRUE(callback.called()); 246 ASSERT_TRUE(callback.called());
205 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 247 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
206 EXPECT_THAT(callback.proof(), IsNull()); 248 EXPECT_THAT(callback.proof(), IsNull());
207 } 249 }
208 250
209 TEST_P(LogDnsClientTest, 251 TEST_P(LogDnsClientTest,
210 QueryAuditProofReportsMalformedResponseIfLeafIndexResponseContainsMoreTha nOneString) { 252 QueryAuditProofReportsMalformedResponseIfLeafIndexResponseContainsMoreTha nOneString) {
211 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456", "7"}); 253 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456", "7"});
212 254
213 MockAuditProofCallback callback; 255 MockAuditProofCallback callback;
214 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 256 ASSERT_THAT(
257 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
258 IsError(net::ERR_IO_PENDING));
215 ASSERT_TRUE(callback.called()); 259 ASSERT_TRUE(callback.called());
216 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 260 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
217 EXPECT_THAT(callback.proof(), IsNull()); 261 EXPECT_THAT(callback.proof(), IsNull());
218 } 262 }
219 263
220 TEST_P(LogDnsClientTest, 264 TEST_P(LogDnsClientTest,
221 QueryAuditProofReportsMalformedResponseIfLeafIndexIsNotNumeric) { 265 QueryAuditProofReportsMalformedResponseIfLeafIndexIsNotNumeric) {
222 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"foo"}); 266 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"foo"});
223 267
224 MockAuditProofCallback callback; 268 MockAuditProofCallback callback;
225 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 269 ASSERT_THAT(
270 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
271 IsError(net::ERR_IO_PENDING));
226 ASSERT_TRUE(callback.called()); 272 ASSERT_TRUE(callback.called());
227 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 273 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
228 EXPECT_THAT(callback.proof(), IsNull()); 274 EXPECT_THAT(callback.proof(), IsNull());
229 } 275 }
230 276
231 TEST_P(LogDnsClientTest, 277 TEST_P(LogDnsClientTest,
232 QueryAuditProofReportsMalformedResponseIfLeafIndexIsFloatingPoint) { 278 QueryAuditProofReportsMalformedResponseIfLeafIndexIsFloatingPoint) {
233 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456.0"}); 279 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456.0"});
234 280
235 MockAuditProofCallback callback; 281 MockAuditProofCallback callback;
236 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 282 ASSERT_THAT(
283 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
284 IsError(net::ERR_IO_PENDING));
237 ASSERT_TRUE(callback.called()); 285 ASSERT_TRUE(callback.called());
238 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 286 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
239 EXPECT_THAT(callback.proof(), IsNull()); 287 EXPECT_THAT(callback.proof(), IsNull());
240 } 288 }
241 289
242 TEST_P(LogDnsClientTest, 290 TEST_P(LogDnsClientTest,
243 QueryAuditProofReportsMalformedResponseIfLeafIndexIsEmpty) { 291 QueryAuditProofReportsMalformedResponseIfLeafIndexIsEmpty) {
244 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {""}); 292 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {""});
245 293
246 MockAuditProofCallback callback; 294 MockAuditProofCallback callback;
247 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 295 ASSERT_THAT(
296 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
297 IsError(net::ERR_IO_PENDING));
248 ASSERT_TRUE(callback.called()); 298 ASSERT_TRUE(callback.called());
249 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 299 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
250 EXPECT_THAT(callback.proof(), IsNull()); 300 EXPECT_THAT(callback.proof(), IsNull());
251 } 301 }
252 302
253 TEST_P(LogDnsClientTest, 303 TEST_P(LogDnsClientTest,
254 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericPrefix) { 304 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericPrefix) {
255 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"foo123456"}); 305 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"foo123456"});
256 306
257 MockAuditProofCallback callback; 307 MockAuditProofCallback callback;
258 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 308 ASSERT_THAT(
309 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
310 IsError(net::ERR_IO_PENDING));
259 ASSERT_TRUE(callback.called()); 311 ASSERT_TRUE(callback.called());
260 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 312 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
261 EXPECT_THAT(callback.proof(), IsNull()); 313 EXPECT_THAT(callback.proof(), IsNull());
262 } 314 }
263 315
264 TEST_P(LogDnsClientTest, 316 TEST_P(LogDnsClientTest,
265 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericSuffix) { 317 QueryAuditProofReportsMalformedResponseIfLeafIndexHasNonNumericSuffix) {
266 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456foo"}); 318 mock_dns_.ExpectRequestAndResponse(kLeafIndexQnames[0], {"123456foo"});
267 319
268 MockAuditProofCallback callback; 320 MockAuditProofCallback callback;
269 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 321 ASSERT_THAT(
322 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
323 IsError(net::ERR_IO_PENDING));
270 ASSERT_TRUE(callback.called()); 324 ASSERT_TRUE(callback.called());
271 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 325 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
272 EXPECT_THAT(callback.proof(), IsNull()); 326 EXPECT_THAT(callback.proof(), IsNull());
273 } 327 }
274 328
275 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLogDomainIsEmpty) { 329 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLogDomainIsEmpty) {
276 MockAuditProofCallback callback; 330 MockAuditProofCallback callback;
277 QueryAuditProof("", kLeafHashes[0], kTreeSizes[0], &callback); 331 ASSERT_THAT(QueryAuditProof("", kLeafHashes[0], kTreeSizes[0], &callback),
278 ASSERT_TRUE(callback.called()); 332 IsError(net::ERR_INVALID_ARGUMENT));
279 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 333 ASSERT_FALSE(callback.called());
280 EXPECT_THAT(callback.proof(), IsNull());
281 } 334 }
282 335
283 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsInvalid) { 336 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsInvalid) {
284 MockAuditProofCallback callback; 337 MockAuditProofCallback callback;
285 QueryAuditProof("ct.test", "foo", kTreeSizes[0], &callback); 338 ASSERT_THAT(QueryAuditProof("ct.test", "foo", kTreeSizes[0], &callback),
286 ASSERT_TRUE(callback.called()); 339 IsError(net::ERR_INVALID_ARGUMENT));
287 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 340 ASSERT_FALSE(callback.called());
288 EXPECT_THAT(callback.proof(), IsNull());
289 } 341 }
290 342
291 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsEmpty) { 343 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsEmpty) {
292 MockAuditProofCallback callback; 344 MockAuditProofCallback callback;
293 QueryAuditProof("ct.test", "", kTreeSizes[0], &callback); 345 ASSERT_THAT(QueryAuditProof("ct.test", "", kTreeSizes[0], &callback),
294 ASSERT_TRUE(callback.called()); 346 IsError(net::ERR_INVALID_ARGUMENT));
295 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 347 ASSERT_FALSE(callback.called());
296 EXPECT_THAT(callback.proof(), IsNull());
297 } 348 }
298 349
299 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsNull) { 350 TEST_P(LogDnsClientTest, QueryAuditProofReportsInvalidArgIfLeafHashIsNull) {
300 MockAuditProofCallback callback; 351 MockAuditProofCallback callback;
301 QueryAuditProof("ct.test", nullptr, kTreeSizes[0], &callback); 352 ASSERT_THAT(QueryAuditProof("ct.test", nullptr, kTreeSizes[0], &callback),
302 ASSERT_TRUE(callback.called()); 353 IsError(net::ERR_INVALID_ARGUMENT));
303 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 354 ASSERT_FALSE(callback.called());
304 EXPECT_THAT(callback.proof(), IsNull());
305 } 355 }
306 356
307 TEST_P(LogDnsClientTest, 357 TEST_P(LogDnsClientTest,
308 QueryAuditProofReportsSocketErrorsDuringLeafIndexRequests) { 358 QueryAuditProofReportsSocketErrorsDuringLeafIndexRequests) {
309 mock_dns_.ExpectRequestAndSocketError(kLeafIndexQnames[0], 359 mock_dns_.ExpectRequestAndSocketError(kLeafIndexQnames[0],
310 net::ERR_CONNECTION_REFUSED); 360 net::ERR_CONNECTION_REFUSED);
311 361
312 MockAuditProofCallback callback; 362 MockAuditProofCallback callback;
313 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 363 ASSERT_THAT(
364 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
365 IsError(net::ERR_IO_PENDING));
314 ASSERT_TRUE(callback.called()); 366 ASSERT_TRUE(callback.called());
315 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); 367 EXPECT_THAT(callback.result(), IsError(net::ERR_CONNECTION_REFUSED));
316 EXPECT_THAT(callback.proof(), IsNull()); 368 EXPECT_THAT(callback.proof(), IsNull());
317 } 369 }
318 370
319 TEST_P(LogDnsClientTest, 371 TEST_P(LogDnsClientTest,
320 QueryAuditProofReportsTimeoutsDuringLeafIndexRequests) { 372 QueryAuditProofReportsTimeoutsDuringLeafIndexRequests) {
321 mock_dns_.ExpectRequestAndTimeout(kLeafIndexQnames[0]); 373 mock_dns_.ExpectRequestAndTimeout(kLeafIndexQnames[0]);
322 374
323 MockAuditProofCallback callback; 375 MockAuditProofCallback callback;
324 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback); 376 ASSERT_THAT(
377 QueryAuditProof("ct.test", kLeafHashes[0], kTreeSizes[0], &callback),
378 IsError(net::ERR_IO_PENDING));
379
380 callback.WaitUntilRun(TestTimeouts::action_max_timeout());
325 ASSERT_TRUE(callback.called()); 381 ASSERT_TRUE(callback.called());
326 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); 382 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_TIMED_OUT));
327 EXPECT_THAT(callback.proof(), IsNull()); 383 EXPECT_THAT(callback.proof(), IsNull());
328 } 384 }
329 385
330 TEST_P(LogDnsClientTest, QueryAuditProof) { 386 TEST_P(LogDnsClientTest, QueryAuditProof) {
331 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); 387 const std::vector<std::string> audit_proof = GetSampleAuditProof(20);
332 388
333 // Expect a leaf index query first, to map the leaf hash to a leaf index. 389 // Expect a leaf index query first, to map the leaf hash to a leaf index.
334 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 390 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
335 391
336 // It takes a number of DNS requests to retrieve the entire |audit_proof| 392 // It takes a number of DNS requests to retrieve the entire |audit_proof|
337 // (see |kMaxProofNodesPerDnsResponse|). 393 // (see |kMaxProofNodesPerDnsResponse|).
338 for (size_t nodes_begin = 0; nodes_begin < audit_proof.size(); 394 for (size_t nodes_begin = 0; nodes_begin < audit_proof.size();
339 nodes_begin += kMaxProofNodesPerDnsResponse) { 395 nodes_begin += kMaxProofNodesPerDnsResponse) {
340 const size_t nodes_end = std::min( 396 const size_t nodes_end = std::min(
341 nodes_begin + kMaxProofNodesPerDnsResponse, audit_proof.size()); 397 nodes_begin + kMaxProofNodesPerDnsResponse, audit_proof.size());
342 398
343 mock_dns_.ExpectAuditProofRequestAndResponse( 399 mock_dns_.ExpectAuditProofRequestAndResponse(
344 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), 400 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin),
345 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); 401 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end);
346 } 402 }
347 403
348 MockAuditProofCallback callback; 404 MockAuditProofCallback callback;
349 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 405 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
406 IsError(net::ERR_IO_PENDING));
350 ASSERT_TRUE(callback.called()); 407 ASSERT_TRUE(callback.called());
351 EXPECT_THAT(callback.net_error(), IsOk()); 408 EXPECT_THAT(callback.result(), IsOk());
352 ASSERT_THAT(callback.proof(), NotNull()); 409 ASSERT_THAT(callback.proof(), NotNull());
353 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); 410 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u));
354 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 411 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
355 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); 412 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999));
356 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); 413 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof));
357 } 414 }
358 415
359 TEST_P(LogDnsClientTest, QueryAuditProofHandlesResponsesWithShortAuditPaths) { 416 TEST_P(LogDnsClientTest, QueryAuditProofHandlesResponsesWithShortAuditPaths) {
360 const std::vector<std::string> audit_proof = GetSampleAuditProof(20); 417 const std::vector<std::string> audit_proof = GetSampleAuditProof(20);
361 418
(...skipping 14 matching lines...) Expand all
376 audit_proof.begin() + 6, 433 audit_proof.begin() + 6,
377 audit_proof.begin() + 10); 434 audit_proof.begin() + 10);
378 mock_dns_.ExpectAuditProofRequestAndResponse("10.123456.999999.tree.ct.test.", 435 mock_dns_.ExpectAuditProofRequestAndResponse("10.123456.999999.tree.ct.test.",
379 audit_proof.begin() + 10, 436 audit_proof.begin() + 10,
380 audit_proof.begin() + 13); 437 audit_proof.begin() + 13);
381 mock_dns_.ExpectAuditProofRequestAndResponse("13.123456.999999.tree.ct.test.", 438 mock_dns_.ExpectAuditProofRequestAndResponse("13.123456.999999.tree.ct.test.",
382 audit_proof.begin() + 13, 439 audit_proof.begin() + 13,
383 audit_proof.end()); 440 audit_proof.end());
384 441
385 MockAuditProofCallback callback; 442 MockAuditProofCallback callback;
386 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 443 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
444 IsError(net::ERR_IO_PENDING));
387 ASSERT_TRUE(callback.called()); 445 ASSERT_TRUE(callback.called());
388 EXPECT_THAT(callback.net_error(), IsOk()); 446 EXPECT_THAT(callback.result(), IsOk());
389 ASSERT_THAT(callback.proof(), NotNull()); 447 ASSERT_THAT(callback.proof(), NotNull());
390 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); 448 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u));
391 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 449 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
392 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); 450 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999));
393 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); 451 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof));
394 } 452 }
395 453
396 TEST_P(LogDnsClientTest, 454 TEST_P(LogDnsClientTest,
397 QueryAuditProofReportsThatAuditProofQnameDoesNotExist) { 455 QueryAuditProofReportsThatAuditProofQnameDoesNotExist) {
398 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 456 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
399 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", 457 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.",
400 net::dns_protocol::kRcodeNXDOMAIN); 458 net::dns_protocol::kRcodeNXDOMAIN);
401 459
402 MockAuditProofCallback callback; 460 MockAuditProofCallback callback;
403 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 461 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
462 IsError(net::ERR_IO_PENDING));
404 ASSERT_TRUE(callback.called()); 463 ASSERT_TRUE(callback.called());
405 EXPECT_THAT(callback.net_error(), IsError(net::ERR_NAME_NOT_RESOLVED)); 464 EXPECT_THAT(callback.result(), IsError(net::ERR_NAME_NOT_RESOLVED));
406 EXPECT_THAT(callback.proof(), IsNull()); 465 EXPECT_THAT(callback.proof(), IsNull());
407 } 466 }
408 467
409 TEST_P(LogDnsClientTest, 468 TEST_P(LogDnsClientTest,
410 QueryAuditProofReportsServerFailureDuringAuditProofRequests) { 469 QueryAuditProofReportsServerFailuresDuringAuditProofRequests) {
411 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 470 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
412 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", 471 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.",
413 net::dns_protocol::kRcodeSERVFAIL); 472 net::dns_protocol::kRcodeSERVFAIL);
414 473
415 MockAuditProofCallback callback; 474 MockAuditProofCallback callback;
416 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 475 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
476 IsError(net::ERR_IO_PENDING));
417 ASSERT_TRUE(callback.called()); 477 ASSERT_TRUE(callback.called());
418 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); 478 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_SERVER_FAILED));
419 EXPECT_THAT(callback.proof(), IsNull()); 479 EXPECT_THAT(callback.proof(), IsNull());
420 } 480 }
421 481
422 TEST_P(LogDnsClientTest, 482 TEST_P(LogDnsClientTest,
423 QueryAuditProofReportsServerRefusalDuringAuditProofRequests) { 483 QueryAuditProofReportsServerRefusalsDuringAuditProofRequests) {
424 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 484 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
425 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.", 485 mock_dns_.ExpectRequestAndErrorResponse("0.123456.999999.tree.ct.test.",
426 net::dns_protocol::kRcodeREFUSED); 486 net::dns_protocol::kRcodeREFUSED);
427 487
428 MockAuditProofCallback callback; 488 MockAuditProofCallback callback;
429 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 489 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
490 IsError(net::ERR_IO_PENDING));
430 ASSERT_TRUE(callback.called()); 491 ASSERT_TRUE(callback.called());
431 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_SERVER_FAILED)); 492 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_SERVER_FAILED));
432 EXPECT_THAT(callback.proof(), IsNull()); 493 EXPECT_THAT(callback.proof(), IsNull());
433 } 494 }
434 495
435 TEST_P(LogDnsClientTest, 496 TEST_P(LogDnsClientTest,
436 QueryAuditProofReportsResponseMalformedIfProofNodesResponseContainsNoStri ngs) { 497 QueryAuditProofReportsResponseMalformedIfProofNodesResponseContainsNoStri ngs) {
437 // Expect a leaf index query first, to map the leaf hash to a leaf index. 498 // Expect a leaf index query first, to map the leaf hash to a leaf index.
438 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 499 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
439 500
440 mock_dns_.ExpectRequestAndResponse("0.123456.999999.tree.ct.test.", 501 mock_dns_.ExpectRequestAndResponse("0.123456.999999.tree.ct.test.",
441 std::vector<base::StringPiece>()); 502 std::vector<base::StringPiece>());
442 503
443 MockAuditProofCallback callback; 504 MockAuditProofCallback callback;
444 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 505 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
506 IsError(net::ERR_IO_PENDING));
445 ASSERT_TRUE(callback.called()); 507 ASSERT_TRUE(callback.called());
446 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 508 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
447 EXPECT_THAT(callback.proof(), IsNull()); 509 EXPECT_THAT(callback.proof(), IsNull());
448 } 510 }
449 511
450 TEST_P(LogDnsClientTest, 512 TEST_P(LogDnsClientTest,
451 QueryAuditProofReportsResponseMalformedIfProofNodesResponseContainsMoreTh anOneString) { 513 QueryAuditProofReportsResponseMalformedIfProofNodesResponseContainsMoreTh anOneString) {
452 // The CT-over-DNS draft RFC states that the response will contain "exactly 514 // The CT-over-DNS draft RFC states that the response will contain "exactly
453 // one character-string." 515 // one character-string."
454 const std::vector<std::string> audit_proof = GetSampleAuditProof(10); 516 const std::vector<std::string> audit_proof = GetSampleAuditProof(10);
455 517
456 std::string first_chunk_of_proof = std::accumulate( 518 std::string first_chunk_of_proof = std::accumulate(
457 audit_proof.begin(), audit_proof.begin() + 7, std::string()); 519 audit_proof.begin(), audit_proof.begin() + 7, std::string());
458 std::string second_chunk_of_proof = std::accumulate( 520 std::string second_chunk_of_proof = std::accumulate(
459 audit_proof.begin() + 7, audit_proof.end(), std::string()); 521 audit_proof.begin() + 7, audit_proof.end(), std::string());
460 522
461 // Expect a leaf index query first, to map the leaf hash to a leaf index. 523 // Expect a leaf index query first, to map the leaf hash to a leaf index.
462 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 524 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
463 525
464 mock_dns_.ExpectRequestAndResponse( 526 mock_dns_.ExpectRequestAndResponse(
465 "0.123456.999999.tree.ct.test.", 527 "0.123456.999999.tree.ct.test.",
466 {first_chunk_of_proof, second_chunk_of_proof}); 528 {first_chunk_of_proof, second_chunk_of_proof});
467 529
468 MockAuditProofCallback callback; 530 MockAuditProofCallback callback;
469 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 531 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
532 IsError(net::ERR_IO_PENDING));
470 ASSERT_TRUE(callback.called()); 533 ASSERT_TRUE(callback.called());
471 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 534 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
472 EXPECT_THAT(callback.proof(), IsNull()); 535 EXPECT_THAT(callback.proof(), IsNull());
473 } 536 }
474 537
475 TEST_P(LogDnsClientTest, 538 TEST_P(LogDnsClientTest,
476 QueryAuditProofReportsResponseMalformedIfNodeTooShort) { 539 QueryAuditProofReportsResponseMalformedIfNodeTooShort) {
477 // node is shorter than a SHA-256 hash (31 vs 32 bytes) 540 // node is shorter than a SHA-256 hash (31 vs 32 bytes)
478 const std::vector<std::string> audit_proof(1, std::string(31, 'a')); 541 const std::vector<std::string> audit_proof(1, std::string(31, 'a'));
479 542
480 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 543 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
481 mock_dns_.ExpectAuditProofRequestAndResponse( 544 mock_dns_.ExpectAuditProofRequestAndResponse(
482 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); 545 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end());
483 546
484 MockAuditProofCallback callback; 547 MockAuditProofCallback callback;
485 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 548 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
549 IsError(net::ERR_IO_PENDING));
486 ASSERT_TRUE(callback.called()); 550 ASSERT_TRUE(callback.called());
487 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 551 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
488 EXPECT_THAT(callback.proof(), IsNull()); 552 EXPECT_THAT(callback.proof(), IsNull());
489 } 553 }
490 554
491 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfNodeTooLong) { 555 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfNodeTooLong) {
492 // node is longer than a SHA-256 hash (33 vs 32 bytes) 556 // node is longer than a SHA-256 hash (33 vs 32 bytes)
493 const std::vector<std::string> audit_proof(1, std::string(33, 'a')); 557 const std::vector<std::string> audit_proof(1, std::string(33, 'a'));
494 558
495 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 559 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
496 mock_dns_.ExpectAuditProofRequestAndResponse( 560 mock_dns_.ExpectAuditProofRequestAndResponse(
497 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); 561 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end());
498 562
499 MockAuditProofCallback callback; 563 MockAuditProofCallback callback;
500 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 564 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
565 IsError(net::ERR_IO_PENDING));
501 ASSERT_TRUE(callback.called()); 566 ASSERT_TRUE(callback.called());
502 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 567 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
503 EXPECT_THAT(callback.proof(), IsNull()); 568 EXPECT_THAT(callback.proof(), IsNull());
504 } 569 }
505 570
506 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfEmpty) { 571 TEST_P(LogDnsClientTest, QueryAuditProofReportsResponseMalformedIfEmpty) {
507 const std::vector<std::string> audit_proof; 572 const std::vector<std::string> audit_proof;
508 573
509 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 574 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
510 mock_dns_.ExpectAuditProofRequestAndResponse( 575 mock_dns_.ExpectAuditProofRequestAndResponse(
511 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end()); 576 "0.123456.999999.tree.ct.test.", audit_proof.begin(), audit_proof.end());
512 577
513 MockAuditProofCallback callback; 578 MockAuditProofCallback callback;
514 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 579 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
580 IsError(net::ERR_IO_PENDING));
515 ASSERT_TRUE(callback.called()); 581 ASSERT_TRUE(callback.called());
516 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_MALFORMED_RESPONSE)); 582 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_MALFORMED_RESPONSE));
517 EXPECT_THAT(callback.proof(), IsNull()); 583 EXPECT_THAT(callback.proof(), IsNull());
518 } 584 }
519 585
520 TEST_P(LogDnsClientTest, 586 TEST_P(LogDnsClientTest,
521 QueryAuditProofReportsInvalidArgIfLeafIndexEqualToTreeSize) { 587 QueryAuditProofReportsInvalidArgIfLeafIndexEqualToTreeSize) {
522 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 588 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
523 589
524 MockAuditProofCallback callback; 590 MockAuditProofCallback callback;
525 QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback); 591 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback),
592 IsError(net::ERR_IO_PENDING));
526 ASSERT_TRUE(callback.called()); 593 ASSERT_TRUE(callback.called());
527 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 594 EXPECT_THAT(callback.result(), IsError(net::ERR_INVALID_ARGUMENT));
528 EXPECT_THAT(callback.proof(), IsNull()); 595 EXPECT_THAT(callback.proof(), IsNull());
529 } 596 }
530 597
531 TEST_P(LogDnsClientTest, 598 TEST_P(LogDnsClientTest,
532 QueryAuditProofReportsInvalidArgIfLeafIndexGreaterThanTreeSize) { 599 QueryAuditProofReportsInvalidArgIfLeafIndexGreaterThanTreeSize) {
533 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 999999); 600 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 999999);
534 601
535 MockAuditProofCallback callback; 602 MockAuditProofCallback callback;
536 QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback); 603 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 123456, &callback),
604 IsError(net::ERR_IO_PENDING));
537 ASSERT_TRUE(callback.called()); 605 ASSERT_TRUE(callback.called());
538 EXPECT_THAT(callback.net_error(), IsError(net::ERR_INVALID_ARGUMENT)); 606 EXPECT_THAT(callback.result(), IsError(net::ERR_INVALID_ARGUMENT));
539 EXPECT_THAT(callback.proof(), IsNull()); 607 EXPECT_THAT(callback.proof(), IsNull());
540 } 608 }
541 609
542 TEST_P(LogDnsClientTest, 610 TEST_P(LogDnsClientTest,
543 QueryAuditProofReportsSocketErrorsDuringAuditProofRequests) { 611 QueryAuditProofReportsSocketErrorsDuringAuditProofRequests) {
544 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 612 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
545 mock_dns_.ExpectRequestAndSocketError("0.123456.999999.tree.ct.test.", 613 mock_dns_.ExpectRequestAndSocketError("0.123456.999999.tree.ct.test.",
546 net::ERR_CONNECTION_REFUSED); 614 net::ERR_CONNECTION_REFUSED);
547 615
548 MockAuditProofCallback callback; 616 MockAuditProofCallback callback;
549 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 617 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
618 IsError(net::ERR_IO_PENDING));
550 ASSERT_TRUE(callback.called()); 619 ASSERT_TRUE(callback.called());
551 EXPECT_THAT(callback.net_error(), IsError(net::ERR_CONNECTION_REFUSED)); 620 EXPECT_THAT(callback.result(), IsError(net::ERR_CONNECTION_REFUSED));
552 EXPECT_THAT(callback.proof(), IsNull()); 621 EXPECT_THAT(callback.proof(), IsNull());
553 } 622 }
554 623
555 TEST_P(LogDnsClientTest, 624 TEST_P(LogDnsClientTest,
556 QueryAuditProofReportsTimeoutsDuringAuditProofRequests) { 625 QueryAuditProofReportsTimeoutsDuringAuditProofRequests) {
557 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456); 626 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[0], 123456);
558 mock_dns_.ExpectRequestAndTimeout("0.123456.999999.tree.ct.test."); 627 mock_dns_.ExpectRequestAndTimeout("0.123456.999999.tree.ct.test.");
559 628
560 MockAuditProofCallback callback; 629 MockAuditProofCallback callback;
561 QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback); 630 ASSERT_THAT(QueryAuditProof("ct.test", kLeafHashes[0], 999999, &callback),
631 IsError(net::ERR_IO_PENDING));
632
633 callback.WaitUntilRun(TestTimeouts::action_max_timeout());
562 ASSERT_TRUE(callback.called()); 634 ASSERT_TRUE(callback.called());
563 EXPECT_THAT(callback.net_error(), IsError(net::ERR_DNS_TIMED_OUT)); 635 EXPECT_THAT(callback.result(), IsError(net::ERR_DNS_TIMED_OUT));
564 EXPECT_THAT(callback.proof(), IsNull()); 636 EXPECT_THAT(callback.proof(), IsNull());
565 } 637 }
566 638
567 TEST_P(LogDnsClientTest, AdoptsLatestDnsConfigIfValid) { 639 TEST_P(LogDnsClientTest, AdoptsLatestDnsConfigIfValid) {
568 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); 640 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient();
569 net::DnsClient* dns_client = tmp.get(); 641 net::DnsClient* dns_client = tmp.get();
570 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0); 642 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0);
571 643
572 // Get the current DNS config, modify it and broadcast the update. 644 // Get the current DNS config, modify it and broadcast the update.
573 net::DnsConfig config(*dns_client->GetConfig()); 645 net::DnsConfig config(*dns_client->GetConfig());
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin), 687 base::StringPrintf("%zu.123456.999999.tree.ct.test.", nodes_begin),
616 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end); 688 audit_proof.begin() + nodes_begin, audit_proof.begin() + nodes_end);
617 } 689 }
618 690
619 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient(); 691 std::unique_ptr<net::DnsClient> tmp = mock_dns_.CreateDnsClient();
620 net::DnsClient* dns_client = tmp.get(); 692 net::DnsClient* dns_client = tmp.get();
621 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0); 693 LogDnsClient log_client(std::move(tmp), net::NetLogWithSource(), 0);
622 694
623 // Start query. 695 // Start query.
624 MockAuditProofCallback callback; 696 MockAuditProofCallback callback;
625 QueryAuditProofAsync(&log_client, "ct.test", kLeafHashes[0], 999999, 697 ASSERT_THAT(log_client.QueryAuditProof("ct.test", kLeafHashes[0], 999999,
626 callback.AsCallback()); 698 callback.AsCallback()),
699 IsError(net::ERR_IO_PENDING));
627 700
628 // Get the current DNS config, modify it and broadcast the update. 701 // Get the current DNS config, modify it and broadcast the update.
629 net::DnsConfig config(*dns_client->GetConfig()); 702 net::DnsConfig config(*dns_client->GetConfig());
630 ASSERT_NE(123, config.attempts); 703 ASSERT_NE(123, config.attempts);
631 config.attempts = 123; 704 config.attempts = 123;
632 mock_dns_.SetDnsConfig(config); 705 mock_dns_.SetDnsConfig(config);
633 706
634 callback.WaitUntilRun(); 707 callback.WaitUntilRun(TestTimeouts::action_max_timeout());
635 // Check that the DNS changes propogated before the query completed. 708 // Check that the DNS changes propogated before the query completed.
636 EXPECT_EQ(123, dns_client->GetConfig()->attempts); 709 EXPECT_EQ(123, dns_client->GetConfig()->attempts);
637 710
638 ASSERT_TRUE(callback.called()); 711 ASSERT_TRUE(callback.called());
639 EXPECT_THAT(callback.net_error(), IsOk()); 712 EXPECT_THAT(callback.result(), IsOk());
640 ASSERT_THAT(callback.proof(), NotNull()); 713 ASSERT_THAT(callback.proof(), NotNull());
641 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u)); 714 EXPECT_THAT(callback.proof()->leaf_index, Eq(123456u));
642 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 715 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
643 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999)); 716 // EXPECT_THAT(callback.proof()->tree_size, Eq(999999));
644 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof)); 717 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proof));
645 } 718 }
646 719
647 TEST_P(LogDnsClientTest, CanPerformQueriesInParallel) { 720 TEST_P(LogDnsClientTest, CanPerformQueriesInParallel) {
648 // Check that 3 queries can be performed in parallel. 721 // Check that 3 queries can be performed in parallel.
649 constexpr size_t kNumOfParallelQueries = 3; 722 constexpr size_t kNumOfParallelQueries = 3;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 base::StringPrintf("%zu.%" PRIu64 ".%" PRIu64 ".tree.ct.test.", 770 base::StringPrintf("%zu.%" PRIu64 ".%" PRIu64 ".tree.ct.test.",
698 start_node, kLeafIndices[query_i], 771 start_node, kLeafIndices[query_i],
699 kTreeSizes[query_i]), 772 kTreeSizes[query_i]),
700 proof.begin() + start_node, proof.begin() + end_node); 773 proof.begin() + start_node, proof.begin() + end_node);
701 } 774 }
702 } 775 }
703 } 776 }
704 777
705 // Start the queries. 778 // Start the queries.
706 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { 779 for (size_t i = 0; i < kNumOfParallelQueries; ++i) {
707 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[i], 780 ASSERT_THAT(
708 kTreeSizes[i], callbacks[i].AsCallback()); 781 log_client->QueryAuditProof("ct.test", kLeafHashes[i], kTreeSizes[i],
782 callbacks[i].AsCallback()),
783 IsError(net::ERR_IO_PENDING))
784 << "query #" << i;
709 } 785 }
710 786
711 // Wait for each query to complete and check its results. 787 // Wait for each query to complete and check its results.
712 for (size_t i = 0; i < kNumOfParallelQueries; ++i) { 788 for (size_t i = 0; i < kNumOfParallelQueries; ++i) {
713 MockAuditProofCallback& callback = callbacks[i]; 789 MockAuditProofCallback& callback = callbacks[i];
714 callbacks[i].WaitUntilRun(); 790 callbacks[i].WaitUntilRun(TestTimeouts::action_max_timeout());
715 791
716 SCOPED_TRACE(testing::Message() << "callbacks[" << i << "]"); 792 SCOPED_TRACE(testing::Message() << "callbacks[" << i << "]");
717 ASSERT_TRUE(callback.called()); 793 ASSERT_TRUE(callback.called());
718 EXPECT_THAT(callback.net_error(), IsOk()); 794 EXPECT_THAT(callback.result(), IsOk());
719 ASSERT_THAT(callback.proof(), NotNull()); 795 ASSERT_THAT(callback.proof(), NotNull());
720 EXPECT_THAT(callback.proof()->leaf_index, Eq(kLeafIndices[i])); 796 EXPECT_THAT(callback.proof()->leaf_index, Eq(kLeafIndices[i]));
721 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 797 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
722 // EXPECT_THAT(callback.proof()->tree_size, kTreeSizes[i]); 798 // EXPECT_THAT(callback.proof()->tree_size, kTreeSizes[i]);
723 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proofs[i])); 799 EXPECT_THAT(callback.proof()->nodes, Eq(audit_proofs[i]));
724 } 800 }
725 } 801 }
726 802
727 TEST_P(LogDnsClientTest, CanBeThrottledToOneQueryAtATime) { 803 TEST_P(LogDnsClientTest, CanBeThrottledToOneQueryAtATime) {
728 // Check that queries can be rate-limited to one at a time. 804 // Check that queries can be rate-limited to one at a time.
(...skipping 15 matching lines...) Expand all
744 audit_proof.begin() + 7, 820 audit_proof.begin() + 7,
745 audit_proof.begin() + 14); 821 audit_proof.begin() + 14);
746 mock_dns_.ExpectAuditProofRequestAndResponse("14.123456.999999.tree.ct.test.", 822 mock_dns_.ExpectAuditProofRequestAndResponse("14.123456.999999.tree.ct.test.",
747 audit_proof.begin() + 14, 823 audit_proof.begin() + 14,
748 audit_proof.end()); 824 audit_proof.end());
749 825
750 const size_t kMaxConcurrentQueries = 1; 826 const size_t kMaxConcurrentQueries = 1;
751 std::unique_ptr<LogDnsClient> log_client = 827 std::unique_ptr<LogDnsClient> log_client =
752 CreateLogDnsClient(kMaxConcurrentQueries); 828 CreateLogDnsClient(kMaxConcurrentQueries);
753 829
754 // Start the queries. 830 // Try to start the queries.
755 MockAuditProofCallback callback1; 831 MockAuditProofCallback callback1;
756 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[0], 999999, 832 ASSERT_THAT(log_client->QueryAuditProof("ct.test", kLeafHashes[0], 999999,
757 callback1.AsCallback()); 833 callback1.AsCallback()),
834 IsError(net::ERR_IO_PENDING));
835
758 MockAuditProofCallback callback2; 836 MockAuditProofCallback callback2;
759 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[1], 999999, 837 ASSERT_THAT(log_client->QueryAuditProof("ct.test", kLeafHashes[1], 999999,
760 callback2.AsCallback()); 838 callback2.AsCallback()),
761 839 IsError(net::ERR_TEMPORARILY_THROTTLED));
762 callback1.WaitUntilRun();
763 callback2.WaitUntilRun();
764 840
765 // Check that the first query succeeded. 841 // Check that the first query succeeded.
842 callback1.WaitUntilRun(TestTimeouts::action_max_timeout());
766 ASSERT_TRUE(callback1.called()); 843 ASSERT_TRUE(callback1.called());
767 EXPECT_THAT(callback1.net_error(), IsOk()); 844 EXPECT_THAT(callback1.result(), IsOk());
768 ASSERT_THAT(callback1.proof(), NotNull()); 845 ASSERT_THAT(callback1.proof(), NotNull());
769 EXPECT_THAT(callback1.proof()->leaf_index, Eq(123456u)); 846 EXPECT_THAT(callback1.proof()->leaf_index, Eq(123456u));
770 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 847 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
771 // EXPECT_THAT(callback1.proof()->tree_size, Eq(999999)); 848 // EXPECT_THAT(callback1.proof()->tree_size, Eq(999999));
772 EXPECT_THAT(callback1.proof()->nodes, Eq(audit_proof)); 849 EXPECT_THAT(callback1.proof()->nodes, Eq(audit_proof));
773 850
774 // Check that the second query failed. 851 // This callback isn't expected to be invoked, but pump the message loop
775 ASSERT_TRUE(callback2.called()); 852 // anyway to confirm that it indeed isn't run. Give up as soon as the
776 EXPECT_THAT(callback2.net_error(), IsError(net::ERR_TEMPORARILY_THROTTLED)); 853 // message loop is empty (zero timeout).
777 EXPECT_THAT(callback2.proof(), IsNull()); 854 callback2.WaitUntilRun(base::TimeDelta());
855 ASSERT_FALSE(callback2.called());
778 856
779 // Try a third query, which should succeed now that the first is finished. 857 // Try a third query, which should succeed now that the first is finished.
780 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[2], 666); 858 mock_dns_.ExpectLeafIndexRequestAndResponse(kLeafIndexQnames[2], 666);
781 mock_dns_.ExpectAuditProofRequestAndResponse("0.666.999999.tree.ct.test.", 859 mock_dns_.ExpectAuditProofRequestAndResponse("0.666.999999.tree.ct.test.",
782 audit_proof.begin(), 860 audit_proof.begin(),
783 audit_proof.begin() + 7); 861 audit_proof.begin() + 7);
784 mock_dns_.ExpectAuditProofRequestAndResponse("7.666.999999.tree.ct.test.", 862 mock_dns_.ExpectAuditProofRequestAndResponse("7.666.999999.tree.ct.test.",
785 audit_proof.begin() + 7, 863 audit_proof.begin() + 7,
786 audit_proof.begin() + 14); 864 audit_proof.begin() + 14);
787 mock_dns_.ExpectAuditProofRequestAndResponse("14.666.999999.tree.ct.test.", 865 mock_dns_.ExpectAuditProofRequestAndResponse("14.666.999999.tree.ct.test.",
788 audit_proof.begin() + 14, 866 audit_proof.begin() + 14,
789 audit_proof.end()); 867 audit_proof.end());
790 868
791 MockAuditProofCallback callback3; 869 MockAuditProofCallback callback3;
792 QueryAuditProofAsync(log_client.get(), "ct.test", kLeafHashes[2], 999999, 870 ASSERT_THAT(log_client->QueryAuditProof("ct.test", kLeafHashes[2], 999999,
793 callback3.AsCallback()); 871 callback3.AsCallback()),
794 872 IsError(net::ERR_IO_PENDING));
795 callback3.WaitUntilRun();
796 873
797 // Check that the third query succeeded. 874 // Check that the third query succeeded.
875 callback3.WaitUntilRun(TestTimeouts::action_max_timeout());
798 ASSERT_TRUE(callback3.called()); 876 ASSERT_TRUE(callback3.called());
799 EXPECT_THAT(callback3.net_error(), IsOk()); 877 EXPECT_THAT(callback3.result(), IsOk());
800 ASSERT_THAT(callback3.proof(), NotNull()); 878 ASSERT_THAT(callback3.proof(), NotNull());
801 EXPECT_THAT(callback3.proof()->leaf_index, Eq(666u)); 879 EXPECT_THAT(callback3.proof()->leaf_index, Eq(666u));
802 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size. 880 // TODO(robpercival): Enable this once MerkleAuditProof has tree_size.
803 // EXPECT_THAT(callback3.proof()->tree_size, Eq(999999)); 881 // EXPECT_THAT(callback3.proof()->tree_size, Eq(999999));
804 EXPECT_THAT(callback3.proof()->nodes, Eq(audit_proof)); 882 EXPECT_THAT(callback3.proof()->nodes, Eq(audit_proof));
805 } 883 }
806 884
807 INSTANTIATE_TEST_CASE_P(ReadMode, 885 INSTANTIATE_TEST_CASE_P(ReadMode,
808 LogDnsClientTest, 886 LogDnsClientTest,
809 ::testing::Values(net::IoMode::ASYNC, 887 ::testing::Values(net::IoMode::ASYNC,
810 net::IoMode::SYNCHRONOUS)); 888 net::IoMode::SYNCHRONOUS));
811 889
812 } // namespace 890 } // namespace
813 } // namespace certificate_transparency 891 } // namespace certificate_transparency
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698