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"