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