3d613a8c285e3e717120b7d1dac8449fb12a23c6
[metze/wireshark/wip.git] / test / lua / verify_dissector.lua
1 -- This is a test script for tshark.
2 -- This script runs inside tshark.
3 -- FIRST run tshark with the "dns_dissector.lua" plugin, with the dns_port.pcap file,
4 -- and with full tree output (-V switch).  Pipe that to a file named testin.txt.
5 -- This verify script then reads in that testin.txt.
6 --
7 -- tshark -r bogus.cap -X lua_script:<path_to_testdir>/lua/verify_dns_dissector.lua
8
9 local function testing(...)
10     print("---- Testing "..tostring(...).." ----")
11 end
12
13 local lines = {
14     {
15         "MyDNS Protocol",
16         "Transaction ID: 42",
17         "Flags: 0x0100",
18         "0... .... .... .... = Response: this is a query",
19         "[Expert Info (Chat/Request): DNS query message]",
20         "[DNS query message]",
21         "[Severity level: Chat]",
22         "[Group: Request]",
23        ".000 0... .... .... = Opcode: 0",
24         ".... ..0. .... .... = Truncated: False",
25         ".... ...1 .... .... = Recursion desired: yes",
26         ".... .... .0.. .... = World War Z - Reserved for future use: 0x0",
27         ".... .... ...0 .... = Checking disabled: False",
28         "Number of Questions: 1",
29         "Number of Answer RRs: 0",
30         "Number of Authority RRs: 0",
31         "Number of Additional RRs: 0",
32         "Queries",
33         "us.pool.ntp.org: type A (IPv4 host address) (1), class IN (Internet) (1)",
34         "Name: us.pool.ntp.org",
35         "[Name Length: 17]",
36         "[Label Count: 4]",
37         "Type: A (IPv4 host address) (1)",
38         "Class: IN (Internet) (1)",
39     },
40
41     {
42         "MyDNS Protocol",
43         "Transaction ID: 42",
44         "Flags: 0x8180",
45         "1... .... .... .... = Response: this is a response",
46         "[Expert Info (Chat/Response): It's a response!]",
47         "[It's a response!]",
48         "[Severity level: Chat]",
49         "[Group: Response]",
50          ".000 0... .... .... = Opcode: 0",
51         ".... .0.. .... .... = Authoritative: False",
52         ".... ..0. .... .... = Truncated: False",
53         ".... .... 1... .... = Recursion available: True",
54         ".... .... .0.. .... = World War Z - Reserved for future use: 0x0",
55         ".... .... ..0. .... = Authenticated: no",
56         ".... .... .... 0000 = Response code: No Error (0)",
57         ".... .... ...0 .... = Checking disabled: False",
58         "DNS answer to life, the universe, and everything",
59         "[Expert Info (Note/Comment): DNS answer to life, the universe, and everything]",
60         "[DNS answer to life, the universe, and everything]",
61         "[Severity level: Note]",
62         "[Group: Comment]",
63         "Number of Questions: 1",
64         "Number of Answer RRs: 15",
65         "Number of Authority RRs: 6",
66         "Number of Additional RRs: 2",
67         "Queries",
68         "us.pool.ntp.org: type A (IPv4 host address) (1), class IN (Internet) (1)",
69         "Name: us.pool.ntp.org",
70         "[Name Length: 17]",
71         "[Label Count: 4]",
72         "Type: A (IPv4 host address) (1)",
73         "Class: IN (Internet) (1)",
74     },
75
76     {
77         "MyDNS Protocol",
78         "Transaction ID: 43",
79         "Flags: 0x0100",
80         "0... .... .... .... = Response: this is a query",
81         "[Expert Info (Chat/Request): DNS query message]",
82         "[DNS query message]",
83         "[Severity level: Chat]",
84         "[Group: Request]",
85        ".000 0... .... .... = Opcode: 0",
86         ".... ..0. .... .... = Truncated: False",
87         ".... ...1 .... .... = Recursion desired: yes",
88         ".... .... .0.. .... = World War Z - Reserved for future use: 0x0",
89         ".... .... ...0 .... = Checking disabled: False",
90         "Number of Questions: 1",
91         "Number of Answer RRs: 0",
92         "Number of Authority RRs: 0",
93         "Number of Additional RRs: 0",
94         "Queries",
95         "us.pool.ntp.org: type A (IPv4 host address) (1), class IN (Internet) (1)",
96         "Name: us.pool.ntp.org",
97         "[Name Length: 17]",
98         "[Label Count: 4]",
99         "Type: A (IPv4 host address) (1)",
100         "Class: IN (Internet) (1)",
101     },
102
103     {
104         "MyDNS Protocol",
105         "Transaction ID: 43",
106         "Flags: 0x8180",
107         "1... .... .... .... = Response: this is a response",
108         "[Expert Info (Chat/Response): It's a response!]",
109         "[It's a response!]",
110         "[Severity level: Chat]",
111         "[Group: Response]",
112          ".000 0... .... .... = Opcode: 0",
113         ".... .0.. .... .... = Authoritative: False",
114         ".... ..0. .... .... = Truncated: False",
115         ".... .... 1... .... = Recursion available: True",
116         ".... .... .0.. .... = World War Z - Reserved for future use: 0x0",
117         ".... .... ..0. .... = Authenticated: no",
118         ".... .... .... 0000 = Response code: No Error (0)",
119         ".... .... ...0 .... = Checking disabled: False",
120         "Number of Questions: 1",
121         "Number of Answer RRs: 15",
122         "Number of Authority RRs: 6",
123         "Number of Additional RRs: 2",
124         "Queries",
125         "us.pool.ntp.org: type A (IPv4 host address) (1), class IN (Internet) (1)",
126         "Name: us.pool.ntp.org",
127         "[Name Length: 17]",
128         "[Label Count: 4]",
129         "Type: A (IPv4 host address) (1)",
130         "Class: IN (Internet) (1)",
131     },
132 }
133
134 -- we're going to see those two sets of output twice: both by the normal
135 -- dissector, then the first one by the heuristic, then the second one by
136 -- a conversation match
137 local numtests = 1 + #lines[1] + #lines[2] + #lines[3] + #lines[4]
138
139 local hasHeuristic = true
140
141 -- grab passed-in arguments
142 local args = { ... }
143 if #args > 0 then
144     for _, arg in ipairs(args) do
145         if arg == "no_heur" then
146             numtests = numtests - 1
147         end
148     end
149 end
150
151 print("going to run "..numtests.." tests")
152
153 -- for an example of what we're reading through to verify, look at end of this file
154 print("opening file testin.txt")
155 local file = io.open("testin.txt", "r")
156 local line = file:read()
157
158 local pktidx = 1
159 local total = 0
160 local found = false
161
162 while line do
163     -- eat beginning whitespace
164     line = line:gsub("^%s+","",1)
165     if line:find("^Frame %d+:") then
166         pktidx = line:match("^Frame (%d+):")
167         testing("Frame "..pktidx)
168         pktidx = tonumber(pktidx)
169         if pktidx > 4 then pktidx = pktidx - 4 end
170         line = file:read()
171     elseif line:find("%[Heuristic dissector used%]") then
172         -- start again, because it now repeats
173         -- but we should not see this [Heuristic dissector used] line again
174         -- or it's an error in setting the conversation
175         if found then
176             error("Heuristic dissector ran twice - conversation setting not working?")
177             return
178         end
179         found = true
180         total = total + 1
181         line = file:read()
182     elseif line == lines[pktidx][1] then
183         -- we've matched the first line of our section
184         -- now verify the rest is sequential
185         for i, v in ipairs(lines[pktidx]) do
186             io.stdout:write("testing Frame "..pktidx..", line "..i.."...")
187             if not line then
188                 -- ended too soon
189                 io.stdout:write("failed!\n")
190                 error("Ran out of file lines!")
191                 return
192             end
193             -- eat beginning whitespace
194             line = line:gsub("^%s+","",1)
195             if line ~= v then
196                 io.stdout:write("failed!\n")
197                 print("Got this:'"..line.."', expected this:'"..v.."'")
198                 error("mismatched lines!")
199                 return
200             end
201             io.stdout:write("passed\n")
202             total = total + 1
203             line = file:read()
204         end
205     else
206         line = file:read()
207     end
208 end
209
210 print(total.." of "..numtests.." tests run and passed")
211
212 if total ~= numtests then
213     error("Did not find all our lines to test!")
214     return
215 end
216
217 print("\n-----------------------------\n")
218 -- must print out the following for success (the test shell sciprt looks for this)
219 print("All tests passed!\n\n")
220
221
222 ----------------------------------------------------------
223 -- We should see something like this:
224 --[[
225 Frame 1: 75 bytes on wire (600 bits), 75 bytes captured (600 bits)
226     Encapsulation type: Ethernet (1)
227     Arrival Time: Sep 26, 2004 23:18:04.938672000 EDT
228     [Time shift for this packet: 0.000000000 seconds]
229     Epoch Time: 1096255084.938672000 seconds
230     [Time delta from previous captured frame: 0.000000000 seconds]
231     [Time delta from previous displayed frame: 0.000000000 seconds]
232     [Time since reference or first frame: 0.000000000 seconds]
233     Frame Number: 1
234     Frame Length: 75 bytes (600 bits)
235     Capture Length: 75 bytes (600 bits)
236     [Frame is marked: False]
237     [Frame is ignored: False]
238     [Protocols in frame: eth:ethertype:ip:udp:mydns]
239 Ethernet II, Src: AmbitMic_6c:40:4e (00:d0:59:6c:40:4e), Dst: Cisco-Li_82:b2:53 (00:0c:41:82:b2:53)
240     Destination: Cisco-Li_82:b2:53 (00:0c:41:82:b2:53)
241         Address: Cisco-Li_82:b2:53 (00:0c:41:82:b2:53)
242         .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
243         .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
244     Source: AmbitMic_6c:40:4e (00:d0:59:6c:40:4e)
245         Address: AmbitMic_6c:40:4e (00:d0:59:6c:40:4e)
246         .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
247         .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
248     Type: IP (0x0800)
249 Internet Protocol Version 4, Src: 192.168.50.50 (192.168.50.50), Dst: 192.168.0.1 (192.168.0.1)
250     Version: 4
251     Header Length: 20 bytes
252     Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
253         0000 00.. = Differentiated Services Codepoint: Default (0x00)
254         .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
255     Total Length: 61
256     Identification: 0x0a41 (2625)
257     Flags: 0x00
258         0... .... = Reserved bit: Not set
259         .0.. .... = Don't fragment: Not set
260         ..0. .... = More fragments: Not set
261     Fragment offset: 0
262     Time to live: 128
263     Protocol: UDP (17)
264     Header checksum: 0x7ceb [correct]
265         [Good: True]
266         [Bad: False]
267     Source: 192.168.50.50 (192.168.50.50)
268     Destination: 192.168.0.1 (192.168.0.1)
269 User Datagram Protocol, Src Port: 65282 (65282), Dst Port: 65333 (65333)
270     Source Port: 65282 (65282)
271     Destination Port: 65333 (65333)
272     Length: 41
273     Checksum: 0x07a9 [validation disabled]
274         [Good Checksum: False]
275         [Bad Checksum: False]
276     [Stream index: 0]
277 MyDNS Protocol
278     Transaction ID: 43
279     Flags: 0x0100
280         0... .... .... .... = Response: this is a query
281         .000 0... .... .... = Opcode: 0
282         .... ..0. .... .... = Truncated: False
283         .... ...1 .... .... = Recursion desired: yes
284         .... .... .0.. .... = World War Z - Reserved for future use: 0x0
285         .... .... ...0 .... = Checking disabled: False
286     Number of Questions: 1
287     Number of Answer RRs: 0
288     Number of Authority RRs: 0
289     Number of Additional RRs: 0
290     Queries
291         us.pool.ntp.org: type A (IPv4 host address) (1), class IN (Internet) (1)
292             Name: us.pool.ntp.org
293             [Name Length: 17]
294             [Label Count: 4]
295             Type: A (IPv4 host address) (1)
296             Class: IN (Internet) (1)
297
298 Frame 2: 540 bytes on wire (4320 bits), 540 bytes captured (4320 bits)
299     Encapsulation type: Ethernet (1)
300     Arrival Time: Sep 26, 2004 23:18:04.945618000 EDT
301     [Time shift for this packet: 0.000000000 seconds]
302     Epoch Time: 1096255084.945618000 seconds
303     [Time delta from previous captured frame: 0.006946000 seconds]
304     [Time delta from previous displayed frame: 0.006946000 seconds]
305     [Time since reference or first frame: 0.006946000 seconds]
306     Frame Number: 2
307     Frame Length: 540 bytes (4320 bits)
308     Capture Length: 540 bytes (4320 bits)
309     [Frame is marked: False]
310     [Frame is ignored: False]
311     [Protocols in frame: eth:ethertype:ip:udp:mydns]
312 Ethernet II, Src: Cisco-Li_82:b2:53 (00:0c:41:82:b2:53), Dst: AmbitMic_6c:40:4e (00:d0:59:6c:40:4e)
313     Destination: AmbitMic_6c:40:4e (00:d0:59:6c:40:4e)
314         Address: AmbitMic_6c:40:4e (00:d0:59:6c:40:4e)
315         .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
316         .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
317     Source: Cisco-Li_82:b2:53 (00:0c:41:82:b2:53)
318         Address: Cisco-Li_82:b2:53 (00:0c:41:82:b2:53)
319         .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
320         .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
321     Type: IP (0x0800)
322 Internet Protocol Version 4, Src: 192.168.0.1 (192.168.0.1), Dst: 192.168.50.50 (192.168.50.50)
323     Version: 4
324     Header Length: 20 bytes
325     Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
326         0000 00.. = Differentiated Services Codepoint: Default (0x00)
327         .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
328     Total Length: 526
329     Identification: 0x2153 (8531)
330     Flags: 0x00
331         0... .... = Reserved bit: Not set
332         .0.. .... = Don't fragment: Not set
333         ..0. .... = More fragments: Not set
334     Fragment offset: 0
335     Time to live: 63
336     Protocol: UDP (17)
337     Header checksum: 0xa508 [correct]
338         [Good: True]
339         [Bad: False]
340     Source: 192.168.0.1 (192.168.0.1)
341     Destination: 192.168.50.50 (192.168.50.50)
342 User Datagram Protocol, Src Port: 65333 (65333), Dst Port: 65282 (65282)
343     Source Port: 65333 (65333)
344     Destination Port: 65282 (65282)
345     Length: 506
346     Checksum: 0xf9d5 [validation disabled]
347         [Good Checksum: False]
348         [Bad Checksum: False]
349     [Stream index: 0]
350 MyDNS Protocol
351     Transaction ID: 43
352     Flags: 0x8180
353         1... .... .... .... = Response: this is a response
354         .000 0... .... .... = Opcode: 0
355         .... .0.. .... .... = Authoritative: False
356         .... ..0. .... .... = Truncated: False
357         .... .... 1... .... = Recursion available: True
358         .... .... .0.. .... = World War Z - Reserved for future use: 0x0
359         .... .... ..0. .... = Authenticated: no
360         .... .... .... 0000 = Response code: No Error (0)
361         .... .... ...0 .... = Checking disabled: False
362     Number of Questions: 1
363     Number of Answer RRs: 15
364     Number of Authority RRs: 6
365     Number of Additional RRs: 2
366     Queries
367         us.pool.ntp.org: type A (IPv4 host address) (1), class IN (Internet) (1)
368             Name: us.pool.ntp.org
369             [Name Length: 17]
370             [Label Count: 4]
371             Type: A (IPv4 host address) (1)
372             Class: IN (Internet) (1)
373 ]]
374