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