dns_test_util.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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
3// found in the LICENSE file.
4
5#ifndef NET_DNS_DNS_TEST_UTIL_H_
6#define NET_DNS_DNS_TEST_UTIL_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/memory/scoped_ptr.h"
13#include "net/dns/dns_config_service.h"
14#include "net/dns/dns_protocol.h"
15
16namespace net {
17
18//-----------------------------------------------------------------------------
19// Query/response set for www.google.com, ID is fixed to 0.
20static const char kT0HostName[] = "www.google.com";
21static const uint16 kT0Qtype = dns_protocol::kTypeA;
22static const char kT0DnsName[] = {
23  0x03, 'w', 'w', 'w',
24  0x06, 'g', 'o', 'o', 'g', 'l', 'e',
25  0x03, 'c', 'o', 'm',
26  0x00
27};
28static const size_t kT0QuerySize = 32;
29static const uint8 kT0ResponseDatagram[] = {
30  // response contains one CNAME for www.l.google.com and the following
31  // IP addresses: 74.125.226.{179,180,176,177,178}
32  0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x06,
33  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
34  0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
35  0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
36  0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01,
37  0x4d, 0x13, 0x00, 0x08, 0x03, 0x77, 0x77, 0x77,
38  0x01, 0x6c, 0xc0, 0x10, 0xc0, 0x2c, 0x00, 0x01,
39  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
40  0x4a, 0x7d, 0xe2, 0xb3, 0xc0, 0x2c, 0x00, 0x01,
41  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
42  0x4a, 0x7d, 0xe2, 0xb4, 0xc0, 0x2c, 0x00, 0x01,
43  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
44  0x4a, 0x7d, 0xe2, 0xb0, 0xc0, 0x2c, 0x00, 0x01,
45  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
46  0x4a, 0x7d, 0xe2, 0xb1, 0xc0, 0x2c, 0x00, 0x01,
47  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
48  0x4a, 0x7d, 0xe2, 0xb2
49};
50static const char* const kT0IpAddresses[] = {
51  "74.125.226.179", "74.125.226.180", "74.125.226.176",
52  "74.125.226.177", "74.125.226.178"
53};
54static const char kT0CanonName[] = "www.l.google.com";
55static const int kT0TTL = 0x000000e4;
56// +1 for the CNAME record.
57static const unsigned kT0RecordCount = arraysize(kT0IpAddresses) + 1;
58
59//-----------------------------------------------------------------------------
60// Query/response set for codereview.chromium.org, ID is fixed to 1.
61static const char kT1HostName[] = "codereview.chromium.org";
62static const uint16 kT1Qtype = dns_protocol::kTypeA;
63static const char kT1DnsName[] = {
64  0x0a, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w',
65  0x08, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm',
66  0x03, 'o', 'r', 'g',
67  0x00
68};
69static const size_t kT1QuerySize = 41;
70static const uint8 kT1ResponseDatagram[] = {
71  // response contains one CNAME for ghs.l.google.com and the following
72  // IP address: 64.233.169.121
73  0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x02,
74  0x00, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f, 0x64,
75  0x65, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x08,
76  0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
77  0x03, 0x6f, 0x72, 0x67, 0x00, 0x00, 0x01, 0x00,
78  0x01, 0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00,
79  0x01, 0x41, 0x75, 0x00, 0x12, 0x03, 0x67, 0x68,
80  0x73, 0x01, 0x6c, 0x06, 0x67, 0x6f, 0x6f, 0x67,
81  0x6c, 0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0xc0,
82  0x35, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
83  0x0b, 0x00, 0x04, 0x40, 0xe9, 0xa9, 0x79
84};
85static const char* const kT1IpAddresses[] = {
86  "64.233.169.121"
87};
88static const char kT1CanonName[] = "ghs.l.google.com";
89static const int kT1TTL = 0x0000010b;
90// +1 for the CNAME record.
91static const unsigned kT1RecordCount = arraysize(kT1IpAddresses) + 1;
92
93//-----------------------------------------------------------------------------
94// Query/response set for www.ccs.neu.edu, ID is fixed to 2.
95static const char kT2HostName[] = "www.ccs.neu.edu";
96static const uint16 kT2Qtype = dns_protocol::kTypeA;
97static const char kT2DnsName[] = {
98  0x03, 'w', 'w', 'w',
99  0x03, 'c', 'c', 's',
100  0x03, 'n', 'e', 'u',
101  0x03, 'e', 'd', 'u',
102  0x00
103};
104static const size_t kT2QuerySize = 33;
105static const uint8 kT2ResponseDatagram[] = {
106  // response contains one CNAME for vulcan.ccs.neu.edu and the following
107  // IP address: 129.10.116.81
108  0x00, 0x02, 0x81, 0x80, 0x00, 0x01, 0x00, 0x02,
109  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
110  0x03, 0x63, 0x63, 0x73, 0x03, 0x6e, 0x65, 0x75,
111  0x03, 0x65, 0x64, 0x75, 0x00, 0x00, 0x01, 0x00,
112  0x01, 0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00,
113  0x00, 0x01, 0x2c, 0x00, 0x09, 0x06, 0x76, 0x75,
114  0x6c, 0x63, 0x61, 0x6e, 0xc0, 0x10, 0xc0, 0x2d,
115  0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x2c,
116  0x00, 0x04, 0x81, 0x0a, 0x74, 0x51
117};
118static const char* const kT2IpAddresses[] = {
119  "129.10.116.81"
120};
121static const char kT2CanonName[] = "vulcan.ccs.neu.edu";
122static const int kT2TTL = 0x0000012c;
123// +1 for the CNAME record.
124static const unsigned kT2RecordCount = arraysize(kT2IpAddresses) + 1;
125
126//-----------------------------------------------------------------------------
127// Query/response set for www.google.az, ID is fixed to 3.
128static const char kT3HostName[] = "www.google.az";
129static const uint16 kT3Qtype = dns_protocol::kTypeA;
130static const char kT3DnsName[] = {
131  0x03, 'w', 'w', 'w',
132  0x06, 'g', 'o', 'o', 'g', 'l', 'e',
133  0x02, 'a', 'z',
134  0x00
135};
136static const size_t kT3QuerySize = 31;
137static const uint8 kT3ResponseDatagram[] = {
138  // response contains www.google.com as CNAME for www.google.az and
139  // www.l.google.com as CNAME for www.google.com and the following
140  // IP addresses: 74.125.226.{178,179,180,176,177}
141  0x00, 0x03, 0x81, 0x80, 0x00, 0x01, 0x00, 0x07,
142  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
143  0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x02,
144  0x61, 0x7a, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
145  0x0c, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x50,
146  0x99, 0x00, 0x10, 0x03, 0x77, 0x77, 0x77, 0x06,
147  0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03, 0x63,
148  0x6f, 0x6d, 0x00, 0xc0, 0x2b, 0x00, 0x05, 0x00,
149  0x01, 0x00, 0x01, 0x50, 0x99, 0x00, 0x08, 0x03,
150  0x77, 0x77, 0x77, 0x01, 0x6c, 0xc0, 0x2f, 0xc0,
151  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
152  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb2, 0xc0,
153  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
154  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb3, 0xc0,
155  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
156  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb4, 0xc0,
157  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
158  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb0, 0xc0,
159  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
160  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb1
161};
162static const char* const kT3IpAddresses[] = {
163  "74.125.226.178", "74.125.226.179", "74.125.226.180",
164  "74.125.226.176", "74.125.226.177"
165};
166static const char kT3CanonName[] = "www.l.google.com";
167static const int kT3TTL = 0x00000015;
168// +2 for the CNAME records.
169static const unsigned kT3RecordCount = arraysize(kT3IpAddresses) + 2;
170
171class DnsClient;
172
173struct MockDnsClientRule {
174  enum Result {
175    FAIL_SYNC,   // Fail synchronously with ERR_NAME_NOT_RESOLVED.
176    FAIL_ASYNC,  // Fail asynchronously with ERR_NAME_NOT_RESOLVED.
177    EMPTY,       // Return an empty response.
178    OK,          // Return a response with loopback address.
179  };
180
181  MockDnsClientRule(const std::string& prefix_arg,
182                    uint16 qtype_arg,
183                    Result result_arg)
184      : result(result_arg), prefix(prefix_arg), qtype(qtype_arg) { }
185
186  Result result;
187  std::string prefix;
188  uint16 qtype;
189};
190
191typedef std::vector<MockDnsClientRule> MockDnsClientRuleList;
192
193// Creates mock DnsClient for testing HostResolverImpl.
194scoped_ptr<DnsClient> CreateMockDnsClient(const DnsConfig& config,
195                                          const MockDnsClientRuleList& rules);
196
197}  // namespace net
198
199#endif  // NET_DNS_DNS_TEST_UTIL_H_
200