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