summaryrefslogtreecommitdiffstats
path: root/test/lua/field.lua
blob: f049b81ec3ba13585b3d6aa577b0232c3b3eb9cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
-- test script for wslua Field/FieldInfo functions
-- use with dhcp.pcap in test/captures directory
local testlib = require("testlib")

local FRAME = "frame"
local PER_FRAME = "per-frame"
local OTHER = "other"

local n_frames = 1
testlib.init({
    [FRAME] = n_frames,
    [PER_FRAME] = n_frames*43,
    [OTHER] = 16,
})

------------- helper funcs ------------

local function toMacAddr(addrhex)
    return addrhex:gsub("..","%0:"):sub(1,-2)
end

-- the following are so we can use pcall (which needs a function to call)
local function makeField(name)
    local foo = Field.new(name)
    return true
end

local function makeFieldInfo(field)
    local foo = field()
    return true
end

local function setFieldInfo(finfo,name,value)
    finfo[name] = value
    return true
end

local function getFieldInfo(finfo,name)
    local foo = finfo[name]
    return true
end

--------------------------

testlib.testing(OTHER, "Field")

testlib.test(OTHER,"Field.new-0",pcall(makeField,"ip.src"))
testlib.test(OTHER,"Field.new-1",not pcall(makeField,"FooBARhowdy"))
testlib.test(OTHER,"Field.new-2",not pcall(makeField))
testlib.test(OTHER,"Field.new-3",not pcall(makeField,""))
testlib.test(OTHER,"Field.new-4",not pcall(makeField,"IP.SRC"))

-- declare some field extractors
local f_frame_encap_type = Field.new("frame.encap_type")
local f_frame_proto = Field.new("frame.protocols")
local f_eth_src     = Field.new("eth.src")
local f_eth_dst     = Field.new("eth.dst")
local f_eth_mac     = Field.new("eth.addr")
local f_ip_src      = Field.new("ip.src")
local f_ip_dst      = Field.new("ip.dst")
local f_udp_srcport = Field.new("udp.srcport")
local f_udp_dstport = Field.new("udp.dstport")
local f_dhcp_hw    = Field.new("dhcp.hw.mac_addr")
local f_dhcp_opt   = Field.new("dhcp.option.type")

testlib.test(OTHER,"Field__tostring-1", tostring(f_frame_proto) == "frame.protocols")

testlib.test(OTHER,"Field.name-1", f_frame_proto.name == "frame.protocols")
testlib.test(OTHER,"Field.name-2", f_eth_src.name == "eth.src")

testlib.test(OTHER,"Field.display-1", f_frame_proto.display == "Protocols in frame")
testlib.test(OTHER,"Field.display-2", f_eth_src.display == "Source")

testlib.test(OTHER,"Field.type-1", f_frame_proto.type == ftypes.STRING)
testlib.test(OTHER,"Field.type-2", f_eth_src.type == ftypes.ETHER)
testlib.test(OTHER,"Field.type-3", f_ip_src.type == ftypes.IPv4)
testlib.test(OTHER,"Field.type-4", f_udp_srcport.type == ftypes.UINT16)
testlib.test(OTHER,"Field.type-5", f_dhcp_opt.type == ftypes.UINT8)

-- make sure can't create a FieldInfo outside tap
testlib.test(OTHER,"Field__call-1",not pcall(makeFieldInfo,f_eth_src))

local tap = Listener.new()

--------------------------

