tests/remoteexecution/remotecache.py: Add test for cache storage-service

This tests the cache `storage-service` configuration with remote
execution. It verifies that build outputs are not downloaded if not
necessary.
diff --git a/tests/remoteexecution/remotecache.py b/tests/remoteexecution/remotecache.py
new file mode 100644
index 0000000..ee3465e
--- /dev/null
+++ b/tests/remoteexecution/remotecache.py
@@ -0,0 +1,62 @@
+# Pylint doesn't play well with fixtures and dependency injection from pytest
+# pylint: disable=redefined-outer-name
+
+import copy
+import os
+import pytest
+
+from buildstream.exceptions import ErrorDomain
+from buildstream.testing import cli_remote_execution as cli  # pylint: disable=unused-import
+from buildstream.testing.integration import assert_contains
+
+
+pytestmark = pytest.mark.remoteexecution
+
+
+DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project")
+
+
+# Test building an executable with remote-execution and remote-cache enabled
+@pytest.mark.datafiles(DATA_DIR)
+def test_remote_autotools_build(cli, datafiles, remote_services):
+    project = str(datafiles)
+    checkout = os.path.join(cli.directory, "checkout")
+    element_name = "autotools/amhello.bst"
+
+    services = cli.ensure_services()
+    assert set(services) == set(["action-cache", "execution", "storage"])
+
+    # Enable remote cache and remove explicit remote execution CAS configuration.
+    config_without_remote_cache = copy.deepcopy(cli.config)
+    cli.configure({"cache": {"storage-service": {"url": remote_services.storage_service}}})
+    del cli.config["remote-execution"]["storage-service"]
+    config_with_remote_cache = cli.config
+
+    # Build element with remote execution.
+    result = cli.run(project=project, args=["build", element_name])
+    result.assert_success()
+
+    # Attempt checkout from local cache by temporarily disabling remote cache.
+    # This should fail as the build result shouldn't have been downloaded to the local cache.
+    cli.config = config_without_remote_cache
+    result = cli.run(project=project, args=["artifact", "checkout", element_name, "--directory", checkout])
+    result.assert_main_error(ErrorDomain.STREAM, "uncached-checkout-attempt")
+    cli.config = config_with_remote_cache
+
+    # Attempt checkout again with remote cache.
+    result = cli.run(project=project, args=["artifact", "checkout", element_name, "--directory", checkout])
+    result.assert_success()
+
+    assert_contains(
+        checkout,
+        [
+            "/usr",
+            "/usr/lib",
+            "/usr/bin",
+            "/usr/share",
+            "/usr/bin/hello",
+            "/usr/share/doc",
+            "/usr/share/doc/amhello",
+            "/usr/share/doc/amhello/README",
+        ],
+    )