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 d35af6e0df21a2bc09fb4b6877996f19304d903e Author: Tristan van Berkom <[email protected]> AuthorDate: Mon Mar 21 14:39:44 2022 +0900 tests/sources/patch.py: Adding tests for patch source --- tests/sources/patch.py | 197 +++++++++++++++++++++ tests/sources/patch/basic/failure-empty-dir.bst | 5 + .../patch/basic/failure-nonexistent-dir.bst | 6 + tests/sources/patch/basic/file.txt | 1 + tests/sources/patch/basic/file_1.patch | 7 + tests/sources/patch/basic/irregular.bst | 7 + tests/sources/patch/basic/project.conf | 3 + tests/sources/patch/basic/target.bst | 7 + tests/sources/patch/different-strip-level/file.txt | 1 + .../patch/different-strip-level/file_1.patch | 7 + .../patch/different-strip-level/project.conf | 3 + .../sources/patch/different-strip-level/target.bst | 8 + .../patch/invalid-relative-path/file_1.patch | 7 + .../patch/invalid-relative-path/irregular.bst | 5 + .../patch/invalid-relative-path/project.conf | 3 + tests/sources/patch/multiple-patches/file.txt | 1 + tests/sources/patch/multiple-patches/file_1.patch | 7 + tests/sources/patch/multiple-patches/file_2.patch | 7 + tests/sources/patch/multiple-patches/project.conf | 3 + tests/sources/patch/multiple-patches/target.bst | 9 + .../sources/patch/separate-patch-dir/file_1.patch | 7 + .../separate-patch-dir/files/test-dir/file.txt | 1 + .../sources/patch/separate-patch-dir/project.conf | 3 + tests/sources/patch/separate-patch-dir/target.bst | 8 + 24 files changed, 313 insertions(+) diff --git a/tests/sources/patch.py b/tests/sources/patch.py new file mode 100644 index 0000000..91848f1 --- /dev/null +++ b/tests/sources/patch.py @@ -0,0 +1,197 @@ +# Pylint doesn't play well with fixtures and dependency injection from pytest +# pylint: disable=redefined-outer-name + +import os +import socket +import pytest + +from buildstream.exceptions import ErrorDomain, LoadErrorReason +from buildstream._testing import cli # pylint: disable=unused-import + +DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "patch",) + + +# generate_file_types() +# +# Generator that creates a regular file directory, symbolic link, fifo +# and socket at the specified path. +# +# Args: +# path: (str) path where to create each different type of file +# +def generate_file_types(path): + def clean(): + if os.path.exists(path): + if os.path.isdir(path): + os.rmdir(path) + else: + os.remove(path) + + clean() + + with open(path, "w", encoding="utf-8"): + pass + yield + clean() + + os.makedirs(path) + yield + clean() + + os.symlink("project.conf", path) + yield + clean() + + os.mkfifo(path) + yield + clean() + + # Change directory because the full path may be longer than the ~100 + # characters permitted for a unix socket + old_dir = os.getcwd() + parent, child = os.path.split(path) + os.chdir(parent) + + s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + + try: + s.bind(child) + os.chdir(old_dir) + yield + finally: + s.close() + + clean() + + [email protected](os.path.join(DATA_DIR, "basic")) +def test_missing_patch(cli, datafiles): + project = str(datafiles) + + # Removing the local file causes preflight to fail + localfile = os.path.join(project, "file_1.patch") + os.remove(localfile) + + result = cli.run(project=project, args=["show", "target.bst"]) + result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.MISSING_FILE) + + [email protected](os.path.join(DATA_DIR, "basic")) +def test_non_regular_file_patch(cli, datafiles): + project = str(datafiles) + + patch_path = os.path.join(project, "irregular_file.patch") + for _file_type in generate_file_types(patch_path): + result = cli.run(project=project, args=["show", "irregular.bst"]) + if os.path.isfile(patch_path) and not os.path.islink(patch_path): + result.assert_success() + else: + result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.PROJ_PATH_INVALID_KIND) + + [email protected](os.path.join(DATA_DIR, "basic")) +def test_invalid_absolute_path(cli, datafiles): + project = str(datafiles) + + with open(os.path.join(project, "target.bst"), "r", encoding="utf-8") as f: + old_yaml = f.read() + new_yaml = old_yaml.replace("file_1.patch", os.path.join(project, "file_1.patch")) + assert old_yaml != new_yaml + + with open(os.path.join(project, "target.bst"), "w", encoding="utf-8") as f: + f.write(new_yaml) + + result = cli.run(project=project, args=["show", "target.bst"]) + result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.PROJ_PATH_INVALID) + + [email protected](os.path.join(DATA_DIR, "invalid-relative-path")) +def test_invalid_relative_path(cli, datafiles): + project = str(datafiles) + + result = cli.run(project=project, args=["show", "irregular.bst"]) + result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.PROJ_PATH_INVALID) + + [email protected](os.path.join(DATA_DIR, "basic")) +def test_stage_and_patch(cli, tmpdir, datafiles): + project = str(datafiles) + checkoutdir = os.path.join(str(tmpdir), "checkout") + + # Build, checkout + result = cli.run(project=project, args=["build", "target.bst"]) + result.assert_success() + result = cli.run(project=project, args=["artifact", "checkout", "target.bst", "--directory", checkoutdir]) + result.assert_success() + + # Test the file.txt was patched and changed + with open(os.path.join(checkoutdir, "file.txt"), encoding="utf-8") as f: + assert f.read() == "This is text file with superpowers\n" + + [email protected](os.path.join(DATA_DIR, "basic")) +def test_stage_file_nonexistent_dir(cli, datafiles): + project = str(datafiles) + + # Fails at build time because it tries to patch into a non-existing directory + result = cli.run(project=project, args=["build", "failure-nonexistent-dir.bst"]) + result.assert_main_error(ErrorDomain.STREAM, None) + result.assert_task_error(ErrorDomain.SOURCE, "patch-no-files") + + [email protected](os.path.join(DATA_DIR, "basic")) +def test_stage_file_empty_dir(cli, datafiles): + project = str(datafiles) + + # Fails at build time because it tries to patch with nothing else staged + result = cli.run(project=project, args=["build", "failure-empty-dir.bst"]) + result.assert_main_error(ErrorDomain.STREAM, None) + result.assert_task_error(ErrorDomain.SOURCE, "patch-no-files") + + [email protected](os.path.join(DATA_DIR, "separate-patch-dir")) +def test_stage_separate_patch_dir(cli, tmpdir, datafiles): + project = str(datafiles) + checkoutdir = os.path.join(str(tmpdir), "checkout") + + # Track, fetch, build, checkout + result = cli.run(project=project, args=["build", "target.bst"]) + result.assert_success() + result = cli.run(project=project, args=["artifact", "checkout", "target.bst", "--directory", checkoutdir]) + result.assert_success() + + # Test the file.txt was patched and changed + with open(os.path.join(checkoutdir, "test-dir", "file.txt"), encoding="utf-8") as f: + assert f.read() == "This is text file in a directory with superpowers\n" + + [email protected](os.path.join(DATA_DIR, "multiple-patches")) +def test_stage_multiple_patches(cli, tmpdir, datafiles): + project = str(datafiles) + checkoutdir = os.path.join(str(tmpdir), "checkout") + + # Track, fetch, build, checkout + result = cli.run(project=project, args=["build", "target.bst"]) + result.assert_success() + result = cli.run(project=project, args=["artifact", "checkout", "target.bst", "--directory", checkoutdir]) + result.assert_success() + + # Test the file.txt was patched and changed + with open(os.path.join(checkoutdir, "file.txt"), encoding="utf-8") as f: + assert f.read() == "This is text file with more superpowers\n" + + [email protected](os.path.join(DATA_DIR, "different-strip-level")) +def test_patch_strip_level(cli, tmpdir, datafiles): + project = str(datafiles) + checkoutdir = os.path.join(str(tmpdir), "checkout") + + # Track, fetch, build, checkout + result = cli.run(project=project, args=["build", "target.bst"]) + result.assert_success() + result = cli.run(project=project, args=["artifact", "checkout", "target.bst", "--directory", checkoutdir]) + result.assert_success() + + # Test the file.txt was patched and changed + with open(os.path.join(checkoutdir, "file.txt"), encoding="utf-8") as f: + assert f.read() == "This is text file with superpowers\n" diff --git a/tests/sources/patch/basic/failure-empty-dir.bst b/tests/sources/patch/basic/failure-empty-dir.bst new file mode 100644 index 0000000..b22af27 --- /dev/null +++ b/tests/sources/patch/basic/failure-empty-dir.bst @@ -0,0 +1,5 @@ +kind: import +description: This is also the pony +sources: +- kind: patch + path: file_1.patch diff --git a/tests/sources/patch/basic/failure-nonexistent-dir.bst b/tests/sources/patch/basic/failure-nonexistent-dir.bst new file mode 100644 index 0000000..8fd593d --- /dev/null +++ b/tests/sources/patch/basic/failure-nonexistent-dir.bst @@ -0,0 +1,6 @@ +kind: import +description: This is also the pony +sources: +- kind: patch + path: file_1.patch + directory: /idontexist diff --git a/tests/sources/patch/basic/file.txt b/tests/sources/patch/basic/file.txt new file mode 100644 index 0000000..a496efe --- /dev/null +++ b/tests/sources/patch/basic/file.txt @@ -0,0 +1 @@ +This is a text file diff --git a/tests/sources/patch/basic/file_1.patch b/tests/sources/patch/basic/file_1.patch new file mode 100644 index 0000000..424a486 --- /dev/null +++ b/tests/sources/patch/basic/file_1.patch @@ -0,0 +1,7 @@ +diff --git a/file.txt b/file.txt +index a496efe..341ef26 100644 +--- a/file.txt ++++ b/file.txt +@@ -1 +1 @@ +-This is a text file ++This is text file with superpowers diff --git a/tests/sources/patch/basic/irregular.bst b/tests/sources/patch/basic/irregular.bst new file mode 100644 index 0000000..425cbcc --- /dev/null +++ b/tests/sources/patch/basic/irregular.bst @@ -0,0 +1,7 @@ +kind: import +description: This is the pony +sources: +- kind: local + path: file.txt +- kind: patch + path: irregular_file.patch diff --git a/tests/sources/patch/basic/project.conf b/tests/sources/patch/basic/project.conf new file mode 100644 index 0000000..dc34380 --- /dev/null +++ b/tests/sources/patch/basic/project.conf @@ -0,0 +1,3 @@ +# Basic project +name: foo +min-version: 2.0 diff --git a/tests/sources/patch/basic/target.bst b/tests/sources/patch/basic/target.bst new file mode 100644 index 0000000..913371d --- /dev/null +++ b/tests/sources/patch/basic/target.bst @@ -0,0 +1,7 @@ +kind: import +description: This is the pony +sources: +- kind: local + path: file.txt +- kind: patch + path: file_1.patch diff --git a/tests/sources/patch/different-strip-level/file.txt b/tests/sources/patch/different-strip-level/file.txt new file mode 100644 index 0000000..a496efe --- /dev/null +++ b/tests/sources/patch/different-strip-level/file.txt @@ -0,0 +1 @@ +This is a text file diff --git a/tests/sources/patch/different-strip-level/file_1.patch b/tests/sources/patch/different-strip-level/file_1.patch new file mode 100644 index 0000000..ff7f7fe --- /dev/null +++ b/tests/sources/patch/different-strip-level/file_1.patch @@ -0,0 +1,7 @@ +diff --git foo/a/file.txt foo/b/file.txt +index a496efe..341ef26 100644 +--- foo/a/file.txt ++++ foo/b/file.txt +@@ -1 +1 @@ +-This is a text file ++This is text file with superpowers diff --git a/tests/sources/patch/different-strip-level/project.conf b/tests/sources/patch/different-strip-level/project.conf new file mode 100644 index 0000000..dc34380 --- /dev/null +++ b/tests/sources/patch/different-strip-level/project.conf @@ -0,0 +1,3 @@ +# Basic project +name: foo +min-version: 2.0 diff --git a/tests/sources/patch/different-strip-level/target.bst b/tests/sources/patch/different-strip-level/target.bst new file mode 100644 index 0000000..c8ea19a --- /dev/null +++ b/tests/sources/patch/different-strip-level/target.bst @@ -0,0 +1,8 @@ +kind: import +description: This is the pony +sources: +- kind: local + path: file.txt +- kind: patch + path: file_1.patch + strip-level: 2 diff --git a/tests/sources/patch/invalid-relative-path/file_1.patch b/tests/sources/patch/invalid-relative-path/file_1.patch new file mode 100644 index 0000000..424a486 --- /dev/null +++ b/tests/sources/patch/invalid-relative-path/file_1.patch @@ -0,0 +1,7 @@ +diff --git a/file.txt b/file.txt +index a496efe..341ef26 100644 +--- a/file.txt ++++ b/file.txt +@@ -1 +1 @@ +-This is a text file ++This is text file with superpowers diff --git a/tests/sources/patch/invalid-relative-path/irregular.bst b/tests/sources/patch/invalid-relative-path/irregular.bst new file mode 100644 index 0000000..6b63a4e --- /dev/null +++ b/tests/sources/patch/invalid-relative-path/irregular.bst @@ -0,0 +1,5 @@ +kind: import +description: This is the pony +sources: +- kind: patch + path: ../invalid-relative-path/irregular_file.patch diff --git a/tests/sources/patch/invalid-relative-path/project.conf b/tests/sources/patch/invalid-relative-path/project.conf new file mode 100644 index 0000000..dc34380 --- /dev/null +++ b/tests/sources/patch/invalid-relative-path/project.conf @@ -0,0 +1,3 @@ +# Basic project +name: foo +min-version: 2.0 diff --git a/tests/sources/patch/multiple-patches/file.txt b/tests/sources/patch/multiple-patches/file.txt new file mode 100644 index 0000000..a496efe --- /dev/null +++ b/tests/sources/patch/multiple-patches/file.txt @@ -0,0 +1 @@ +This is a text file diff --git a/tests/sources/patch/multiple-patches/file_1.patch b/tests/sources/patch/multiple-patches/file_1.patch new file mode 100644 index 0000000..424a486 --- /dev/null +++ b/tests/sources/patch/multiple-patches/file_1.patch @@ -0,0 +1,7 @@ +diff --git a/file.txt b/file.txt +index a496efe..341ef26 100644 +--- a/file.txt ++++ b/file.txt +@@ -1 +1 @@ +-This is a text file ++This is text file with superpowers diff --git a/tests/sources/patch/multiple-patches/file_2.patch b/tests/sources/patch/multiple-patches/file_2.patch new file mode 100644 index 0000000..f56614b --- /dev/null +++ b/tests/sources/patch/multiple-patches/file_2.patch @@ -0,0 +1,7 @@ +diff --git a/file.txt b/file.txt +index a496efe..341ef26 100644 +--- a/file.txt ++++ b/file.txt +@@ -1 +1 @@ +-This is text file with superpowers ++This is text file with more superpowers diff --git a/tests/sources/patch/multiple-patches/project.conf b/tests/sources/patch/multiple-patches/project.conf new file mode 100644 index 0000000..dc34380 --- /dev/null +++ b/tests/sources/patch/multiple-patches/project.conf @@ -0,0 +1,3 @@ +# Basic project +name: foo +min-version: 2.0 diff --git a/tests/sources/patch/multiple-patches/target.bst b/tests/sources/patch/multiple-patches/target.bst new file mode 100644 index 0000000..4665e7d --- /dev/null +++ b/tests/sources/patch/multiple-patches/target.bst @@ -0,0 +1,9 @@ +kind: import +description: This is the pony +sources: +- kind: local + path: file.txt +- kind: patch + path: file_1.patch +- kind: patch + path: file_2.patch diff --git a/tests/sources/patch/separate-patch-dir/file_1.patch b/tests/sources/patch/separate-patch-dir/file_1.patch new file mode 100644 index 0000000..ae8bc33 --- /dev/null +++ b/tests/sources/patch/separate-patch-dir/file_1.patch @@ -0,0 +1,7 @@ +diff --git a/file.txt b/file.txt +index a496efe..341ef26 100644 +--- a/file.txt ++++ b/file.txt +@@ -1 +1 @@ +-This is a text file in a directory ++This is text file in a directory with superpowers diff --git a/tests/sources/patch/separate-patch-dir/files/test-dir/file.txt b/tests/sources/patch/separate-patch-dir/files/test-dir/file.txt new file mode 100644 index 0000000..425911a --- /dev/null +++ b/tests/sources/patch/separate-patch-dir/files/test-dir/file.txt @@ -0,0 +1 @@ +This is a text file in a directory diff --git a/tests/sources/patch/separate-patch-dir/project.conf b/tests/sources/patch/separate-patch-dir/project.conf new file mode 100644 index 0000000..dc34380 --- /dev/null +++ b/tests/sources/patch/separate-patch-dir/project.conf @@ -0,0 +1,3 @@ +# Basic project +name: foo +min-version: 2.0 diff --git a/tests/sources/patch/separate-patch-dir/target.bst b/tests/sources/patch/separate-patch-dir/target.bst new file mode 100644 index 0000000..796c131 --- /dev/null +++ b/tests/sources/patch/separate-patch-dir/target.bst @@ -0,0 +1,8 @@ +kind: import +description: This is the pony +sources: +- kind: local + path: files +- kind: patch + path: file_1.patch + directory: test-dir
