diff options
-rw-r--r-- | src/buildtool/execution_api/local/local_action.cpp | 2 | ||||
-rw-r--r-- | test/buildtool/execution_api/common/api_test.hpp | 32 | ||||
-rw-r--r-- | test/buildtool/execution_api/local/local_api.test.cpp | 13 |
3 files changed, 46 insertions, 1 deletions
diff --git a/src/buildtool/execution_api/local/local_action.cpp b/src/buildtool/execution_api/local/local_action.cpp index 0d73d923..0328ca98 100644 --- a/src/buildtool/execution_api/local/local_action.cpp +++ b/src/buildtool/execution_api/local/local_action.cpp @@ -525,7 +525,7 @@ auto LocalAction::CollectAndStoreOutputs( " - symlink {}: {}", path, out_symlink.target()); - result->mutable_output_file_symlinks()->Add( + result->mutable_output_directory_symlinks()->Add( std::move(out_symlink)); } else { diff --git a/test/buildtool/execution_api/common/api_test.hpp b/test/buildtool/execution_api/common/api_test.hpp index f8981434..441c27b0 100644 --- a/test/buildtool/execution_api/common/api_test.hpp +++ b/test/buildtool/execution_api/common/api_test.hpp @@ -725,4 +725,36 @@ TestRetrieveFileAndSymlinkWithSameContentToPath(ApiFactory const& api_factory, } } +[[nodiscard]] static inline auto TestSymlinkCollection( + ApiFactory const& api_factory, + ExecProps const& props) { + auto api = api_factory(); + + auto action = api->CreateAction( + *api->UploadTree({}), + {"/bin/sh", "-c", "set -e; ln -s none foo; rm -rf bar; ln -s none bar"}, + "", + {"foo"}, + {"bar"}, + {}, + props); + + // run execution + auto const response = action->Execute(); + REQUIRE(response); + + // verify result + auto const artifacts = response->Artifacts(); + REQUIRE(artifacts.has_value()); + REQUIRE(artifacts.value()->contains("foo")); + CHECK(IsSymlinkObject(artifacts.value()->at("foo").type)); + REQUIRE(artifacts.value()->contains("bar")); + CHECK(IsSymlinkObject(artifacts.value()->at("bar").type)); + + // check if bar was correctly detected as directory symlink + auto dir_symlinks = response->DirectorySymlinks(); + REQUIRE(dir_symlinks); + CHECK((*dir_symlinks)->contains("bar")); +} + #endif // INCLUDED_SRC_TEST_BUILDTOOL_EXECUTION_API_COMMON_API_TEST_HPP diff --git a/test/buildtool/execution_api/local/local_api.test.cpp b/test/buildtool/execution_api/local/local_api.test.cpp index ec065cb7..94b9bf75 100644 --- a/test/buildtool/execution_api/local/local_api.test.cpp +++ b/test/buildtool/execution_api/local/local_api.test.cpp @@ -146,3 +146,16 @@ TEST_CASE("LocalAPI: Create directory prior to execution", "[execution_api]") { TestCreateDirPriorToExecution(api_factory, {}, /*is_hermetic=*/true); } + +TEST_CASE("LocalAPI: Collect file and directory symlinks", "[execution_api]") { + auto const storage_config = TestStorageConfig::Create(); + auto const storage = Storage::Create(&storage_config.Get()); + auto const local_exec_config = CreateLocalExecConfig(); + // pack the local context instances to be passed to LocalApi + LocalContext const local_context{.exec_config = &local_exec_config, + .storage_config = &storage_config.Get(), + .storage = &storage}; + FactoryApi api_factory(&local_context); + + TestSymlinkCollection(api_factory, {}); +} |