This is an automated email from the ASF dual-hosted git repository. tvb pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/buildstream-plugins.git
commit 1a11f454e8ff81d62033b5d235327bac4c75eb31 Author: Tristan van Berkom <[email protected]> AuthorDate: Mon Mar 21 17:46:42 2022 +0900 tests/sources/pip_build.py: Adding test which builds using the pip source --- setup.cfg | 2 +- tests/sources/pip-build/elements/base.bst | 3 + .../pip-build/elements/base/alpine-image.bst | 6 + tests/sources/pip-build/files/pip-source/app1.py | 11 ++ .../sources/pip-build/files/pip-source/myreqs.txt | 1 + tests/sources/pip-build/project.conf | 15 ++ tests/sources/pip_build.py | 208 +++++++++++++++++++++ 7 files changed, 245 insertions(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index c324a67..2796004 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,7 +3,7 @@ test=pytest [tool:pytest] addopts = --verbose --basetemp ./tmp --durations=20 -norecursedirs = integration-cache tmp __pycache__ .eggs +norecursedirs = tests/sources/pip-build integration-cache tmp __pycache__ .eggs python_files = tests/*.py markers = integration: run test only if --integration option is specified diff --git a/tests/sources/pip-build/elements/base.bst b/tests/sources/pip-build/elements/base.bst new file mode 100644 index 0000000..da7c70b --- /dev/null +++ b/tests/sources/pip-build/elements/base.bst @@ -0,0 +1,3 @@ +kind: stack +depends: +- base/alpine-image.bst diff --git a/tests/sources/pip-build/elements/base/alpine-image.bst b/tests/sources/pip-build/elements/base/alpine-image.bst new file mode 100644 index 0000000..f8e00ba --- /dev/null +++ b/tests/sources/pip-build/elements/base/alpine-image.bst @@ -0,0 +1,6 @@ +kind: import +description: Import an alpine image as the platform +sources: +- kind: tar + url: alpine:integration-tests-base.v1.x86_64.tar.xz + ref: 3eb559250ba82b64a68d86d0636a6b127aa5f6d25d3601a79f79214dc9703639 diff --git a/tests/sources/pip-build/files/pip-source/app1.py b/tests/sources/pip-build/files/pip-source/app1.py new file mode 100644 index 0000000..b96d14b --- /dev/null +++ b/tests/sources/pip-build/files/pip-source/app1.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 + +from hellolib import hello + + +def main(): + hello("App1") + + +if __name__ == "__main__": + main() diff --git a/tests/sources/pip-build/files/pip-source/myreqs.txt b/tests/sources/pip-build/files/pip-source/myreqs.txt new file mode 100644 index 0000000..c805aae --- /dev/null +++ b/tests/sources/pip-build/files/pip-source/myreqs.txt @@ -0,0 +1 @@ +hellolib diff --git a/tests/sources/pip-build/project.conf b/tests/sources/pip-build/project.conf new file mode 100644 index 0000000..f04cd98 --- /dev/null +++ b/tests/sources/pip-build/project.conf @@ -0,0 +1,15 @@ +# test project config +name: test +min-version: 2.0 + +element-path: elements + +plugins: +- origin: pip + package-name: buildstream-plugins + elements: + - pip + +aliases: + alpine: https://bst-integration-test-images.ams3.cdn.digitaloceanspaces.com/ + project_dir: file://{project_dir} diff --git a/tests/sources/pip_build.py b/tests/sources/pip_build.py new file mode 100644 index 0000000..35333c9 --- /dev/null +++ b/tests/sources/pip_build.py @@ -0,0 +1,208 @@ +# Pylint doesn't play well with fixtures and dependency injection from pytest +# pylint: disable=redefined-outer-name + +import os +import pytest + +from buildstream import _yaml + +from buildstream._testing import cli_integration as cli # pylint: disable=unused-import +from buildstream._testing.integration import assert_contains +from buildstream._testing.integration import integration_cache # pylint: disable=unused-import +from buildstream._testing._utils.site import HAVE_SANDBOX + +from tests.testutils.python_repo import setup_pypi_repo # pylint: disable=unused-import + + +pytestmark = pytest.mark.integration + + +DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "pip-build") + + [email protected](DATA_DIR) +def test_pip_source_import_packages(cli, datafiles, setup_pypi_repo): + project = str(datafiles) + checkout = os.path.join(cli.directory, "checkout") + element_path = os.path.join(project, "elements") + element_name = "pip/hello.bst" + + # check that exotically named packages are imported correctly + myreqs_packages = "hellolib" + dependencies = [ + "app2", + "app.3", + "app-4", + "app_5", + "app.no.6", + "app-no-7", + "app_no_8", + ] + mock_packages = {myreqs_packages: {package: {} for package in dependencies}} + + # create mock pypi repository + pypi_repo = os.path.join(project, "files", "pypi-repo") + os.makedirs(pypi_repo, exist_ok=True) + setup_pypi_repo(mock_packages, pypi_repo) + + element = { + "kind": "import", + "sources": [ + {"kind": "local", "path": "files/pip-source"}, + {"kind": "pip", "url": "file://{}".format(os.path.realpath(pypi_repo)), "packages": [myreqs_packages],}, + ], + } + os.makedirs( + os.path.dirname(os.path.join(element_path, element_name)), exist_ok=True, + ) + _yaml.roundtrip_dump(element, os.path.join(element_path, element_name)) + + result = cli.run(project=project, args=["source", "track", element_name]) + assert result.exit_code == 0 + + result = cli.run(project=project, args=["build", element_name]) + assert result.exit_code == 0 + + result = cli.run(project=project, args=["artifact", "checkout", element_name, "--directory", checkout],) + assert result.exit_code == 0 + + assert_contains( + checkout, + [ + "/.bst_pip_downloads", + "/.bst_pip_downloads/hellolib-0.1.tar.gz", + "/.bst_pip_downloads/app2-0.1.tar.gz", + "/.bst_pip_downloads/app.3-0.1.tar.gz", + "/.bst_pip_downloads/app-4-0.1.tar.gz", + "/.bst_pip_downloads/app_5-0.1.tar.gz", + "/.bst_pip_downloads/app.no.6-0.1.tar.gz", + "/.bst_pip_downloads/app-no-7-0.1.tar.gz", + "/.bst_pip_downloads/app_no_8-0.1.tar.gz", + ], + ) + + [email protected](DATA_DIR) +def test_pip_source_import_requirements_files(cli, datafiles, setup_pypi_repo): + project = str(datafiles) + checkout = os.path.join(cli.directory, "checkout") + element_path = os.path.join(project, "elements") + element_name = "pip/hello.bst" + + # check that exotically named packages are imported correctly + myreqs_packages = "hellolib" + dependencies = [ + "app2", + "app.3", + "app-4", + "app_5", + "app.no.6", + "app-no-7", + "app_no_8", + ] + mock_packages = {myreqs_packages: {package: {} for package in dependencies}} + + # create mock pypi repository + pypi_repo = os.path.join(project, "files", "pypi-repo") + os.makedirs(pypi_repo, exist_ok=True) + setup_pypi_repo(mock_packages, pypi_repo) + + element = { + "kind": "import", + "sources": [ + {"kind": "local", "path": "files/pip-source"}, + { + "kind": "pip", + "url": "file://{}".format(os.path.realpath(pypi_repo)), + "requirements-files": ["myreqs.txt"], + }, + ], + } + os.makedirs( + os.path.dirname(os.path.join(element_path, element_name)), exist_ok=True, + ) + _yaml.roundtrip_dump(element, os.path.join(element_path, element_name)) + + result = cli.run(project=project, args=["source", "track", element_name]) + assert result.exit_code == 0 + + result = cli.run(project=project, args=["build", element_name]) + assert result.exit_code == 0 + + result = cli.run(project=project, args=["artifact", "checkout", element_name, "--directory", checkout],) + assert result.exit_code == 0 + + assert_contains( + checkout, + [ + "/.bst_pip_downloads", + "/.bst_pip_downloads/hellolib-0.1.tar.gz", + "/.bst_pip_downloads/app2-0.1.tar.gz", + "/.bst_pip_downloads/app.3-0.1.tar.gz", + "/.bst_pip_downloads/app-4-0.1.tar.gz", + "/.bst_pip_downloads/app_5-0.1.tar.gz", + "/.bst_pip_downloads/app.no.6-0.1.tar.gz", + "/.bst_pip_downloads/app-no-7-0.1.tar.gz", + "/.bst_pip_downloads/app_no_8-0.1.tar.gz", + ], + ) + + [email protected](DATA_DIR) [email protected](not HAVE_SANDBOX, reason="Only available with a functioning sandbox") +def test_pip_source_build(cli, datafiles, setup_pypi_repo): + project = str(datafiles) + element_path = os.path.join(project, "elements") + element_name = "pip/hello.bst" + + # check that exotically named packages are imported correctly + myreqs_packages = "hellolib" + dependencies = [ + "app2", + "app.3", + "app-4", + "app_5", + "app.no.6", + "app-no-7", + "app_no_8", + ] + mock_packages = {myreqs_packages: {package: {} for package in dependencies}} + + # create mock pypi repository + pypi_repo = os.path.join(project, "files", "pypi-repo") + os.makedirs(pypi_repo, exist_ok=True) + setup_pypi_repo(mock_packages, pypi_repo) + + element = { + "kind": "manual", + "depends": ["base.bst"], + "sources": [ + {"kind": "local", "path": "files/pip-source"}, + { + "kind": "pip", + "url": "file://{}".format(os.path.realpath(pypi_repo)), + "requirements-files": ["myreqs.txt"], + "packages": dependencies, + }, + ], + "config": { + "install-commands": [ + "pip3 install --no-index --prefix %{install-root}/usr .bst_pip_downloads/*.tar.gz", + "install app1.py %{install-root}/usr/bin/", + ] + }, + } + os.makedirs( + os.path.dirname(os.path.join(element_path, element_name)), exist_ok=True, + ) + _yaml.roundtrip_dump(element, os.path.join(element_path, element_name)) + + result = cli.run(project=project, args=["source", "track", element_name]) + assert result.exit_code == 0 + + result = cli.run(project=project, args=["build", element_name]) + assert result.exit_code == 0 + + result = cli.run(project=project, args=["shell", element_name, "/usr/bin/app1.py"]) + assert result.exit_code == 0 + assert result.output == "Hello App1! This is hellolib\n"