function tap.packet(pinfo,tvb)
    testlib.countPacket(FRAME)

    testlib.testing(FRAME,"Field")
    testlib.test(PER_FRAME,"Field__tostring-2", tostring(f_frame_proto) == "frame.protocols")

    -- make sure can't create a Field inside tap
    testlib.test(PER_FRAME,"Field.new-5",not pcall(makeField,"ip.src"))

    testlib.test(PER_FRAME,"Field__call-2",pcall(makeFieldInfo,f_eth_src))

    testlib.test(PER_FRAME,"Field.name-3", f_frame_proto.name == "frame.protocols")
    testlib.test(PER_FRAME,"Field.name-4", f_eth_src.name == "eth.src")

    testlib.test(PER_FRAME,"Field.display-3", f_frame_proto.display == "Protocols in frame")
    testlib.test(PER_FRAME,"Field.display-4", f_eth_src.display == "Source")

    testlib.test(PER_FRAME,"Field.type-6", f_frame_proto.type == ftypes.STRING)
    testlib.test(PER_FRAME,"Field.type-7", f_eth_src.type == ftypes.ETHER)
    testlib.test(PER_FRAME,"Field.type-8", f_ip_src.type == ftypes.IPv4)
    testlib.test(PER_FRAME,"Field.type-9", f_udp_srcport.type == ftypes.UINT16)
    testlib.test(PER_FRAME,"Field.type-10", f_dhcp_opt.type == ftypes.UINT8)

    testlib.testing(FRAME,"FieldInfo")

    local finfo_udp_srcport = f_udp_srcport()
    testlib.test(PER_FRAME,"FieldInfo.name-1", finfo_udp_srcport.name == "udp.srcport")
    testlib.test(PER_FRAME,"FieldInfo.type-1", finfo_udp_srcport.type == ftypes.UINT16)
    testlib.test(PER_FRAME,"FieldInfo.little_endian-1", finfo_udp_srcport.little_endian == false)
    testlib.test(PER_FRAME,"FieldInfo.big_endian-1", finfo_udp_srcport.big_endian == true)
    testlib.test(PER_FRAME,"FieldInfo.is_url-1", finfo_udp_srcport.is_url == false)
    testlib.test(PER_FRAME,"FieldInfo.offset-1", finfo_udp_srcport.offset == 34)
    testlib.test(PER_FRAME,"FieldInfo.source-1", finfo_udp_srcport.source == tvb)

    -- check ether addr
    local fi_eth_src = f_eth_src()
    testlib.test(PER_FRAME,"FieldInfo.type-2", fi_eth_src.type == ftypes.ETHER)
    testlib.test(PER_FRAME,"FieldInfo.range-0",pcall(getFieldInfo,fi_eth_src,"range"))
    local eth_macs = { f_eth_mac() }
    local eth_src1 = tostring(f_eth_src().range)
    local eth_src2 = tostring(tvb:range(6,6))
    local eth_src3 = tostring(eth_macs[2].tvb)

    testlib.test(PER_FRAME,"FieldInfo.range-1", eth_src1 == eth_src2)
    testlib.test(PER_FRAME,"FieldInfo.range-2", eth_src1 == eth_src3)
    testlib.test(PER_FRAME,"FieldInfo.range-3",not pcall(setFieldInfo,fi_eth_src,"range",3))
    testlib.test(PER_FRAME,"FieldInfo.range-4", tostring(f_frame_encap_type().range) == "<EMPTY>")

    testlib.test(PER_FRAME,"FieldInfo.generated-1", f_frame_proto().generated == true)
    testlib.test(PER_FRAME,"FieldInfo.generated-2", eth_macs[2].generated == false)
    testlib.test(PER_FRAME,"FieldInfo.generated-3",not pcall(setFieldInfo,fi_eth_src,"generated",3))

    testlib.test(PER_FRAME,"FieldInfo.name-1", fi_eth_src.name == "eth.src")
    testlib.test(PER_FRAME,"FieldInfo.name-2",not pcall(setFieldInfo,fi_eth_src,"name","3"))

    testlib.test(PER_FRAME,"FieldInfo.label-1", fi_eth_src.label == tostring(fi_eth_src))
    testlib.test(PER_FRAME,"FieldInfo.label-2", fi_eth_src.label == toMacAddr(eth_src1))
    testlib.test(PER_FRAME,"FieldInfo.label-3",not pcall(setFieldInfo,fi_eth_src,"label","3"))

    testlib.test(PER_FRAME,"FieldInfo.display-1", select(1, string.find(fi_eth_src.display, toMacAddr(eth_src1))) ~= nil)
    testlib.test(PER_FRAME,"FieldInfo.display-2",not pcall(setFieldInfo,fi_eth_src,"display","3"))

    testlib.test(PER_FRAME,"FieldInfo.eq-1", eth_macs[2] == select(2, f_eth_mac()))
    testlib.test(PER_FRAME,"FieldInfo.eq-2", eth_macs[1] ~= fi_eth_src)
    testlib.test(PER_FRAME,"FieldInfo.eq-3", eth_macs[1] == f_eth_dst())

    testlib.test(PER_FRAME,"FieldInfo.offset-1", eth_macs[1].offset == 0)
    testlib.test(PER_FRAME,"FieldInfo.offset-2", -fi_eth_src == 6)
    testlib.test(PER_FRAME,"FieldInfo.offset-3",not pcall(setFieldInfo,fi_eth_src,"offset","3"))

    testlib.test(PER_FRAME,"FieldInfo.len-1", fi_eth_src.len == 6)
    testlib.test(PER_FRAME,"FieldInfo.len-2",not pcall(setFieldInfo,fi_eth_src,"len",6))

    testlib.pass(FRAME)
end

function tap.draw()
    testlib.getResults()
end