Integration tests are leaking into each others
Summary
Integration tests in BuildStream are not completely separate and are leaking information into each other.
Currently, the Platform is instantiated only once and then shared accross all integration tests which can lead to some failures if we want to change the environment for some tests.
Steps to reproduce
Add the following to a file and run pytest on it:
import os
import pytest
from tests.testutils import cli
from tests.testutils.site import IS_LINUX
from buildstream import _yaml
from buildstream._exceptions import ErrorDomain
# Project directory
DATA_DIR = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'project',
)
@pytest.mark.integration
@pytest.mark.skipif(not IS_LINUX, reason='Only available on Linux')
@pytest.mark.datafiles(DATA_DIR)
def test_missing_brwap_has_nice_error_message(cli, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
element_path = os.path.join(project, 'elements', 'element.bst')
# Write out our test target
element = {
'kind': 'script',
'depends': [
{
'filename': 'base.bst',
'type': 'build',
},
],
'config': {
'commands': [
'false',
],
},
}
_yaml.dump(element, element_path)
# Build without access to host tools, this should fail with a nice error
result = cli.run(
project=project, args=['build', 'element.bst'], env={'PATH': ''})
result.assert_task_error(ErrorDomain.SANDBOX, 'unavailable-local-sandbox')
assert "not found" in result.stderr
@pytest.mark.integration
@pytest.mark.skipif(not IS_LINUX, reason='Only available on Linux')
@pytest.mark.datafiles(DATA_DIR)
def test_old_brwap_has_nice_error_message(cli, datafiles, tmp_path):
# import buildstream._platform
# buildstream._platform.Platform._instance = None
bwrap = tmp_path.joinpath('bin/bwrap')
bwrap.parent.mkdir()
with bwrap.open('w') as fp:
fp.write('''
#!/bin/bash
echo bubblewrap 0.0.1
'''.strip())
bwrap.chmod(0o755)
project = os.path.join(datafiles.dirname, datafiles.basename)
element_path = os.path.join(project, 'elements', 'element3.bst')
# Write out our test target
element = {
'kind': 'script',
'depends': [
{
'filename': 'base.bst',
'type': 'build',
},
],
'config': {
'commands': [
'true && true && false',
],
},
}
_yaml.dump(element, element_path)
# Build without access to host tools, this should fail with a nice error
result = cli.run(
project=project,
args=['--debug', '--verbose', 'build', 'element3.bst'],
env={'PATH': str(tmp_path.joinpath('bin'))})
result.assert_task_error(ErrorDomain.SANDBOX, 'unavailable-local-sandbox')
assert "too old" in result.stderr
To make the test pass, uncomment the two lines at the start of test_old_brwap_has_nice_error_message
What is the current bug behavior?
The second test fails with "missing bwrap"
What is the expected correct behavior?
The second test should pass
Relevant logs and/or screenshots
Possible fixes
- have a fixture resetting Platform between every integration tests
- rework the platform to not act as a "god object"
- store the platform in the context instead
Other relevant information
- BuildStream version affected: /milestone %BuildStream_v1.x
Edited by Benjamin Schubert