xref: /unit/test/test_configuration.py (revision 1006)
1484Szelenkov@nginx.comimport unittest
2484Szelenkov@nginx.comimport unit
3484Szelenkov@nginx.com
4484Szelenkov@nginx.comclass TestUnitConfiguration(unit.TestUnitControl):
5484Szelenkov@nginx.com
6484Szelenkov@nginx.com    def setUpClass():
7550Szelenkov@nginx.com        unit.TestUnit().check_modules('python')
8484Szelenkov@nginx.com
9719Szelenkov@nginx.com    def test_json_empty(self):
10719Szelenkov@nginx.com        self.assertIn('error', self.conf(''), 'empty')
11719Szelenkov@nginx.com
12495Szelenkov@nginx.com    def test_json_leading_zero(self):
13504Szelenkov@nginx.com        self.assertIn('error', self.conf('00'), 'leading zero')
14484Szelenkov@nginx.com
15495Szelenkov@nginx.com    def test_json_unicode(self):
16504Szelenkov@nginx.com        self.assertIn('success', self.conf(b"""
17495Szelenkov@nginx.com            {
18495Szelenkov@nginx.com                "ap\u0070": {
19495Szelenkov@nginx.com                    "type": "\u0070ython",
20507Smax.romanov@nginx.com                    "processes": { "spare": 0 },
21495Szelenkov@nginx.com                    "path": "\u002Fapp",
22495Szelenkov@nginx.com                    "module": "wsgi"
23495Szelenkov@nginx.com                }
24495Szelenkov@nginx.com            }
25760Szelenkov@nginx.com            """, 'applications'), 'unicode')
26484Szelenkov@nginx.com
27760Szelenkov@nginx.com        self.assertDictEqual(self.conf_get('applications'), {
28555Szelenkov@nginx.com            "app": {
29555Szelenkov@nginx.com                "type": "python",
30555Szelenkov@nginx.com                "processes": { "spare": 0 },
31555Szelenkov@nginx.com                "path": "/app",
32555Szelenkov@nginx.com                "module": "wsgi"
33555Szelenkov@nginx.com            }
34555Szelenkov@nginx.com        }, 'unicode get')
35555Szelenkov@nginx.com
36495Szelenkov@nginx.com    def test_json_unicode_2(self):
37504Szelenkov@nginx.com        self.assertIn('success', self.conf({
38504Szelenkov@nginx.com            "приложение": {
39504Szelenkov@nginx.com                "type": "python",
40507Smax.romanov@nginx.com                "processes": { "spare": 0 },
41504Szelenkov@nginx.com                "path": "/app",
42504Szelenkov@nginx.com                "module": "wsgi"
43495Szelenkov@nginx.com            }
44760Szelenkov@nginx.com        }, 'applications'), 'unicode 2')
45495Szelenkov@nginx.com
46760Szelenkov@nginx.com        self.assertIn('приложение', self.conf_get('applications'),
47555Szelenkov@nginx.com            'unicode 2 get')
48555Szelenkov@nginx.com
49495Szelenkov@nginx.com    def test_json_unicode_number(self):
50504Szelenkov@nginx.com        self.assertIn('error', self.conf(b"""
51495Szelenkov@nginx.com            {
52495Szelenkov@nginx.com                "app": {
53495Szelenkov@nginx.com                    "type": "python",
54507Smax.romanov@nginx.com                    "processes": { "spare": \u0030 },
55495Szelenkov@nginx.com                    "path": "/app",
56495Szelenkov@nginx.com                    "module": "wsgi"
57495Szelenkov@nginx.com                }
58495Szelenkov@nginx.com            }
59760Szelenkov@nginx.com            """, 'applications'), 'unicode number')
60495Szelenkov@nginx.com
61495Szelenkov@nginx.com    def test_applications_open_brace(self):
62760Szelenkov@nginx.com        self.assertIn('error', self.conf('{', 'applications'), 'open brace')
63495Szelenkov@nginx.com
64495Szelenkov@nginx.com    def test_applications_string(self):
65760Szelenkov@nginx.com        self.assertIn('error', self.conf('"{}"', 'applications'), 'string')
66495Szelenkov@nginx.com
67495Szelenkov@nginx.com    def test_applications_type_only(self):
68565Szelenkov@nginx.com        self.skip_alerts.extend([
69565Szelenkov@nginx.com            r'python module is empty',
70565Szelenkov@nginx.com            r'failed to apply new conf',
71565Szelenkov@nginx.com            r'process \d+ exited on signal'
72565Szelenkov@nginx.com        ])
73565Szelenkov@nginx.com
74504Szelenkov@nginx.com        self.assertIn('error', self.conf({
75504Szelenkov@nginx.com            "app": {
76504Szelenkov@nginx.com                "type": "python"
77484Szelenkov@nginx.com            }
78760Szelenkov@nginx.com        }, 'applications'), 'type only')
79484Szelenkov@nginx.com
80495Szelenkov@nginx.com    def test_applications_miss_quote(self):
81504Szelenkov@nginx.com        self.assertIn('error', self.conf("""
82484Szelenkov@nginx.com            {
83484Szelenkov@nginx.com                app": {
84484Szelenkov@nginx.com                    "type": "python",
85507Smax.romanov@nginx.com                    "processes": { "spare": 0 },
86484Szelenkov@nginx.com                    "path": "/app",
87484Szelenkov@nginx.com                    "module": "wsgi"
88484Szelenkov@nginx.com                }
89484Szelenkov@nginx.com            }
90760Szelenkov@nginx.com            """, 'applications'), 'miss quote')
91484Szelenkov@nginx.com
92495Szelenkov@nginx.com    def test_applications_miss_colon(self):
93504Szelenkov@nginx.com        self.assertIn('error', self.conf("""
94484Szelenkov@nginx.com            {
95484Szelenkov@nginx.com                "app" {
96484Szelenkov@nginx.com                    "type": "python",
97507Smax.romanov@nginx.com                    "processes": { "spare": 0 },
98484Szelenkov@nginx.com                    "path": "/app",
99484Szelenkov@nginx.com                    "module": "wsgi"
100484Szelenkov@nginx.com                }
101484Szelenkov@nginx.com            }
102760Szelenkov@nginx.com            """, 'applications'), 'miss colon')
103484Szelenkov@nginx.com
104495Szelenkov@nginx.com    def test_applications_miss_comma(self):
105504Szelenkov@nginx.com        self.assertIn('error', self.conf("""
106484Szelenkov@nginx.com            {
107484Szelenkov@nginx.com                "app": {
108484Szelenkov@nginx.com                    "type": "python"
109507Smax.romanov@nginx.com                    "processes": { "spare": 0 },
110484Szelenkov@nginx.com                    "path": "/app",
111484Szelenkov@nginx.com                    "module": "wsgi"
112484Szelenkov@nginx.com                }
113484Szelenkov@nginx.com            }
114760Szelenkov@nginx.com            """, 'applications'), 'miss comma')
115484Szelenkov@nginx.com
116495Szelenkov@nginx.com    def test_applications_skip_spaces(self):
117760Szelenkov@nginx.com        self.assertIn('success', self.conf(b'{ \n\r\t}', 'applications'),
118495Szelenkov@nginx.com            'skip spaces')
119484Szelenkov@nginx.com
120495Szelenkov@nginx.com    def test_applications_relative_path(self):
121504Szelenkov@nginx.com        self.assertIn('success', self.conf({
122504Szelenkov@nginx.com            "app": {
123504Szelenkov@nginx.com                "type": "python",
124507Smax.romanov@nginx.com                "processes": { "spare": 0 },
125504Szelenkov@nginx.com                "path": "../app",
126504Szelenkov@nginx.com                "module": "wsgi"
127484Szelenkov@nginx.com            }
128760Szelenkov@nginx.com        }, 'applications'), 'relative path')
129484Szelenkov@nginx.com
130495Szelenkov@nginx.com    @unittest.expectedFailure
131495Szelenkov@nginx.com    def test_listeners_empty(self):
132565Szelenkov@nginx.com        self.skip_sanitizer = True
133565Szelenkov@nginx.com        self.skip_alerts.extend([
134606Szelenkov@nginx.com            r'failed to apply previous configuration',
135565Szelenkov@nginx.com            r'process \d+ exited on signal'
136565Szelenkov@nginx.com        ])
137565Szelenkov@nginx.com
138760Szelenkov@nginx.com        self.assertIn('error', self.conf({"*:7080":{}}, 'listeners'),
139495Szelenkov@nginx.com            'listener empty')
140484Szelenkov@nginx.com
141495Szelenkov@nginx.com    def test_listeners_no_app(self):
142504Szelenkov@nginx.com        self.assertIn('error', self.conf({"*:7080":{"application":"app"}},
143760Szelenkov@nginx.com            'listeners'), 'listeners no app')
144484Szelenkov@nginx.com
145495Szelenkov@nginx.com    def test_listeners_wildcard(self):
146504Szelenkov@nginx.com        self.assertIn('success', self.conf({
147504Szelenkov@nginx.com            "listeners": {
148504Szelenkov@nginx.com                "*:7080": {
149504Szelenkov@nginx.com                    "application":"app"
150504Szelenkov@nginx.com                }
151504Szelenkov@nginx.com            },
152504Szelenkov@nginx.com            "applications": {
153504Szelenkov@nginx.com                "app": {
154504Szelenkov@nginx.com                    "type": "python",
155507Smax.romanov@nginx.com                    "processes": { "spare": 0 },
156504Szelenkov@nginx.com                    "path": "/app",
157504Szelenkov@nginx.com                    "module": "wsgi"
158495Szelenkov@nginx.com                }
159495Szelenkov@nginx.com            }
160504Szelenkov@nginx.com        }), 'listeners wildcard')
161495Szelenkov@nginx.com
162495Szelenkov@nginx.com    def test_listeners_explicit(self):
163504Szelenkov@nginx.com        self.assertIn('success', self.conf({
164504Szelenkov@nginx.com            "listeners": {
165504Szelenkov@nginx.com                "127.0.0.1:7080": {
166504Szelenkov@nginx.com                    "application":"app"
167504Szelenkov@nginx.com                }
168504Szelenkov@nginx.com            },
169504Szelenkov@nginx.com            "applications": {
170504Szelenkov@nginx.com                "app": {
171504Szelenkov@nginx.com                    "type": "python",
172507Smax.romanov@nginx.com                    "processes": { "spare": 0 },
173504Szelenkov@nginx.com                    "path": "/app",
174504Szelenkov@nginx.com                    "module": "wsgi"
175484Szelenkov@nginx.com                }
176484Szelenkov@nginx.com            }
177504Szelenkov@nginx.com        }), 'explicit')
178484Szelenkov@nginx.com
179495Szelenkov@nginx.com    def test_listeners_explicit_ipv6(self):
180504Szelenkov@nginx.com        self.assertIn('success', self.conf({
181504Szelenkov@nginx.com            "listeners": {
182504Szelenkov@nginx.com                "[::1]:7080": {
183504Szelenkov@nginx.com                    "application":"app"
184504Szelenkov@nginx.com                }
185504Szelenkov@nginx.com            },
186504Szelenkov@nginx.com            "applications": {
187504Szelenkov@nginx.com                "app": {
188504Szelenkov@nginx.com                    "type": "python",
189507Smax.romanov@nginx.com                    "processes": { "spare": 0 },
190504Szelenkov@nginx.com                    "path": "/app",
191504Szelenkov@nginx.com                    "module": "wsgi"
192495Szelenkov@nginx.com                }
193495Szelenkov@nginx.com            }
194504Szelenkov@nginx.com        }), 'explicit ipv6')
195495Szelenkov@nginx.com
196495Szelenkov@nginx.com    def test_listeners_no_port(self):
197565Szelenkov@nginx.com        self.skip_alerts.extend([
198565Szelenkov@nginx.com            r'invalid listener "127\.0\.0\.1"',
199565Szelenkov@nginx.com            r'failed to apply new conf',
200565Szelenkov@nginx.com            r'process \d+ exited on signal'
201565Szelenkov@nginx.com        ])
202565Szelenkov@nginx.com
203504Szelenkov@nginx.com        self.assertIn('error', self.conf({
204504Szelenkov@nginx.com            "listeners": {
205504Szelenkov@nginx.com                "127.0.0.1": {
206504Szelenkov@nginx.com                    "application":"app"
207504Szelenkov@nginx.com                }
208504Szelenkov@nginx.com            },
209504Szelenkov@nginx.com            "applications": {
210504Szelenkov@nginx.com                "app": {
211504Szelenkov@nginx.com                    "type": "python",
212507Smax.romanov@nginx.com                    "processes": { "spare": 0 },
213504Szelenkov@nginx.com                    "path": "/app",
214504Szelenkov@nginx.com                    "module": "wsgi"
215495Szelenkov@nginx.com                }
216495Szelenkov@nginx.com            }
217504Szelenkov@nginx.com        }), 'no port')
218484Szelenkov@nginx.com
219917Szelenkov@nginx.com    @unittest.expectedFailure
220917Szelenkov@nginx.com    def test_json_application_name_large(self):
221917Szelenkov@nginx.com        self.skip_alerts.append(r'epoll_ctl.+failed')
222917Szelenkov@nginx.com        name = "X" * 1024 * 1024
223917Szelenkov@nginx.com
224917Szelenkov@nginx.com        self.assertIn('success', self.conf({
225917Szelenkov@nginx.com            "listeners": {
226917Szelenkov@nginx.com                "*:7080": {
227917Szelenkov@nginx.com                    "application": name
228917Szelenkov@nginx.com                }
229917Szelenkov@nginx.com            },
230917Szelenkov@nginx.com            "applications": {
231917Szelenkov@nginx.com                name: {
232917Szelenkov@nginx.com                    "type": "python",
233917Szelenkov@nginx.com                    "processes": { "spare": 0 },
234917Szelenkov@nginx.com                    "path": "/app",
235917Szelenkov@nginx.com                    "module": "wsgi"
236917Szelenkov@nginx.com                }
237917Szelenkov@nginx.com            }
238917Szelenkov@nginx.com        }))
239917Szelenkov@nginx.com
240917Szelenkov@nginx.com    @unittest.expectedFailure
241917Szelenkov@nginx.com    def test_json_application_many(self):
242917Szelenkov@nginx.com        self.skip_alerts.extend([
243917Szelenkov@nginx.com            r'eventfd.+failed',
2441000Szelenkov@nginx.com            r'epoll.+failed',
2451000Szelenkov@nginx.com            r'failed to apply'
246917Szelenkov@nginx.com        ])
247946Szelenkov@nginx.com        apps = 999
248917Szelenkov@nginx.com
249917Szelenkov@nginx.com        conf = {
250917Szelenkov@nginx.com            "applications":
251917Szelenkov@nginx.com                {"app-" + str(a): {
252917Szelenkov@nginx.com                    "type": "python",
253917Szelenkov@nginx.com                    "processes": { "spare": 0 },
254917Szelenkov@nginx.com                    "path": "/app",
255917Szelenkov@nginx.com                    "module": "wsgi"
256917Szelenkov@nginx.com                } for a in range(apps)
257917Szelenkov@nginx.com            },
258917Szelenkov@nginx.com            "listeners": {
259946Szelenkov@nginx.com                "*:" + str(7000 + a): {
260917Szelenkov@nginx.com                    "application": "app-" + str(a)
261917Szelenkov@nginx.com                } for a in range(apps)
262917Szelenkov@nginx.com            }
263917Szelenkov@nginx.com        }
264917Szelenkov@nginx.com
265917Szelenkov@nginx.com        self.assertIn('success', self.conf(conf))
266917Szelenkov@nginx.com
267*1006Smax.romanov@nginx.com    def test_json_application_many2(self):
268*1006Smax.romanov@nginx.com        self.skip_alerts.extend([
269*1006Smax.romanov@nginx.com            r'eventfd.+failed',
270*1006Smax.romanov@nginx.com            r'epoll.+failed',
271*1006Smax.romanov@nginx.com            r'failed to apply'
272*1006Smax.romanov@nginx.com        ])
273*1006Smax.romanov@nginx.com
274*1006Smax.romanov@nginx.com        conf = {
275*1006Smax.romanov@nginx.com            "applications":
276*1006Smax.romanov@nginx.com                {"app-" + str(a): {
277*1006Smax.romanov@nginx.com                    "type": "python",
278*1006Smax.romanov@nginx.com                    "processes": { "spare": 0 },
279*1006Smax.romanov@nginx.com                    "path": "/app",
280*1006Smax.romanov@nginx.com                    "module": "wsgi"
281*1006Smax.romanov@nginx.com                } for a in range(999)
282*1006Smax.romanov@nginx.com            },
283*1006Smax.romanov@nginx.com            "listeners": {
284*1006Smax.romanov@nginx.com                "*:7001": {
285*1006Smax.romanov@nginx.com                    "application": "app-1"
286*1006Smax.romanov@nginx.com                }
287*1006Smax.romanov@nginx.com            }
288*1006Smax.romanov@nginx.com        }
289*1006Smax.romanov@nginx.com
290*1006Smax.romanov@nginx.com        self.assertIn('success', self.conf(conf))
291*1006Smax.romanov@nginx.com
292484Szelenkov@nginx.comif __name__ == '__main__':
293853Szelenkov@nginx.com    TestUnitConfiguration.main()
294