summaryrefslogtreecommitdiff
path: root/tests/sourcecache
diff options
context:
space:
mode:
authorRaoul Hidalgo Charman <raoul.hidalgocharman@codethink.co.uk>2019-03-06 14:52:08 +0000
committerbst-marge-bot <marge-bot@buildstream.build>2019-03-25 11:46:44 +0000
commitf56bed714e2bd0a50ce350fd14d6195728624ff7 (patch)
tree6d7e807dbb3a50d95daf022c3ad5e662088635ad /tests/sourcecache
parent3ce14e1755b0d50a1b723c6c50dc7b2d2355c76d (diff)
downloadbuildstream-f56bed714e2bd0a50ce350fd14d6195728624ff7.tar.gz
tests: Add source cache test for fallback
Checks buildstream calls fetch method when remote source cache does not have a source. Part of #440
Diffstat (limited to 'tests/sourcecache')
-rw-r--r--tests/sourcecache/fetch.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/sourcecache/fetch.py b/tests/sourcecache/fetch.py
index 9043430c8..323ddd1ea 100644
--- a/tests/sourcecache/fetch.py
+++ b/tests/sourcecache/fetch.py
@@ -109,3 +109,62 @@ def test_source_fetch(cli, tmpdir, datafiles):
# check that we have the source in the cas now and it's not fetched
assert element._source_cached()
assert os.listdir(os.path.join(str(tmpdir), 'cache', 'sources', 'git')) == []
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_fetch_fallback(cli, tmpdir, datafiles):
+ project_dir = str(datafiles)
+
+ # use artifact cache for sources for now, they should work the same
+ with create_artifact_share(os.path.join(str(tmpdir), 'sourceshare')) as share:
+ # configure using this share
+ cache_dir = os.path.join(str(tmpdir), 'cache')
+ user_config_file = str(tmpdir.join('buildstream.conf'))
+ user_config = {
+ 'scheduler': {
+ 'pushers': 1
+ },
+ 'source-caches': {
+ 'url': share.repo,
+ },
+ 'cachedir': cache_dir,
+ }
+ _yaml.dump(_yaml.node_sanitize(user_config), filename=user_config_file)
+ cli.configure(user_config)
+
+ repo = create_repo('git', str(tmpdir))
+ ref = repo.create(os.path.join(project_dir, 'files'))
+ element_path = os.path.join(project_dir, 'elements')
+ element_name = 'fetch.bst'
+ element = {
+ 'kind': 'import',
+ 'sources': [repo.source_config(ref=ref)]
+ }
+ _yaml.dump(element, os.path.join(element_path, element_name))
+
+ context = Context()
+ context.load(config=user_config_file)
+ context.set_message_handler(message_handler)
+
+ project = Project(project_dir, context)
+ project.ensure_fully_loaded()
+
+ element = project.load_elements(['fetch.bst'])[0]
+ assert not element._source_cached()
+ source = list(element.sources())[0]
+
+ cas = context.get_cascache()
+ assert not cas.contains(source._get_source_name())
+ assert not os.path.exists(os.path.join(cache_dir, 'sources'))
+
+ # Now check if it falls back to the source fetch method.
+ res = cli.run(project=project_dir, args=['source', 'fetch', 'fetch.bst'])
+ res.assert_success()
+ brief_key = source._get_brief_display_key()
+ assert ("Remote ({}) does not have source {} cached"
+ .format(share.repo, brief_key)) in res.stderr
+ assert ("SUCCESS Fetching from {}"
+ .format(repo.source_config(ref=ref)['url'])) in res.stderr
+
+ # Check that the source in both in the source dir and the local CAS
+ assert element._source_cached()