From 8604c46b3193fe4ef28cb37f5fbf08e6dffa0006 Mon Sep 17 00:00:00 2001 From: Alexandre Rossi Date: Mon, 9 Sep 2024 12:02:58 +0200 Subject: [PATCH] integration tests: add basic test for php, python and pypy plugins --- .github/workflows/test.yml | 8 ++++-- buildconf/integration-tests.ini | 4 +++ t/php/config.ini | 3 +++ t/pypy/config.ini | 7 +++++ t/python/helloapp.py | 3 +++ t/runner | 48 +++++++++++++++++++++++++++++++-- 6 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 buildconf/integration-tests.ini create mode 100644 t/pypy/config.ini create mode 100644 t/python/helloapp.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2d4731914b..20541b77c0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,14 +22,18 @@ jobs: run: make unittests test: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Install dependencies run: | sudo apt update -qq sudo apt install --no-install-recommends -qqyf \ - libpcre2-dev libjansson-dev libcap2-dev + libpcre2-dev libjansson-dev libcap2-dev \ + php-dev libphp-embed libargon2-dev libsodium-dev \ + pypy3 - uses: actions/checkout@v4 + - name: Set env + run: echo "PROFILE=integration-tests" >> $GITHUB_ENV - name: Run integration tests run: make all tests diff --git a/buildconf/integration-tests.ini b/buildconf/integration-tests.ini new file mode 100644 index 0000000000..55f4188ca7 --- /dev/null +++ b/buildconf/integration-tests.ini @@ -0,0 +1,4 @@ +[uwsgi] +inherit = base +main_plugin = +plugins = python,php,pypy diff --git a/t/php/config.ini b/t/php/config.ini index 35a6dee9f6..a94e3abd5e 100644 --- a/t/php/config.ini +++ b/t/php/config.ini @@ -1,6 +1,9 @@ [uwsgi] http-socket = :8080 http-socket-modifier1 = 14 +# required for php +need-app = false +plugins = php cache2 = name=session,items=1000,store=/tmp/uwsgi-session-cache,bitmap=1 diff --git a/t/pypy/config.ini b/t/pypy/config.ini new file mode 100644 index 0000000000..be091f500b --- /dev/null +++ b/t/pypy/config.ini @@ -0,0 +1,7 @@ +[uwsgi] +plugin = pypy +need-app = false +pypy-lib = /usr/lib/libpypy3-c.so +pypy-home = /usr/lib/pypy3 +pypy-setup = plugins/pypy/pypy_setup.py +pypy-wsgi-file = t/python/helloapp.py diff --git a/t/python/helloapp.py b/t/python/helloapp.py new file mode 100644 index 0000000000..49f1907cc3 --- /dev/null +++ b/t/python/helloapp.py @@ -0,0 +1,3 @@ +def application(env, start_response): + start_response("200 OK", [("Content-Type", "text/html")]) + return [b"Hello World"] diff --git a/t/runner b/t/runner index b0431b7b06..78a495e48e 100755 --- a/t/runner +++ b/t/runner @@ -1,4 +1,12 @@ #!/usr/bin/python3 +# +# This test suite runner runs some integration tests for uwsgi, that is +# each test launches a test server with a specific configuration and +# verifies (usually using a HTTP request) that this test server behaves as +# expected. +# +# buildconf/integration-tests.ini holds the build configuration for this +# to run fine. import os @@ -82,12 +90,12 @@ class UwsgiTest(unittest.TestCase): self.testserver.wait() self.testserver.stdout.close() - @unittest.skipUnless(*plugins_available(["python3"])) + @unittest.skipUnless(*plugins_available(["python"])) def test_static_expires(self): self.start_listen_server( [ "--plugin", - "python3", # provide a request plugin if no embedded request plugin + "python", # provide a request plugin os.path.join(TESTS_DIR, "static", "config.ini"), ] ) @@ -95,6 +103,42 @@ class UwsgiTest(unittest.TestCase): with requests.get(f"http://{UWSGI_HTTP}/foobar/config.ini") as r: self.assertTrue("Expires" in r.headers) + @unittest.skipUnless(*plugins_available(["python"])) + def test_python3_helloworld(self): + self.start_listen_server( + [ + "--plugin", + "python", + "--wsgi-file", + os.path.join(TESTS_DIR, "python", "helloapp.py"), + ] + ) + + with requests.get(f"http://{UWSGI_HTTP}/") as r: + self.assertEqual(r.text, "Hello World") + + @unittest.skipUnless(*plugins_available(["pypy"])) + def test_pypy3_helloworld(self): + self.start_listen_server( + [ + os.path.join(TESTS_DIR, "pypy", "config.ini"), + ] + ) + + with requests.get(f"http://{UWSGI_HTTP}/") as r: + self.assertEqual(r.text, "Hello World") + + @unittest.skipUnless(*plugins_available(["php"])) + def test_php_session(self): + self.start_listen_server( + [ + os.path.join(TESTS_DIR, "php", "config.ini"), + ] + ) + + with requests.get(f"http://{UWSGI_HTTP}/test.php") as r: + self.assertEqual(r.text, "PASS\n") + if __name__ == "__main__": unittest.main()