xref: /unit/test/test_asgi_lifespan.py (revision 2616:ab2896c980ab)
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