Trace processor: export telemetry metadata to json

Exports metadata entries written by telemetry to json format.

Bug: 132682848
Change-Id: Ie6400c7f2e95a42bcb95d695da2f26bdce9c00b0
diff --git a/src/trace_processor/export_json_unittest.cc b/src/trace_processor/export_json_unittest.cc
index 63a0c10..2f6dde5 100644
--- a/src/trace_processor/export_json_unittest.cc
+++ b/src/trace_processor/export_json_unittest.cc
@@ -127,6 +127,84 @@
   EXPECT_EQ(code, kResultWrongRefType);
 }
 
+TEST(ExportJsonTest, StorageWithMetadata) {
+  const char* kDescription = "description";
+  const char* kBenchmarkName = "benchmark name";
+  const char* kStoryName = "story name";
+  const char* kStoryTag1 = "tag1";
+  const char* kStoryTag2 = "tag2";
+  const int64_t kBenchmarkStart = 1000000;
+  const int64_t kStoryStart = 2000000;
+  const bool kHadFailures = true;
+
+  TraceStorage storage;
+
+  StringId desc_id = storage.InternString(base::StringView(kDescription));
+  Variadic description = Variadic::String(desc_id);
+  storage.SetMetadata(metadata::benchmark_description, description);
+
+  StringId benchmark_name_id =
+      storage.InternString(base::StringView(kBenchmarkName));
+  Variadic benchmark_name = Variadic::String(benchmark_name_id);
+  storage.SetMetadata(metadata::benchmark_name, benchmark_name);
+
+  StringId story_name_id = storage.InternString(base::StringView(kStoryName));
+  Variadic story_name = Variadic::String(story_name_id);
+  storage.SetMetadata(metadata::benchmark_story_name, story_name);
+
+  StringId tag1_id = storage.InternString(base::StringView(kStoryTag1));
+  StringId tag2_id = storage.InternString(base::StringView(kStoryTag2));
+  Variadic tag1 = Variadic::String(tag1_id);
+  Variadic tag2 = Variadic::String(tag2_id);
+  storage.AppendMetadata(metadata::benchmark_story_tags, tag1);
+  storage.AppendMetadata(metadata::benchmark_story_tags, tag2);
+
+  Variadic benchmark_start = Variadic::Integer(kBenchmarkStart);
+  storage.SetMetadata(metadata::benchmark_start_time_us, benchmark_start);
+
+  Variadic story_start = Variadic::Integer(kStoryStart);
+  storage.SetMetadata(metadata::benchmark_story_run_time_us, story_start);
+
+  Variadic had_failures = Variadic::Integer(kHadFailures);
+  storage.SetMetadata(metadata::benchmark_had_failures, had_failures);
+
+  base::TempFile temp_file = base::TempFile::Create();
+  FILE* output = fopen(temp_file.path().c_str(), "w+");
+  int code = ExportJson(&storage, output);
+
+  EXPECT_EQ(code, kResultOk);
+
+  Json::Reader reader;
+  Json::Value result;
+
+  EXPECT_TRUE(reader.parse(ReadFile(output), result));
+  EXPECT_TRUE(result.isMember("metadata"));
+  EXPECT_TRUE(result["metadata"].isMember("telemetry"));
+  Json::Value telemetry_metadata = result["metadata"]["telemetry"];
+
+  EXPECT_EQ(telemetry_metadata["benchmarkDescriptions"].size(), 1);
+  EXPECT_EQ(telemetry_metadata["benchmarkDescriptions"][0].asString(),
+            kDescription);
+
+  EXPECT_EQ(telemetry_metadata["benchmarks"].size(), 1);
+  EXPECT_EQ(telemetry_metadata["benchmarks"][0].asString(), kBenchmarkName);
+
+  EXPECT_EQ(telemetry_metadata["stories"].size(), 1);
+  EXPECT_EQ(telemetry_metadata["stories"][0].asString(), kStoryName);
+
+  EXPECT_EQ(telemetry_metadata["storyTags"].size(), 2);
+  EXPECT_EQ(telemetry_metadata["storyTags"][0].asString(), kStoryTag1);
+  EXPECT_EQ(telemetry_metadata["storyTags"][1].asString(), kStoryTag2);
+
+  EXPECT_EQ(telemetry_metadata["benchmarkStart"].asInt(),
+            kBenchmarkStart / 1000.0);
+
+  EXPECT_EQ(telemetry_metadata["traceStart"].asInt(), kStoryStart / 1000.0);
+
+  EXPECT_EQ(telemetry_metadata["hadFailures"].size(), 1);
+  EXPECT_EQ(telemetry_metadata["hadFailures"][0].asBool(), kHadFailures);
+}
+
 }  // namespace
 }  // namespace json
 }  // namespace trace_processor