xref: /unit/test/test_status.py (revision 2212)
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