Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37038069
en ru br
Репозитории ALT
S:4.9.4-alt1
5.1: 2.5-alt1
www.altlinux.org/Changes

Группа :: Система/Серверы
Пакет: apache2-mod_wsgi

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: apache2-mod_wsgi-4.9.4.patch
Скачать


 Makefile.in                |   9 ++++
 tests/conftest.py          | 114 +++++++++++++++++++++++++++++++++++++++++++++
 tests/httpd.conf           |  19 ++++++++
 tests/run_tests.py         |  78 +++++++++++++++++++++++++++++++
 tests/test_env_daemon.py   |  34 ++++++++++++++
 tests/test_env_embedded.py |  36 ++++++++++++++
 6 files changed, 290 insertions(+)
diff --git a/Makefile.in b/Makefile.in
index 8ea2be2..0ca14f9 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -58,3 +58,12 @@ distclean : clean
 
 realclean : distclean
 	-rm -f configure
+
+DSOFILE = mod_wsgi.so
+ifeq ($(PYTHON), python3)
+    DSOFILE = mod_wsgi-py3.so
+endif
+
+check :
+	    PYTHON=$(PYTHON) $(PYTHON) ./tests/run_tests.py --sodir \
+	    $(DESTDIR)$(LIBEXECDIR) --dsofile=$(DSOFILE)
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100755
index 0000000..5214f1e
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,114 @@
+"""
+Configuration for pytest
+"""
+
+import time
+import os
+import shutil
+import subprocess
+import signal
+import pytest
+
+
+def pytest_addoption(parser):
+    """
+    Add supported options
+    """
+    parser.addoption("--sodir",
+                     default='{}/src/server/.libs'.format(os.getcwd()),
+                     help='dir path to mod_wsgi so file')
+    parser.addoption("--dsofile", default='mod_wsgi.so',
+                     help='mod_wsgi so file name')
+
+
+def setup_http(testdir, so_dir, so_filename):
+    """
+    Setup httpd server's config
+    """
+    httpdir = os.path.join(testdir, 'httpd')
+    logsubdir = 'logs'
+    if os.path.exists(httpdir):
+        shutil.rmtree(httpdir)
+    os.makedirs(httpdir)
+    os.mkdir(os.path.join(httpdir, 'html'))
+    os.mkdir(os.path.join(httpdir, logsubdir))
+
+    apache_mod_dir = subprocess.check_output(
+        ["apxs2", "-q", "libexecdir"]).strip()
+
+    if not os.path.exists(apache_mod_dir):
+        raise ValueError("Could not find Apache module directory!")
+    os.symlink(apache_mod_dir, os.path.join(httpdir, 'modules'))
+
+    shutil.copy('{}/{}'.format(so_dir, so_filename), httpdir)
+
+    with open('tests/httpd.conf') as hfile:
+        text = hfile.read().format(HTTPROOT=httpdir,
+                                   HTTPNAME=os.environ['NSS_WRAPPER_HOSTNAME'],
+                                   HTTPADDR=os.environ['WRAP_IPADDR'],
+                                   HTTPPORT=os.environ['WRAP_PORT'],
+                                   LOGDIR=logsubdir,
+                                   ERROR_LOG='error_log',
+                                   DSOFILE=so_filename)
+    config = os.path.join(httpdir, 'httpd.conf')
+    with open(config, 'w+') as cfile:
+        cfile.write(text)
+
+    test_subdirs = ['environ-daemon', 'environ-embedded']
+    for subdir in test_subdirs:
+        bandir = os.path.join(testdir, 'httpd', 'html', subdir)
+        os.mkdir(bandir)
+        shutil.copy('tests/environ.wsgi', bandir)
+
+
+def run_http(testdir):
+    """
+    Run httpd server
+    """
+    httpdir = os.path.join(testdir, 'httpd')
+    config = os.path.join(httpdir, 'httpd.conf')
+    httpd = "httpd2"
+    httpproc = subprocess.Popen([httpd, '-DFOREGROUND', '-f', config],
+                                preexec_fn=os.setsid)
+    if httpproc.poll() is None:
+        # check whether httpd server ready for processing or not
+        retry_number = 0
+        max_retries = 20
+        httpd_logfile = os.path.join(httpdir, 'logs', 'error_log')
+        for i in range(max_retries):
+            try:
+                with open(httpd_logfile, 'r') as logfile:
+                    lines = [line for line in logfile
+                             if 'Command line' in line]
+                    if not lines:
+                        time.sleep(0.5)
+                        retry_number = i + 1
+                    else:
+                        break
+            except IOError:
+                time.sleep(0.5)
+                retry_number = i + 1
+        if retry_number >= max_retries:
+            raise AssertionError(
+                "Perphaps httpd server was not started correctly")
+    return httpproc
+
+
+@pytest.fixture(scope='module')
+def prepare_tests(request):
+    """
+    Preparation for module tests
+    """
+    testdir = '{}/testsdir'.format(os.getcwd())
+    so_dir = request.config.getoption('--sodir')
+    so_filename = request.config.getoption('--dsofile')
+
+    setup_http(testdir, so_dir, so_filename)
+    httpproc = run_http(testdir)
+
+    def resource_teardown():
+        """
+        Clean up module tests
+        """
+        os.killpg(httpproc.pid, signal.SIGTERM)
+    request.addfinalizer(resource_teardown)
diff --git a/tests/httpd.conf b/tests/httpd.conf
new file mode 100644
index 0000000..748de40
--- /dev/null
+++ b/tests/httpd.conf
@@ -0,0 +1,19 @@
+PidFile "{HTTPROOT}/{LOGDIR}/httpd.pid"
+
+ServerRoot "{HTTPROOT}"
+ServerName "{HTTPNAME}"
+Listen {HTTPADDR}:{HTTPPORT}
+DocumentRoot "{HTTPROOT}/html"
+ErrorLog "{LOGDIR}/{ERROR_LOG}"
+
+LoadModule wsgi_module "{DSOFILE}"
+LoadModule authz_core_module modules/mod_authz_core.so
+
+WSGIScriptAlias /daemon-env/ {HTTPROOT}/html/environ-daemon/environ.wsgi
+WSGIDaemonProcess wsgi-test processes=2 threads=15
+WSGISocketPrefix {HTTPROOT}
+<Directory {HTTPROOT}/html/environ-daemon>
+  WSGIProcessGroup wsgi-test
+</Directory>
+
+WSGIScriptAlias /embedded-env/ {HTTPROOT}/html/environ-embedded/environ.wsgi
diff --git a/tests/run_tests.py b/tests/run_tests.py
new file mode 100755
index 0000000..1cf7cdb
--- /dev/null
+++ b/tests/run_tests.py
@@ -0,0 +1,78 @@
+"""
+Wrapper script for pytest runner
+"""
+
+import argparse
+import os
+import shutil
+import subprocess
+
+WRAP_HOSTNAME = "wsgi.dev.test"
+WRAP_IPADDR = '127.0.0.10'
+WRAP_PORT = '80'
+
+
+def parse_args():
+    """
+    Script's arguments parser
+    """
+    parser = argparse.ArgumentParser(
+        description='Mod WSGI Tests Environment')
+    parser.add_argument('--sodir',
+                        default='{}/src/server/.libs'.format(os.getcwd()),
+                        help="mod_wsgi object dirpath")
+    parser.add_argument('--dsofile', default='mod_wsgi.so',
+                        help="mod_wsgi object filename")
+    return vars(parser.parse_args())
+
+
+def setup_wrappers(basedir):
+    """
+    Setup nss and socket wrappers
+    """
+    wrapdir = os.path.join(basedir, 'wrapdir')
+    if not os.path.exists(wrapdir):
+        os.makedirs(wrapdir)
+
+    hosts_file = os.path.join(basedir, 'hosts')
+    with open(hosts_file, 'w+') as hfile:
+        hfile.write('{} {}\n'.format(WRAP_IPADDR, WRAP_HOSTNAME))
+
+    wenv = {'LD_PRELOAD': 'libsocket_wrapper.so libnss_wrapper.so',
+            'SOCKET_WRAPPER_DIR': wrapdir,
+            'SOCKET_WRAPPER_DEFAULT_IFACE': '10',
+            'WRAP_IPADDR': WRAP_IPADDR,
+            'WRAP_PORT': WRAP_PORT,
+            'NSS_WRAPPER_HOSTNAME': WRAP_HOSTNAME,
+            'NSS_WRAPPER_HOSTS': hosts_file}
+    return wenv
+
+
+def main():
+    """
+    Wrapper script for pytest runner
+    """
+    args = parse_args()
+
+    testdir = '{}/testsdir'.format(os.getcwd())
+    so_dir = args['sodir']
+    so_filename = args['dsofile']
+    if os.path.exists(testdir):
+        shutil.rmtree(testdir)
+    os.makedirs(testdir)
+
+    wrapenv = setup_wrappers(testdir)
+
+    testenv = {'PATH': '/sbin:/bin:/usr/sbin:/usr/bin', }
+    testenv.update(wrapenv)
+
+    python = os.environ['PYTHON']
+    testproc = subprocess.Popen([python, "-m", "pytest", "-v", "tests",
+                                 "--sodir", so_dir, "--dsofile", so_filename],
+                                env=testenv, preexec_fn=os.setsid)
+    testproc.wait()
+    exit(testproc.returncode)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/tests/test_env_daemon.py b/tests/test_env_daemon.py
new file mode 100755
index 0000000..9f46e98
--- /dev/null
+++ b/tests/test_env_daemon.py
@@ -0,0 +1,34 @@
+"""
+Test daemon mode environ
+"""
+
+import os
+import requests
+import pytest
+
+
+def find_result(result, key):
+    """
+    Helper for find key in result
+    """
+    result_text = result.splitlines()
+    result_list = [x.split(': ') for x in filter(None, result_text)]
+    result_dict = {x[0]: x[1] for x in [val for val in result_list]
+                   if len(x) == 2}
+    try:
+        return result_dict[key]
+    except KeyError:
+        return ''
+
+
+@pytest.mark.usefixtures("prepare_tests")
+def test_daemon_env():
+    """
+    Test daemon mode environ
+    """
+    url = 'http://{hostname}/daemon-env/'.format(
+        hostname=os.environ['NSS_WRAPPER_HOSTNAME'])
+    result = requests.get(url)
+    assert result.status_code == 200
+    assert find_result(result.text, "mod_wsgi.script_name") == "'/daemon-env/'"
+    assert find_result(result.text, "mod_wsgi.process_group") == "'wsgi-test'"
diff --git a/tests/test_env_embedded.py b/tests/test_env_embedded.py
new file mode 100755
index 0000000..fc63f82
--- /dev/null
+++ b/tests/test_env_embedded.py
@@ -0,0 +1,36 @@
+"""
+Test embedded mode environ
+"""
+
+import os
+import requests
+import pytest
+
+
+def find_result(result, key):
+    """
+    Helper for find key in result
+    """
+    result_text = result.splitlines()
+    result_list = [x.split(': ') for x in filter(None, result_text)]
+    result_dict = {x[0]: x[1] for x in [val for val in result_list]
+                   if len(x) == 2}
+    try:
+        return result_dict[key]
+    except KeyError:
+        return ''
+
+
+@pytest.mark.usefixtures("prepare_tests")
+def test_embedded_env():
+    """
+    Test daemon mode environ
+    """
+    url = 'http://{hostname}/embedded-env/'.format(
+        hostname=os.environ['NSS_WRAPPER_HOSTNAME'])
+    result = requests.get(url)
+    assert result.status_code == 200
+    assert find_result(
+        result.text, "mod_wsgi.script_name"
+    ) == "'/embedded-env/'"
+    assert find_result(result.text, "mod_wsgi.process_group") == "''"
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin