1*2616Szelenkov@nginx.comfrom pathlib import Path 2*2616Szelenkov@nginx.com 3*2616Szelenkov@nginx.comfrom packaging import version 41628Szelenkov@nginx.com 51654Szelenkov@nginx.comfrom conftest import unit_stop 62491Szelenkov@nginx.comfrom unit.applications.lang.python import ApplicationPython 71730Szelenkov@nginx.comfrom unit.option import option 81628Szelenkov@nginx.com 92488Szelenkov@nginx.comprerequisites = { 102488Szelenkov@nginx.com 'modules': {'python': lambda v: version.parse(v) >= version.parse('3.5')} 112488Szelenkov@nginx.com} 122488Szelenkov@nginx.com 132491Szelenkov@nginx.comclient = ApplicationPython(load_module='asgi') 141628Szelenkov@nginx.com 151628Szelenkov@nginx.com 162491Szelenkov@nginx.comdef assert_cookies(prefix): 172491Szelenkov@nginx.com for name in ['startup', 'shutdown']: 18*2616Szelenkov@nginx.com path = Path(f'{option.test_dir}/python/lifespan/empty/{prefix}{name}') 19*2616Szelenkov@nginx.com exists = path.is_file() 20*2616Szelenkov@nginx.com path.unlink(missing_ok=True) 211873So.canty@f5.com 222491Szelenkov@nginx.com assert not exists, name 232491Szelenkov@nginx.com 24*2616Szelenkov@nginx.com path = Path(f'{option.test_dir}/python/lifespan/empty/{prefix}version') 25*2616Szelenkov@nginx.com versions = path.read_text(encoding='utf-8') 26*2616Szelenkov@nginx.com path.unlink() 272491Szelenkov@nginx.com 28*2616Szelenkov@nginx.com assert versions == '3.0 2.0', 'versions' 292491Szelenkov@nginx.com 302491Szelenkov@nginx.com 312491Szelenkov@nginx.comdef setup_cookies(prefix): 32*2616Szelenkov@nginx.com base_dir = Path(f'{option.test_dir}/python/lifespan/empty') 33*2616Szelenkov@nginx.com base_dir.chmod(0o777) 341873So.canty@f5.com 352491Szelenkov@nginx.com for name in ['startup', 'shutdown', 'version']: 36*2616Szelenkov@nginx.com path = Path(f'{option.test_dir}/python/lifespan/empty/{prefix}{name}') 37*2616Szelenkov@nginx.com path.touch(0o777) 381873So.canty@f5.com 392491Szelenkov@nginx.com 402491Szelenkov@nginx.comdef test_asgi_lifespan(): 412491Szelenkov@nginx.com client.load('lifespan/empty') 421873So.canty@f5.com 432491Szelenkov@nginx.com setup_cookies('') 441873So.canty@f5.com 452491Szelenkov@nginx.com assert client.get()['status'] == 204 461873So.canty@f5.com 472491Szelenkov@nginx.com unit_stop() 481873So.canty@f5.com 492491Szelenkov@nginx.com assert_cookies('') 502491Szelenkov@nginx.com 511628Szelenkov@nginx.com 522491Szelenkov@nginx.comdef test_asgi_lifespan_targets(): 532491Szelenkov@nginx.com path = f'{option.test_dir}/python/lifespan/empty' 541628Szelenkov@nginx.com 552491Szelenkov@nginx.com assert 'success' in client.conf( 562491Szelenkov@nginx.com { 572592Szelenkov@nginx.com "listeners": {"*:8080": {"pass": "routes"}}, 582491Szelenkov@nginx.com "routes": [ 592491Szelenkov@nginx.com { 602491Szelenkov@nginx.com "match": {"uri": "/1"}, 612491Szelenkov@nginx.com "action": {"pass": "applications/targets/1"}, 622491Szelenkov@nginx.com }, 632491Szelenkov@nginx.com { 642491Szelenkov@nginx.com "match": {"uri": "/2"}, 652491Szelenkov@nginx.com "action": {"pass": "applications/targets/2"}, 662491Szelenkov@nginx.com }, 672491Szelenkov@nginx.com ], 682491Szelenkov@nginx.com "applications": { 692491Szelenkov@nginx.com "targets": { 702491Szelenkov@nginx.com "type": client.get_application_type(), 712491Szelenkov@nginx.com "processes": {"spare": 0}, 722491Szelenkov@nginx.com "working_directory": path, 732491Szelenkov@nginx.com "path": path, 742491Szelenkov@nginx.com "targets": { 752491Szelenkov@nginx.com "1": {"module": "asgi", "callable": "application"}, 762491Szelenkov@nginx.com "2": { 772491Szelenkov@nginx.com "module": "asgi", 782491Szelenkov@nginx.com "callable": "application2", 792491Szelenkov@nginx.com }, 801873So.canty@f5.com }, 812491Szelenkov@nginx.com } 822491Szelenkov@nginx.com }, 832491Szelenkov@nginx.com } 842491Szelenkov@nginx.com ) 852491Szelenkov@nginx.com 862491Szelenkov@nginx.com setup_cookies('') 872491Szelenkov@nginx.com setup_cookies('app2_') 881628Szelenkov@nginx.com 892491Szelenkov@nginx.com assert client.get(url="/1")['status'] == 204 902491Szelenkov@nginx.com assert client.get(url="/2")['status'] == 204 912491Szelenkov@nginx.com 922491Szelenkov@nginx.com unit_stop() 931628Szelenkov@nginx.com 942491Szelenkov@nginx.com assert_cookies('') 952491Szelenkov@nginx.com assert_cookies('app2_') 962491Szelenkov@nginx.com 972491Szelenkov@nginx.com 982491Szelenkov@nginx.comdef test_asgi_lifespan_failed(wait_for_record): 992491Szelenkov@nginx.com client.load('lifespan/failed') 1001873So.canty@f5.com 1012491Szelenkov@nginx.com assert client.get()['status'] == 503 1021628Szelenkov@nginx.com 1032491Szelenkov@nginx.com assert ( 1042491Szelenkov@nginx.com wait_for_record(r'\[error\].*Application startup failed') is not None 1052491Szelenkov@nginx.com ), 'error message' 1062491Szelenkov@nginx.com assert wait_for_record(r'Exception blah') is not None, 'exception' 1071628Szelenkov@nginx.com 1082491Szelenkov@nginx.com 1092491Szelenkov@nginx.comdef test_asgi_lifespan_error(wait_for_record): 1102491Szelenkov@nginx.com client.load('lifespan/error') 1111628Szelenkov@nginx.com 1122491Szelenkov@nginx.com client.get() 1131628Szelenkov@nginx.com 1142491Szelenkov@nginx.com assert wait_for_record(r'Exception blah') is not None, 'exception' 1152491Szelenkov@nginx.com 1161628Szelenkov@nginx.com 1172491Szelenkov@nginx.comdef test_asgi_lifespan_error_auto(wait_for_record): 1182491Szelenkov@nginx.com client.load('lifespan/error_auto') 1191628Szelenkov@nginx.com 1202491Szelenkov@nginx.com client.get() 1211628Szelenkov@nginx.com 1222491Szelenkov@nginx.com assert wait_for_record(r'AssertionError') is not None, 'assertion' 123