2 The tree:add_packet_field() method returns a value and offset in addition to a tree item.
3 This file tests whether the value and offset are correct. As for the value,
4 its correctness is tested in several ways for a given input.
6 1. The returned value should match a precomputed value
8 2. The returned value should match the value obtained from a Field object
9 right after tree:add_packet_field() is called
11 3. The returned value should match the value obtained from a Field object
12 right after tree:add() is called with the same input as tree:add_packet_field()
14 4. The returned value should match the value obtained from the corresponding value function
15 called on the input tvbrange
17 There are some incompatibilties and limitations due to handling of encodings.
18 Incompatibilities are noted with the text INCOMPATIBILITY in a nearby comment.
21 local field_setup
= require
"field_setup"
24 This dissector expects a capture with at least one packet on UDP 65333.
25 All the actual test data is synthetic.
27 local myproto
= Proto("test", "Test")
29 field_data
= field_setup(myproto
, "test")
31 function hexlify_string(s
)
35 hx
= hx
.. sep
.. string.format("%02x", s
:byte(i
))
42 Ensure the value is represented in a way that shows up when printed.
43 It is assumed the string representation is relatively short.
45 The test suite will report an error if we print invalid utf8 for any reason.
46 We work around this by passing a substitution string used when the real
47 string has invalid utf8. We also print the output bytes in hex after the string,
48 and those bytes are always faithful to the real output.
50 function format_value_for_print(v
, substitution
)
54 local hx
= hexlify_string(v
)
55 if substitution
~= nil then
56 s
= string.format("(invalid utf8) \"%s\" [%s]", substitution
, hx
)
58 s
= string.format("\"%s\" [%s]", v
, hx
)
64 return string.format("(%s) %s", type(v
), s
)
67 function format_encoding_for_print(enc
)
69 local char_enc
= "ASCII"
70 if bit
.band(enc
, ENC_UTF_16
) ~= 0 then
75 if bit
.band(enc
, ENC_LITTLE_ENDIAN
) ~= 0 then
79 if enc
== ENC_ISO_8601_DATE_TIME
then
84 return string.format("%s %s", char_enc
, end_enc
)
87 function print_test_data(test_data
)
88 print(string.format("TEST: using field type: %s", test_data
.field_type
))
89 if test_data
.hexlify
then
90 print(string.format("TEST: input was hexlified from: \"%s\"", test_data
.original_input
))
92 print(string.format("TEST: using data: [%s]", test_data
.input
))
93 print(string.format("TEST: using offset: %d", test_data
.input_offset
))
94 print(string.format("TEST: using encoding: %s", format_encoding_for_print(test_data
.encoding
)))
98 function general_equality_test(a
, b
)
103 function float_equality_test(a
, b
)
104 return a
== b
or (a
~= a
and b
~= b
)
107 function recent_field_value(t
)
108 local values
= {field_data
[t
].value_field()}
109 return values
[#values
].value
112 function add_packet_field_returns_precomputed_value(test_data
)
114 print(string.format(" EXPECT: precomputed return value: %s", format_value_for_print(test_data
.expect_precomputed
)))
115 print(string.format(" OUTPUT: add_packet_field returned value: %s", format_value_for_print(test_data
.returned_value
)))
117 if test_data
.equality_function(test_data
.returned_value
, test_data
.expect_precomputed
) then
118 print(" PASS: the return value is correct")
123 print(" FAIL: the returned value is incorrect")
128 function add_packet_field_then_value_field_returns_expected_value(test_data
)
130 print(string.format(" EXPECT: value field value %s", format_value_for_print(test_data
.expect_add_pf_field_value
)))
131 print(string.format(" OUTPUT: value field after tree:add_packet_field() returned: %s",
132 format_value_for_print(test_data
.returned_add_pf_field_value
)))
134 local incompatible
= test_data
.expect_add_pf_field_value
~= test_data
.expect_precomputed
136 print(" WARNING: the value field does not return the same value as the other implementations")
138 if test_data
.equality_function(test_data
.returned_add_pf_field_value
, test_data
.expect_add_pf_field_value
) then
139 print(" PASS: the value field is correct")
144 print(" FAIL: the value field is incorrect")
149 function tree_add_then_value_field_returns_expected_value(test_data
)
151 if test_data
.skip_tree_add_test
then
152 print(" SKIP: " .. test_data
.skip_tree_add_test_message
)
157 print(string.format(" EXPECT: value field value %s", format_value_for_print(test_data
.expect_add_field_value
)))
158 print(string.format(" OUTPUT: value field after tree:add() returned: %s",
159 format_value_for_print(test_data
.returned_add_field_value
)))
161 local incompatible
= test_data
.expect_add_field_value
~= test_data
.expect_precomputed
163 print(" WARNING: the value field does not return the same value as the other implementations")
165 if test_data
.equality_function(test_data
.returned_add_field_value
, test_data
.expect_add_field_value
) then
166 print(" PASS: the value field is correct")
171 print(" FAIL: the value field is incorrect")
178 The tvbrange:string() function can return invalid utf8 even when the input is valid.
180 function tvbrange_returns_expected_value(test_data
)
182 if test_data
.tvbr_fn
== nil then
183 print(" SKIP: no tvbrange function for this field type")
188 local tvbr_value
, tvbr_fn_printable
= test_data
.tvbr_fn(test_data
.input_tvbrange
, test_data
.encoding
)
189 local pass
= test_data
.equality_function(tvbr_value
, test_data
.expect_tvbrange_value
)
190 local incompatible
= test_data
.expect_tvbrange_value
~= test_data
.expect_precomputed
191 local tvbr_value_printable
= format_value_for_print(tvbr_value
)
192 local expect_value_printable
= format_value_for_print(test_data
.expect_tvbrange_value
, test_data
.expect_tvbrange_value_printable
)
194 --if the outputs are equal, then the substitute is useable for both
195 tvbr_value_printable
= format_value_for_print(tvbr_value
, test_data
.expect_tvbrange_value_printable
)
198 print(string.format(" TEST: using tvbrange function %s", tvbr_fn_printable
))
199 print(string.format(" EXPECT: tvbrange value %s", expect_value_printable
))
200 print(string.format(" OUTPUT: tvbrange returned %s", tvbr_value_printable
))
202 print(" WARNING: the tvbr function is not compatible with the other implementations")
206 print(" PASS: the the tvbr function works as expected")
211 print(" FAIL: the the tvbr function works as expected")
216 function add_packet_field_returns_correct_offset(test_data
)
218 print(string.format(" EXPECT: offset %d", test_data
.expect_offset
))
219 print(string.format(" OUTPUT: add_packet_field returned offset %d", test_data
.returned_offset
))
221 if test_data
.returned_offset
== test_data
.expect_offset
then
222 print(" PASS: the returned offset is correct")
227 print(" FAIL: the returned offset is incorrect")
232 function add_packet_field_all_tests(tree
, test_data
)
233 print_test_data(test_data
)
235 and add_packet_field_returns_precomputed_value(test_data
)
236 and add_packet_field_then_value_field_returns_expected_value(test_data
)
237 and tree_add_then_value_field_returns_expected_value(test_data
)
238 and tvbrange_returns_expected_value(test_data
)
239 and add_packet_field_returns_correct_offset(test_data
)
243 function generate_test_data_for_case(tree
, field_type
, case
, tvbr_fn
, equality_function
, use_offset
)
245 local input
= case
.input
247 input
= hexlify_string(case
.input
)
250 local input_byte_length
= string.len(input
:gsub(" ", "")) / 2
251 local input_offset
= 0
253 input
= "77 " .. input
257 local input_tvb
= ByteArray
.new(input
):tvb()
260 if case
.fake_input_length
== nil then
261 input_tvbrange
= input_tvb(input_offset
, input_byte_length
)
263 input_tvbrange
= input_tvb(input_offset
, case
.fake_input_length
)
266 local t
= field_data
[field_type
]
267 local add_pf_leaf
, returned_value
, returned_offset
= tree
:add_packet_field(t
.packet_field
, input_tvbrange
, case
.encoding
)
268 local add_pf_field_value
= recent_field_value(field_type
)
271 local add_field_value
= nil
272 local skip_tree_add_test_message
= nil
273 local skip_tree_add_test
= false
275 if case
.encoding
== ENC_ASCII
+ ENC_BIG_ENDIAN
then
276 add_leaf
= tree
:add(t
.packet_field
, input_tvbrange
)
277 add_field_value
= recent_field_value(field_type
)
278 elseif case
.encoding
== ENC_ASCII
+ ENC_LITTLE_ENDIAN
then
279 add_leaf
= tree
:add_le(t
.packet_field
, input_tvbrange
)
280 add_field_value
= recent_field_value(field_type
)
282 skip_tree_add_test
= true
283 skip_tree_add_test_message
= "tree:add() only uses ASCII encoding"
286 local expect_add_pf_field_value
= case
.output
287 if case
.incompatible_add_pf_field
then
288 expect_add_pf_field_value
= case
.expect_add_pf_field_value
291 local expect_add_field_value
= case
.output
292 if case
.incompatible_add_field
then
293 expect_add_field_value
= case
.expect_add_field_value
296 local expect_tvbrange_value
= case
.output
297 if case
.incompatible_tvbrange
then
298 expect_tvbrange_value
= case
.expect_tvbrange_value
301 local expect_offset
= input_byte_length
+ input_offset
302 if case
.variable_input_length
then
303 expect_offset
= case
.input_length
+ input_offset
307 field_type
= field_type
,
308 hexlify
= case
.hexlify
,
309 original_input
= case
.input
,
311 input_offset
= input_offset
,
312 input_tvbrange
= input_tvbrange
,
313 encoding
= case
.encoding
,
315 returned_value
= returned_value
,
316 returned_offset
= returned_offset
,
317 returned_add_pf_field_value
= add_pf_field_value
,
318 returned_add_field_value
= add_field_value
,
321 equality_function
= equality_function
,
322 expect_precomputed
= case
.output
,
323 expect_add_pf_field_value
= expect_add_pf_field_value
,
325 expect_add_field_value
= expect_add_field_value
,
326 skip_tree_add_test
= skip_tree_add_test
,
327 skip_tree_add_test_message
= skip_tree_add_test_message
,
329 expect_tvbrange_value
= expect_tvbrange_value
,
330 expect_tvbrange_value_printable
= case
.expect_tvbrange_value_printable
,
331 expect_offset
= expect_offset
335 function run_test_cases_all_tests(tree
, field_type
, test_cases
, tvbr_fn
, equality_function
)
337 for _
, case
in ipairs(test_cases
) do
338 test_data
= generate_test_data_for_case(tree
, field_type
, case
, tvbr_fn
, equality_function
, true)
339 if not add_packet_field_all_tests(tree
, test_data
) then
343 test_data
= generate_test_data_for_case(tree
, field_type
, case
, tvbr_fn
, equality_function
, false)
344 if not add_packet_field_all_tests(tree
, test_data
) then
352 function simple_integer_tests(tree
)
353 local uint8_test_cases
= {
354 {input
= "ff", encoding
= ENC_LITTLE_ENDIAN
, output
= 0xff},
355 {input
= "00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x00},
356 {input
= "ff", encoding
= ENC_BIG_ENDIAN
, output
= 0xff},
357 {input
= "00", encoding
= ENC_BIG_ENDIAN
, output
= 0x00},
360 local uint16_test_cases
= {
361 {input
= "ff 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x00ff},
362 {input
= "00 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= 0xff00},
363 {input
= "ff 00", encoding
= ENC_BIG_ENDIAN
, output
= 0xff00},
364 {input
= "00 ff", encoding
= ENC_BIG_ENDIAN
, output
= 0x00ff},
367 local uint24_test_cases
= {
368 {input
= "ff 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x0000ff},
369 {input
= "00 ff 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x00ff00},
370 {input
= "00 00 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= 0xff0000},
371 {input
= "ff 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0xff0000},
372 {input
= "00 ff 00", encoding
= ENC_BIG_ENDIAN
, output
= 0x00ff00},
373 {input
= "00 00 ff", encoding
= ENC_BIG_ENDIAN
, output
= 0x0000ff},
376 local uint32_test_cases
= {
377 {input
= "ff 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x000000ff},
378 {input
= "00 ff 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x0000ff00},
379 {input
= "00 00 ff 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x00ff0000},
380 {input
= "00 00 00 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= 0xff000000},
381 {input
= "ff 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0xff000000},
382 {input
= "00 ff 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0x00ff0000},
383 {input
= "00 00 ff 00", encoding
= ENC_BIG_ENDIAN
, output
= 0x0000ff00},
384 {input
= "00 00 00 ff", encoding
= ENC_BIG_ENDIAN
, output
= 0x000000ff},
387 function tvbr_uint (tvbr
, encoding
)
388 if encoding
== ENC_LITTLE_ENDIAN
then
389 return tvbr
:le_uint(), "le_uint()"
391 return tvbr
:uint(), "uint()"
395 local int8_test_cases
= {
396 {input
= "ff", encoding
= ENC_LITTLE_ENDIAN
, output
= -0x01},
397 {input
= "00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x00},
398 {input
= "ff", encoding
= ENC_BIG_ENDIAN
, output
= -0x01},
399 {input
= "00", encoding
= ENC_BIG_ENDIAN
, output
= 0x00},
402 local int16_test_cases
= {
403 {input
= "ff 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x00ff},
404 {input
= "00 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= -0x0100},
405 {input
= "ff 00", encoding
= ENC_BIG_ENDIAN
, output
= -0x0100},
406 {input
= "00 ff", encoding
= ENC_BIG_ENDIAN
, output
= 0x00ff},
409 local int24_test_cases
= {
410 {input
= "ff 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x0000ff},
411 {input
= "00 ff 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x00ff00},
412 {input
= "00 00 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= -0x010000},
413 {input
= "ff 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -0x010000},
414 {input
= "00 ff 00", encoding
= ENC_BIG_ENDIAN
, output
= 0x00ff00},
415 {input
= "00 00 ff", encoding
= ENC_BIG_ENDIAN
, output
= 0x0000ff},
418 local int32_test_cases
= {
419 {input
= "ff 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x000000ff},
420 {input
= "00 ff 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x0000ff00},
421 {input
= "00 00 ff 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x00ff0000},
422 {input
= "00 00 00 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= -0x01000000},
423 {input
= "ff 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -0x01000000},
424 {input
= "00 ff 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0x00ff0000},
425 {input
= "00 00 ff 00", encoding
= ENC_BIG_ENDIAN
, output
= 0x0000ff00},
426 {input
= "00 00 00 ff", encoding
= ENC_BIG_ENDIAN
, output
= 0x000000ff},
429 function tvbr_int(tvbr
, encoding
)
430 if encoding
== ENC_LITTLE_ENDIAN
then
431 return tvbr
:le_int(), "le_int()"
433 return tvbr
:int(), "int()"
438 and run_test_cases_all_tests(tree
, "uint8", uint8_test_cases
, tvbr_uint
, general_equality_test
)
439 and run_test_cases_all_tests(tree
, "uint16", uint16_test_cases
, tvbr_uint
, general_equality_test
)
440 and run_test_cases_all_tests(tree
, "uint24", uint24_test_cases
, tvbr_uint
, general_equality_test
)
441 and run_test_cases_all_tests(tree
, "uint32", uint32_test_cases
, tvbr_uint
, general_equality_test
)
443 and run_test_cases_all_tests(tree
, "int8", int8_test_cases
, tvbr_int
, general_equality_test
)
444 and run_test_cases_all_tests(tree
, "int16", int16_test_cases
, tvbr_int
, general_equality_test
)
445 and run_test_cases_all_tests(tree
, "int24", int24_test_cases
, tvbr_int
, general_equality_test
)
446 and run_test_cases_all_tests(tree
, "int32", int32_test_cases
, tvbr_int
, general_equality_test
)
449 function integer64_tests(tree
)
451 local uint64_test_cases
= {
452 {input
= "ff 00 00 00 00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= UInt64(0x000000ff, 0x00000000)},
453 {input
= "00 ff 00 00 00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= UInt64(0x0000ff00, 0x00000000)},
454 {input
= "00 00 ff 00 00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= UInt64(0x00ff0000, 0x00000000)},
455 {input
= "00 00 00 ff 00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= UInt64(0xff000000, 0x00000000)},
456 {input
= "00 00 00 00 ff 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= UInt64(0x00000000, 0x000000ff)},
457 {input
= "00 00 00 00 00 ff 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= UInt64(0x00000000, 0x0000ff00)},
458 {input
= "00 00 00 00 00 00 ff 00", encoding
= ENC_LITTLE_ENDIAN
, output
= UInt64(0x00000000, 0x00ff0000)},
459 {input
= "00 00 00 00 00 00 00 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= UInt64(0x00000000, 0xff000000)},
460 {input
= "ff 00 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= UInt64(0x00000000, 0xff000000)},
461 {input
= "00 ff 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= UInt64(0x00000000, 0x00ff0000)},
462 {input
= "00 00 ff 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= UInt64(0x00000000, 0x0000ff00)},
463 {input
= "00 00 00 ff 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= UInt64(0x00000000, 0x000000ff)},
464 {input
= "00 00 00 00 ff 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= UInt64(0xff000000, 0x00000000)},
465 {input
= "00 00 00 00 00 ff 00 00", encoding
= ENC_BIG_ENDIAN
, output
= UInt64(0x00ff0000, 0x00000000)},
466 {input
= "00 00 00 00 00 00 ff 00", encoding
= ENC_BIG_ENDIAN
, output
= UInt64(0x0000ff00, 0x00000000)},
467 {input
= "00 00 00 00 00 00 00 ff", encoding
= ENC_BIG_ENDIAN
, output
= UInt64(0x000000ff, 0x00000000)},
470 function tvbr_uint(tvbr
, encoding
)
471 if encoding
== ENC_LITTLE_ENDIAN
then
472 return tvbr
:le_uint64(), "le_uint64()"
474 return tvbr
:uint64(), "uint64()"
478 local int64_test_cases
= {
479 {input
= "ff 00 00 00 00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Int64(0x000000ff, 0x00000000)},
480 {input
= "00 ff 00 00 00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Int64(0x0000ff00, 0x00000000)},
481 {input
= "00 00 ff 00 00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Int64(0x00ff0000, 0x00000000)},
482 {input
= "00 00 00 ff 00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Int64(0xff000000, 0x00000000)},
483 {input
= "00 00 00 00 ff 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Int64(0x00000000, 0x000000ff)},
484 {input
= "00 00 00 00 00 ff 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Int64(0x00000000, 0x0000ff00)},
485 {input
= "00 00 00 00 00 00 ff 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Int64(0x00000000, 0x00ff0000)},
486 {input
= "00 00 00 00 00 00 00 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= Int64(0x00000000, 0xff000000)},
487 {input
= "ff 00 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= Int64(0x00000000, 0xff000000)},
488 {input
= "00 ff 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= Int64(0x00000000, 0x00ff0000)},
489 {input
= "00 00 ff 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= Int64(0x00000000, 0x0000ff00)},
490 {input
= "00 00 00 ff 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= Int64(0x00000000, 0x000000ff)},
491 {input
= "00 00 00 00 ff 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= Int64(0xff000000, 0x00000000)},
492 {input
= "00 00 00 00 00 ff 00 00", encoding
= ENC_BIG_ENDIAN
, output
= Int64(0x00ff0000, 0x00000000)},
493 {input
= "00 00 00 00 00 00 ff 00", encoding
= ENC_BIG_ENDIAN
, output
= Int64(0x0000ff00, 0x00000000)},
494 {input
= "00 00 00 00 00 00 00 ff", encoding
= ENC_BIG_ENDIAN
, output
= Int64(0x000000ff, 0x00000000)},
497 function tvbr_int(tvbr
, encoding
)
498 if encoding
== ENC_LITTLE_ENDIAN
then
499 return tvbr
:le_int64(), "le_int64()"
501 return tvbr
:int64(), "int64()"
506 and run_test_cases_all_tests(tree
, "uint64", uint64_test_cases
, tvbr_uint
, general_equality_test
)
507 and run_test_cases_all_tests(tree
, "int64", int64_test_cases
, tvbr_int
, general_equality_test
)
510 function string_tests(tree
)
512 local ABC_ascii
= "41 42 43"
513 local ABCzD_ascii
= "41 42 43 00 44"
515 local SHARK_16_little
= "b5 30 e1 30"
516 local SHARKzSA_16_little
= "b5 30 e1 30 00 00 b5 30"
518 local SHARK_16_big
= "30 b5 30 e1"
519 local SHARKzSA_16_big
= "30 b5 30 e1 00 00 30 b5"
521 local string_test_cases
= {
522 {input
= ABC_ascii
, encoding
= ENC_ASCII
, output
= "ABC"},
524 {input
= ABCzD_ascii
, encoding
= ENC_ASCII
, output
= "ABC"},
526 {input
= SHARK_16_little
, encoding
= ENC_ASCII
, output
= "�0�0"},
528 {input
= SHARK_16_little
, encoding
= ENC_UTF_16
+ ENC_LITTLE_ENDIAN
, output
= "サメ"},
530 {input
= SHARKzSA_16_little
, encoding
= ENC_UTF_16
+ ENC_LITTLE_ENDIAN
, output
= "サメ"},
532 {input
= SHARK_16_big
, encoding
= ENC_UTF_16
+ ENC_BIG_ENDIAN
, output
= "サメ"},
534 {input
= SHARKzSA_16_big
, encoding
= ENC_UTF_16
+ ENC_BIG_ENDIAN
, output
= "サメ"},
537 function tvbr_string(tvbr
, encoding
)
538 return tvbr
:string(encoding
), string.format("string(%s)", format_encoding_for_print(encoding
))
542 stringz computes its own input length by looking for null
543 the input length includes the null, which is 2 bytes for utf16
545 local stringz_tests
= {
547 {input
= ABCzD_ascii
, encoding
= ENC_ASCII
, output
= "ABC",
548 variable_input_length
= true, input_length
= 4
551 {input
= SHARKzSA_16_little
, encoding
= ENC_UTF_16
+ ENC_LITTLE_ENDIAN
, output
= "サメ",
552 variable_input_length
= true, input_length
= 6,
555 {input
= SHARKzSA_16_big
, encoding
= ENC_UTF_16
+ ENC_BIG_ENDIAN
, output
= "サメ",
556 variable_input_length
= true, input_length
= 6,
560 function tvbr_stringz(tvbr
, encoding
)
561 return tvbr
:stringz(encoding
), string.format("stringz(%s)", format_encoding_for_print(encoding
))
564 local ustring_tests
= {
565 {input
= SHARK_16_big
, encoding
= ENC_UTF_16
+ ENC_BIG_ENDIAN
, output
= "サメ"},
566 {input
= SHARKzSA_16_big
, encoding
= ENC_UTF_16
+ ENC_BIG_ENDIAN
, output
= "サメ"},
569 function tvbr_ustring(tvbr
, encoding
)
570 return tvbr
:ustring(), "ustring()"
573 local le_ustring_tests
= {
574 {input
= SHARK_16_little
, encoding
= ENC_UTF_16
+ ENC_LITTLE_ENDIAN
, output
= "サメ"},
575 {input
= SHARKzSA_16_little
, encoding
= ENC_UTF_16
+ ENC_LITTLE_ENDIAN
, output
= "サメ"},
578 function tvbr_le_ustring(tvbr
, encoding
)
579 return tvbr
:le_ustring(), "le_ustring()"
582 local ustringz_tests
= {
583 {input
= SHARKzSA_16_big
, encoding
= ENC_UTF_16
+ ENC_BIG_ENDIAN
, output
= "サメ",
584 variable_input_length
= true, input_length
= 6
588 function tvbr_ustringz(tvbr
, encoding
)
589 return tvbr
:ustringz(), "ustringz()"
592 local le_ustringz_tests
= {
593 {input
= SHARKzSA_16_little
, encoding
= ENC_UTF_16
+ ENC_LITTLE_ENDIAN
, output
= "サメ",
594 variable_input_length
= true, input_length
= 6
598 function tvbr_le_ustringz(tvbr
, encoding
)
599 return tvbr
:le_ustringz(), "le_ustringz()"
603 and run_test_cases_all_tests(tree
, "string", string_test_cases
, tvbr_string
, general_equality_test
)
604 and run_test_cases_all_tests(tree
, "stringz", stringz_tests
, tvbr_stringz
, general_equality_test
)
605 and run_test_cases_all_tests(tree
, "string", ustring_tests
, tvbr_ustring
, general_equality_test
)
606 and run_test_cases_all_tests(tree
, "string", le_ustring_tests
, tvbr_le_ustring
, general_equality_test
)
607 and run_test_cases_all_tests(tree
, "stringz", ustringz_tests
, tvbr_ustringz
, general_equality_test
)
608 and run_test_cases_all_tests(tree
, "stringz", le_ustringz_tests
, tvbr_le_ustringz
, general_equality_test
)
611 function bool_char_tests(tree
)
614 {input
= "ff", encoding
= ENC_BIG_ENDIAN
, output
= true},
615 {input
= "00", encoding
= ENC_BIG_ENDIAN
, output
= false},
616 {input
= "01", encoding
= ENC_BIG_ENDIAN
, output
= true},
617 {input
= "ff", encoding
= ENC_LITTLE_ENDIAN
, output
= true},
618 {input
= "00", encoding
= ENC_LITTLE_ENDIAN
, output
= false},
619 {input
= "01", encoding
= ENC_LITTLE_ENDIAN
, output
= true},
623 {input
= "ff", encoding
= ENC_BIG_ENDIAN
, output
= 0xff},
624 {input
= "00", encoding
= ENC_BIG_ENDIAN
, output
= 0x00},
625 {input
= "30", encoding
= ENC_BIG_ENDIAN
, output
= 0x30},
626 {input
= "ff", encoding
= ENC_LITTLE_ENDIAN
, output
= 0xff},
627 {input
= "00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x00},
628 {input
= "30", encoding
= ENC_LITTLE_ENDIAN
, output
= 0x30},
632 and run_test_cases_all_tests(tree
, "boolean", bool_tests
, nil, general_equality_test
)
633 and run_test_cases_all_tests(tree
, "char", char_tests
, nil, general_equality_test
)
636 function float_tests(tree
)
639 {input
= "3c 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0.0078125},
640 {input
= "bd a0 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -0.078125},
641 {input
= "3f 48 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0.78125},
642 {input
= "c0 fa 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -7.8125},
643 {input
= "42 9c 40 00", encoding
= ENC_BIG_ENDIAN
, output
= 78.125},
644 {input
= "c4 43 50 00", encoding
= ENC_BIG_ENDIAN
, output
= -781.25},
645 {input
= "45 f4 24 00", encoding
= ENC_BIG_ENDIAN
, output
= 7812.5},
646 {input
= "c7 98 96 80", encoding
= ENC_BIG_ENDIAN
, output
= -78125.0},
647 {input
= "49 3e bc 20", encoding
= ENC_BIG_ENDIAN
, output
= 781250.0},
648 {input
= "ca ee 6b 28", encoding
= ENC_BIG_ENDIAN
, output
= -7812500.0},
649 {input
= "00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0.0},
650 {input
= "80 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -0.0},
651 {input
= "7f c0 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0/0},
652 {input
= "7f 80 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 1/0},
653 {input
= "ff 80 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -1/0},
657 {input
= "00 00 00 3c", encoding
= ENC_LITTLE_ENDIAN
, output
= 0.0078125},
658 {input
= "00 00 a0 bd", encoding
= ENC_LITTLE_ENDIAN
, output
= -0.078125},
659 {input
= "00 00 48 3f", encoding
= ENC_LITTLE_ENDIAN
, output
= 0.78125},
660 {input
= "00 00 fa c0", encoding
= ENC_LITTLE_ENDIAN
, output
= -7.8125},
661 {input
= "00 40 9c 42", encoding
= ENC_LITTLE_ENDIAN
, output
= 78.125},
662 {input
= "00 50 43 c4", encoding
= ENC_LITTLE_ENDIAN
, output
= -781.25},
663 {input
= "00 24 f4 45", encoding
= ENC_LITTLE_ENDIAN
, output
= 7812.5},
664 {input
= "80 96 98 c7", encoding
= ENC_LITTLE_ENDIAN
, output
= -78125.0},
665 {input
= "20 bc 3e 49", encoding
= ENC_LITTLE_ENDIAN
, output
= 781250.0},
666 {input
= "28 6b ee ca", encoding
= ENC_LITTLE_ENDIAN
, output
= -7812500.0},
667 {input
= "00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0.0},
668 {input
= "00 00 00 80", encoding
= ENC_LITTLE_ENDIAN
, output
= -0.0},
669 {input
= "00 00 c0 7f", encoding
= ENC_LITTLE_ENDIAN
, output
= 0/0},
670 {input
= "00 00 80 7f", encoding
= ENC_LITTLE_ENDIAN
, output
= 1/0},
671 {input
= "00 00 80 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= -1/0},
675 {input
= "3f 80 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0.0078125},
676 {input
= "bf e9 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -0.78125},
677 {input
= "40 88 6a 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 781.25},
678 {input
= "c0 f3 12 d0 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -78125.0},
679 {input
= "41 92 a0 5f 20 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 78125000.0},
680 {input
= "c1 fd 1a 94 a2 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -7812500000.0},
681 {input
= "42 9c 6b f5 26 34 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 7812500000000.0},
682 {input
= "c3 06 34 57 85 d8 a0 00", encoding
= ENC_BIG_ENDIAN
, output
= -781250000000000.0},
683 {input
= "43 a5 af 1d 78 b5 8c 40", encoding
= ENC_BIG_ENDIAN
, output
= 7.8125e+17},
684 {input
= "c4 10 f0 cf 06 4d d5 92", encoding
= ENC_BIG_ENDIAN
, output
= -7.8125e+19},
685 {input
= "00 00 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0.0},
686 {input
= "80 00 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -0.0},
687 {input
= "7f f8 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 0/0},
688 {input
= "7f f0 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= 1/0},
689 {input
= "ff f0 00 00 00 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= -1/0},
693 {input
= "00 00 00 00 00 00 80 3f", encoding
= ENC_LITTLE_ENDIAN
, output
= 0.0078125},
694 {input
= "00 00 00 00 00 00 e9 bf", encoding
= ENC_LITTLE_ENDIAN
, output
= -0.78125},
695 {input
= "00 00 00 00 00 6a 88 40", encoding
= ENC_LITTLE_ENDIAN
, output
= 781.25},
696 {input
= "00 00 00 00 d0 12 f3 c0", encoding
= ENC_LITTLE_ENDIAN
, output
= -78125.0},
697 {input
= "00 00 00 20 5f a0 92 41", encoding
= ENC_LITTLE_ENDIAN
, output
= 78125000.0},
698 {input
= "00 00 00 a2 94 1a fd c1", encoding
= ENC_LITTLE_ENDIAN
, output
= -7812500000.0},
699 {input
= "00 00 34 26 f5 6b 9c 42", encoding
= ENC_LITTLE_ENDIAN
, output
= 7812500000000.0},
700 {input
= "00 a0 d8 85 57 34 06 c3", encoding
= ENC_LITTLE_ENDIAN
, output
= -781250000000000.0},
701 {input
= "40 8c b5 78 1d af a5 43", encoding
= ENC_LITTLE_ENDIAN
, output
= 7.8125e+17},
702 {input
= "92 d5 4d 06 cf f0 10 c4", encoding
= ENC_LITTLE_ENDIAN
, output
= -7.8125e+19},
703 {input
= "00 00 00 00 00 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= 0.0},
704 {input
= "00 00 00 00 00 00 00 80", encoding
= ENC_LITTLE_ENDIAN
, output
= -0.0},
705 {input
= "00 00 00 00 00 00 f8 7f", encoding
= ENC_LITTLE_ENDIAN
, output
= 0/0},
706 {input
= "00 00 00 00 00 00 f0 7f", encoding
= ENC_LITTLE_ENDIAN
, output
= 1/0},
707 {input
= "00 00 00 00 00 00 f0 ff", encoding
= ENC_LITTLE_ENDIAN
, output
= -1/0},
710 function tvbr_float(tvbr
, encoding
)
711 return tvbr
:float(), "float()"
714 function tvbr_le_float(tvbr
, encoding
)
715 return tvbr
:le_float(), "le_float()"
719 and run_test_cases_all_tests(tree
, "float", be_float
, tvbr_float
, float_equality_test
)
720 and run_test_cases_all_tests(tree
, "double", be_double
, tvbr_float
, float_equality_test
)
721 and run_test_cases_all_tests(tree
, "float", le_float
, tvbr_le_float
, float_equality_test
)
722 and run_test_cases_all_tests(tree
, "double", le_double
, tvbr_le_float
, float_equality_test
)
725 function address_tests(tree
)
727 --INCOMPATIBILITY: value fields always assume big-endian encoding for IPv4 addresses
728 local ipv4_test_cases
= {
729 {input
= "01 00 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Address
.ip("0.0.0.1"),
730 incompatible_add_pf_field
= true, expect_add_pf_field_value
= Address
.ip("1.0.0.0"),
731 incompatible_add_field
= true, expect_add_field_value
= Address
.ip("1.0.0.0")
733 {input
= "00 02 00 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Address
.ip("0.0.2.0"),
734 incompatible_add_pf_field
= true, expect_add_pf_field_value
= Address
.ip("0.2.0.0"),
735 incompatible_add_field
= true, expect_add_field_value
= Address
.ip("0.2.0.0")
737 {input
= "00 00 03 00", encoding
= ENC_LITTLE_ENDIAN
, output
= Address
.ip("0.3.0.0"),
738 incompatible_add_pf_field
= true, expect_add_pf_field_value
= Address
.ip("0.0.3.0"),
739 incompatible_add_field
= true, expect_add_field_value
= Address
.ip("0.0.3.0")
741 {input
= "00 00 00 04", encoding
= ENC_LITTLE_ENDIAN
, output
= Address
.ip("4.0.0.0"),
742 incompatible_add_pf_field
= true, expect_add_pf_field_value
= Address
.ip("0.0.0.4"),
743 incompatible_add_field
= true, expect_add_field_value
= Address
.ip("0.0.0.4")
745 {input
= "01 00 00 00", encoding
= ENC_BIG_ENDIAN
, output
= Address
.ip("1.0.0.0")},
746 {input
= "00 02 00 00", encoding
= ENC_BIG_ENDIAN
, output
= Address
.ip("0.2.0.0")},
747 {input
= "00 00 03 00", encoding
= ENC_BIG_ENDIAN
, output
= Address
.ip("0.0.3.0")},
748 {input
= "00 00 00 04", encoding
= ENC_BIG_ENDIAN
, output
= Address
.ip("0.0.0.4")},
751 function tvbr_ipv4 (tvbr
, encoding
)
752 if encoding
== ENC_LITTLE_ENDIAN
then
753 return tvbr
:le_ipv4(), "le_ipv4()"
755 return tvbr
:ipv4(), "ipv4()"
759 local ipv6_test_cases
= {
760 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 0000 0000 0000 0000 00ff",
761 output
= Address
.ipv6("0000:0000:0000:0000:0000:0000:0000:00ff")},
762 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 0000 0000 0000 0000 ff00",
763 output
= Address
.ipv6("0000:0000:0000:0000:0000:0000:0000:ff00")},
764 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 0000 0000 0000 00ff 0000",
765 output
= Address
.ipv6("0000:0000:0000:0000:0000:0000:00ff:0000")},
766 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 0000 0000 0000 ff00 0000",
767 output
= Address
.ipv6("0000:0000:0000:0000:0000:0000:ff00:0000")},
768 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 0000 0000 00ff 0000 0000",
769 output
= Address
.ipv6("0000:0000:0000:0000:0000:00ff:0000:0000")},
770 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 0000 0000 ff00 0000 0000",
771 output
= Address
.ipv6("0000:0000:0000:0000:0000:ff00:0000:0000")},
772 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 0000 00ff 0000 0000 0000",
773 output
= Address
.ipv6("0000:0000:0000:0000:00ff:0000:0000:0000")},
774 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 0000 ff00 0000 0000 0000",
775 output
= Address
.ipv6("0000:0000:0000:0000:ff00:0000:0000:0000")},
776 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 00ff 0000 0000 0000 0000",
777 output
= Address
.ipv6("0000:0000:0000:00ff:0000:0000:0000:0000")},
778 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 0000 ff00 0000 0000 0000 0000",
779 output
= Address
.ipv6("0000:0000:0000:ff00:0000:0000:0000:0000")},
780 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 00ff 0000 0000 0000 0000 0000",
781 output
= Address
.ipv6("0000:0000:00ff:0000:0000:0000:0000:0000")},
782 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 0000 ff00 0000 0000 0000 0000 0000",
783 output
= Address
.ipv6("0000:0000:ff00:0000:0000:0000:0000:0000")},
784 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 00ff 0000 0000 0000 0000 0000 0000",
785 output
= Address
.ipv6("0000:00ff:0000:0000:0000:0000:0000:0000")},
786 {encoding
= ENC_BIG_ENDIAN
, input
= "0000 ff00 0000 0000 0000 0000 0000 0000",
787 output
= Address
.ipv6("0000:ff00:0000:0000:0000:0000:0000:0000")},
788 {encoding
= ENC_BIG_ENDIAN
, input
= "00ff 0000 0000 0000 0000 0000 0000 0000",
789 output
= Address
.ipv6("00ff:0000:0000:0000:0000:0000:0000:0000")},
790 {encoding
= ENC_BIG_ENDIAN
, input
= "ff00 0000 0000 0000 0000 0000 0000 0000",
791 output
= Address
.ipv6("ff00:0000:0000:0000:0000:0000:0000:0000")},
794 function tvbr_ipv6 (tvbr
, encoding
)
795 return tvbr
:ipv6(), "ipv6()"
798 local ether_test_cases
= {
799 {input
= "ff 00 00 00 00 00", encoding
= 0, output
= Address
.ether("ff:00:00:00:00:00")},
800 {input
= "00 ff 00 00 00 00", encoding
= 0, output
= Address
.ether("00:ff:00:00:00:00")},
801 {input
= "00 00 ff 00 00 00", encoding
= 0, output
= Address
.ether("00:00:ff:00:00:00")},
802 {input
= "00 00 00 ff 00 00", encoding
= 0, output
= Address
.ether("00:00:00:ff:00:00")},
803 {input
= "00 00 00 00 ff 00", encoding
= 0, output
= Address
.ether("00:00:00:00:ff:00")},
804 {input
= "00 00 00 00 00 ff", encoding
= 0, output
= Address
.ether("00:00:00:00:00:ff")},
807 function tvbr_ether (tvbr
, encoding
)
808 return tvbr
:ether(), "ether()"
812 and run_test_cases_all_tests(tree
, "ipv4", ipv4_test_cases
, tvbr_ipv4
, general_equality_test
)
813 and run_test_cases_all_tests(tree
, "ipv6", ipv6_test_cases
, tvbr_ipv6
, general_equality_test
)
814 and run_test_cases_all_tests(tree
, "ether", ether_test_cases
, tvbr_ether
, general_equality_test
)
817 function time_tests(tree
)
820 {input
="00 01 02 03", encoding
= ENC_BIG_ENDIAN
, output
= NSTime(0x00010203,0)},
821 {input
="03 02 01 00", encoding
= ENC_LITTLE_ENDIAN
, output
= NSTime(0x00010203,0)},
822 {input
="00 01 02 03 04 05 06 07", encoding
= ENC_BIG_ENDIAN
, output
= NSTime(0x00010203, 0x04050607)},
823 {input
="03 02 01 00 07 06 05 04", encoding
= ENC_LITTLE_ENDIAN
, output
= NSTime(0x00010203, 0x04050607)},
826 local string_cases
= {
827 {input
= "1994-11-05T13:15:30Z", encoding
= ENC_ISO_8601_DATE_TIME
, output
= NSTime(784041330, 0),
829 {input
= "1994-11-05T13:15:30Z12345", encoding
= ENC_ISO_8601_DATE_TIME
, output
= NSTime(784041330, 0),
830 hexlify
=true, variable_input_length
= true, input_length
= 20},
833 function tvbr_nstime(tvbr
, encoding
)
834 if encoding
== ENC_LITTLE_ENDIAN
then
835 return tvbr
:le_nstime(), "le_nstime()"
837 return tvbr
:nstime(encoding
), string.format("nstime(%s)", format_encoding_for_print(encoding
))
842 and run_test_cases_all_tests(tree
, "relative_time", time_cases
, tvbr_nstime
, general_equality_test
)
843 and run_test_cases_all_tests(tree
, "absolute_time", time_cases
, tvbr_nstime
, general_equality_test
)
844 and run_test_cases_all_tests(tree
, "absolute_time", string_cases
, tvbr_nstime
, general_equality_test
)
847 function bytearray_tests(tree
)
849 local bytes_tests
= {
850 {input
= "00 01 02 03 ff", encoding
= 0, output
= ByteArray
.new("00 01 02 03 ff")}
853 function tvbr_bytes(tvbr
, encoding
)
854 return tvbr
:bytes(), "bytes()"
857 local varbytes_tests
= {
858 {input
= "04 00 01 02 ff", encoding
= ENC_BIG_ENDIAN
,
859 output
= ByteArray
.new("00 01 02 ff"), fake_input_length
= 1},
860 {input
= "00 04 00 01 02 ff", encoding
= ENC_BIG_ENDIAN
,
861 output
= ByteArray
.new("00 01 02 ff"), fake_input_length
= 2},
862 {input
= "00 00 00 04 00 01 02 ff", encoding
= ENC_BIG_ENDIAN
,
863 output
= ByteArray
.new("00 01 02 ff"), fake_input_length
= 4},
867 and run_test_cases_all_tests(tree
, "bytes", bytes_tests
, tvbr_bytes
, general_equality_test
)
868 and run_test_cases_all_tests(tree
, "oid", bytes_tests
, tvbr_bytes
, general_equality_test
)
869 and run_test_cases_all_tests(tree
, "rel_oid", bytes_tests
, tvbr_bytes
, general_equality_test
)
870 and run_test_cases_all_tests(tree
, "system_id", bytes_tests
, tvbr_bytes
, general_equality_test
)
871 and run_test_cases_all_tests(tree
, "uint_bytes", varbytes_tests
, nil, general_equality_test
)
874 function run_all_tests(tree
)
876 and simple_integer_tests(tree
)
877 and integer64_tests(tree
)
878 and string_tests(tree
)
879 and bool_char_tests(tree
)
880 and float_tests(tree
)
881 and address_tests(tree
)
883 and bytearray_tests(tree
)
886 local has_run
= false
887 function myproto
.dissector(tvb
, pkt
, root
)
892 local tree
= root
:add(myproto
, tvb(0))
893 if run_all_tests(tree
) then
894 print("All tests passed!")
899 DissectorTable
.get("udp.port"):add(65333, myproto
)