summaryrefslogtreecommitdiffstats
path: root/scripts/automation/regression/unit_tests/functional_tests/payload_gen_test.py
blob: 80d2b0869af8437c4ef5f95ff936188c2c39a347 (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
#!/router/bin/python

import pkt_bld_general_test
from client_utils.packet_builder import *
from dpkt.ethernet import Ethernet
from dpkt.ip import IP
from dpkt.icmp import ICMP
from nose.tools import assert_equal
from nose.tools import assert_not_equal
from nose.tools import assert_raises
from nose.tools import raises
import re
import binascii

class CTRexPayloadGen_Test(pkt_bld_general_test.CGeneralPktBld_Test):

    def setUp(self):
#       echo = dpkt.icmp.ICMP.Echo()
#       echo.id = random.randint(0, 0xffff)
#       echo.seq = random.randint(0, 0xffff)
#       echo.data = 'hello world'
#
#       icmp = dpkt.icmp.ICMP()
#       icmp.type = dpkt.icmp.ICMP_ECHO
#       icmp.data = echo

        # packet generation is done directly using dpkt package and 
        self.packet = Ethernet()
        ip = IP(src='\x01\x02\x03\x04', dst='\x05\x06\x07\x08', p=1)
        icmp = ICMP(type=8, data=ICMP.Echo(id=123, seq=1, data='foobar'))
        ip.data = icmp
        self.packet.src = "\x00\x00\x55\x55\x00\x00"
        self.packet.dst = "\x00\x00\x11\x11\x00\x00"
        self.packet.data = ip
        self.print_packet(self.packet)
        self.max_pkt_size = 1400
        self.pld_gen = CTRexPktBuilder.CTRexPayloadGen(self.packet, self.max_pkt_size)

    @staticmethod
    def special_match(strg, search=re.compile(r'[^a-zA-Z0-9]').search):
        return not bool(search(strg))

    @staticmethod
    def principal_period(s):
        # finds the string the repeats itself in the string
        i = (s+s).find(s, 1, -1)
        return None if i == -1 else s[:i]

    def test_gen_random_str(self):
        generated_str = self.pld_gen.gen_random_str()
        # print "\nGenerated string: {}".format(generated_str)
        # chech that the generated string is accorsing to rules.
        assert CTRexPayloadGen_Test.special_match(generated_str)
        assert_equal(len(generated_str), (self.max_pkt_size - len(self.packet)))
        
    def test_gen_repeat_ptrn(self):
        gen_len = self.max_pkt_size - len(self.packet)
        # case 1 - repeated string
        repeat_str = "HelloWorld"
        generated_str = self.pld_gen.gen_repeat_ptrn(repeat_str)
        for i in xrange(len(repeat_str)):
            if generated_str.endswith(repeat_str[:i+1]):
                # remove the string residue, if found
                generated_str = generated_str[:-(i+1)]
                # print generated_str
                break
        assert_equal(CTRexPayloadGen_Test.principal_period(generated_str), "HelloWorld")

        # case 2.1 - repeated single number - long number
        repeat_num = 0x645564646465
        generated_str = self.pld_gen.gen_repeat_ptrn(repeat_num)
        ptrn = binascii.unhexlify(hex(repeat_num)[2:])
        for i in xrange(len(ptrn)):
            if generated_str.endswith(ptrn[:i+1]):
                # remove the string residue, if found
                generated_str = generated_str[:-(i+1)]
                break
        assert_equal(CTRexPayloadGen_Test.principal_period(generated_str), ptrn)
        # case 2.2 - repeated single number - 1 byte
        repeat_num = 0x64
        generated_str = self.pld_gen.gen_repeat_ptrn(repeat_num)
        ptrn = binascii.unhexlify(hex(repeat_num)[2:])
        assert_equal(CTRexPayloadGen_Test.principal_period(generated_str), ptrn)
        assert_equal(len(generated_str), (self.max_pkt_size - len(self.packet)))
        # case 3 - repeated sequence
        repeat_seq = (0x55, 0x60, 0x65, 0x70, 0x85)
        ptrn = binascii.unhexlify(''.join(hex(x)[2:] for x in repeat_seq))
        generated_str = self.pld_gen.gen_repeat_ptrn(repeat_seq)
        # ptrn = binascii.unhexlify(hex(repeat_num)[2:])
        for i in xrange(len(ptrn)):
            if generated_str.endswith(ptrn[:i+1]):
                # remove the string residue, if found
                generated_str = generated_str[:-(i+1)]
                break
        assert_equal(CTRexPayloadGen_Test.principal_period(generated_str), ptrn)
        
        # in tuples, check that if any of the numbers exceeds limit
        assert_raises(ValueError, self.pld_gen.gen_repeat_ptrn, (0x1, -18))
        assert_raises(ValueError, self.pld_gen.gen_repeat_ptrn, (0xFFF, 5))
        # finally, check an exception is thrown in rest of cases
        assert_raises(ValueError, self.pld_gen.gen_repeat_ptrn, 5.5)





        








        pass


    def tearDown(self):
        pass


if __name__ == "__main__":
    pass