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_client.h"
14#include "net/dns/dns_config_service.h"
15#include "net/dns/dns_protocol.h"
16
17namespace net {
18
19//-----------------------------------------------------------------------------
20// Query/response set for www.google.com, ID is fixed to 0.
21static const char kT0HostName[] = "www.google.com";
22static const uint16 kT0Qtype = dns_protocol::kTypeA;
23static const char kT0DnsName[] = {
24  0x03, 'w', 'w', 'w',
25  0x06, 'g', 'o', 'o', 'g', 'l', 'e',
26  0x03, 'c', 'o', 'm',
27  0x00
28};
29static const size_t kT0QuerySize = 32;
30static const uint8 kT0ResponseDatagram[] = {
31  // response contains one CNAME for www.l.google.com and the following
32  // IP addresses: 74.125.226.{179,180,176,177,178}
33  0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x06,
34  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
35  0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
36  0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
37  0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01,
38  0x4d, 0x13, 0x00, 0x08, 0x03, 0x77, 0x77, 0x77,
39  0x01, 0x6c, 0xc0, 0x10, 0xc0, 0x2c, 0x00, 0x01,
40  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
41  0x4a, 0x7d, 0xe2, 0xb3, 0xc0, 0x2c, 0x00, 0x01,
42  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
43  0x4a, 0x7d, 0xe2, 0xb4, 0xc0, 0x2c, 0x00, 0x01,
44  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
45  0x4a, 0x7d, 0xe2, 0xb0, 0xc0, 0x2c, 0x00, 0x01,
46  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
47  0x4a, 0x7d, 0xe2, 0xb1, 0xc0, 0x2c, 0x00, 0x01,
48  0x00, 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x04,
49  0x4a, 0x7d, 0xe2, 0xb2
50};
51static const char* const kT0IpAddresses[] = {
52  "74.125.226.179", "74.125.226.180", "74.125.226.176",
53  "74.125.226.177", "74.125.226.178"
54};
55static const char kT0CanonName[] = "www.l.google.com";
56static const int kT0TTL = 0x000000e4;
57// +1 for the CNAME record.
58static const unsigned kT0RecordCount = arraysize(kT0IpAddresses) + 1;
59
60//-----------------------------------------------------------------------------
61// Query/response set for codereview.chromium.org, ID is fixed to 1.
62static const char kT1HostName[] = "codereview.chromium.org";
63static const uint16 kT1Qtype = dns_protocol::kTypeA;
64static const char kT1DnsName[] = {
65  0x0a, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w',
66  0x08, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm',
67  0x03, 'o', 'r', 'g',
68  0x00
69};
70static const size_t kT1QuerySize = 41;
71static const uint8 kT1ResponseDatagram[] = {
72  // response contains one CNAME for ghs.l.google.com and the following
73  // IP address: 64.233.169.121
74  0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x02,
75  0x00, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f, 0x64,
76  0x65, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x08,
77  0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
78  0x03, 0x6f, 0x72, 0x67, 0x00, 0x00, 0x01, 0x00,
79  0x01, 0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00,
80  0x01, 0x41, 0x75, 0x00, 0x12, 0x03, 0x67, 0x68,
81  0x73, 0x01, 0x6c, 0x06, 0x67, 0x6f, 0x6f, 0x67,
82  0x6c, 0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0xc0,
83  0x35, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
84  0x0b, 0x00, 0x04, 0x40, 0xe9, 0xa9, 0x79
85};
86static const char* const kT1IpAddresses[] = {
87  "64.233.169.121"
88};
89static const char kT1CanonName[] = "ghs.l.google.com";
90static const int kT1TTL = 0x0000010b;
91// +1 for the CNAME record.
92static const unsigned kT1RecordCount = arraysize(kT1IpAddresses) + 1;
93
94//-----------------------------------------------------------------------------
95// Query/response set for www.ccs.neu.edu, ID is fixed to 2.
96static const char kT2HostName[] = "www.ccs.neu.edu";
97static const uint16 kT2Qtype = dns_protocol::kTypeA;
98static const char kT2DnsName[] = {
99  0x03, 'w', 'w', 'w',
100  0x03, 'c', 'c', 's',
101  0x03, 'n', 'e', 'u',
102  0x03, 'e', 'd', 'u',
103  0x00
104};
105static const size_t kT2QuerySize = 33;
106static const uint8 kT2ResponseDatagram[] = {
107  // response contains one CNAME for vulcan.ccs.neu.edu and the following
108  // IP address: 129.10.116.81
109  0x00, 0x02, 0x81, 0x80, 0x00, 0x01, 0x00, 0x02,
110  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
111  0x03, 0x63, 0x63, 0x73, 0x03, 0x6e, 0x65, 0x75,
112  0x03, 0x65, 0x64, 0x75, 0x00, 0x00, 0x01, 0x00,
113  0x01, 0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00,
114  0x00, 0x01, 0x2c, 0x00, 0x09, 0x06, 0x76, 0x75,
115  0x6c, 0x63, 0x61, 0x6e, 0xc0, 0x10, 0xc0, 0x2d,
116  0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x2c,
117  0x00, 0x04, 0x81, 0x0a, 0x74, 0x51
118};
119static const char* const kT2IpAddresses[] = {
120  "129.10.116.81"
121};
122static const char kT2CanonName[] = "vulcan.ccs.neu.edu";
123static const int kT2TTL = 0x0000012c;
124// +1 for the CNAME record.
125static const unsigned kT2RecordCount = arraysize(kT2IpAddresses) + 1;
126
127//-----------------------------------------------------------------------------
128// Query/response set for www.google.az, ID is fixed to 3.
129static const char kT3HostName[] = "www.google.az";
130static const uint16 kT3Qtype = dns_protocol::kTypeA;
131static const char kT3DnsName[] = {
132  0x03, 'w', 'w', 'w',
133  0x06, 'g', 'o', 'o', 'g', 'l', 'e',
134  0x02, 'a', 'z',
135  0x00
136};
137static const size_t kT3QuerySize = 31;
138static const uint8 kT3ResponseDatagram[] = {
139  // response contains www.google.com as CNAME for www.google.az and
140  // www.l.google.com as CNAME for www.google.com and the following
141  // IP addresses: 74.125.226.{178,179,180,176,177}
142  // The TTLs on the records are: 0x00015099, 0x00025099, 0x00000415,
143  // 0x00003015, 0x00002015, 0x00000015, 0x00001015.
144  // The last record is an imaginary TXT record for t.google.com.
145  0x00, 0x03, 0x81, 0x80, 0x00, 0x01, 0x00, 0x08,
146  0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
147  0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x02,
148  0x61, 0x7a, 0x00, 0x00, 0x01, 0x00, 0x01, 0xc0,
149  0x0c, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x50,
150  0x99, 0x00, 0x10, 0x03, 0x77, 0x77, 0x77, 0x06,
151  0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03, 0x63,
152  0x6f, 0x6d, 0x00, 0xc0, 0x2b, 0x00, 0x05, 0x00,
153  0x01, 0x00, 0x02, 0x50, 0x99, 0x00, 0x08, 0x03,
154  0x77, 0x77, 0x77, 0x01, 0x6c, 0xc0, 0x2f, 0xc0,
155  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x04,
156  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb2, 0xc0,
157  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x30,
158  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb3, 0xc0,
159  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x20,
160  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb4, 0xc0,
161  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
162  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb0, 0xc0,
163  0x47, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x10,
164  0x15, 0x00, 0x04, 0x4a, 0x7d, 0xe2, 0xb1, 0x01,
165  0x74, 0xc0, 0x2f, 0x00, 0x10, 0x00, 0x01, 0x00,
166  0x00, 0x00, 0x01, 0x00, 0x04, 0xde, 0xad, 0xfe,
167  0xed
168};
169static const char* const kT3IpAddresses[] = {
170  "74.125.226.178", "74.125.226.179", "74.125.226.180",
171  "74.125.226.176", "74.125.226.177"
172};
173static const char kT3CanonName[] = "www.l.google.com";
174static const int kT3TTL = 0x00000015;
175// +2 for the CNAME records, +1 for TXT record.
176static const unsigned kT3RecordCount = arraysize(kT3IpAddresses) + 3;
177
178class AddressSorter;
179class DnsClient;
180class MockTransactionFactory;
181
182struct MockDnsClientRule {
183  enum Result {
184    FAIL,     // Fail asynchronously with ERR_NAME_NOT_RESOLVED.
185    TIMEOUT,  // Fail asynchronously with ERR_DNS_TIMEOUT.
186    EMPTY,    // Return an empty response.
187    OK,       // Return a response with loopback address.
188  };
189
190  // If |delay| is true, matching transactions will be delayed until triggered
191  // by the consumer.
192  MockDnsClientRule(const std::string& prefix_arg,
193                    uint16 qtype_arg,
194                    Result result_arg,
195                    bool delay)
196      : result(result_arg), prefix(prefix_arg), qtype(qtype_arg),
197        delay(delay) {}
198
199  Result result;
200  std::string prefix;
201  uint16 qtype;
202  bool delay;
203};
204
205typedef std::vector<MockDnsClientRule> MockDnsClientRuleList;
206
207// MockDnsClient provides MockTransactionFactory.
208class MockDnsClient : public DnsClient {
209 public:
210  MockDnsClient(const DnsConfig& config, const MockDnsClientRuleList& rules);
211  virtual ~MockDnsClient();
212
213  // DnsClient interface:
214  virtual void SetConfig(const DnsConfig& config) OVERRIDE;
215  virtual const DnsConfig* GetConfig() const OVERRIDE;
216  virtual DnsTransactionFactory* GetTransactionFactory() OVERRIDE;
217  virtual AddressSorter* GetAddressSorter() OVERRIDE;
218
219  // Completes all DnsTransactions that were delayed by a rule.
220  void CompleteDelayedTransactions();
221
222 private:
223  DnsConfig config_;
224  scoped_ptr<MockTransactionFactory> factory_;
225  scoped_ptr<AddressSorter> address_sorter_;
226};
227
228}  // namespace net
229
230#endif  // NET_DNS_DNS_TEST_UTIL_H_
231