diff options
Diffstat (limited to 'tests/integration/artifact.py')
-rw-r--r-- | tests/integration/artifact.py | 108 |
1 files changed, 107 insertions, 1 deletions
diff --git a/tests/integration/artifact.py b/tests/integration/artifact.py index 459241209..742c33455 100644 --- a/tests/integration/artifact.py +++ b/tests/integration/artifact.py @@ -20,9 +20,12 @@ import os import pytest +import shutil from buildstream.plugintestutils import cli_integration as cli - +from tests.testutils import create_artifact_share +from tests.testutils.site import HAVE_SANDBOX +from buildstream._exceptions import ErrorDomain pytestmark = pytest.mark.integration @@ -66,3 +69,106 @@ def test_artifact_log(cli, tmpdir, datafiles): assert result.exit_code == 0 # The artifact is cached under both a strong key and a weak key assert (log + log) == result.output + + +# A test to capture the integration of the cachebuildtrees +# behaviour, which by default is to include the buildtree +# content of an element on caching. +@pytest.mark.integration +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.skipif(not HAVE_SANDBOX, reason='Only available with a functioning sandbox') +def test_cache_buildtrees(cli, tmpdir, datafiles): + project = os.path.join(datafiles.dirname, datafiles.basename) + element_name = 'autotools/amhello.bst' + + # Create artifact shares for pull & push testing + with create_artifact_share(os.path.join(str(tmpdir), 'share1')) as share1,\ + create_artifact_share(os.path.join(str(tmpdir), 'share2')) as share2,\ + create_artifact_share(os.path.join(str(tmpdir), 'share3')) as share3: + cli.configure({ + 'artifacts': {'url': share1.repo, 'push': True}, + 'artifactdir': os.path.join(str(tmpdir), 'artifacts') + }) + + # Build autotools element with cache-buildtrees set via the + # cli. The artifact should be successfully pushed to the share1 remote + # and cached locally with an 'empty' buildtree digest, as it's not a + # dangling ref + result = cli.run(project=project, args=['--cache-buildtrees', 'never', 'build', element_name]) + assert result.exit_code == 0 + assert cli.get_element_state(project, element_name) == 'cached' + assert share1.has_artifact('test', element_name, cli.get_element_key(project, element_name)) + + # The extracted buildtree dir should be empty, as we set the config + # to not cache buildtrees + cache_key = cli.get_element_key(project, element_name) + elementdigest = share1.has_artifact('test', element_name, cache_key) + buildtreedir = os.path.join(str(tmpdir), 'artifacts', 'extract', 'test', 'autotools-amhello', + elementdigest.hash, 'buildtree') + assert os.path.isdir(buildtreedir) + assert not os.listdir(buildtreedir) + + # Delete the local cached artifacts, and assert the when pulled with --pull-buildtrees + # that is was cached in share1 as expected with an empty buildtree dir + shutil.rmtree(os.path.join(str(tmpdir), 'artifacts')) + assert cli.get_element_state(project, element_name) != 'cached' + result = cli.run(project=project, args=['--pull-buildtrees', 'artifact', 'pull', element_name]) + assert element_name in result.get_pulled_elements() + assert os.path.isdir(buildtreedir) + assert not os.listdir(buildtreedir) + shutil.rmtree(os.path.join(str(tmpdir), 'artifacts')) + + # Assert that the default behaviour of pull to not include buildtrees on the artifact + # in share1 which was purposely cached with an empty one behaves as expected. As such the + # pulled artifact will have a dangling ref for the buildtree dir, regardless of content, + # leading to no buildtreedir being extracted + result = cli.run(project=project, args=['artifact', 'pull', element_name]) + assert element_name in result.get_pulled_elements() + assert not os.path.isdir(buildtreedir) + shutil.rmtree(os.path.join(str(tmpdir), 'artifacts')) + + # Repeat building the artifacts, this time with the default behaviour of caching buildtrees, + # as such the buildtree dir should not be empty + cli.configure({ + 'artifacts': {'url': share2.repo, 'push': True}, + 'artifactdir': os.path.join(str(tmpdir), 'artifacts') + }) + result = cli.run(project=project, args=['build', element_name]) + assert result.exit_code == 0 + assert cli.get_element_state(project, element_name) == 'cached' + assert share2.has_artifact('test', element_name, cli.get_element_key(project, element_name)) + + # Cache key will be the same however the digest hash will have changed as expected, so reconstruct paths + elementdigest = share2.has_artifact('test', element_name, cache_key) + buildtreedir = os.path.join(str(tmpdir), 'artifacts', 'extract', 'test', 'autotools-amhello', + elementdigest.hash, 'buildtree') + assert os.path.isdir(buildtreedir) + assert os.listdir(buildtreedir) is not None + + # Delete the local cached artifacts, and assert that when pulled with --pull-buildtrees + # that it was cached in share2 as expected with a populated buildtree dir + shutil.rmtree(os.path.join(str(tmpdir), 'artifacts')) + assert cli.get_element_state(project, element_name) != 'cached' + result = cli.run(project=project, args=['--pull-buildtrees', 'artifact', 'pull', element_name]) + assert element_name in result.get_pulled_elements() + assert os.path.isdir(buildtreedir) + assert os.listdir(buildtreedir) is not None + shutil.rmtree(os.path.join(str(tmpdir), 'artifacts')) + + # Clarify that the user config option for cache-buildtrees works as the cli + # main option does. Point to share3 which does not have the artifacts cached to force + # a build + cli.configure({ + 'artifacts': {'url': share3.repo, 'push': True}, + 'artifactdir': os.path.join(str(tmpdir), 'artifacts'), + 'cache': {'cache-buildtrees': 'never'} + }) + result = cli.run(project=project, args=['build', element_name]) + assert result.exit_code == 0 + assert cli.get_element_state(project, element_name) == 'cached' + cache_key = cli.get_element_key(project, element_name) + elementdigest = share3.has_artifact('test', element_name, cache_key) + buildtreedir = os.path.join(str(tmpdir), 'artifacts', 'extract', 'test', 'autotools-amhello', + elementdigest.hash, 'buildtree') + assert os.path.isdir(buildtreedir) + assert not os.listdir(buildtreedir) |