OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/dns/dns_response.h" | 5 #include "net/dns/dns_response.h" |
6 | 6 |
7 #include "base/time.h" | 7 #include "base/time.h" |
8 #include "net/base/address_list.h" | 8 #include "net/base/address_list.h" |
9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
10 #include "net/base/net_util.h" | 10 #include "net/base/net_util.h" |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
238 | 238 |
239 DnsResourceRecord record; | 239 DnsResourceRecord record; |
240 DnsRecordParser parser = resp.Parser(); | 240 DnsRecordParser parser = resp.Parser(); |
241 EXPECT_TRUE(parser.ReadRecord(&record)); | 241 EXPECT_TRUE(parser.ReadRecord(&record)); |
242 EXPECT_FALSE(parser.AtEnd()); | 242 EXPECT_FALSE(parser.AtEnd()); |
243 EXPECT_TRUE(parser.ReadRecord(&record)); | 243 EXPECT_TRUE(parser.ReadRecord(&record)); |
244 EXPECT_TRUE(parser.AtEnd()); | 244 EXPECT_TRUE(parser.AtEnd()); |
245 EXPECT_FALSE(parser.ReadRecord(&record)); | 245 EXPECT_FALSE(parser.ReadRecord(&record)); |
246 } | 246 } |
247 | 247 |
248 TEST(DnsResponseTest, InitParseWithoutQuery) { | |
249 DnsResponse resp; | |
250 memcpy(resp.io_buffer()->data(), kT0ResponseDatagram, | |
251 sizeof(kT0ResponseDatagram)); | |
252 | |
253 // Accept matching question. | |
254 EXPECT_TRUE(resp.InitParseWithoutQuery(sizeof(kT0ResponseDatagram))); | |
255 EXPECT_TRUE(resp.IsValid()); | |
256 | |
257 // Check header access. | |
258 EXPECT_EQ(0x8180, resp.flags()); | |
259 EXPECT_EQ(0x0, resp.rcode()); | |
260 EXPECT_EQ(kT0RecordCount, resp.answer_count()); | |
261 | |
262 // Check question access. | |
263 EXPECT_EQ(kT0Qtype, resp.qtype()); | |
264 EXPECT_EQ(kT0HostName, resp.GetDottedName()); | |
265 | |
266 DnsResourceRecord record; | |
267 DnsRecordParser parser = resp.Parser(); | |
268 for (unsigned i = 0; i < kT0RecordCount; i ++) { | |
269 EXPECT_FALSE(parser.AtEnd()); | |
270 EXPECT_TRUE(parser.ReadRecord(&record)); | |
271 } | |
272 EXPECT_TRUE(parser.AtEnd()); | |
273 EXPECT_FALSE(parser.ReadRecord(&record)); | |
274 } | |
275 | |
276 TEST(DnsResponseTest, InitParseWithoutQueryNoQuestions) { | |
277 const uint8 response_data[] = { | |
278 // Header | |
279 0xca, 0xfe, // ID | |
280 0x81, 0x80, // Standard query response, RA, no error | |
281 0x00, 0x00, // No question | |
282 0x00, 0x01, // 2 RRs (answers) | |
283 0x00, 0x00, // 0 authority RRs | |
284 0x00, 0x00, // 0 additional RRs | |
285 | |
286 // Answer 1 | |
287 0x0a, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', | |
288 0x08, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm', | |
289 0x03, 'o', 'r', 'g', | |
290 0x00, | |
291 0x00, 0x01, // TYPE is A. | |
292 0x00, 0x01, // CLASS is IN. | |
293 0x00, 0x00, // TTL (4 bytes) is 53 seconds. | |
294 0x00, 0x35, | |
295 0x00, 0x04, // RDLENGTH is 4 bytes. | |
296 0x4a, 0x7d, // RDATA is the IP: 74.125.95.121 | |
297 0x5f, 0x79, | |
298 }; | |
299 | |
300 DnsResponse resp; | |
301 memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data)); | |
302 | |
303 EXPECT_TRUE(resp.InitParseWithoutQuery(sizeof(response_data))); | |
304 | |
305 // Check header access. | |
306 EXPECT_EQ(0x8180, resp.flags()); | |
307 EXPECT_EQ(0x0, resp.rcode()); | |
308 EXPECT_EQ(0x1u, resp.answer_count()); | |
309 | |
310 DnsResourceRecord record; | |
311 DnsRecordParser parser = resp.Parser(); | |
312 | |
313 EXPECT_FALSE(parser.AtEnd()); | |
314 EXPECT_TRUE(parser.ReadRecord(&record)); | |
315 EXPECT_EQ("codereview.chromium.org", record.name); | |
316 EXPECT_EQ(0x00000035u, record.ttl); | |
317 EXPECT_EQ(dns_protocol::kTypeA, record.type); | |
318 | |
319 EXPECT_TRUE(parser.AtEnd()); | |
320 EXPECT_FALSE(parser.ReadRecord(&record)); | |
321 } | |
322 | |
323 TEST(DnsResponseTest, InitParseWithoutQueryTwoQuestions) { | |
324 const uint8 response_data[] = { | |
325 // Header | |
326 0xca, 0xfe, // ID | |
327 0x81, 0x80, // Standard query response, RA, no error | |
328 0x00, 0x02, // 2 questions | |
329 0x00, 0x01, // 2 RRs (answers) | |
330 0x00, 0x00, // 0 authority RRs | |
331 0x00, 0x00, // 0 additional RRs | |
332 | |
333 // Question 1 | |
334 0x0a, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', | |
335 0x08, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm', | |
336 0x03, 'o', 'r', 'g', | |
337 0x00, | |
338 0x00, 0x01, // TYPE is A. | |
339 0x00, 0x01, // CLASS is IN. | |
340 | |
341 // Question 2 | |
342 0x0b, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', '2', | |
343 0xc0, 0x18, // pointer to "chromium.org" | |
szym
2013/04/18 19:12:34
nit: align comment with the rest.
Noam Samuel
2013/04/19 22:13:23
Done.
| |
344 0x00, 0x01, // TYPE is A. | |
345 0x00, 0x01, // CLASS is IN. | |
346 | |
347 // Answer 1 | |
348 0xc0, 0x0c, // NAME is a pointer to name in Question section. | |
szym
2013/04/18 19:12:34
nit: align comment with the rest.
Noam Samuel
2013/04/19 22:13:23
Done.
| |
349 0x00, 0x01, // TYPE is A. | |
350 0x00, 0x01, // CLASS is IN. | |
351 0x00, 0x00, // TTL (4 bytes) is 53 seconds. | |
352 0x00, 0x35, | |
353 0x00, 0x04, // RDLENGTH is 4 bytes. | |
354 0x4a, 0x7d, // RDATA is the IP: 74.125.95.121 | |
355 0x5f, 0x79, | |
356 }; | |
357 | |
358 DnsResponse resp; | |
359 memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data)); | |
360 | |
361 EXPECT_TRUE(resp.InitParseWithoutQuery(sizeof(response_data))); | |
362 | |
363 // Check header access. | |
364 EXPECT_EQ(0x8180, resp.flags()); | |
365 EXPECT_EQ(0x0, resp.rcode()); | |
366 EXPECT_EQ(0x01u, resp.answer_count()); | |
367 | |
368 DnsResourceRecord record; | |
369 DnsRecordParser parser = resp.Parser(); | |
370 | |
371 EXPECT_FALSE(parser.AtEnd()); | |
372 EXPECT_TRUE(parser.ReadRecord(&record)); | |
373 EXPECT_EQ("codereview.chromium.org", record.name); | |
374 EXPECT_EQ(0x35u, record.ttl); | |
375 EXPECT_EQ(dns_protocol::kTypeA, record.type); | |
376 | |
377 EXPECT_TRUE(parser.AtEnd()); | |
378 EXPECT_FALSE(parser.ReadRecord(&record)); | |
379 } | |
380 | |
248 void VerifyAddressList(const std::vector<const char*>& ip_addresses, | 381 void VerifyAddressList(const std::vector<const char*>& ip_addresses, |
249 const AddressList& addrlist) { | 382 const AddressList& addrlist) { |
250 ASSERT_EQ(ip_addresses.size(), addrlist.size()); | 383 ASSERT_EQ(ip_addresses.size(), addrlist.size()); |
251 | 384 |
252 for (size_t i = 0; i < addrlist.size(); ++i) { | 385 for (size_t i = 0; i < addrlist.size(); ++i) { |
253 EXPECT_EQ(ip_addresses[i], addrlist[i].ToStringWithoutPort()); | 386 EXPECT_EQ(ip_addresses[i], addrlist[i].ToStringWithoutPort()); |
254 } | 387 } |
255 } | 388 } |
256 | 389 |
257 TEST(DnsResponseTest, ParseToAddressList) { | 390 TEST(DnsResponseTest, ParseToAddressList) { |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
425 AddressList addr_list; | 558 AddressList addr_list; |
426 base::TimeDelta ttl; | 559 base::TimeDelta ttl; |
427 EXPECT_EQ(t.expected_result, | 560 EXPECT_EQ(t.expected_result, |
428 response.ParseToAddressList(&addr_list, &ttl)); | 561 response.ParseToAddressList(&addr_list, &ttl)); |
429 } | 562 } |
430 } | 563 } |
431 | 564 |
432 } // namespace | 565 } // namespace |
433 | 566 |
434 } // namespace net | 567 } // namespace net |
568 | |
szym
2013/04/18 19:12:34
Ditto.
Noam Samuel
2013/04/19 22:13:23
Done.
| |
OLD | NEW |