You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by tv...@apache.org on 2022/04/05 10:04:50 UTC
[buildstream-plugins] 35/49: tests/sources/pip_build.py: Adding test which builds using the pip source
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 <tr...@codethink.co.uk>
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")
+
+
+@pytest.mark.datafiles(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",
+ ],
+ )
+
+
+@pytest.mark.datafiles(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",
+ ],
+ )
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.skipif(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"