diff --git a/test/lua/protofield.lua b/test/lua/protofield.lua new file mode 100644 index 0000000000..8f8e5d237b --- /dev/null +++ b/test/lua/protofield.lua @@ -0,0 +1,121 @@ +---------------------------------------- +-- script-name: protofield.lua +-- This is based on the dissector.lua example script, which is also used for testing. +-- Unlike that one, this one is purely for testing even more things, notably +-- the ProtoField API. +---------------------------------------- + +------------- general test helper funcs ------------ +local OTHER = "other" + +local total_tests = 0 +local function getTotal() + return total_tests +end + +local passed = {} +local function setPassed(name) + if not passed[name] then + passed[name] = 1 + else + passed[name] = passed[name] + 1 + end + total_tests = total_tests + 1 +end + +local fail_count = 0 +local function setFailed(name) + fail_count = fail_count + 1 + total_tests = total_tests + 1 +end + +-- expected number of runs +local taptests = { [OTHER]=16 } +local function getResults() + print("\n-----------------------------\n") + for k,v in pairs(taptests) do + if v ~= 0 and passed[k] ~= v then + print("Something didn't run or ran too much... tests failed!") + print("Dissector type "..k.." expected: "..v..", but got: "..tostring(passed[k])) + return false + end + end + print("All tests passed!\n\n") + return true +end + +local function test(type,name, ...) + io.stdout:write("test "..type.."-->"..name.."-"..getTotal().."...") + if (...) == true then + setPassed(type) + io.stdout:write("passed\n") + return true + else + setFailed(type) + io.stdout:write("failed!\n") + error(name.." test failed!") + end +end + +------------- test script ------------ + +---------------------------------- +-- modify original test function for now, kinda sorta +local orig_test = test +test = function (...) + return orig_test(OTHER,...) +end + +---------------------------------------- +local test_proto = Proto.new("test", "Test Proto") +test_proto.fields.time_field = ProtoField.uint16("test.time", "Time", base.UNIT_STRING, {" sec", " secs"}) +test_proto.fields.dist_field = ProtoField.uint16("test.dist", "Distance", base.UNIT_STRING, {" km"}) + +-- Passing no table should not work +success = pcall(ProtoField.uint16, "test.bad0", "Bad0", base.UNIT_STRING) +test("ProtoField-unitstring-no-table", not success) + +-- Passing an empty table should not work +success = pcall(ProtoField.uint16, "test.bad1", "Bad1", base.UNIT_STRING, {}) +test("ProtoField-unitstring-empty-table", not success) + +-- Passing userdata should not work +success = pcall(ProtoField.uint16, "test.bad2", "Bad2", base.UNIT_STRING, {test_proto}) +test("ProtoField-unitstring-userdata", not success) + +-- Too many items are not supported +success = pcall(ProtoField.uint16, "test.bad3", "Bad3", base.UNIT_STRING, {"too", "many", "items"}) +test("ProtoField-unitstring-too-many-items", not success) + +local numinits = 0 +function test_proto.init() + numinits = numinits + 1 + if numinits == 2 then + getResults() + end +end + +-- Test expected text with singular and plural forms +function test_proto.dissector(tvb, pinfo, tree) + local ti + + local tvb1 = ByteArray.new("00 00"):tvb("Tvb1") + ti = tree:add(test_proto.fields.time_field, tvb1()) + test("Time: 0 secs", ti.text == "Time: 0 secs") + ti = tree:add(test_proto.fields.dist_field, tvb1()) + test("Distance: 0 km", ti.text == "Distance: 0 km") + + local tvb2 = ByteArray.new("00 01"):tvb("Tvb2") + ti = tree:add(test_proto.fields.time_field, tvb2()) + test("Time: 1 sec", ti.text == "Time: 1 sec") + ti = tree:add(test_proto.fields.dist_field, tvb2()) + test("Distance: 1 km", ti.text == "Distance: 1 km") + + local tvb3 = ByteArray.new("ff ff"):tvb("Tvb3") + ti = tree:add(test_proto.fields.time_field, tvb3()) + test("Time: 65535 secs", ti.text == "Time: 65535 secs") + ti = tree:add(test_proto.fields.dist_field, tvb3()) + test("Distance: 65535 km", ti.text == "Distance: 65535 km") +end + +DissectorTable.get("udp.port"):add(65333, test_proto) diff --git a/test/suite-wslua.sh b/test/suite-wslua.sh index 8e7e22dcac..49803036eb 100755 --- a/test/suite-wslua.sh +++ b/test/suite-wslua.sh @@ -334,6 +334,30 @@ wslua_step_proto_test() { fi } +wslua_step_protofield_test() { + if [ $HAVE_LUA -ne 0 ]; then + test_step_skipped + return + fi + + # Tshark catches lua script failures, so we have to parse the output. + # perform this twice: once with a tree, once without + $TSHARK -r $CAPTURE_DIR/dns_port.pcap -X lua_script:$TESTS_DIR/lua/protofield.lua -V > testout.txt 2>&1 + grep -q "All tests passed!" testout.txt + if [ $? -ne 0 ]; then + cat testout.txt + test_step_failed "lua_args_test test 1 failed" + fi + + $TSHARK -r $CAPTURE_DIR/dns_port.pcap -X lua_script:$TESTS_DIR/lua/protofield.lua > testout.txt 2>&1 + if grep -q "All tests passed!" testout.txt; then + test_step_ok + else + cat testout.txt + test_step_failed "didn't find pass marker" + fi +} + wslua_step_int64_test() { if [ $HAVE_LUA -ne 0 ]; then test_step_skipped @@ -481,6 +505,7 @@ wslua_suite() { test_step_add "wslua nstime" wslua_step_nstime_test test_step_add "wslua pinfo" wslua_step_pinfo_test test_step_add "wslua proto/protofield" wslua_step_proto_test + test_step_add "wslua protofield" wslua_step_protofield_test test_step_add "wslua script arguments" wslua_step_args_test test_step_add "wslua struct" wslua_step_struct_test test_step_add "wslua tvb" wslua_step_tvb_test