README.md
1
2# Resolv Gold Test
3The "Resolv Gold Test" targets to run automatically in presubmit, as a change
4detector to ensure that the resolver doesn't send the query or parse the
5response unexpectedly.
6
7## Build testing pbtext
8The testing pbtext is built manually so far. Fill expected API parameters to
9'config' and expected answers to 'result' in pbtext. Then, record the
10corresponding DNS query and response packets. Fill the packets with the \x
11formatting into 'query' and 'response' in pbtext. Perhaps have a mechanism
12to generate the pbtxt automatically in the future.
13
14### Using 'ping' utility to be an example for building pbtext
15Here demonstrates how the pbtext is built.
16
171. Enable resolver debug log level to VERBOSE (0)
18```
19$ adb shell service call dnsresolver 10 i32 0
20```
212. Ping a website
22```
23$ adb shell ping www.google.com
24```
253. Get bugreport
26```
27$ adb bugreport
28```
294. Search the log pattern as the follows in bugreport
30```
31# API arguments
32resolv : logArguments: argv[0]=gethostbyname
33resolv : logArguments: argv[1]=0
34resolv : logArguments: argv[2]=www.google.com
35resolv : logArguments: argv[3]=2
36
37# Query packet
38resolv : ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29827
39resolv : ;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
40resolv : ;; QUERY SECTION:
41resolv : ;; www.google.com, type = A, class = IN
42resolv :
43resolv : Hex dump:
44resolv : 7483010000010000000000000377777706676f6f676c6503636f6d0000010001
45
46# Response packet
47resolv : ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29827
48resolv : ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
49resolv : ;; QUERY SECTION:
50resolv : ;; www.google.com, type = A, class = IN
51resolv :
52resolv : ;; ANSWER SECTION:
53resolv : ;; www.google.com. 2m19s IN A 172.217.160.100
54resolv :
55resolv : Hex dump:
56resolv : 7483818000010001000000000377777706676f6f676c6503636f6d0000010001
57resolv : c00c000100010000008b0004acd9a064
58```
59
605. Convert the logging into pbtext. Then, Clear the 'id' which is 0x7483 in
61this example from 'query' and 'response' because 'id' is regenerated per
62session. The follows is result pbtext.
63```
64config {
65 call: CALL_GETHOSTBYNAME
66 hostbyname {
67 host: "www.google.com."
68 family: GT_AF_INET
69 };
70}
71result {
72 return_code: GT_EAI_NO_ERROR
73 addresses: "172.217.160.100"
74}
75packet_mapping {
76 query: "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03\x77\x77\x77"
77 "\x06\x67\x6f\x6f\x67\x6c\x65\x03\x63\x6f\x6d\x00\x00\x01\x00\x01"
78 response: "\x00\x00\x81\x80\x00\x01\x00\x01\x00\x00\x00\x00\x03\x77\x77\x77"
79 "\x06\x67\x6f\x6f\x67\x6c\x65\x03\x63\x6f\x6d\x00\x00\x01\x00\x01"
80 "\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\x8b\x00\x04\xac\xd9\xa0\x64"
81}
82```
83
84## Decode packets in pbtext
85You can invoke the [scapy](https://scapy.net) of python module to extract
86binary packet record in pbtext file. Here are the instructions and example
87for parsing packet.
88
89### Instructions
90Run the following instruction to decode.
91```
92$ python
93>>> from scapy import all as scapy
94>>> scapy.DNS("<paste_hex_string>").show2()
95```
96
97### Example
98Using 'getaddrinfo.topsite.youtube.pbtxt' to be an example here.
99
1001. Find the packet record 'query' or 'response' in .pbtext file.
101```
102query: "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03\x77\x77\x77"
103 "\x07\x79\x6f\x75\x74\x75\x62\x65\x03\x63\x6f\x6d\x00\x00\x1c\x00"
104 "\x01"
105```
1062. Run the following instruction.
107
108Start python
109```
110$ python
111```
112Import scapy
113```
114>>> from scapy import all as scapy
115```
116Assign the binary packet to be decoded into a variable. Beware of using
117backslash '\\' for new line if required
118```
119>>> raw_packet=\
120 "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03\x77\x77\x77" \
121 "\x07\x79\x6f\x75\x74\x75\x62\x65\x03\x63\x6f\x6d\x00\x00\x1c\x00" \
122 "\x01"
123```
124Decode packet
125```
126>>> scapy.DNS(raw_packet).show2()
127###[ DNS ]###
128 id = 0
129 qr = 0
130 opcode = QUERY
131 aa = 0
132 tc = 0
133 rd = 1
134 ra = 0
135 z = 0
136 ad = 0
137 cd = 0
138 rcode = ok
139 qdcount = 1
140 ancount = 0
141 nscount = 0
142 arcount = 0
143 \qd \
144 |###[ DNS Question Record ]###
145 | qname = 'www.youtube.com.'
146 | qtype = AAAA
147 | qclass = IN
148 an = None
149 ns = None
150 ar = None
151```
152
153## Running the tests
154Run the following instruction to test.
155```
156atest resolv_gold_test
157```