summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam.thursfield@codethink.co.uk>2018-02-14 17:23:37 +0000
committerSam Thursfield <sam.thursfield@codethink.co.uk>2018-02-26 10:48:35 +0000
commit50492d2dc88c3b6e259595c2b7bc1c2b60274213 (patch)
treecf3c5ca4f008563b2a3a76424b9ba8fc3ae4eac8
parentf9e9946207256f6b054d92484a094a3d3ad79582 (diff)
downloadbuildstream-sam/233-push-after-pull.tar.gz
tests/frontend/push.py: Test that we don't push stuff that we just pulledsam/233-push-after-pull
-rw-r--r--tests/frontend/push.py53
-rw-r--r--tests/testutils/runcli.py14
2 files changed, 67 insertions, 0 deletions
diff --git a/tests/frontend/push.py b/tests/frontend/push.py
index 338a854c9..fa1a91045 100644
--- a/tests/frontend/push.py
+++ b/tests/frontend/push.py
@@ -142,3 +142,56 @@ def test_push_all(cli, tmpdir, datafiles):
assert_shared(cli, share, project, 'import-bin.bst')
assert_shared(cli, share, project, 'import-dev.bst')
assert_shared(cli, share, project, 'compose-all.bst')
+
+
+# Tests that `bst build` won't push artifacts to the cache it just pulled from.
+#
+# Regression test for https://gitlab.com/BuildStream/buildstream/issues/233.
+@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
+@pytest.mark.datafiles(DATA_DIR)
+def test_push_after_pull(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+
+ # Set up two artifact shares.
+ share1 = create_artifact_share(os.path.join(str(tmpdir), 'artifactshare1'))
+ share2 = create_artifact_share(os.path.join(str(tmpdir), 'artifactshare2'))
+
+ # Set the scene: share1 has the artifact, share2 does not.
+ #
+ cli.configure({
+ 'artifacts': {'url': share1.repo, 'push': True},
+ })
+
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ result.assert_success()
+
+ share1.update_summary()
+ cli.remove_artifact_from_cache(project, 'target.bst')
+
+ assert_shared(cli, share1, project, 'target.bst')
+ assert_not_shared(cli, share2, project, 'target.bst')
+ assert cli.get_element_state(project, 'target.bst') == 'downloadable'
+
+ # Now run the build again. Correct `bst build` behaviour is to download the
+ # artifact from share1 but not push it back again.
+ #
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ result.assert_success()
+ assert result.get_pulled_elements() == ['target.bst']
+ assert result.get_pushed_elements() == []
+
+ # Delete the artifact locally again.
+ cli.remove_artifact_from_cache(project, 'target.bst')
+
+ # Now we add share2 into the mix as a second push remote. This time,
+ # `bst build` should push to share2 after pulling from share1.
+ cli.configure({
+ 'artifacts': [
+ {'url': share1.repo, 'push': True},
+ {'url': share2.repo, 'push': True},
+ ]
+ })
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ result.assert_success()
+ assert result.get_pulled_elements() == ['target.bst']
+ assert result.get_pushed_elements() == ['target.bst']
diff --git a/tests/testutils/runcli.py b/tests/testutils/runcli.py
index a913c4aa2..d18fa279d 100644
--- a/tests/testutils/runcli.py
+++ b/tests/testutils/runcli.py
@@ -157,6 +157,20 @@ class Result():
return list(tracked)
+ def get_pushed_elements(self):
+ pushed = re.findall(r'\[\s*push:(\S+)\s*\]\s*START\s*Pushing Artifact', self.stderr)
+ if pushed is None:
+ return []
+
+ return list(pushed)
+
+ def get_pulled_elements(self):
+ pulled = re.findall(r'\[\s*pull:(\S+)\s*\]\s*START', self.stderr)
+ if pulled is None:
+ return []
+
+ return list(pulled)
+
class Cli():