12187Szelenkov@nginx.comimport time 22187Szelenkov@nginx.com 32187Szelenkov@nginx.comimport pytest 42187Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython 52187Szelenkov@nginx.comfrom unit.option import option 62187Szelenkov@nginx.comfrom unit.status import Status 72187Szelenkov@nginx.com 82187Szelenkov@nginx.com 92187Szelenkov@nginx.comclass TestStatus(TestApplicationPython): 102187Szelenkov@nginx.com prerequisites = {'modules': {'python': 'any'}} 112187Szelenkov@nginx.com 122205Szelenkov@nginx.com def check_connections(self, accepted, active, idle, closed): 132205Szelenkov@nginx.com Status.get('/connections') == { 142205Szelenkov@nginx.com 'accepted': accepted, 152205Szelenkov@nginx.com 'active': active, 162205Szelenkov@nginx.com 'idle': idle, 172205Szelenkov@nginx.com 'closed': closed, 182205Szelenkov@nginx.com } 192205Szelenkov@nginx.com 202205Szelenkov@nginx.com def app_default(self, name="empty", module="wsgi"): 212205Szelenkov@nginx.com return { 222205Szelenkov@nginx.com "type": self.get_application_type(), 232205Szelenkov@nginx.com "processes": {"spare": 0}, 242205Szelenkov@nginx.com "path": option.test_dir + "/python/" + name, 252205Szelenkov@nginx.com "working_directory": option.test_dir + "/python/" + name, 262205Szelenkov@nginx.com "module": module, 272205Szelenkov@nginx.com } 282205Szelenkov@nginx.com 292187Szelenkov@nginx.com def test_status(self): 302187Szelenkov@nginx.com assert 'error' in self.conf_delete('/status'), 'DELETE method' 312187Szelenkov@nginx.com 322187Szelenkov@nginx.com def test_status_requests(self, skip_alert): 332187Szelenkov@nginx.com skip_alert(r'Python failed to import module "blah"') 342187Szelenkov@nginx.com 352187Szelenkov@nginx.com assert 'success' in self.conf( 362187Szelenkov@nginx.com { 372187Szelenkov@nginx.com "listeners": { 382187Szelenkov@nginx.com "*:7080": {"pass": "routes"}, 392187Szelenkov@nginx.com "*:7081": {"pass": "applications/empty"}, 402187Szelenkov@nginx.com "*:7082": {"pass": "applications/blah"}, 412187Szelenkov@nginx.com }, 422187Szelenkov@nginx.com "routes": [{"action": {"return": 200}}], 432187Szelenkov@nginx.com "applications": { 442205Szelenkov@nginx.com "empty": self.app_default(), 452187Szelenkov@nginx.com "blah": { 462187Szelenkov@nginx.com "type": self.get_application_type(), 472187Szelenkov@nginx.com "processes": {"spare": 0}, 482187Szelenkov@nginx.com "module": "blah", 492187Szelenkov@nginx.com }, 502187Szelenkov@nginx.com }, 512187Szelenkov@nginx.com }, 522187Szelenkov@nginx.com ) 532187Szelenkov@nginx.com 542187Szelenkov@nginx.com Status.init() 552187Szelenkov@nginx.com 562187Szelenkov@nginx.com assert self.get()['status'] == 200 572187Szelenkov@nginx.com assert Status.get('/requests/total') == 1, '2xx' 582187Szelenkov@nginx.com 592187Szelenkov@nginx.com assert self.get(port=7081)['status'] == 200 602187Szelenkov@nginx.com assert Status.get('/requests/total') == 2, '2xx app' 612187Szelenkov@nginx.com 622187Szelenkov@nginx.com assert ( 632187Szelenkov@nginx.com self.get(headers={'Host': '/', 'Connection': 'close'})['status'] 642187Szelenkov@nginx.com == 400 652187Szelenkov@nginx.com ) 662187Szelenkov@nginx.com assert Status.get('/requests/total') == 3, '4xx' 672187Szelenkov@nginx.com 682187Szelenkov@nginx.com assert self.get(port=7082)['status'] == 503 692187Szelenkov@nginx.com assert Status.get('/requests/total') == 4, '5xx' 702187Szelenkov@nginx.com 712187Szelenkov@nginx.com self.http( 722187Szelenkov@nginx.com b"""GET / HTTP/1.1 732187Szelenkov@nginx.comHost: localhost 742187Szelenkov@nginx.com 752187Szelenkov@nginx.comGET / HTTP/1.1 762187Szelenkov@nginx.comHost: localhost 772187Szelenkov@nginx.comConnection: close 782187Szelenkov@nginx.com 792187Szelenkov@nginx.com""", 802187Szelenkov@nginx.com raw=True, 812187Szelenkov@nginx.com ) 822187Szelenkov@nginx.com assert Status.get('/requests/total') == 6, 'pipeline' 832187Szelenkov@nginx.com 84*2212Szelenkov@nginx.com sock = self.get(port=7081, no_recv=True) 852187Szelenkov@nginx.com 862187Szelenkov@nginx.com time.sleep(1) 872187Szelenkov@nginx.com 882187Szelenkov@nginx.com assert Status.get('/requests/total') == 7, 'no receive' 892187Szelenkov@nginx.com 902187Szelenkov@nginx.com sock.close() 912187Szelenkov@nginx.com 922187Szelenkov@nginx.com def test_status_connections(self): 932187Szelenkov@nginx.com assert 'success' in self.conf( 942187Szelenkov@nginx.com { 952187Szelenkov@nginx.com "listeners": { 962187Szelenkov@nginx.com "*:7080": {"pass": "routes"}, 972187Szelenkov@nginx.com "*:7081": {"pass": "applications/delayed"}, 982187Szelenkov@nginx.com }, 992187Szelenkov@nginx.com "routes": [{"action": {"return": 200}}], 1002187Szelenkov@nginx.com "applications": { 1012205Szelenkov@nginx.com "delayed": self.app_default("delayed"), 1022187Szelenkov@nginx.com }, 1032187Szelenkov@nginx.com }, 1042187Szelenkov@nginx.com ) 1052187Szelenkov@nginx.com 1062187Szelenkov@nginx.com Status.init() 1072187Szelenkov@nginx.com 1082187Szelenkov@nginx.com # accepted, closed 1092187Szelenkov@nginx.com 1102187Szelenkov@nginx.com assert self.get()['status'] == 200 1112205Szelenkov@nginx.com self.check_connections(1, 0, 0, 1) 1122187Szelenkov@nginx.com 1132187Szelenkov@nginx.com # idle 1142187Szelenkov@nginx.com 115*2212Szelenkov@nginx.com sock = self.http(b'', raw=True, no_recv=True) 1162205Szelenkov@nginx.com self.check_connections(2, 0, 1, 1) 1172187Szelenkov@nginx.com 1182187Szelenkov@nginx.com self.get(sock=sock) 1192205Szelenkov@nginx.com self.check_connections(2, 0, 0, 2) 1202187Szelenkov@nginx.com 1212187Szelenkov@nginx.com # active 1222187Szelenkov@nginx.com 1232187Szelenkov@nginx.com (_, sock) = self.get( 1242187Szelenkov@nginx.com headers={ 1252187Szelenkov@nginx.com 'Host': 'localhost', 1262187Szelenkov@nginx.com 'X-Delay': '2', 1272187Szelenkov@nginx.com 'Connection': 'close', 1282187Szelenkov@nginx.com }, 1292187Szelenkov@nginx.com port=7081, 1302187Szelenkov@nginx.com start=True, 1312187Szelenkov@nginx.com read_timeout=1, 1322187Szelenkov@nginx.com ) 1332205Szelenkov@nginx.com self.check_connections(3, 1, 0, 2) 1342187Szelenkov@nginx.com 1352187Szelenkov@nginx.com self.get(sock=sock) 1362205Szelenkov@nginx.com self.check_connections(3, 0, 0, 3) 1372187Szelenkov@nginx.com 1382187Szelenkov@nginx.com def test_status_applications(self): 1392187Szelenkov@nginx.com def check_applications(expert): 1402187Szelenkov@nginx.com apps = list(self.conf_get('/status/applications').keys()).sort() 1412187Szelenkov@nginx.com assert apps == expert.sort() 1422187Szelenkov@nginx.com 1432187Szelenkov@nginx.com def check_application(name, running, starting, idle, active): 1442187Szelenkov@nginx.com Status.get('/applications/' + name) == { 1452187Szelenkov@nginx.com 'processes': { 1462187Szelenkov@nginx.com 'running': running, 1472187Szelenkov@nginx.com 'starting': starting, 1482187Szelenkov@nginx.com 'idle': idle, 1492187Szelenkov@nginx.com }, 1502187Szelenkov@nginx.com 'requests': {'active': active}, 1512187Szelenkov@nginx.com } 1522187Szelenkov@nginx.com 1532187Szelenkov@nginx.com self.load('delayed') 1542187Szelenkov@nginx.com Status.init() 1552187Szelenkov@nginx.com 1562187Szelenkov@nginx.com check_applications(['delayed']) 1572187Szelenkov@nginx.com check_application('delayed', 0, 0, 0, 0) 1582187Szelenkov@nginx.com 1592187Szelenkov@nginx.com # idle 1602187Szelenkov@nginx.com 1612187Szelenkov@nginx.com assert self.get()['status'] == 200 1622187Szelenkov@nginx.com check_application('delayed', 1, 0, 1, 0) 1632187Szelenkov@nginx.com 1642187Szelenkov@nginx.com assert 'success' in self.conf('4', 'applications/delayed/processes') 1652187Szelenkov@nginx.com check_application('delayed', 4, 0, 4, 0) 1662187Szelenkov@nginx.com 1672187Szelenkov@nginx.com # active 1682187Szelenkov@nginx.com 1692187Szelenkov@nginx.com (_, sock) = self.get( 1702187Szelenkov@nginx.com headers={ 1712187Szelenkov@nginx.com 'Host': 'localhost', 1722187Szelenkov@nginx.com 'X-Delay': '2', 1732187Szelenkov@nginx.com 'Connection': 'close', 1742187Szelenkov@nginx.com }, 1752187Szelenkov@nginx.com start=True, 1762187Szelenkov@nginx.com read_timeout=1, 1772187Szelenkov@nginx.com ) 1782187Szelenkov@nginx.com check_application('delayed', 4, 0, 3, 1) 1792187Szelenkov@nginx.com sock.close() 1802187Szelenkov@nginx.com 1812187Szelenkov@nginx.com # starting 1822187Szelenkov@nginx.com 1832187Szelenkov@nginx.com assert 'success' in self.conf( 1842187Szelenkov@nginx.com { 1852187Szelenkov@nginx.com "listeners": { 1862187Szelenkov@nginx.com "*:7080": {"pass": "applications/restart"}, 1872187Szelenkov@nginx.com "*:7081": {"pass": "applications/delayed"}, 1882187Szelenkov@nginx.com }, 1892187Szelenkov@nginx.com "routes": [], 1902187Szelenkov@nginx.com "applications": { 1912205Szelenkov@nginx.com "restart": self.app_default("restart", "longstart"), 1922205Szelenkov@nginx.com "delayed": self.app_default("delayed"), 1932187Szelenkov@nginx.com }, 1942187Szelenkov@nginx.com }, 1952187Szelenkov@nginx.com ) 1962187Szelenkov@nginx.com Status.init() 1972187Szelenkov@nginx.com 1982187Szelenkov@nginx.com check_applications(['delayed', 'restart']) 1992187Szelenkov@nginx.com check_application('restart', 0, 0, 0, 0) 2002187Szelenkov@nginx.com check_application('delayed', 0, 0, 0, 0) 2012187Szelenkov@nginx.com 2022187Szelenkov@nginx.com self.get(read_timeout=1) 2032187Szelenkov@nginx.com 2042187Szelenkov@nginx.com check_application('restart', 0, 1, 0, 1) 2052187Szelenkov@nginx.com check_application('delayed', 0, 0, 0, 0) 2062205Szelenkov@nginx.com 2072205Szelenkov@nginx.com def test_status_proxy(self): 2082205Szelenkov@nginx.com assert 'success' in self.conf( 2092205Szelenkov@nginx.com { 2102205Szelenkov@nginx.com "listeners": { 2112205Szelenkov@nginx.com "*:7080": {"pass": "routes"}, 2122205Szelenkov@nginx.com "*:7081": {"pass": "applications/empty"}, 2132205Szelenkov@nginx.com }, 2142205Szelenkov@nginx.com "routes": [ 2152205Szelenkov@nginx.com { 2162205Szelenkov@nginx.com "match": {"uri": "/"}, 2172205Szelenkov@nginx.com "action": {"proxy": "http://127.0.0.1:7081"}, 2182205Szelenkov@nginx.com } 2192205Szelenkov@nginx.com ], 2202205Szelenkov@nginx.com "applications": { 2212205Szelenkov@nginx.com "empty": self.app_default(), 2222205Szelenkov@nginx.com }, 2232205Szelenkov@nginx.com }, 2242205Szelenkov@nginx.com ) 2252205Szelenkov@nginx.com 2262205Szelenkov@nginx.com Status.init() 2272205Szelenkov@nginx.com 2282205Szelenkov@nginx.com assert self.get()['status'] == 200 2292205Szelenkov@nginx.com self.check_connections(2, 0, 0, 2) 2302205Szelenkov@nginx.com assert Status.get('/requests/total') == 2, 'proxy' 231