1*2187Szelenkov@nginx.comimport time 2*2187Szelenkov@nginx.com 3*2187Szelenkov@nginx.comimport pytest 4*2187Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython 5*2187Szelenkov@nginx.comfrom unit.option import option 6*2187Szelenkov@nginx.comfrom unit.status import Status 7*2187Szelenkov@nginx.com 8*2187Szelenkov@nginx.com 9*2187Szelenkov@nginx.comclass TestStatus(TestApplicationPython): 10*2187Szelenkov@nginx.com prerequisites = {'modules': {'python': 'any'}} 11*2187Szelenkov@nginx.com 12*2187Szelenkov@nginx.com def test_status(self): 13*2187Szelenkov@nginx.com assert 'error' in self.conf_delete('/status'), 'DELETE method' 14*2187Szelenkov@nginx.com 15*2187Szelenkov@nginx.com def test_status_requests(self, skip_alert): 16*2187Szelenkov@nginx.com skip_alert(r'Python failed to import module "blah"') 17*2187Szelenkov@nginx.com 18*2187Szelenkov@nginx.com assert 'success' in self.conf( 19*2187Szelenkov@nginx.com { 20*2187Szelenkov@nginx.com "listeners": { 21*2187Szelenkov@nginx.com "*:7080": {"pass": "routes"}, 22*2187Szelenkov@nginx.com "*:7081": {"pass": "applications/empty"}, 23*2187Szelenkov@nginx.com "*:7082": {"pass": "applications/blah"}, 24*2187Szelenkov@nginx.com }, 25*2187Szelenkov@nginx.com "routes": [{"action": {"return": 200}}], 26*2187Szelenkov@nginx.com "applications": { 27*2187Szelenkov@nginx.com "empty": { 28*2187Szelenkov@nginx.com "type": self.get_application_type(), 29*2187Szelenkov@nginx.com "processes": {"spare": 0}, 30*2187Szelenkov@nginx.com "path": option.test_dir + '/python/empty', 31*2187Szelenkov@nginx.com "working_directory": option.test_dir + '/python/empty', 32*2187Szelenkov@nginx.com "module": "wsgi", 33*2187Szelenkov@nginx.com }, 34*2187Szelenkov@nginx.com "blah": { 35*2187Szelenkov@nginx.com "type": self.get_application_type(), 36*2187Szelenkov@nginx.com "processes": {"spare": 0}, 37*2187Szelenkov@nginx.com "module": "blah", 38*2187Szelenkov@nginx.com }, 39*2187Szelenkov@nginx.com }, 40*2187Szelenkov@nginx.com }, 41*2187Szelenkov@nginx.com ) 42*2187Szelenkov@nginx.com 43*2187Szelenkov@nginx.com Status.init() 44*2187Szelenkov@nginx.com 45*2187Szelenkov@nginx.com assert self.get()['status'] == 200 46*2187Szelenkov@nginx.com assert Status.get('/requests/total') == 1, '2xx' 47*2187Szelenkov@nginx.com 48*2187Szelenkov@nginx.com assert self.get(port=7081)['status'] == 200 49*2187Szelenkov@nginx.com assert Status.get('/requests/total') == 2, '2xx app' 50*2187Szelenkov@nginx.com 51*2187Szelenkov@nginx.com assert ( 52*2187Szelenkov@nginx.com self.get(headers={'Host': '/', 'Connection': 'close'})['status'] 53*2187Szelenkov@nginx.com == 400 54*2187Szelenkov@nginx.com ) 55*2187Szelenkov@nginx.com assert Status.get('/requests/total') == 3, '4xx' 56*2187Szelenkov@nginx.com 57*2187Szelenkov@nginx.com assert self.get(port=7082)['status'] == 503 58*2187Szelenkov@nginx.com assert Status.get('/requests/total') == 4, '5xx' 59*2187Szelenkov@nginx.com 60*2187Szelenkov@nginx.com self.http( 61*2187Szelenkov@nginx.com b"""GET / HTTP/1.1 62*2187Szelenkov@nginx.comHost: localhost 63*2187Szelenkov@nginx.com 64*2187Szelenkov@nginx.comGET / HTTP/1.1 65*2187Szelenkov@nginx.comHost: localhost 66*2187Szelenkov@nginx.comConnection: close 67*2187Szelenkov@nginx.com 68*2187Szelenkov@nginx.com""", 69*2187Szelenkov@nginx.com raw=True, 70*2187Szelenkov@nginx.com ) 71*2187Szelenkov@nginx.com assert Status.get('/requests/total') == 6, 'pipeline' 72*2187Szelenkov@nginx.com 73*2187Szelenkov@nginx.com (_, sock) = self.get(port=7081, no_recv=True, start=True) 74*2187Szelenkov@nginx.com 75*2187Szelenkov@nginx.com time.sleep(1) 76*2187Szelenkov@nginx.com 77*2187Szelenkov@nginx.com assert Status.get('/requests/total') == 7, 'no receive' 78*2187Szelenkov@nginx.com 79*2187Szelenkov@nginx.com sock.close() 80*2187Szelenkov@nginx.com 81*2187Szelenkov@nginx.com def test_status_connections(self): 82*2187Szelenkov@nginx.com def check_connections(accepted, active, idle, closed): 83*2187Szelenkov@nginx.com Status.get('/connections') == { 84*2187Szelenkov@nginx.com 'accepted': accepted, 85*2187Szelenkov@nginx.com 'active': active, 86*2187Szelenkov@nginx.com 'idle': idle, 87*2187Szelenkov@nginx.com 'closed': closed, 88*2187Szelenkov@nginx.com } 89*2187Szelenkov@nginx.com 90*2187Szelenkov@nginx.com assert 'success' in self.conf( 91*2187Szelenkov@nginx.com { 92*2187Szelenkov@nginx.com "listeners": { 93*2187Szelenkov@nginx.com "*:7080": {"pass": "routes"}, 94*2187Szelenkov@nginx.com "*:7081": {"pass": "applications/delayed"}, 95*2187Szelenkov@nginx.com }, 96*2187Szelenkov@nginx.com "routes": [{"action": {"return": 200}}], 97*2187Szelenkov@nginx.com "applications": { 98*2187Szelenkov@nginx.com "delayed": { 99*2187Szelenkov@nginx.com "type": self.get_application_type(), 100*2187Szelenkov@nginx.com "processes": {"spare": 0}, 101*2187Szelenkov@nginx.com "path": option.test_dir + "/python/delayed", 102*2187Szelenkov@nginx.com "working_directory": option.test_dir 103*2187Szelenkov@nginx.com + "/python/delayed", 104*2187Szelenkov@nginx.com "module": "wsgi", 105*2187Szelenkov@nginx.com }, 106*2187Szelenkov@nginx.com }, 107*2187Szelenkov@nginx.com }, 108*2187Szelenkov@nginx.com ) 109*2187Szelenkov@nginx.com 110*2187Szelenkov@nginx.com Status.init() 111*2187Szelenkov@nginx.com 112*2187Szelenkov@nginx.com # accepted, closed 113*2187Szelenkov@nginx.com 114*2187Szelenkov@nginx.com assert self.get()['status'] == 200 115*2187Szelenkov@nginx.com check_connections(1, 0, 0, 1) 116*2187Szelenkov@nginx.com 117*2187Szelenkov@nginx.com # idle 118*2187Szelenkov@nginx.com 119*2187Szelenkov@nginx.com _, sock = self.http(b'', start=True, raw=True, no_recv=True) 120*2187Szelenkov@nginx.com check_connections(2, 0, 1, 1) 121*2187Szelenkov@nginx.com 122*2187Szelenkov@nginx.com self.get(sock=sock) 123*2187Szelenkov@nginx.com check_connections(2, 0, 0, 2) 124*2187Szelenkov@nginx.com 125*2187Szelenkov@nginx.com # active 126*2187Szelenkov@nginx.com 127*2187Szelenkov@nginx.com (_, sock) = self.get( 128*2187Szelenkov@nginx.com headers={ 129*2187Szelenkov@nginx.com 'Host': 'localhost', 130*2187Szelenkov@nginx.com 'X-Delay': '2', 131*2187Szelenkov@nginx.com 'Connection': 'close', 132*2187Szelenkov@nginx.com }, 133*2187Szelenkov@nginx.com port=7081, 134*2187Szelenkov@nginx.com start=True, 135*2187Szelenkov@nginx.com read_timeout=1, 136*2187Szelenkov@nginx.com ) 137*2187Szelenkov@nginx.com check_connections(3, 1, 0, 2) 138*2187Szelenkov@nginx.com 139*2187Szelenkov@nginx.com self.get(sock=sock) 140*2187Szelenkov@nginx.com check_connections(3, 0, 0, 3) 141*2187Szelenkov@nginx.com 142*2187Szelenkov@nginx.com def test_status_applications(self): 143*2187Szelenkov@nginx.com def check_applications(expert): 144*2187Szelenkov@nginx.com apps = list(self.conf_get('/status/applications').keys()).sort() 145*2187Szelenkov@nginx.com assert apps == expert.sort() 146*2187Szelenkov@nginx.com 147*2187Szelenkov@nginx.com def check_application(name, running, starting, idle, active): 148*2187Szelenkov@nginx.com Status.get('/applications/' + name) == { 149*2187Szelenkov@nginx.com 'processes': { 150*2187Szelenkov@nginx.com 'running': running, 151*2187Szelenkov@nginx.com 'starting': starting, 152*2187Szelenkov@nginx.com 'idle': idle, 153*2187Szelenkov@nginx.com }, 154*2187Szelenkov@nginx.com 'requests': {'active': active}, 155*2187Szelenkov@nginx.com } 156*2187Szelenkov@nginx.com 157*2187Szelenkov@nginx.com self.load('delayed') 158*2187Szelenkov@nginx.com Status.init() 159*2187Szelenkov@nginx.com 160*2187Szelenkov@nginx.com check_applications(['delayed']) 161*2187Szelenkov@nginx.com check_application('delayed', 0, 0, 0, 0) 162*2187Szelenkov@nginx.com 163*2187Szelenkov@nginx.com # idle 164*2187Szelenkov@nginx.com 165*2187Szelenkov@nginx.com assert self.get()['status'] == 200 166*2187Szelenkov@nginx.com check_application('delayed', 1, 0, 1, 0) 167*2187Szelenkov@nginx.com 168*2187Szelenkov@nginx.com assert 'success' in self.conf('4', 'applications/delayed/processes') 169*2187Szelenkov@nginx.com check_application('delayed', 4, 0, 4, 0) 170*2187Szelenkov@nginx.com 171*2187Szelenkov@nginx.com # active 172*2187Szelenkov@nginx.com 173*2187Szelenkov@nginx.com (_, sock) = self.get( 174*2187Szelenkov@nginx.com headers={ 175*2187Szelenkov@nginx.com 'Host': 'localhost', 176*2187Szelenkov@nginx.com 'X-Delay': '2', 177*2187Szelenkov@nginx.com 'Connection': 'close', 178*2187Szelenkov@nginx.com }, 179*2187Szelenkov@nginx.com start=True, 180*2187Szelenkov@nginx.com read_timeout=1, 181*2187Szelenkov@nginx.com ) 182*2187Szelenkov@nginx.com check_application('delayed', 4, 0, 3, 1) 183*2187Szelenkov@nginx.com sock.close() 184*2187Szelenkov@nginx.com 185*2187Szelenkov@nginx.com # starting 186*2187Szelenkov@nginx.com 187*2187Szelenkov@nginx.com assert 'success' in self.conf( 188*2187Szelenkov@nginx.com { 189*2187Szelenkov@nginx.com "listeners": { 190*2187Szelenkov@nginx.com "*:7080": {"pass": "applications/restart"}, 191*2187Szelenkov@nginx.com "*:7081": {"pass": "applications/delayed"}, 192*2187Szelenkov@nginx.com }, 193*2187Szelenkov@nginx.com "routes": [], 194*2187Szelenkov@nginx.com "applications": { 195*2187Szelenkov@nginx.com "restart": { 196*2187Szelenkov@nginx.com "type": self.get_application_type(), 197*2187Szelenkov@nginx.com "processes": {"spare": 0}, 198*2187Szelenkov@nginx.com "path": option.test_dir + "/python/restart", 199*2187Szelenkov@nginx.com "working_directory": option.test_dir 200*2187Szelenkov@nginx.com + "/python/restart", 201*2187Szelenkov@nginx.com "module": "longstart", 202*2187Szelenkov@nginx.com }, 203*2187Szelenkov@nginx.com "delayed": { 204*2187Szelenkov@nginx.com "type": self.get_application_type(), 205*2187Szelenkov@nginx.com "processes": {"spare": 0}, 206*2187Szelenkov@nginx.com "path": option.test_dir + "/python/delayed", 207*2187Szelenkov@nginx.com "working_directory": option.test_dir 208*2187Szelenkov@nginx.com + "/python/delayed", 209*2187Szelenkov@nginx.com "module": "wsgi", 210*2187Szelenkov@nginx.com }, 211*2187Szelenkov@nginx.com }, 212*2187Szelenkov@nginx.com }, 213*2187Szelenkov@nginx.com ) 214*2187Szelenkov@nginx.com Status.init() 215*2187Szelenkov@nginx.com 216*2187Szelenkov@nginx.com check_applications(['delayed', 'restart']) 217*2187Szelenkov@nginx.com check_application('restart', 0, 0, 0, 0) 218*2187Szelenkov@nginx.com check_application('delayed', 0, 0, 0, 0) 219*2187Szelenkov@nginx.com 220*2187Szelenkov@nginx.com self.get(read_timeout=1) 221*2187Szelenkov@nginx.com 222*2187Szelenkov@nginx.com check_application('restart', 0, 1, 0, 1) 223*2187Szelenkov@nginx.com check_application('delayed', 0, 0, 0, 0) 224