1484Szelenkov@nginx.comimport unittest
2484Szelenkov@nginx.comimport unit
3484Szelenkov@nginx.com
4484Szelenkov@nginx.comclass TestUnitApplication(unit.TestUnitControl):
5484Szelenkov@nginx.com
6484Szelenkov@nginx.com    def setUpClass():
7484Szelenkov@nginx.com        u = unit.TestUnit()
8484Szelenkov@nginx.com
9484Szelenkov@nginx.com        u.check_modules('python')
10484Szelenkov@nginx.com        u.check_version('0.4')
11484Szelenkov@nginx.com
12495Szelenkov@nginx.com    conf = """
13495Szelenkov@nginx.com        {
14495Szelenkov@nginx.com            "listeners": {
15495Szelenkov@nginx.com                "*:7080": {
16495Szelenkov@nginx.com                    "application": "app"
17495Szelenkov@nginx.com                }
18495Szelenkov@nginx.com            },
19495Szelenkov@nginx.com            "applications": {
20495Szelenkov@nginx.com                "app": {
21495Szelenkov@nginx.com                    "type": "python",
22495Szelenkov@nginx.com                    "workers": 1,
23495Szelenkov@nginx.com                    "path": "%s",
24495Szelenkov@nginx.com                    "module": "wsgi"
25495Szelenkov@nginx.com                }
26495Szelenkov@nginx.com            }
27495Szelenkov@nginx.com        }
28495Szelenkov@nginx.com        """
29495Szelenkov@nginx.com
30495Szelenkov@nginx.com    def test_python_application_simple(self):
31484Szelenkov@nginx.com        code, name = """
32484Szelenkov@nginx.com
33484Szelenkov@nginx.comdef application(environ, start_response):
34484Szelenkov@nginx.com
35484Szelenkov@nginx.com    content_length = int(environ.get('CONTENT_LENGTH', 0))
36484Szelenkov@nginx.com    body = bytes(environ['wsgi.input'].read(content_length))
37484Szelenkov@nginx.com
38484Szelenkov@nginx.com    start_response('200 OK', [
39484Szelenkov@nginx.com        ('Content-Type', environ.get('CONTENT_TYPE')),
40484Szelenkov@nginx.com        ('Content-Length', str(len(body))),
41484Szelenkov@nginx.com        ('Request-Method', environ.get('REQUEST_METHOD')),
42484Szelenkov@nginx.com        ('Request-Uri', environ.get('REQUEST_URI')),
43484Szelenkov@nginx.com        ('Path-Info', environ.get('PATH_INFO')),
44484Szelenkov@nginx.com        ('Http-Host', environ.get('HTTP_HOST')),
45484Szelenkov@nginx.com        ('Remote-Addr', environ.get('REMOTE_ADDR')),
46484Szelenkov@nginx.com        ('Server-Name', environ.get('SERVER_NAME')),
47484Szelenkov@nginx.com        ('Server-Protocol', environ.get('SERVER_PROTOCOL')),
48484Szelenkov@nginx.com        ('Custom-Header', environ.get('HTTP_CUSTOM_HEADER'))
49484Szelenkov@nginx.com    ])
50484Szelenkov@nginx.com    return [body]
51484Szelenkov@nginx.com
52484Szelenkov@nginx.com""", 'py_app'
53484Szelenkov@nginx.com
54484Szelenkov@nginx.com        self.python_application(name, code)
55495Szelenkov@nginx.com        self.put('/', self.conf % (self.testdir + '/' + name))
56484Szelenkov@nginx.com
57484Szelenkov@nginx.com        body = 'Test body string.'
58484Szelenkov@nginx.com
59484Szelenkov@nginx.com        r = unit.TestUnitHTTP.post(headers={
60484Szelenkov@nginx.com            'Host': 'localhost',
61484Szelenkov@nginx.com            'Content-Type': 'text/html',
62484Szelenkov@nginx.com            'Custom-Header': 'blah'
63484Szelenkov@nginx.com        }, data=body)
64484Szelenkov@nginx.com
65484Szelenkov@nginx.com        self.assertEqual(r.status_code, 200, 'status')
66495Szelenkov@nginx.com        headers = dict(r.headers)
67495Szelenkov@nginx.com        self.assertRegex(headers.pop('Server'), r'unit/[\d\.]+',
68495Szelenkov@nginx.com            'server header')
69495Szelenkov@nginx.com        self.assertDictEqual(headers, {
70495Szelenkov@nginx.com            'Content-Length': str(len(body)),
71495Szelenkov@nginx.com            'Content-Type': 'text/html',
72495Szelenkov@nginx.com            'Request-Method': 'POST',
73495Szelenkov@nginx.com            'Request-Uri': '/',
74495Szelenkov@nginx.com            'Path-Info': '/',
75495Szelenkov@nginx.com            'Http-Host': 'localhost',
76495Szelenkov@nginx.com            'Server-Name': 'localhost',
77495Szelenkov@nginx.com            'Remote-Addr': '127.0.0.1',
78495Szelenkov@nginx.com            'Server-Protocol': 'HTTP/1.1',
79495Szelenkov@nginx.com            'Custom-Header': 'blah'
80495Szelenkov@nginx.com        }, 'headers')
81495Szelenkov@nginx.com        self.assertEqual(r.content, str.encode(body), 'body')
82484Szelenkov@nginx.com
83495Szelenkov@nginx.com    @unittest.expectedFailure
84495Szelenkov@nginx.com    def test_python_application_server_port(self):
85495Szelenkov@nginx.com        code, name = """
86495Szelenkov@nginx.com
87495Szelenkov@nginx.comdef application(environ, start_response):
88484Szelenkov@nginx.com
89495Szelenkov@nginx.com    start_response('200 OK', [
90495Szelenkov@nginx.com        ('Content-Type', 'text/html'),
91495Szelenkov@nginx.com        ('Server-Port', environ.get('SERVER_PORT'))
92495Szelenkov@nginx.com    ])
93495Szelenkov@nginx.com    return []
94495Szelenkov@nginx.com
95495Szelenkov@nginx.com""", 'py_app'
96495Szelenkov@nginx.com
97495Szelenkov@nginx.com        self.python_application(name, code)
98495Szelenkov@nginx.com        self.put('/', self.conf % (self.testdir + '/' + name))
99495Szelenkov@nginx.com
100495Szelenkov@nginx.com        r = unit.TestUnitHTTP.get(headers={'Host': 'localhost'})
101495Szelenkov@nginx.com
102495Szelenkov@nginx.com        self.assertEqual(r.headers.pop('Server-Port'), '7080',
103495Szelenkov@nginx.com            'Server-Port header')
104484Szelenkov@nginx.com
105*496Szelenkov@nginx.com    @unittest.expectedFailure
106*496Szelenkov@nginx.com    def test_python_application_204_transfer_encoding(self):
107*496Szelenkov@nginx.com        code, name = """
108*496Szelenkov@nginx.com
109*496Szelenkov@nginx.comdef application(environ, start_response):
110*496Szelenkov@nginx.com
111*496Szelenkov@nginx.com    start_response('204 No Content', [])
112*496Szelenkov@nginx.com    return []
113*496Szelenkov@nginx.com
114*496Szelenkov@nginx.com""", 'py_app'
115*496Szelenkov@nginx.com
116*496Szelenkov@nginx.com        self.python_application(name, code)
117*496Szelenkov@nginx.com        self.put('/', self.conf % (self.testdir + '/' + name))
118*496Szelenkov@nginx.com
119*496Szelenkov@nginx.com        r = unit.TestUnitHTTP.get(headers={'Host': 'localhost'})
120*496Szelenkov@nginx.com        self.assertNotIn('Transfer-Encoding', r.headers,
121*496Szelenkov@nginx.com            '204 header transfer encoding')
122484Szelenkov@nginx.com
123484Szelenkov@nginx.comif __name__ == '__main__':
124484Szelenkov@nginx.com    unittest.main()
125