1import unittest 2import unit 3 4class TestUnitNodeApplication(unit.TestUnitApplicationNode): 5 6 def setUpClass(): 7 u = unit.TestUnit().check_modules('node') 8 9 def test_node_application_basic(self): 10 self.load('basic') 11 12 resp = self.get() 13 self.assertEqual(resp['headers']['Content-Type'], 'text/plain', 14 'basic header') 15 self.assertEqual(resp['body'], 'Hello World\n', 'basic body') 16 17 def test_node_application_seq(self): 18 self.load('basic') 19 20 self.assertEqual(self.get()['status'], 200, 'seq') 21 self.assertEqual(self.get()['status'], 200, 'seq 2') 22 23 def test_node_application_variables(self): 24 self.load('variables') 25 26 body = 'Test body string.' 27 28 resp = self.post(headers={ 29 'Host': 'localhost', 30 'Content-Type': 'text/html', 31 'Custom-Header': 'blah' 32 }, body=body) 33 34 self.assertEqual(resp['status'], 200, 'status') 35 headers = resp['headers'] 36 header_server = headers.pop('Server') 37 self.assertRegex(header_server, r'Unit/[\d\.]+', 'server header') 38 39 date = headers.pop('Date') 40 self.assertEqual(date[-4:], ' GMT', 'date header timezone') 41 self.assertLess(abs(self.date_to_sec_epoch(date) - self.sec_epoch()), 5, 42 'date header') 43 44 raw_headers = headers.pop('Request-Raw-Headers') 45 self.assertRegex(raw_headers, r'^(?:Host|localhost|Content-Type|' \ 46 'text\/html|Custom-Header|blah|Content-Length|17|,)+$', 47 'raw headers') 48 49 self.assertDictEqual(headers, { 50 'Content-Length': str(len(body)), 51 'Content-Type': 'text/html', 52 'Request-Method': 'POST', 53 'Request-Uri': '/', 54 'Http-Host': 'localhost', 55 'Server-Protocol': 'HTTP/1.1', 56 'Custom-Header': 'blah' 57 }, 'headers') 58 self.assertEqual(resp['body'], body, 'body') 59 60 def test_node_application_get_variables(self): 61 self.load('get_variables') 62 63 resp = self.get(url='/?var1=val1&var2=&var3') 64 self.assertEqual(resp['headers']['X-Var-1'], 'val1', 'GET variables') 65 self.assertEqual(resp['headers']['X-Var-2'], '', 'GET variables 2') 66 self.assertEqual(resp['headers']['X-Var-3'], '', 'GET variables 3') 67 68 def test_node_application_post_variables(self): 69 self.load('post_variables') 70 71 resp = self.post(headers={ 72 'Content-Type': 'application/x-www-form-urlencoded', 73 'Host': 'localhost', 74 'Connection': 'close' 75 }, body='var1=val1&var2=&var3') 76 77 self.assertEqual(resp['headers']['X-Var-1'], 'val1', 'POST variables') 78 self.assertEqual(resp['headers']['X-Var-2'], '', 'POST variables 2') 79 self.assertEqual(resp['headers']['X-Var-3'], '', 'POST variables 3') 80 81 def test_node_application_404(self): 82 self.load('404') 83 84 resp = self.get() 85 86 self.assertEqual(resp['status'], 404, '404 status') 87 self.assertRegex(resp['body'], r'<title>404 Not Found</title>', 88 '404 body') 89 90 def test_node_keepalive_body(self): 91 self.load('mirror') 92 93 (resp, sock) = self.post(headers={ 94 'Connection': 'keep-alive', 95 'Content-Type': 'text/html', 96 'Host': 'localhost' 97 }, start=True, body='0123456789' * 500) 98 99 self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1') 100 101 resp = self.post(headers={ 102 'Connection': 'close', 103 'Content-Type': 'text/html', 104 'Host': 'localhost' 105 }, sock=sock, body='0123456789') 106 107 self.assertEqual(resp['body'], '0123456789', 'keep-alive 2') 108 109 def test_node_application_write_buffer(self): 110 self.load('write_buffer') 111 112 self.assertEqual(self.get()['body'], '6\r\nbuffer\r\n0\r\n\r\n', 113 'write buffer') 114 115 def test_node_application_write_callback(self): 116 self.load('write_callback') 117 118 self.assertEqual(self.get()['body'], 119 '5\r\nhello\r\n5\r\nworld\r\n0\r\n\r\n', 'write callback order') 120 self.assertTrue(self.waitforfiles(self.testdir + '/node/callback'), 121 'write callback') 122 123 def test_node_application_write_before_write_head(self): 124 self.load('write_before_write_head') 125 126 self.assertEqual(self.get()['status'], 200, 'write before writeHead') 127 128 def test_node_application_double_end(self): 129 self.load('double_end') 130 131 self.assertEqual(self.get()['status'], 200, 'double end') 132 self.assertEqual(self.get()['status'], 200, 'double end 2') 133 134 def test_node_application_write_return(self): 135 self.load('write_return') 136 137 self.assertEqual(self.get()['body'], 138 '4\r\nbody\r\n4\r\ntrue\r\n0\r\n\r\n', 'write return') 139 140 def test_node_application_remove_header(self): 141 self.load('remove_header') 142 143 resp = self.get(headers={ 144 'Host': 'localhost', 145 'X-Remove': 'X-Header' 146 }) 147 self.assertEqual(resp['headers']['Was-Header'], 'true', 'was header') 148 self.assertEqual(resp['headers']['Has-Header'], 'false', 'has header') 149 self.assertFalse('X-Header' in resp['headers'], 'remove header') 150 151 def test_node_application_remove_header_nonexisting(self): 152 self.load('remove_header') 153 154 self.assertEqual(self.get(headers={ 155 'Host': 'localhost', 156 'X-Remove': 'blah' 157 })['headers']['Has-Header'], 'true', 'remove header nonexisting') 158 159 def test_node_application_update_header(self): 160 self.load('update_header') 161 162 self.assertEqual(self.get()['headers']['X-Header'], 'new', 163 'update header') 164 165 def test_node_application_set_header_array(self): 166 self.load('set_header_array') 167 168 self.assertListEqual(self.get()['headers']['Set-Cookie'], 169 ['tc=one,two,three', 'tc=four,five,six'], 'set header array') 170 171 @unittest.expectedFailure 172 def test_node_application_status_message(self): 173 self.load('status_message') 174 175 self.assertRegex(self.get(raw_resp=True), r'200 blah', 'status message') 176 177 def test_node_application_get_header_type(self): 178 self.load('get_header_type') 179 180 self.assertEqual(self.get()['headers']['X-Type'], 'number', 181 'get header type') 182 183 def test_node_application_header_name_case(self): 184 self.load('header_name_case') 185 186 headers = self.get()['headers'] 187 188 self.assertEqual(headers['X-HEADER'], '3', 'header value') 189 self.assertNotIn('X-Header', headers, 'insensitive') 190 self.assertNotIn('X-header', headers, 'insensitive 2') 191 192 def test_node_application_promise_handler(self): 193 self.load('promise_handler') 194 195 self.assertEqual(self.post(headers={ 196 'Host': 'localhost', 197 'Content-Type': 'text/html' 198 }, body='callback')['status'], 200, 'promise handler request') 199 self.assertTrue(self.waitforfiles(self.testdir + '/node/callback'), 200 'promise handler') 201 202 def test_node_application_promise_handler_write_after_end(self): 203 self.load('promise_handler') 204 205 self.assertEqual(self.post(headers={ 206 'Host': 'localhost', 207 'Content-Type': 'text/html', 208 'X-Write-Call': '1' 209 }, body='callback')['status'], 200, 210 'promise handler request write after end') 211 212 def test_node_application_promise_end(self): 213 self.load('promise_end') 214 215 self.assertEqual(self.post(headers={ 216 'Host': 'localhost', 217 'Content-Type': 'text/html' 218 }, body='end')['status'], 200, 'promise end request') 219 self.assertTrue(self.waitforfiles(self.testdir + '/node/callback'), 220 'promise end') 221 222 def test_node_application_promise_multiple_calls(self): 223 self.load('promise_handler') 224 225 self.post(headers={ 226 'Host': 'localhost', 227 'Content-Type': 'text/html' 228 }, body='callback1') 229 230 self.assertTrue(self.waitforfiles(self.testdir + '/node/callback1'), 231 'promise first call') 232 233 self.post(headers={ 234 'Host': 'localhost', 235 'Content-Type': 'text/html' 236 }, body='callback2') 237 238 self.assertTrue(self.waitforfiles(self.testdir + '/node/callback2'), 239 'promise second call') 240 241 @unittest.expectedFailure 242 def test_node_application_header_name_valid(self): 243 self.load('header_name_valid') 244 245 self.assertNotIn('status', self.get(), 'header name valid') 246 247 def test_node_application_header_value_object(self): 248 self.load('header_value_object') 249 250 self.assertIn('X-Header', self.get()['headers'], 'header value object') 251 252 def test_node_application_get_header_names(self): 253 self.load('get_header_names') 254 255 self.assertListEqual(self.get()['headers']['X-Names'], 256 ['date', 'x-header'], 'get header names') 257 258 def test_node_application_has_header(self): 259 self.load('has_header') 260 261 self.assertEqual(self.get(headers={ 262 'Host': 'localhost', 263 'X-Header': 'length' 264 })['headers']['X-Has-Header'], 'false', 'has header length') 265 266 self.assertEqual(self.get(headers={ 267 'Host': 'localhost', 268 'X-Header': 'Date' 269 })['headers']['X-Has-Header'], 'false', 'has header date') 270 271 def test_node_application_write_multiple(self): 272 self.load('write_multiple') 273 274 self.assertEqual(self.get()['body'], 'writewrite2end', 'write multiple') 275 276if __name__ == '__main__': 277 TestUnitNodeApplication.main() 278