| % Regression tests for Scapy regarding fields |
| |
| ############ |
| ############ |
| + Tests on basic fields |
| |
| #= Field class |
| #~ core field |
| #Field("foo", None, fmt="H").i2m(None,0xabcdef) |
| #assert( _ == b"\xcd\xef" ) |
| #Field("foo", None, fmt="<I").i2m(None,0x12cdef) |
| #assert( _ == b"\xef\xcd\x12\x00" ) |
| #Field("foo", None, fmt="B").addfield(None, "FOO", 0x12) |
| #assert( _ == b"FOO\x12" ) |
| #Field("foo", None, fmt="I").getfield(None, b"\x12\x34\x56\x78ABCD") |
| #assert( _ == ("ABCD",0x12345678) ) |
| # |
| #= ConditionnalField class |
| #~ core field |
| #False |
| |
| |
| = Simple tests |
| |
| assert LELongField("test", None).addfield(None, b"", 0x44434241) == b'ABCD\x00\x00\x00\x00' |
| |
| = MACField class |
| ~ core field |
| m = MACField("foo", None) |
| m.i2m(None, None) |
| assert( _ == b"\x00\x00\x00\x00\x00\x00" ) |
| m.getfield(None, b"\xc0\x01\xbe\xef\xba\xbeABCD") |
| assert( _ == (b"ABCD","c0:01:be:ef:ba:be") ) |
| m.addfield(None, b"FOO", "c0:01:be:ef:ba:be") |
| assert( _ == b"FOO\xc0\x01\xbe\xef\xba\xbe" ) |
| |
| = SourceMACField, ARPSourceMACField |
| conf.route.add(net="1.2.3.4/32", dev=conf.iface) |
| p = Ether() / ARP(pdst="1.2.3.4") |
| assert p.src == p.hwsrc == p[ARP].hwsrc == get_if_hwaddr(conf.iface) |
| conf.route.delt(net="1.2.3.4/32") |
| |
| = IPField class |
| ~ core field |
| |
| if WINDOWS: |
| route_add_loopback() |
| |
| i = IPField("foo", None) |
| i.i2m(None, "1.2.3.4") |
| assert( _ == b"\x01\x02\x03\x04" ) |
| i.i2m(None, "255.255.255.255") |
| assert( _ == b"\xff\xff\xff\xff" ) |
| i.m2i(None, b"\x01\x02\x03\x04") |
| assert( _ == "1.2.3.4" ) |
| i.getfield(None, b"\x01\x02\x03\x04ABCD") |
| assert( _ == (b"ABCD","1.2.3.4") ) |
| i.addfield(None, b"FOO", "1.2.3.4") |
| assert( _ == b"FOO\x01\x02\x03\x04" ) |
| |
| = SourceIPField |
| ~ core field |
| defaddr = conf.route.route('0.0.0.0')[1] |
| class Test(Packet): fields_desc = [SourceIPField("sourceip", None)] |
| |
| assert Test().sourceip == defaddr |
| assert Test(raw(Test())).sourceip == defaddr |
| |
| assert IP(dst="0.0.0.0").src == defaddr |
| assert IP(raw(IP(dst="0.0.0.0"))).src == defaddr |
| assert IP(dst="0.0.0.0/31").src == defaddr |
| assert IP(raw(IP(dst="0.0.0.0/31"))).src == defaddr |
| |
| |
| #= ByteField |
| #~ core field |
| #b = ByteField("foo", None) |
| #b.i2m(" |
| #b.getfield |
| |
| |
| ############ |
| ############ |
| + Tests on ActionField |
| |
| = Creation of a layer with ActionField |
| ~ field actionfield |
| |
| from __future__ import print_function |
| |
| class TestAction(Packet): |
| __slots__ = ["_val", "_fld", "_priv1", "_priv2"] |
| name = "TestAction" |
| fields_desc = [ ActionField(ByteField("tst", 3), "my_action", priv1=1, priv2=2) ] |
| def __init__(self, *args, **kargs): |
| self._val, self._fld, self._priv1, self._priv2 = None, None, None, None |
| super(TestAction, self).__init__(*args, **kargs) |
| def my_action(self, val, fld, priv1, priv2): |
| print("Action (%i)!" % val) |
| self._val, self._fld, self._priv1, self._priv2 = val, fld, priv1, priv2 |
| |
| = Triggering action |
| ~ field actionfield |
| |
| t = TestAction() |
| assert(t._val == t._fld == t._priv1 == t._priv2 == None) |
| t.tst=42 |
| assert(t._priv1 == 1) |
| assert(t._priv2 == 2) |
| assert(t._val == 42) |
| |
| |
| ############ |
| ############ |
| + Tests on FieldLenField |
| |
| = Creation of a layer with FieldLenField |
| ~ field |
| class TestFLenF(Packet): |
| fields_desc = [ FieldLenField("len", None, length_of="str", fmt="B", adjust=lambda pkt,x:x+1), |
| StrLenField("str", "default", length_from=lambda pkt:pkt.len-1,) ] |
| |
| = Assembly of an empty packet |
| ~ field |
| TestFLenF() |
| raw(_) |
| _ == b"\x08default" |
| |
| = Assembly of non empty packet |
| ~ field |
| TestFLenF(str="123") |
| raw(_) |
| _ == b"\x04123" |
| |
| = Disassembly |
| ~ field |
| TestFLenF(b"\x04ABCDEFGHIJKL") |
| _ |
| _.len == 4 and _.str == b"ABC" and Raw in _ |
| |
| |
| = BitFieldLenField test |
| ~ field |
| class TestBFLenF(Packet): |
| fields_desc = [ BitFieldLenField("len", None, 4, length_of="str" , adjust=lambda pkt,x:x+1), |
| BitField("nothing",0xfff, 12), |
| StrLenField("str", "default", length_from=lambda pkt:pkt.len-1, ) ] |
| |
| a=TestBFLenF() |
| raw(a) |
| assert( _ == b"\x8f\xffdefault" ) |
| |
| a.str="" |
| raw(a) |
| assert( _ == b"\x1f\xff" ) |
| |
| TestBFLenF(b"\x1f\xff@@") |
| assert( _.len == 1 and _.str == b"" and Raw in _ and _[Raw].load == b"@@" ) |
| |
| TestBFLenF(b"\x6f\xffabcdeFGH") |
| assert( _.len == 6 and _.str == b"abcde" and Raw in _ and _[Raw].load == b"FGH" ) |
| |
| |
| |
| ############ |
| ############ |
| + Tests on FieldListField |
| |
| = Creation of a layer |
| ~ field |
| class TestFLF(Packet): |
| name="test" |
| fields_desc = [ FieldLenField("len", None, count_of="lst", fmt="B"), |
| FieldListField("lst", None, IntField("elt",0), count_from=lambda pkt:pkt.len) |
| ] |
| |
| = Assembly of an empty packet |
| ~ field |
| a = TestFLF() |
| raw(a) |
| |
| = Assembly of a non-empty packet |
| ~ field |
| a = TestFLF() |
| a.lst = [7,65539] |
| ls(a) |
| raw(a) |
| import struct |
| _ == struct.pack("!BII", 2,7,65539) |
| |
| = Disassemble |
| ~ field |
| import struct |
| TestFLF(b"\x00\x11\x12") |
| assert(_.len == 0 and Raw in _ and _[Raw].load == b"\x11\x12") |
| TestFLF(struct.pack("!BIII",3,1234,2345,12345678)) |
| assert(_.len == 3 and _.lst == [1234,2345,12345678]) |
| |
| = Manipulate |
| ~ field |
| a = TestFLF(lst=[4]) |
| raw(a) |
| assert(_ == b"\x01\x00\x00\x00\x04") |
| a.lst.append(1234) |
| TestFLF(raw(a)) |
| a.show2() |
| a.len=7 |
| raw(a) |
| assert(_ == b"\x07\x00\x00\x00\x04\x00\x00\x04\xd2") |
| a.len=2 |
| a.lst=[1,2,3,4,5] |
| TestFLF(raw(a)) |
| assert(Raw in _ and _[Raw].load == b'\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05') |
| |
| |
| ############ |
| ############ |
| + PacketListField |
| |
| = Create a layer |
| ~ field lengthfield |
| class TestPLF(Packet): |
| name="test" |
| fields_desc=[ FieldLenField("len", None, count_of="plist"), |
| PacketListField("plist", None, IP, count_from=lambda pkt:pkt.len,) ] |
| |
| = Test the PacketListField assembly |
| ~ field lengthfield |
| x=TestPLF() |
| raw(x) |
| _ == b"\x00\x00" |
| |
| = Test the PacketListField assembly 2 |
| ~ field lengthfield |
| x=TestPLF() |
| x.plist=[IP()/TCP(), IP()/UDP()] |
| raw(x) |
| _.startswith(b'\x00\x02E') |
| |
| = Test disassembly |
| ~ field lengthfield |
| x=TestPLF(plist=[IP()/TCP(seq=1234567), IP()/UDP()]) |
| TestPLF(raw(x)) |
| _.show() |
| IP in _ and TCP in _ and UDP in _ and _[TCP].seq == 1234567 |
| |
| = Nested PacketListField |
| ~ field lengthfield |
| y=IP()/TCP(seq=111111)/TestPLF(plist=[IP()/TCP(seq=222222),IP()/UDP()]) |
| TestPLF(plist=[y,IP()/TCP(seq=333333)]) |
| _.show() |
| IP in _ and TCP in _ and UDP in _ and _[TCP].seq == 111111 and _[TCP:2].seq==222222 and _[TCP:3].seq == 333333 |
| |
| ############ |
| ############ |
| + PacketListField tests |
| |
| = Create a layer |
| ~ field lengthfield |
| class TestPLF(Packet): |
| name="test" |
| fields_desc=[ FieldLenField("len", None, count_of="plist"), |
| PacketListField("plist", None, IP, count_from=lambda pkt:pkt.len) ] |
| |
| = Test the PacketListField assembly |
| ~ field lengthfield |
| x=TestPLF() |
| raw(x) |
| _ == b"\x00\x00" |
| |
| = Test the PacketListField assembly 2 |
| ~ field lengthfield |
| x=TestPLF() |
| x.plist=[IP()/TCP(), IP()/UDP()] |
| raw(x) |
| _.startswith(b'\x00\x02E') |
| |
| = Test disassembly |
| ~ field lengthfield |
| x=TestPLF(plist=[IP()/TCP(seq=1234567), IP()/UDP()]) |
| TestPLF(raw(x)) |
| _.show() |
| IP in _ and TCP in _ and UDP in _ and _[TCP].seq == 1234567 |
| |
| = Nested PacketListField |
| ~ field lengthfield |
| y=IP()/TCP(seq=111111)/TestPLF(plist=[IP()/TCP(seq=222222),IP()/UDP()]) |
| TestPLF(plist=[y,IP()/TCP(seq=333333)]) |
| _.show() |
| IP in _ and TCP in _ and UDP in _ and _[TCP].seq == 111111 and _[TCP:2].seq==222222 and _[TCP:3].seq == 333333 |
| |
| = Complex packet |
| ~ field lengthfield ccc |
| class TestPkt(Packet): |
| fields_desc = [ ByteField("f1",65), |
| ShortField("f2",0x4244) ] |
| def extract_padding(self, p): |
| return "", p |
| |
| class TestPLF2(Packet): |
| fields_desc = [ FieldLenField("len1", None, count_of="plist", fmt="H", |
| adjust=lambda pkt, x: x + 2), |
| FieldLenField("len2", None, length_of="plist", fmt="I", |
| adjust=lambda pkt, x: (x + 1) // 2), |
| PacketListField("plist", None, TestPkt, |
| length_from=lambda x: (x.len2 * 2) // 3 * 3) ] |
| |
| a=TestPLF2() |
| raw(a) |
| assert( _ == b"\x00\x02\x00\x00\x00\x00" ) |
| |
| a.plist=[TestPkt(),TestPkt(f1=100)] |
| raw(a) |
| assert(_ == b'\x00\x04\x00\x00\x00\x03ABDdBD') |
| |
| a /= "123456" |
| b = TestPLF2(raw(a)) |
| b.show() |
| assert(b.len1 == 4 and b.len2 == 3) |
| assert(b[TestPkt].f1 == 65 and b[TestPkt].f2 == 0x4244) |
| assert(b[TestPkt:2].f1 == 100) |
| assert(Raw in b and b[Raw].load == b"123456") |
| |
| a.plist.append(TestPkt(f1=200)) |
| b = TestPLF2(raw(a)) |
| b.show() |
| assert(b.len1 == 5 and b.len2 == 5) |
| assert(b[TestPkt].f1 == 65 and b[TestPkt].f2 == 0x4244) |
| assert(b[TestPkt:2].f1 == 100) |
| assert(b[TestPkt:3].f1 == 200) |
| assert(b.getlayer(TestPkt,4) is None) |
| assert(Raw in b and b[Raw].load == b"123456") |
| hexdiff(a,b) |
| assert( raw(a) == raw(b) ) |
| |
| ############ |
| ############ |
| + Tests on TCPOptionsField |
| |
| = Test calls on TCPOptionsField.getfield |
| |
| assert TCPOptionsField("test", "").getfield(TCP(dataofs=0), "") == ('', []) |
| |
| |
| ############ |
| ############ |
| + PacketListField tests |
| |
| = Create a layer |
| ~ field lengthfield |
| class TestPLF(Packet): |
| name="test" |
| fields_desc=[ FieldLenField("len", None, count_of="plist"), |
| PacketListField("plist", None, IP, count_from=lambda pkt:pkt.len) ] |
| |
| = Test the PacketListField assembly |
| ~ field lengthfield |
| x=TestPLF() |
| raw(x) |
| _ == b"\x00\x00" |
| |
| = Test the PacketListField assembly 2 |
| ~ field lengthfield |
| x=TestPLF() |
| x.plist=[IP()/TCP(), IP()/UDP()] |
| raw(x) |
| _.startswith(b'\x00\x02E') |
| |
| = Test disassembly |
| ~ field lengthfield |
| x=TestPLF(plist=[IP()/TCP(seq=1234567), IP()/UDP()]) |
| TestPLF(raw(x)) |
| _.show() |
| IP in _ and TCP in _ and UDP in _ and _[TCP].seq == 1234567 |
| |
| = Nested PacketListField |
| ~ field lengthfield |
| y=IP()/TCP(seq=111111)/TestPLF(plist=[IP()/TCP(seq=222222),IP()/UDP()]) |
| TestPLF(plist=[y,IP()/TCP(seq=333333)]) |
| _.show() |
| IP in _ and TCP in _ and UDP in _ and _[TCP].seq == 111111 and _[TCP:2].seq==222222 and _[TCP:3].seq == 333333 |
| |
| = Complex packet |
| ~ field lengthfield ccc |
| class TestPkt(Packet): |
| fields_desc = [ ByteField("f1",65), |
| ShortField("f2",0x4244) ] |
| def extract_padding(self, p): |
| return "", p |
| |
| class TestPLF2(Packet): |
| fields_desc = [ FieldLenField("len1", None, count_of="plist",fmt="H", |
| adjust=lambda pkt,x: x + 2), |
| FieldLenField("len2", None, length_of="plist", fmt="I", |
| adjust=lambda pkt, x: (x + 1) // 2), |
| PacketListField("plist", None, TestPkt, |
| length_from=lambda x: (x.len2 * 2) // 3 *3) ] |
| |
| a=TestPLF2() |
| raw(a) |
| assert( _ == b"\x00\x02\x00\x00\x00\x00" ) |
| |
| a.plist=[TestPkt(),TestPkt(f1=100)] |
| raw(a) |
| assert(_ == b'\x00\x04\x00\x00\x00\x03ABDdBD') |
| |
| a /= "123456" |
| b = TestPLF2(raw(a)) |
| b.show() |
| assert(b.len1 == 4 and b.len2 == 3) |
| assert(b[TestPkt].f1 == 65 and b[TestPkt].f2 == 0x4244) |
| assert(b[TestPkt:2].f1 == 100) |
| assert(Raw in b and b[Raw].load == b"123456") |
| |
| a.plist.append(TestPkt(f1=200)) |
| b = TestPLF2(raw(a)) |
| b.show() |
| assert(b.len1 == 5 and b.len2 == 5) |
| assert(b[TestPkt].f1 == 65 and b[TestPkt].f2 == 0x4244) |
| assert(b[TestPkt:2].f1 == 100) |
| assert(b[TestPkt:3].f1 == 200) |
| assert(b.getlayer(TestPkt,4) is None) |
| assert(Raw in b and b[Raw].load == b"123456") |
| hexdiff(a,b) |
| assert( raw(a) == raw(b) ) |
| |
| = Create layers for heterogeneous PacketListField |
| ~ field lengthfield |
| TestPLFH1 = type('TestPLFH1', (Packet,), { |
| 'name': 'test1', |
| 'fields_desc': [ByteField('data', 0)], |
| 'guess_payload_class': lambda self, p: conf.padding_layer, |
| } |
| ) |
| TestPLFH2 = type('TestPLFH2', (Packet,), { |
| 'name': 'test2', |
| 'fields_desc': [ShortField('data', 0)], |
| 'guess_payload_class': lambda self, p: conf.padding_layer, |
| } |
| ) |
| class TestPLFH3(Packet): |
| name = 'test3' |
| fields_desc = [ |
| PacketListField( |
| 'data', [], |
| next_cls_cb=lambda pkt, lst, p, remain: pkt.detect_next_packet(lst, p, remain) |
| ) |
| ] |
| def detect_next_packet(self, lst, p, remain): |
| if len(remain) < 3: |
| return None |
| if isinstance(p, type(None)): |
| return TestPLFH1 |
| if p.data & 3 == 1: |
| return TestPLFH1 |
| if p.data & 3 == 2: |
| return TestPLFH2 |
| return None |
| |
| = Test heterogeneous PacketListField |
| ~ field lengthfield |
| |
| p = TestPLFH3(b'\x02\x01\x01\xc1\x02\x80\x04toto') |
| assert(isinstance(p.data[0], TestPLFH1)) |
| assert(p.data[0].data == 0x2) |
| assert(isinstance(p.data[1], TestPLFH2)) |
| assert(p.data[1].data == 0x101) |
| assert(isinstance(p.data[2], TestPLFH1)) |
| assert(p.data[2].data == 0xc1) |
| assert(isinstance(p.data[3], TestPLFH1)) |
| assert(p.data[3].data == 0x2) |
| assert(isinstance(p.data[4], TestPLFH2)) |
| assert(p.data[4].data == 0x8004) |
| assert(isinstance(p.payload, conf.raw_layer)) |
| assert(p.payload.load == b'toto') |
| |
| p = TestPLFH3(b'\x02\x01\x01\xc1\x02\x80\x02to') |
| assert(isinstance(p.data[0], TestPLFH1)) |
| assert(p.data[0].data == 0x2) |
| assert(isinstance(p.data[1], TestPLFH2)) |
| assert(p.data[1].data == 0x101) |
| assert(isinstance(p.data[2], TestPLFH1)) |
| assert(p.data[2].data == 0xc1) |
| assert(isinstance(p.data[3], TestPLFH1)) |
| assert(p.data[3].data == 0x2) |
| assert(isinstance(p.data[4], TestPLFH2)) |
| assert(p.data[4].data == 0x8002) |
| assert(isinstance(p.payload, conf.raw_layer)) |
| assert(p.payload.load == b'to') |
| |
| = Create layers for heterogeneous PacketListField with memory |
| ~ field lengthfield |
| TestPLFH4 = type('TestPLFH4', (Packet,), { |
| 'name': 'test4', |
| 'fields_desc': [ByteField('data', 0)], |
| 'guess_payload_class': lambda self, p: conf.padding_layer, |
| } |
| ) |
| TestPLFH5 = type('TestPLFH5', (Packet,), { |
| 'name': 'test5', |
| 'fields_desc': [ShortField('data', 0)], |
| 'guess_payload_class': lambda self, p: conf.padding_layer, |
| } |
| ) |
| class TestPLFH6(Packet): |
| __slots__ = ['_memory'] |
| name = 'test6' |
| fields_desc = [ |
| PacketListField( |
| 'data', [], |
| next_cls_cb=lambda pkt, lst, p, remain: pkt.detect_next_packet(lst, p, remain) |
| ) |
| ] |
| def detect_next_packet(self, lst, p, remain): |
| if isinstance(p, type(None)): |
| self._memory = [TestPLFH4] * 3 + [TestPLFH5] |
| try: |
| return self._memory.pop(0) |
| except IndexError: |
| return None |
| |
| = Test heterogeneous PacketListField with memory |
| ~ field lengthfield |
| |
| p = TestPLFH6(b'\x01\x02\x03\xc1\x02toto') |
| assert(isinstance(p.data[0], TestPLFH4)) |
| assert(p.data[0].data == 0x1) |
| assert(isinstance(p.data[1], TestPLFH4)) |
| assert(p.data[1].data == 0x2) |
| assert(isinstance(p.data[2], TestPLFH4)) |
| assert(p.data[2].data == 0x3) |
| assert(isinstance(p.data[3], TestPLFH5)) |
| assert(p.data[3].data == 0xc102) |
| assert(isinstance(p.payload, conf.raw_layer)) |
| assert(p.payload.load == b'toto') |
| |
| |
| ############ |
| ############ |
| + Tests on MultiFlagsField |
| |
| = Test calls on MultiFlagsField.any2i |
| ~ multiflagsfield |
| |
| import collections |
| MockPacket = collections.namedtuple('MockPacket', ['type']) |
| |
| f = MultiFlagsField('flags', set(), 3, { |
| 0: { |
| 0: MultiFlagsEntry('A', 'OptionA'), |
| 1: MultiFlagsEntry('B', 'OptionB'), |
| }, |
| 1: { |
| 0: MultiFlagsEntry('+', 'Plus'), |
| 1: MultiFlagsEntry('*', 'Star'), |
| }, |
| }, |
| depends_on=lambda x: x.type |
| ) |
| |
| mp = MockPacket(0) |
| x = f.any2i(mp, set()) |
| assert(isinstance(x, set)) |
| assert(len(x) == 0) |
| x = f.any2i(mp, {'A'}) |
| assert(isinstance(x, set)) |
| assert(len(x) == 1) |
| assert('A' in x) |
| assert('B' not in x) |
| assert('+' not in x) |
| x = f.any2i(mp, {'A', 'B'}) |
| assert(isinstance(x, set)) |
| assert(len(x) == 2) |
| assert('A' in x) |
| assert('B' in x) |
| assert('+' not in x) |
| assert('*' not in x) |
| x = f.any2i(mp, 3) |
| assert(isinstance(x, set)) |
| assert(len(x) == 2) |
| assert('A' in x) |
| assert('B' in x) |
| assert('+' not in x) |
| assert('*' not in x) |
| x = f.any2i(mp, 7) |
| assert(isinstance(x, set)) |
| assert(len(x) == 3) |
| assert('A' in x) |
| assert('B' in x) |
| assert('bit 2' in x) |
| assert('+' not in x) |
| assert('*' not in x) |
| mp = MockPacket(1) |
| x = f.any2i(mp, {'+', '*'}) |
| assert(isinstance(x, set)) |
| assert(len(x) == 2) |
| assert('+' in x) |
| assert('*' in x) |
| assert('A' not in x) |
| assert('B' not in x) |
| try: |
| x = f.any2i(mp, {'A'}) |
| ret = False |
| except AssertionError: |
| ret = True |
| |
| assert(ret) |
| #Following test demonstrate a non-sensical yet acceptable usage :( |
| x = f.any2i(None, {'Toto'}) |
| assert('Toto' in x) |
| |
| = Test calls on MultiFlagsField.i2m |
| ~ multiflagsfield |
| |
| import collections |
| MockPacket = collections.namedtuple('MockPacket', ['type']) |
| |
| f = MultiFlagsField('flags', set(), 3, { |
| 0: { |
| 0: MultiFlagsEntry('A', 'OptionA'), |
| 1: MultiFlagsEntry('B', 'OptionB'), |
| }, |
| 1: { |
| 0: MultiFlagsEntry('+', 'Plus'), |
| 1: MultiFlagsEntry('*', 'Star'), |
| }, |
| }, |
| depends_on=lambda x: x.type |
| ) |
| |
| mp = MockPacket(0) |
| x = f.i2m(mp, set()) |
| assert(isinstance(x, six.integer_types)) |
| assert(x == 0) |
| x = f.i2m(mp, {'A'}) |
| assert(isinstance(x, six.integer_types)) |
| assert(x == 1) |
| x = f.i2m(mp, {'A', 'B'}) |
| assert(isinstance(x, six.integer_types)) |
| assert(x == 3) |
| x = f.i2m(mp, {'A', 'B', 'bit 2'}) |
| assert(isinstance(x, six.integer_types)) |
| assert(x == 7) |
| try: |
| x = f.i2m(mp, {'+'}) |
| ret = False |
| except: |
| ret = True |
| |
| assert(ret) |
| |
| = Test calls on MultiFlagsField.m2i |
| ~ multiflagsfield |
| |
| import collections |
| MockPacket = collections.namedtuple('MockPacket', ['type']) |
| |
| f = MultiFlagsField('flags', set(), 3, { |
| 0: { |
| 0: MultiFlagsEntry('A', 'OptionA'), |
| 1: MultiFlagsEntry('B', 'OptionB'), |
| }, |
| 1: { |
| 0: MultiFlagsEntry('+', 'Plus'), |
| 1: MultiFlagsEntry('*', 'Star'), |
| }, |
| }, |
| depends_on=lambda x: x.type |
| ) |
| |
| mp = MockPacket(0) |
| x = f.m2i(mp, 2) |
| assert(isinstance(x, set)) |
| assert(len(x) == 1) |
| assert('B' in x) |
| assert('A' not in x) |
| assert('*' not in x) |
| |
| x = f.m2i(mp, 7) |
| assert(isinstance(x, set)) |
| assert('B' in x) |
| assert('A' in x) |
| assert('bit 2' in x) |
| assert('*' not in x) |
| assert('+' not in x) |
| x = f.m2i(mp, 0) |
| assert(len(x) == 0) |
| mp = MockPacket(1) |
| x = f.m2i(mp, 2) |
| assert(isinstance(x, set)) |
| assert(len(x) == 1) |
| assert('*' in x) |
| assert('+' not in x) |
| assert('B' not in x) |
| |
| = Test calls on MultiFlagsField.i2repr |
| ~ multiflagsfield |
| |
| import collections, re |
| MockPacket = collections.namedtuple('MockPacket', ['type']) |
| |
| f = MultiFlagsField('flags', set(), 3, { |
| 0: { |
| 0: MultiFlagsEntry('A', 'OptionA'), |
| 1: MultiFlagsEntry('B', 'OptionB'), |
| }, |
| 1: { |
| 0: MultiFlagsEntry('+', 'Plus'), |
| 1: MultiFlagsEntry('*', 'Star'), |
| }, |
| }, |
| depends_on=lambda x: x.type |
| ) |
| |
| mp = MockPacket(0) |
| x = f.i2repr(mp, {'A', 'B'}) |
| assert(re.match(r'^.*OptionA \(A\).*$', x) is not None) |
| assert(re.match(r'^.*OptionB \(B\).*$', x) is not None) |
| mp = MockPacket(1) |
| x = f.i2repr(mp, {'*', '+', 'bit 2'}) |
| assert(re.match(r'^.*Star \(\*\).*$', x) is not None) |
| assert(re.match(r'^.*Plus \(\+\).*$', x) is not None) |
| assert(re.match(r'^.*bit 2.*$', x) is not None) |
| |
| ############ |
| ############ |
| + EnumField tests |
| |
| = EnumField tests initialization |
| |
| # Basic EnumField |
| f = EnumField('test', 0, {0: 'Foo', 1: 'Bar'}) |
| # Reverse i2s/s2i |
| rf = EnumField('test', 0, {'Foo': 0, 'Bar': 1}) |
| # EnumField initialized with a list |
| lf = EnumField('test', 0, ['Foo', 'Bar']) |
| # EnumField with i2s_cb/s2i_cb |
| fcb = EnumField('test', 0, ( |
| lambda x: 'Foo' if x == 0 else 'Bar' if 1 <= x <= 10 else repr(x), |
| lambda x: 0 if x == 'Foo' else 1 if x == 'Bar' else int(x), |
| ) |
| ) |
| |
| def expect_exception(e, c): |
| try: |
| eval(c) |
| return False |
| except e: |
| return True |
| |
| |
| = EnumField.any2i_one |
| ~ field enumfield |
| |
| assert(f.any2i_one(None, 'Foo') == 0) |
| assert(f.any2i_one(None, 'Bar') == 1) |
| assert(f.any2i_one(None, 2) == 2) |
| expect_exception(KeyError, 'f.any2i_one(None, "Baz")') |
| |
| assert(rf.any2i_one(None, 'Foo') == 0) |
| assert(rf.any2i_one(None, 'Bar') == 1) |
| assert(rf.any2i_one(None, 2) == 2) |
| expect_exception(KeyError, 'rf.any2i_one(None, "Baz")') |
| |
| assert(lf.any2i_one(None, 'Foo') == 0) |
| assert(lf.any2i_one(None, 'Bar') == 1) |
| assert(lf.any2i_one(None, 2) == 2) |
| expect_exception(KeyError, 'lf.any2i_one(None, "Baz")') |
| |
| assert(fcb.any2i_one(None, 'Foo') == 0) |
| assert(fcb.any2i_one(None, 'Bar') == 1) |
| assert(fcb.any2i_one(None, 5) == 5) |
| expect_exception(ValueError, 'fcb.any2i_one(None, "Baz")') |
| |
| True |
| |
| = EnumField.any2i |
| ~ field enumfield |
| |
| assert(f.any2i(None, 'Foo') == 0) |
| assert(f.any2i(None, 'Bar') == 1) |
| assert(f.any2i(None, 2) == 2) |
| expect_exception(KeyError, 'f.any2i(None, "Baz")') |
| assert(f.any2i(None, ['Foo', 'Bar', 2]) == [0, 1, 2]) |
| |
| assert(rf.any2i(None, 'Foo') == 0) |
| assert(rf.any2i(None, 'Bar') == 1) |
| assert(rf.any2i(None, 2) == 2) |
| expect_exception(KeyError, 'rf.any2i(None, "Baz")') |
| assert(rf.any2i(None, ['Foo', 'Bar', 2]) == [0, 1, 2]) |
| |
| assert(lf.any2i(None, 'Foo') == 0) |
| assert(lf.any2i(None, 'Bar') == 1) |
| assert(lf.any2i(None, 2) == 2) |
| expect_exception(KeyError, 'lf.any2i(None, "Baz")') |
| assert(lf.any2i(None, ['Foo', 'Bar', 2]) == [0, 1, 2]) |
| |
| assert(fcb.any2i(None, 'Foo') == 0) |
| assert(fcb.any2i(None, 'Bar') == 1) |
| assert(fcb.any2i(None, 5) == 5) |
| expect_exception(ValueError, 'fcb.any2i(None, "Baz")') |
| assert(f.any2i(None, ['Foo', 'Bar', 5]) == [0, 1, 5]) |
| |
| True |
| |
| = EnumField.i2repr_one |
| ~ field enumfield |
| |
| assert(f.i2repr_one(None, 0) == 'Foo') |
| assert(f.i2repr_one(None, 1) == 'Bar') |
| expect_exception(KeyError, 'f.i2repr_one(None, 2)') |
| |
| assert(rf.i2repr_one(None, 0) == 'Foo') |
| assert(rf.i2repr_one(None, 1) == 'Bar') |
| expect_exception(KeyError, 'rf.i2repr_one(None, 2)') |
| |
| assert(lf.i2repr_one(None, 0) == 'Foo') |
| assert(lf.i2repr_one(None, 1) == 'Bar') |
| expect_exception(KeyError, 'lf.i2repr_one(None, 2)') |
| |
| assert(fcb.i2repr_one(None, 0) == 'Foo') |
| assert(fcb.i2repr_one(None, 1) == 'Bar') |
| assert(fcb.i2repr_one(None, 5) == 'Bar') |
| assert(fcb.i2repr_one(None, 11) == repr(11)) |
| |
| conf.noenum.add(f, rf, lf, fcb) |
| |
| assert(f.i2repr_one(None, 0) == repr(0)) |
| assert(f.i2repr_one(None, 1) == repr(1)) |
| assert(f.i2repr_one(None, 2) == repr(2)) |
| |
| assert(rf.i2repr_one(None, 0) == repr(0)) |
| assert(rf.i2repr_one(None, 1) == repr(1)) |
| assert(rf.i2repr_one(None, 2) == repr(2)) |
| |
| assert(lf.i2repr_one(None, 0) == repr(0)) |
| assert(lf.i2repr_one(None, 1) == repr(1)) |
| assert(lf.i2repr_one(None, 2) == repr(2)) |
| |
| assert(fcb.i2repr_one(None, 0) == repr(0)) |
| assert(fcb.i2repr_one(None, 1) == repr(1)) |
| assert(fcb.i2repr_one(None, 5) == repr(5)) |
| assert(fcb.i2repr_one(None, 11) == repr(11)) |
| |
| conf.noenum.remove(f, rf, lf, fcb) |
| |
| assert(f.i2repr_one(None, RandNum(0, 10)) == '<RandNum>') |
| assert(rf.i2repr_one(None, RandNum(0, 10)) == '<RandNum>') |
| assert(lf.i2repr_one(None, RandNum(0, 10)) == '<RandNum>') |
| assert(fcb.i2repr_one(None, RandNum(0, 10)) == '<RandNum>') |
| |
| True |
| |
| = EnumField.i2repr |
| ~ field enumfield |
| |
| assert(f.i2repr(None, 0) == 'Foo') |
| assert(f.i2repr(None, 1) == 'Bar') |
| expect_exception(KeyError, 'f.i2repr(None, 2)') |
| assert(f.i2repr(None, [0, 1]) == ['Foo', 'Bar']) |
| |
| assert(rf.i2repr(None, 0) == 'Foo') |
| assert(rf.i2repr(None, 1) == 'Bar') |
| expect_exception(KeyError, 'rf.i2repr(None, 2)') |
| assert(rf.i2repr(None, [0, 1]) == ['Foo', 'Bar']) |
| |
| assert(lf.i2repr(None, 0) == 'Foo') |
| assert(lf.i2repr(None, 1) == 'Bar') |
| expect_exception(KeyError, 'lf.i2repr(None, 2)') |
| assert(lf.i2repr(None, [0, 1]) == ['Foo', 'Bar']) |
| |
| assert(fcb.i2repr(None, 0) == 'Foo') |
| assert(fcb.i2repr(None, 1) == 'Bar') |
| assert(fcb.i2repr(None, 5) == 'Bar') |
| assert(fcb.i2repr(None, 11) == repr(11)) |
| assert(fcb.i2repr(None, [0, 1, 5, 11]) == ['Foo', 'Bar', 'Bar', repr(11)]) |
| |
| conf.noenum.add(f, rf, lf, fcb) |
| |
| assert(f.i2repr(None, 0) == repr(0)) |
| assert(f.i2repr(None, 1) == repr(1)) |
| assert(f.i2repr(None, 2) == repr(2)) |
| assert(f.i2repr(None, [0, 1, 2]) == [repr(0), repr(1), repr(2)]) |
| |
| assert(rf.i2repr(None, 0) == repr(0)) |
| assert(rf.i2repr(None, 1) == repr(1)) |
| assert(rf.i2repr(None, 2) == repr(2)) |
| assert(rf.i2repr(None, [0, 1, 2]) == [repr(0), repr(1), repr(2)]) |
| |
| assert(lf.i2repr(None, 0) == repr(0)) |
| assert(lf.i2repr(None, 1) == repr(1)) |
| assert(lf.i2repr(None, 2) == repr(2)) |
| assert(lf.i2repr(None, [0, 1, 2]) == [repr(0), repr(1), repr(2)]) |
| |
| assert(fcb.i2repr(None, 0) == repr(0)) |
| assert(fcb.i2repr(None, 1) == repr(1)) |
| assert(fcb.i2repr(None, 5) == repr(5)) |
| assert(fcb.i2repr(None, 11) == repr(11)) |
| assert(fcb.i2repr(None, [0, 1, 5, 11]) == [repr(0), repr(1), repr(5), repr(11)]) |
| |
| conf.noenum.remove(f, rf, lf, fcb) |
| |
| assert(f.i2repr_one(None, RandNum(0, 10)) == '<RandNum>') |
| assert(rf.i2repr_one(None, RandNum(0, 10)) == '<RandNum>') |
| assert(lf.i2repr_one(None, RandNum(0, 10)) == '<RandNum>') |
| assert(fcb.i2repr_one(None, RandNum(0, 10)) == '<RandNum>') |
| |
| True |
| |
| ############ |
| ############ |
| + CharEnumField tests |
| |
| = Building expect_exception handler |
| ~ field charenumfield |
| |
| def expect_exception(e, c): |
| try: |
| eval(c) |
| return False |
| except e: |
| return True |
| |
| |
| = CharEnumField tests initialization |
| ~ field charenumfield |
| |
| fc = CharEnumField('test', 'f', {'f': 'Foo', 'b': 'Bar'}) |
| fcb = CharEnumField('test', 'a', ( |
| lambda x: 'Foo' if x == 'a' else 'Bar' if x == 'b' else 'Baz', |
| lambda x: 'a' if x == 'Foo' else 'b' if x == 'Bar' else '' |
| )) |
| |
| True |
| |
| = CharEnumField.any2i_one |
| ~ field charenumfield |
| |
| assert(fc.any2i_one(None, 'Foo') == 'f') |
| assert(fc.any2i_one(None, 'Bar') == 'b') |
| expect_exception(KeyError, 'fc.any2i_one(None, "Baz")') |
| |
| assert(fcb.any2i_one(None, 'Foo') == 'a') |
| assert(fcb.any2i_one(None, 'Bar') == 'b') |
| assert(fcb.any2i_one(None, 'Baz') == '') |
| |
| True |
| |
| ############ |
| ############ |
| + XShortEnumField tests |
| |
| = Building expect_exception handler |
| ~ field xshortenumfield |
| |
| def expect_exception(e, c): |
| try: |
| eval(c) |
| return False |
| except e: |
| return True |
| |
| |
| = XShortEnumField tests initialization |
| ~ field xshortenumfield |
| |
| f = XShortEnumField('test', 0, {0: 'Foo', 1: 'Bar'}) |
| fcb = XShortEnumField('test', 0, ( |
| lambda x: 'Foo' if x == 0 else 'Bar' if x == 1 else lhex(x), |
| lambda x: x |
| )) |
| |
| True |
| |
| = XShortEnumField.i2repr_one |
| ~ field xshortenumfield |
| |
| assert(f.i2repr_one(None, 0) == 'Foo') |
| assert(f.i2repr_one(None, 1) == 'Bar') |
| assert(f.i2repr_one(None, 0xff) == '0xff') |
| |
| assert(f.i2repr_one(None, 0) == 'Foo') |
| assert(f.i2repr_one(None, 1) == 'Bar') |
| assert(f.i2repr_one(None, 0xff) == '0xff') |
| |
| True |
| |
| ############ |
| ############ |
| + DNSStrField tests |
| |
| = Raise exception - test data |
| |
| dnsf = DNSStrField("test", "") |
| assert(dnsf.getfield("", b"\x01x\x00") == (b"", b"x.")) |
| |
| try: |
| dnsf.getfield("", b"\xff") |
| assert(False) |
| except (Scapy_Exception, IndexError): |
| pass |