1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
import os
import pytest
from buildstream._exceptions import ErrorDomain, LoadErrorReason
from tests.testutils import cli, filetypegenerator
DATA_DIR = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'patch',
)
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
def test_missing_patch(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
# 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)
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
def test_non_regular_file_patch(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
patch_path = os.path.join(project, 'irregular_file.patch')
for file_type in filetypegenerator.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)
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
def test_invalid_absolute_path(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
with open(os.path.join(project, "target.bst"), 'r') 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') 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, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
result = cli.run(project=project, args=['show', 'irregular.bst'])
result.assert_main_error(ErrorDomain.LOAD,
LoadErrorReason.PROJ_PATH_INVALID)
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
def test_stage_and_patch(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
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=['checkout', 'target.bst', checkoutdir])
result.assert_success()
# Test the file.txt was patched and changed
with open(os.path.join(checkoutdir, 'file.txt')) as f:
assert(f.read() == 'This is text file with superpowers\n')
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
def test_stage_file_nonexistent_dir(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
checkoutdir = os.path.join(str(tmpdir), "checkout")
# 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")
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
def test_stage_file_empty_dir(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
checkoutdir = os.path.join(str(tmpdir), "checkout")
# 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")
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'separate-patch-dir'))
def test_stage_separate_patch_dir(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
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=['checkout', 'target.bst', checkoutdir])
result.assert_success()
# Test the file.txt was patched and changed
with open(os.path.join(checkoutdir, 'test-dir', 'file.txt')) as f:
assert(f.read() == 'This is text file in a directory with superpowers\n')
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'multiple-patches'))
def test_stage_multiple_patches(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
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=['checkout', 'target.bst', checkoutdir])
result.assert_success()
# Test the file.txt was patched and changed
with open(os.path.join(checkoutdir, 'file.txt')) as f:
assert(f.read() == 'This is text file with more superpowers\n')
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'different-strip-level'))
def test_patch_strip_level(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
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=['checkout', 'target.bst', checkoutdir])
result.assert_success()
# Test the file.txt was patched and changed
with open(os.path.join(checkoutdir, 'file.txt')) as f:
assert(f.read() == 'This is text file with superpowers\n')
|