11628Szelenkov@nginx.comimport os 21628Szelenkov@nginx.comfrom distutils.version import LooseVersion 31628Szelenkov@nginx.com 41635Szelenkov@nginx.comimport pytest 51635Szelenkov@nginx.com 61635Szelenkov@nginx.comfrom conftest import public_dir 71654Szelenkov@nginx.comfrom conftest import unit_stop 81628Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython 9*1730Szelenkov@nginx.comfrom unit.option import option 101628Szelenkov@nginx.com 111628Szelenkov@nginx.com 121628Szelenkov@nginx.comclass TestASGILifespan(TestApplicationPython): 131628Szelenkov@nginx.com prerequisites = { 141628Szelenkov@nginx.com 'modules': {'python': lambda v: LooseVersion(v) >= LooseVersion('3.5')} 151628Szelenkov@nginx.com } 161628Szelenkov@nginx.com load_module = 'asgi' 171628Szelenkov@nginx.com 181628Szelenkov@nginx.com def test_asgi_lifespan(self): 191628Szelenkov@nginx.com self.load('lifespan/empty') 201628Szelenkov@nginx.com 211628Szelenkov@nginx.com startup_path = option.test_dir + '/python/lifespan/empty/startup' 221628Szelenkov@nginx.com shutdown_path = option.test_dir + '/python/lifespan/empty/shutdown' 231628Szelenkov@nginx.com version_path = option.test_dir + '/python/lifespan/empty/version' 241628Szelenkov@nginx.com 251635Szelenkov@nginx.com os.chmod(option.test_dir + '/python/lifespan/empty', 0o777) 261635Szelenkov@nginx.com 271628Szelenkov@nginx.com open(startup_path, 'a').close() 281635Szelenkov@nginx.com os.chmod(startup_path, 0o777) 291635Szelenkov@nginx.com 301628Szelenkov@nginx.com open(shutdown_path, 'a').close() 311635Szelenkov@nginx.com os.chmod(shutdown_path, 0o777) 321635Szelenkov@nginx.com 331628Szelenkov@nginx.com open(version_path, 'a').close() 341635Szelenkov@nginx.com os.chmod(version_path, 0o777) 351632Szelenkov@nginx.com 361628Szelenkov@nginx.com assert self.get()['status'] == 204 371628Szelenkov@nginx.com 381654Szelenkov@nginx.com unit_stop() 391628Szelenkov@nginx.com 401628Szelenkov@nginx.com is_startup = os.path.isfile(startup_path) 411628Szelenkov@nginx.com is_shutdown = os.path.isfile(shutdown_path) 421628Szelenkov@nginx.com 431628Szelenkov@nginx.com if is_startup: 441628Szelenkov@nginx.com os.remove(startup_path) 451628Szelenkov@nginx.com 461628Szelenkov@nginx.com if is_shutdown: 471628Szelenkov@nginx.com os.remove(shutdown_path) 481628Szelenkov@nginx.com 491628Szelenkov@nginx.com with open(version_path, 'r') as f: 501628Szelenkov@nginx.com version = f.read() 511628Szelenkov@nginx.com 521628Szelenkov@nginx.com os.remove(version_path) 531628Szelenkov@nginx.com 541628Szelenkov@nginx.com assert not is_startup, 'startup' 551628Szelenkov@nginx.com assert not is_shutdown, 'shutdown' 561628Szelenkov@nginx.com assert version == '3.0 2.0', 'version' 571628Szelenkov@nginx.com 581628Szelenkov@nginx.com def test_asgi_lifespan_failed(self): 591628Szelenkov@nginx.com self.load('lifespan/failed') 601628Szelenkov@nginx.com 611628Szelenkov@nginx.com assert self.get()['status'] == 503 621628Szelenkov@nginx.com 631628Szelenkov@nginx.com assert ( 641628Szelenkov@nginx.com self.wait_for_record(r'\[error\].*Application startup failed') 651628Szelenkov@nginx.com is not None 661628Szelenkov@nginx.com ), 'error message' 671628Szelenkov@nginx.com assert self.wait_for_record(r'Exception blah') is not None, 'exception' 681628Szelenkov@nginx.com 691628Szelenkov@nginx.com def test_asgi_lifespan_error(self): 701628Szelenkov@nginx.com self.load('lifespan/error') 711628Szelenkov@nginx.com 721628Szelenkov@nginx.com self.get() 731628Szelenkov@nginx.com 741628Szelenkov@nginx.com assert self.wait_for_record(r'Exception blah') is not None, 'exception' 751628Szelenkov@nginx.com 761628Szelenkov@nginx.com def test_asgi_lifespan_error_auto(self): 771628Szelenkov@nginx.com self.load('lifespan/error_auto') 781628Szelenkov@nginx.com 791628Szelenkov@nginx.com self.get() 801628Szelenkov@nginx.com 811628Szelenkov@nginx.com assert self.wait_for_record(r'AssertionError') is not None, 'assertion' 82