summaryrefslogtreecommitdiff
path: root/tests/integration/workspace.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/integration/workspace.py')
-rw-r--r--tests/integration/workspace.py183
1 files changed, 183 insertions, 0 deletions
diff --git a/tests/integration/workspace.py b/tests/integration/workspace.py
index 26168341d..fcff58f08 100644
--- a/tests/integration/workspace.py
+++ b/tests/integration/workspace.py
@@ -1,6 +1,7 @@
import os
import pytest
+from buildstream import _yaml
from tests.testutils import cli_integration as cli
@@ -27,3 +28,185 @@ def test_workspace_mount(cli, tmpdir, datafiles):
assert res.exit_code == 0
assert os.path.exists(os.path.join(cli.directory, 'workspace'))
+
+
+@pytest.mark.integration
+@pytest.mark.datafiles(DATA_DIR)
+def test_workspace_updated_dependency(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ workspace = os.path.join(cli.directory, 'workspace')
+ element_path = os.path.join(project, 'elements')
+ element_name = 'workspace/workspace-updated-dependency.bst'
+ dep_name = 'workspace/dependency.bst'
+
+ dependency = {
+ 'kind': 'manual',
+ 'depends': [{
+ 'filename': 'base.bst',
+ 'type': 'build'
+ }],
+ 'config': {
+ 'build-commands': [
+ 'mkdir -p %{install-root}/etc/test/',
+ 'echo "Hello world!" > %{install-root}/etc/test/hello.txt'
+ ]
+ }
+ }
+ os.makedirs(os.path.dirname(os.path.join(element_path, dep_name)), exist_ok=True)
+ _yaml.dump(dependency, os.path.join(element_path, dep_name))
+
+ # First open the workspace
+ res = cli.run(project=project, args=['workspace', 'open', element_name, workspace])
+ assert res.exit_code == 0
+
+ # We build the workspaced element, so that we have an artifact
+ # with specific built dependencies
+ res = cli.run(project=project, args=['build', element_name])
+ assert res.exit_code == 0
+
+ # Now we update a dependency of our element.
+ dependency['config']['build-commands'] = [
+ 'mkdir -p %{install-root}/etc/test/',
+ 'echo "Hello china!" > %{install-root}/etc/test/hello.txt'
+ ]
+ _yaml.dump(dependency, os.path.join(element_path, dep_name))
+
+ # `Make` would look at timestamps and normally not realize that
+ # our dependency's header files changed. BuildStream must
+ # therefore ensure that we change the mtimes of any files touched
+ # since the last successful build of this element, otherwise this
+ # build will fail.
+ res = cli.run(project=project, args=['build', element_name])
+ assert res.exit_code == 0
+
+ res = cli.run(project=project, args=['shell', element_name, '/usr/bin/test.sh'])
+ assert res.exit_code == 0
+ assert res.output == 'Hello china!\n\n'
+
+
+@pytest.mark.integration
+@pytest.mark.datafiles(DATA_DIR)
+def test_workspace_update_dependency_failed(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ workspace = os.path.join(cli.directory, 'workspace')
+ element_path = os.path.join(project, 'elements')
+ element_name = 'workspace/workspace-updated-dependency-failed.bst'
+ dep_name = 'workspace/dependency.bst'
+
+ dependency = {
+ 'kind': 'manual',
+ 'depends': [{
+ 'filename': 'base.bst',
+ 'type': 'build'
+ }],
+ 'config': {
+ 'build-commands': [
+ 'mkdir -p %{install-root}/etc/test/',
+ 'echo "Hello world!" > %{install-root}/etc/test/hello.txt',
+ 'echo "Hello brazil!" > %{install-root}/etc/test/brazil.txt'
+ ]
+ }
+ }
+ os.makedirs(os.path.dirname(os.path.join(element_path, dep_name)), exist_ok=True)
+ _yaml.dump(dependency, os.path.join(element_path, dep_name))
+
+ # First open the workspace
+ res = cli.run(project=project, args=['workspace', 'open', element_name, workspace])
+ assert res.exit_code == 0
+
+ # We build the workspaced element, so that we have an artifact
+ # with specific built dependencies
+ res = cli.run(project=project, args=['build', element_name])
+ assert res.exit_code == 0
+
+ # Now we update a dependency of our element.
+ dependency['config']['build-commands'] = [
+ 'mkdir -p %{install-root}/etc/test/',
+ 'echo "Hello china!" > %{install-root}/etc/test/hello.txt',
+ 'echo "Hello brazil!" > %{install-root}/etc/test/brazil.txt'
+ ]
+ _yaml.dump(dependency, os.path.join(element_path, dep_name))
+
+ # And our build fails!
+ with open(os.path.join(workspace, 'Makefile'), 'a') as f:
+ f.write("\texit 1")
+
+ res = cli.run(project=project, args=['build', element_name])
+ assert res.exit_code != 0
+
+ # We update our dependency again...
+ dependency['config']['build-commands'] = [
+ 'mkdir -p %{install-root}/etc/test/',
+ 'echo "Hello world!" > %{install-root}/etc/test/hello.txt',
+ 'echo "Hello spain!" > %{install-root}/etc/test/brazil.txt'
+ ]
+ _yaml.dump(dependency, os.path.join(element_path, dep_name))
+
+ # And fix the source
+ with open(os.path.join(workspace, 'Makefile'), 'r') as f:
+ makefile = f.readlines()
+ with open(os.path.join(workspace, 'Makefile'), 'w') as f:
+ f.write("\n".join(makefile[:-1]))
+
+ # Since buildstream thinks hello.txt did not change, we could end
+ # up not rebuilding a file! We need to make sure that a case like
+ # this can't blind-side us.
+ res = cli.run(project=project, args=['build', element_name])
+ assert res.exit_code == 0
+
+ res = cli.run(project=project, args=['shell', element_name, '/usr/bin/test.sh'])
+ assert res.exit_code == 0
+ assert res.output == 'Hello world!\nHello spain!\n\n'
+
+
+@pytest.mark.integration
+@pytest.mark.datafiles(DATA_DIR)
+def test_updated_dependency_nested(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ workspace = os.path.join(cli.directory, 'workspace')
+ element_path = os.path.join(project, 'elements')
+ element_name = 'workspace/workspace-updated-dependency-nested.bst'
+ dep_name = 'workspace/dependency.bst'
+
+ dependency = {
+ 'kind': 'manual',
+ 'depends': [{
+ 'filename': 'base.bst',
+ 'type': 'build'
+ }],
+ 'config': {
+ 'build-commands': [
+ 'mkdir -p %{install-root}/etc/test/tests/',
+ 'echo "Hello world!" > %{install-root}/etc/test/hello.txt',
+ 'echo "Hello brazil!" > %{install-root}/etc/test/tests/brazil.txt'
+ ]
+ }
+ }
+ os.makedirs(os.path.dirname(os.path.join(element_path, dep_name)), exist_ok=True)
+ _yaml.dump(dependency, os.path.join(element_path, dep_name))
+
+ # First open the workspace
+ res = cli.run(project=project, args=['workspace', 'open', element_name, workspace])
+ assert res.exit_code == 0
+
+ # We build the workspaced element, so that we have an artifact
+ # with specific built dependencies
+ res = cli.run(project=project, args=['build', element_name])
+ assert res.exit_code == 0
+
+ # Now we update a dependency of our element.
+ dependency['config']['build-commands'] = [
+ 'mkdir -p %{install-root}/etc/test/tests/',
+ 'echo "Hello world!" > %{install-root}/etc/test/hello.txt',
+ 'echo "Hello test!" > %{install-root}/etc/test/tests/tests.txt'
+ ]
+ _yaml.dump(dependency, os.path.join(element_path, dep_name))
+
+ res = cli.run(project=project, args=['build', element_name])
+ assert res.exit_code == 0
+
+ # Buildstream should pick up the newly added element, and pick up
+ # the lack of the newly removed element
+ res = cli.run(project=project, args=['shell', element_name, '/usr/bin/test.sh'])
+ assert res.exit_code == 0
+ assert res.output == 'Hello world!\nHello test!\n\n'