| # 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._exceptions import ErrorDomain, LoadErrorReason |
| from buildstream.testing import cli # pylint: disable=unused-import |
| from buildstream.testing._utils.site import HAVE_SANDBOX |
| from tests.testutils import filetypegenerator |
| |
| DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "local",) |
| |
| |
| @pytest.mark.datafiles(os.path.join(DATA_DIR, "basic")) |
| def test_missing_path(cli, datafiles): |
| project = str(datafiles) |
| |
| # Removing the local file causes preflight to fail |
| localfile = os.path.join(project, "file.txt") |
| os.remove(localfile) |
| |
| result = cli.run(project=project, args=["show", "target.bst"]) |
| result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.MISSING_FILE) |
| |
| |
| @pytest.mark.datafiles(os.path.join(DATA_DIR, "basic")) |
| def test_non_regular_file_or_directory(cli, datafiles): |
| project = str(datafiles) |
| localfile = os.path.join(project, "file.txt") |
| |
| for _file_type in filetypegenerator.generate_file_types(localfile): |
| result = cli.run(project=project, args=["show", "target.bst"]) |
| if os.path.isdir(localfile) and not os.path.islink(localfile): |
| result.assert_success() |
| elif os.path.isfile(localfile) and not os.path.islink(localfile): |
| result.assert_success() |
| else: |
| result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.PROJ_PATH_INVALID_KIND) |
| |
| |
| @pytest.mark.datafiles(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") as f: |
| old_yaml = f.read() |
| |
| new_yaml = old_yaml.replace("file.txt", os.path.join(project, "file.txt")) |
| assert old_yaml != new_yaml |
| |
| with open(os.path.join(project, "target.bst"), "w") 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) |
| |
| |
| @pytest.mark.datafiles(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", "target.bst"]) |
| result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.PROJ_PATH_INVALID) |
| |
| |
| @pytest.mark.datafiles(os.path.join(DATA_DIR, "basic")) |
| def test_stage_file(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() |
| |
| # Check that the checkout contains the expected file |
| assert os.path.exists(os.path.join(checkoutdir, "file.txt")) |
| |
| |
| @pytest.mark.datafiles(os.path.join(DATA_DIR, "directory")) |
| def test_stage_directory(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() |
| |
| # Check that the checkout contains the expected file and directory and other file |
| assert os.path.exists(os.path.join(checkoutdir, "file.txt")) |
| assert os.path.exists(os.path.join(checkoutdir, "subdir", "anotherfile.txt")) |
| |
| |
| @pytest.mark.datafiles(os.path.join(DATA_DIR, "symlink")) |
| def test_stage_symlink(cli, tmpdir, datafiles): |
| |
| project = str(datafiles) |
| checkoutdir = os.path.join(str(tmpdir), "checkout") |
| |
| # Workaround datafiles bug: |
| # |
| # https://github.com/omarkohl/pytest-datafiles/issues/1 |
| # |
| # Create the symlink by hand. |
| symlink = os.path.join(project, "files", "symlink-to-file.txt") |
| os.symlink("file.txt", symlink) |
| |
| # 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() |
| |
| # Check that the checkout contains the expected file and directory and other file |
| assert os.path.exists(os.path.join(checkoutdir, "file.txt")) |
| assert os.path.exists(os.path.join(checkoutdir, "symlink-to-file.txt")) |
| assert os.path.islink(os.path.join(checkoutdir, "symlink-to-file.txt")) |
| |
| |
| @pytest.mark.datafiles(os.path.join(DATA_DIR, "file-exists")) |
| def test_stage_file_exists(cli, datafiles): |
| project = str(datafiles) |
| |
| # Build, checkout |
| result = cli.run(project=project, args=["build", "target.bst"]) |
| result.assert_main_error(ErrorDomain.STREAM, None) |
| result.assert_task_error(ErrorDomain.ELEMENT, "import-source-files-fail") |
| |
| |
| @pytest.mark.datafiles(os.path.join(DATA_DIR, "directory")) |
| def test_stage_directory_symlink(cli, tmpdir, datafiles): |
| project = str(datafiles) |
| checkoutdir = os.path.join(str(tmpdir), "checkout") |
| |
| symlink = os.path.join(project, "files", "symlink-to-subdir") |
| os.symlink("subdir", symlink) |
| |
| # 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() |
| |
| # Check that the checkout contains the expected directory and directory symlink |
| assert os.path.exists(os.path.join(checkoutdir, "subdir", "anotherfile.txt")) |
| assert os.path.exists(os.path.join(checkoutdir, "symlink-to-subdir", "anotherfile.txt")) |
| assert os.path.islink(os.path.join(checkoutdir, "symlink-to-subdir")) |
| |
| |
| @pytest.mark.integration |
| @pytest.mark.datafiles(os.path.join(DATA_DIR, "deterministic-umask")) |
| @pytest.mark.skipif(not HAVE_SANDBOX, reason="Only available with a functioning sandbox") |
| def test_deterministic_source_umask(cli, tmpdir, datafiles): |
| def create_test_file(*path, mode=0o644, content="content\n"): |
| path = os.path.join(*path) |
| os.makedirs(os.path.dirname(path), exist_ok=True) |
| with open(path, "w") as f: |
| f.write(content) |
| os.fchmod(f.fileno(), mode) |
| |
| def create_test_directory(*path, mode=0o644): |
| create_test_file(*path, ".keep", content="") |
| path = os.path.join(*path) |
| os.chmod(path, mode) |
| |
| project = str(datafiles) |
| element_name = "list.bst" |
| element_path = os.path.join(project, "elements", element_name) |
| sourcedir = os.path.join(project, "source") |
| |
| create_test_file(sourcedir, "a.txt", mode=0o700) |
| create_test_file(sourcedir, "b.txt", mode=0o755) |
| create_test_file(sourcedir, "c.txt", mode=0o600) |
| create_test_file(sourcedir, "d.txt", mode=0o400) |
| create_test_file(sourcedir, "e.txt", mode=0o644) |
| create_test_file(sourcedir, "f.txt", mode=0o4755) |
| create_test_file(sourcedir, "g.txt", mode=0o2755) |
| create_test_file(sourcedir, "h.txt", mode=0o1755) |
| create_test_directory(sourcedir, "dir-a", mode=0o0700) |
| create_test_directory(sourcedir, "dir-c", mode=0o0755) |
| create_test_directory(sourcedir, "dir-d", mode=0o4755) |
| create_test_directory(sourcedir, "dir-e", mode=0o2755) |
| create_test_directory(sourcedir, "dir-f", mode=0o1755) |
| |
| source = {"kind": "local", "path": "source"} |
| element = { |
| "kind": "manual", |
| "depends": [{"filename": "base.bst", "type": "build"}], |
| "sources": [source], |
| "config": {"install-commands": ['ls -l >"%{install-root}/ls-l"']}, |
| } |
| _yaml.roundtrip_dump(element, element_path) |