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