summaryrefslogtreecommitdiffhomepage
path: root/test/test_perl_application.py
blob: 45f8ab3368f55c70710e33678749c9f52bfdc875 (plain) (blame)
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
import re
import time
import unittest
import unit

class TestUnitPerlApplication(unit.TestUnitApplicationPerl):

    def setUpClass():
        unit.TestUnit().check_modules('perl')

    def test_perl_application(self):
        self.load('variables')

        body = 'Test body string.'

        resp = self.post(headers={
            'Host': 'localhost',
            'Content-Type': 'text/html',
            'Custom-Header': 'blah'
        }, body=body)

        self.assertEqual(resp['status'], 200, 'status')
        headers = resp['headers']
        self.assertRegex(headers.pop('Server'), r'Unit/[\d\.]+',
            'server header')
        self.assertLess(abs(time.mktime(time.gmtime()) -
            time.mktime(time.strptime(headers.pop('Date'),
            '%a, %d %b %Y %H:%M:%S GMT'))), 5, 'date header')
        self.assertDictEqual(headers, {
            'Content-Length': str(len(body)),
            'Content-Type': 'text/html',
            'Request-Method': 'POST',
            'Request-Uri': '/',
            'Http-Host': 'localhost',
            'Server-Protocol': 'HTTP/1.1',
            'Custom-Header': 'blah',
            'Psgi-Version': '11',
            'Psgi-Url-Scheme': 'http',
            'Psgi-Multithread': '',
            'Psgi-Multiprocess': '1',
            'Psgi-Run-Once': '',
            'Psgi-Nonblocking': '',
            'Psgi-Streaming': ''
        }, 'headers')
        self.assertEqual(resp['body'], body, 'body')

    def test_perl_application_query_string(self):
        self.load('query_string')

        resp = self.get(url='/?var1=val1&var2=val2')

        self.assertEqual(resp['headers']['Query-String'], 'var1=val1&var2=val2',
            'Query-String header')

    @unittest.expectedFailure
    def test_perl_application_server_port(self):
        self.load('server_port')

        self.assertEqual(self.get()['headers']['Server-Port'], '7080',
            'Server-Port header')

    def test_perl_application_input_read_empty(self):
        self.load('input_read_empty')

        self.assertEqual(self.get()['body'], '', 'read empty')

    def test_perl_application_input_read_parts(self):
        self.load('input_read_parts')

        self.assertEqual(self.post(body='0123456789')['body'], '0123456789',
            'input read parts')

    @unittest.expectedFailure
    def test_perl_application_input_read_offset(self):
        self.load('input_read_offset')

        self.assertEqual(self.post(body='0123456789')['body'], '4567',
            'read offset')

    def test_perl_application_input_copy(self):
        self.load('input_copy')

        body = '0123456789'
        self.assertEqual(self.post(body=body)['body'], body, 'input copy')

    def test_perl_application_errors_print(self):
        self.load('errors_print')

        self.assertEqual(self.get()['body'], '1', 'errors result')

        with open(self.testdir + '/unit.log', 'r') as f:
            m = re.search('Error in application', f.read())

        self.assertIsNotNone(m, 'errors log')

    def test_perl_application_header_equal_names(self):
        self.load('header_equal_names')

        self.assertListEqual(self.get()['headers']['Set-Cookie'],
            ['tc=one,two,three', 'tc=four,five,six'], 'header equal names')

    def test_perl_application_header_pairs(self):
        self.load('header_pairs')

        self.assertEqual(self.get()['headers']['blah'], 'blah', 'header pairs')

    def test_perl_application_body_empty(self):
        self.load('body_empty')

        self.assertEqual(self.get()['body'], '0\r\n\r\n', 'body empty')

    def test_perl_application_body_array(self):
        self.load('body_array')

        self.assertEqual(self.get()['body'], '0123456789', 'body array')

    def test_perl_application_body_large(self):
        self.load('variables')

        body = '0123456789' * 1000

        resp = self.post(body=body)['body']

        self.assertEqual(resp, body, 'body large')

    def test_perl_application_body_io_empty(self):
        self.load('body_io_empty')

        self.assertEqual(self.get()['status'], 200, 'body io empty')

    def test_perl_application_body_io_file(self):
        self.load('body_io_file')

        self.assertEqual(self.get()['body'], 'body\n', 'body io file')

    def test_perl_keepalive_body(self):
        self.load('variables')

        (resp, sock) = self.post(headers={
            'Connection': 'keep-alive',
            'Content-Type': 'text/html',
            'Host': 'localhost'
        }, start=True, body='0123456789' * 500)

        self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1')

        resp = self.post(headers={
            'Connection': 'close',
            'Content-Type': 'text/html',
            'Host': 'localhost'
        }, sock=sock, body='0123456789')

        self.assertEqual(resp['body'], '0123456789', 'keep-alive 2')

if __name__ == '__main__':
    unittest.main()