Skip to content

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information