You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by ju...@apache.org on 2025/09/05 08:42:20 UTC
(buildstream) 14/15: tests/integration/recc.py: Add recc remote execution test
This is an automated email from the ASF dual-hosted git repository.
juergbi pushed a commit to branch jbilleter/recc
in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit 585960c5780978a7b6c1475238e645bd29f4bf52
Author: Jürg Billeter <j...@bitron.ch>
AuthorDate: Fri Aug 29 16:38:23 2025 +0200
tests/integration/recc.py: Add recc remote execution test
---
tests/integration/project/elements/recc/recc.bst | 8 ++
.../project/elements/recc/remoteexecution.bst | 26 ++++
tests/integration/project/project.conf | 1 +
tests/integration/recc.py | 142 +++++++++++++++++++++
4 files changed, 177 insertions(+)
diff --git a/tests/integration/project/elements/recc/recc.bst b/tests/integration/project/elements/recc/recc.bst
new file mode 100644
index 000000000..c9c203010
--- /dev/null
+++ b/tests/integration/project/elements/recc/recc.bst
@@ -0,0 +1,8 @@
+kind: import
+
+sources:
+ - kind: tar
+ base-dir: ''
+ ref: 00795f1781fd5f80757dd0c60f6335c221dacfa852edad8209b390dd9cfb1f83
+ url: buildbox:buildbox-integration/-/releases/1.3.31/downloads/recc-x86_64-linux-gnu.tgz
+ directory: usr/bin
diff --git a/tests/integration/project/elements/recc/remoteexecution.bst b/tests/integration/project/elements/recc/remoteexecution.bst
new file mode 100644
index 000000000..269895eb2
--- /dev/null
+++ b/tests/integration/project/elements/recc/remoteexecution.bst
@@ -0,0 +1,26 @@
+kind: autotools
+description: recc test with autotools
+
+build-depends:
+- filename: base/base-debian.bst
+ config:
+ digest-environment: RECC_REMOTE_PLATFORM_chrootRootDigest
+- recc/recc.bst
+
+sources:
+- kind: tar
+ url: project_dir:/files/amhello.tar.gz
+ ref: 534a884bc1974ffc539a9c215e35c4217b6f666a134cd729e786b9c84af99650
+
+sandbox:
+ remote-apis-socket:
+ path: /tmp/casd.sock
+
+environment:
+ CC: recc gcc
+ RECC_LOG_LEVEL: debug
+ RECC_LOG_DIRECTORY: .recc-log
+ RECC_DEPS_GLOBAL_PATHS: 1
+ RECC_NO_PATH_REWRITE: 1
+ RECC_LINK: 1
+ RECC_SERVER: unix:/tmp/casd.sock
diff --git a/tests/integration/project/project.conf b/tests/integration/project/project.conf
index ba0228348..2d5a36e90 100644
--- a/tests/integration/project/project.conf
+++ b/tests/integration/project/project.conf
@@ -5,6 +5,7 @@ element-path: elements
aliases:
test-images: https://bst-integration-test-images.ams3.cdn.digitaloceanspaces.com/
+ buildbox: https://gitlab.com/BuildGrid/buildbox/
project_dir: file://{project_dir}
plugins:
diff --git a/tests/integration/recc.py b/tests/integration/recc.py
new file mode 100644
index 000000000..c43ece5b6
--- /dev/null
+++ b/tests/integration/recc.py
@@ -0,0 +1,142 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Pylint doesn't play well with fixtures and dependency injection from pytest
+# pylint: disable=redefined-outer-name
+
+import os
+import pytest
+
+from buildstream._testing import cli_integration as cli # pylint: disable=unused-import
+from buildstream._testing.integration import assert_contains
+from buildstream._testing._utils.site import HAVE_SANDBOX
+
+pytestmark = pytest.mark.integration
+
+
+DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project")
+
+
+@pytest.mark.skipif(not HAVE_SANDBOX, reason="Only available with a functioning sandbox")
+@pytest.mark.datafiles(DATA_DIR)
+def test_remote_execution(cli, datafiles):
+ project = str(datafiles)
+ checkout1 = os.path.join(cli.directory, "checkout1")
+ checkout2 = os.path.join(cli.directory, "checkout2")
+ element_name = "recc/remoteexecution.bst"
+
+ # Always cache buildtrees to be able to check recc logs
+ result = cli.run(project=project, args=["--cache-buildtrees", "always", "build", element_name])
+ if result.exit_code != 0:
+ # Output recc logs in case of failure
+ cli.run(
+ project=project,
+ args=[
+ "shell",
+ "--build",
+ "--use-buildtree",
+ element_name,
+ "--",
+ "sh",
+ "-c",
+ "cat config.log .recc-log/* */.recc-log/*",
+ ],
+ )
+ assert result.exit_code == 0
+
+ result = cli.run(project=project, args=["artifact", "checkout", element_name, "--directory", checkout1])
+ assert result.exit_code == 0
+
+ assert_contains(
+ checkout1,
+ [
+ "/usr",
+ "/usr/bin",
+ "/usr/share",
+ "/usr/bin/hello",
+ "/usr/share/doc",
+ "/usr/share/doc/amhello",
+ "/usr/share/doc/amhello/README",
+ ],
+ )
+
+ # Check the main build log
+ result = cli.run(project=project, args=["artifact", "log", element_name])
+ assert result.exit_code == 0
+ log = result.output
+
+ # Verify we get expected output exactly once
+ assert log.count("Making all in src") == 1
+
+ result = cli.run(
+ project=project,
+ args=[
+ "shell",
+ "--build",
+ "--use-buildtree",
+ element_name,
+ "--",
+ "sh",
+ "-c",
+ "cat src/.recc-log/recc.buildbox*",
+ ],
+ )
+ assert result.exit_code == 0
+ recc_log = result.output
+
+ # Verify recc is successfully using remote execution for both, compiling and linking
+ assert recc_log.count("Executing action remotely") == 2
+ assert recc_log.count("Remote execution finished with exit code 0") == 2
+
+ # Delete artifact from BuildStream cache to trigger a BuildStream rebuild with action cache hits for recc
+ result = cli.run(project=project, args=["artifact", "delete", element_name])
+ assert result.exit_code == 0
+
+ result = cli.run(project=project, args=["--cache-buildtrees", "always", "build", element_name])
+ assert result.exit_code == 0
+
+ result = cli.run(project=project, args=["artifact", "checkout", element_name, "--directory", checkout2])
+ assert result.exit_code == 0
+
+ assert_contains(
+ checkout2,
+ [
+ "/usr",
+ "/usr/bin",
+ "/usr/share",
+ "/usr/bin/hello",
+ "/usr/share/doc",
+ "/usr/share/doc/amhello",
+ "/usr/share/doc/amhello/README",
+ ],
+ )
+
+ result = cli.run(
+ project=project,
+ args=[
+ "shell",
+ "--build",
+ "--use-buildtree",
+ element_name,
+ "--",
+ "sh",
+ "-c",
+ "cat src/.recc-log/recc.buildbox*",
+ ],
+ )
+ assert result.exit_code == 0
+ recc_log = result.output
+
+ # Verify recc is getting action cache hits for both, compiling and linking
+ assert recc_log.count("Action Cache hit") == 2