Add implementation of writing to BuildInfo files. PiperOrigin-RevId: 452754537 Change-Id: I9ea726719bc1c1edbcfed0a588ec08274a24f270
diff --git a/tools/cpp/build_info_translation_helper.cc b/tools/cpp/build_info_translation_helper.cc index 26192a1..51a004b 100644 --- a/tools/cpp/build_info_translation_helper.cc +++ b/tools/cpp/build_info_translation_helper.cc
@@ -13,18 +13,15 @@ // limitations under the License. #include "tools/cpp/build_info_translation_helper.h" -#include <fstream> #include <string> #include <unordered_map> -#include <vector> #include "third_party/absl/strings/str_split.h" namespace bazel { namespace tools { namespace cpp { - -absl::Status BuildInfoTranslationHelper::ParseFile( +const absl::Status BuildInfoTranslationHelper::ParseFile( const std::string &file_path, std::unordered_map<std::string, std::string> &file_map) { std::ifstream file_reader(file_path); @@ -35,6 +32,7 @@ std::string line; // Split the line on the first separator, in case there is // no separator found return a non-zero exit code. + constexpr static char kKeyValueSeparator[] = " "; while (std::getline(file_reader, line)) { if (absl::StrContains(line, kKeyValueSeparator)) { std::vector<std::string> key_and_value = @@ -56,12 +54,12 @@ return absl::Status(absl::StatusCode::kOk, ""); } -absl::Status BuildInfoTranslationHelper::ParseInfoFile( +const absl::Status BuildInfoTranslationHelper::ParseInfoFile( std::unordered_map<std::string, std::string> &file_map) { return BuildInfoTranslationHelper::ParseFile(info_file_path_, file_map); } -absl::Status BuildInfoTranslationHelper::ParseVersionFile( +const absl::Status BuildInfoTranslationHelper::ParseVersionFile( std::unordered_map<std::string, std::string> &file_map) { return BuildInfoTranslationHelper::ParseFile(version_file_path_, file_map); }
diff --git a/tools/cpp/build_info_translation_helper.h b/tools/cpp/build_info_translation_helper.h index 722b253..4e0efd3 100644 --- a/tools/cpp/build_info_translation_helper.h +++ b/tools/cpp/build_info_translation_helper.h
@@ -14,15 +14,26 @@ #ifndef BAZEL_TOOLS_CPP_BUILD_INFO_TRANSLATION_HELPER_H_ #define BAZEL_TOOLS_CPP_BUILD_INFO_TRANSLATION_HELPER_H_ +#include <fstream> #include <string> #include <unordered_map> +#include <vector> #include "third_party/absl/status/status.h" +#include "third_party/absl/types/span.h" namespace bazel { namespace tools { namespace cpp { - +inline void WriteFile(absl::Span<const std::string> entries, + const std::string& file_path) { + std::ofstream file_writer(file_path); + for (const std::string& i : entries) { + file_writer << i << "\n"; + file_writer.flush(); + } + file_writer.close(); +} class BuildInfoTranslationHelper { public: BuildInfoTranslationHelper(const std::string& info_file_path, @@ -30,19 +41,17 @@ : info_file_path_(info_file_path), version_file_path_(version_file_path) {} - absl::Status ParseInfoFile( + const absl::Status ParseInfoFile( std::unordered_map<std::string, std::string>& file_map); - absl::Status ParseVersionFile( + const absl::Status ParseVersionFile( std::unordered_map<std::string, std::string>& file_map); private: - std::string info_file_path_; - std::string version_file_path_; - absl::Status ParseFile( + const std::string info_file_path_; + const std::string version_file_path_; + const absl::Status ParseFile( const std::string& file_path, std::unordered_map<std::string, std::string>& file_map); - - const char kKeyValueSeparator = ' '; }; } // namespace cpp
diff --git a/tools/cpp/build_info_translation_helper_test.cc b/tools/cpp/build_info_translation_helper_test.cc index 4c23858..33a5362 100644 --- a/tools/cpp/build_info_translation_helper_test.cc +++ b/tools/cpp/build_info_translation_helper_test.cc
@@ -14,6 +14,9 @@ #include "tools/cpp/build_info_translation_helper.h" +#include <fstream> +#include <vector> + #include "googletest/include/gtest/gtest.h" namespace bazel { @@ -25,7 +28,7 @@ class BuildInfoTranslationHelperTest : public testing::Test {}; TEST_F(BuildInfoTranslationHelperTest, CorrectFileFormat) { - BuildInfoTranslationHelper helper = BuildInfoTranslationHelper( + BuildInfoTranslationHelper helper( absl::StrCat(kTestFilePrefix, "bazel/tools/cpp/test_data/correct_file_format.txt"), ""); @@ -33,24 +36,22 @@ {{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3 and some spaces"}}); - absl::Status expected_info_status = absl::Status(absl::StatusCode::kOk, ""); + absl::Status expected_info_status = absl::OkStatus(); std::unordered_map<std::string, std::string> actual_info_file_map; absl::Status actual_info_status = helper.ParseInfoFile(actual_info_file_map); - ASSERT_EQ(actual_info_status, expected_info_status); - ASSERT_EQ(actual_info_file_map, expected_info_file_map); + EXPECT_EQ(actual_info_status, expected_info_status); + EXPECT_EQ(actual_info_file_map, expected_info_file_map); } TEST_F(BuildInfoTranslationHelperTest, NonExistingFile) { - BuildInfoTranslationHelper helper = BuildInfoTranslationHelper( - "", - absl::StrCat(kTestFilePrefix, - "bazel/tools/cpp/test_data/this_file_does_not_exist.txt")); - absl::Status expected_version_status = absl::Status( - absl::StatusCode::kNotFound, - "Could not open file: " - "third_party/bazel/tools/cpp/test_data/this_file_does_not_exist.txt"); + BuildInfoTranslationHelper helper( + "", "bazel/tools/cpp/test_data/this_file_does_not_exist.txt"); + absl::Status expected_version_status = + absl::Status(absl::StatusCode::kNotFound, + "Could not open file: " + "bazel/tools/cpp/test_data/this_file_does_not_exist.txt"); std::unordered_map<std::string, std::string> actual_version_file_map; absl::Status actual_version_status = @@ -60,7 +61,7 @@ } TEST_F(BuildInfoTranslationHelperTest, DuplicatedKey) { - BuildInfoTranslationHelper helper = BuildInfoTranslationHelper( + BuildInfoTranslationHelper helper( absl::StrCat(kTestFilePrefix, "bazel/tools/cpp/test_data/duplicated_key.txt"), ""); @@ -75,7 +76,7 @@ } TEST_F(BuildInfoTranslationHelperTest, MissingSeparator) { - BuildInfoTranslationHelper helper = BuildInfoTranslationHelper( + BuildInfoTranslationHelper helper( "", absl::StrCat(kTestFilePrefix, "bazel/tools/cpp/test_data/no_separator.txt")); absl::Status expected_version_status = @@ -90,6 +91,21 @@ ASSERT_EQ(actual_version_status, expected_version_status); } +TEST_F(BuildInfoTranslationHelperTest, WriteFileWorksCorrectly) { + std::vector<std::string> expected_entries({"aaa", "bbb", "ccc", "ddd"}); + WriteFile(expected_entries, + absl::StrCat(FLAGS_test_tmpdir, "/", "write_file.txt")); + std::ifstream file_reader( + absl::StrCat(FLAGS_test_tmpdir, "/", "write_file.txt")); + std::string line = ""; + std::vector<std::string> actual_entries; + while (std::getline(file_reader, line)) { + actual_entries.push_back(line); + } + + EXPECT_EQ(actual_entries, expected_entries); +} + } // namespace } // namespace cpp } // namespace tools