Cobalt takes build_type information

By default, the build_type is set to UNKNOWN_TYPE. This will be reported
for all reports until the Cobalt fuchsia application is updated to
provide the correct information.

Change-Id: I5fba4db7000dce4e7af78b1fa990f26d8453a360
Reviewed-on: https://fuchsia-review.googlesource.com/c/cobalt/+/508074
Commit-Queue: Jared Weinstein <jaredweinstein@google.com>
Reviewed-by: Zach Bush <zmbush@google.com>
diff --git a/src/pb/metadata_builder.cc b/src/pb/metadata_builder.cc
index 9e7b3e7..5418269 100644
--- a/src/pb/metadata_builder.cc
+++ b/src/pb/metadata_builder.cc
@@ -208,6 +208,9 @@
       case SystemProfileField::REALM:
         profile_out->set_realm(profile_in.realm());
         break;
+      case SystemProfileField::BUILD_TYPE:
+        profile_out->set_build_type(profile_in.build_type());
+        break;
     }
   }
 }
diff --git a/src/public/cobalt_config.h b/src/public/cobalt_config.h
index 20a69fc..246cbd1 100644
--- a/src/public/cobalt_config.h
+++ b/src/public/cobalt_config.h
@@ -12,6 +12,7 @@
 #include "src/lib/util/file_system.h"
 #include "src/local_aggregation_1_1/local_aggregate_storage/local_aggregate_storage.h"
 #include "src/logger/project_context.h"
+#include "src/pb/common.pb.h"
 #include "src/public/activity_listener_interface.h"
 #include "src/public/lib/http_client.h"
 #include "src/registry/metric_definition.pb.h"
@@ -163,6 +164,11 @@
   // example on Fuchsia a possible value for |version| is "20190220_01_RC00".
   std::string version = "";
 
+  // |build_type|: The build type of the running system. The use of this field
+  // is system-specific. Fuchsia can have possible values of "eng", "user", and
+  // "user_debug".
+  SystemProfile::BuildType build_type = SystemProfile::UNKNOWN_TYPE;
+
   // |release_stage|: The ReleaseStage of the running system.
   ReleaseStage release_stage = ReleaseStage::GA;
 
diff --git a/src/public/cobalt_service.cc b/src/public/cobalt_service.cc
index 101cc74..fe22c12 100644
--- a/src/public/cobalt_service.cc
+++ b/src/public/cobalt_service.cc
@@ -93,7 +93,8 @@
 CobaltService::CobaltService(CobaltConfig cfg)
     : enable_replacement_metrics_(cfg.enable_replacement_metrics),
       fs_(std::move(cfg.file_system)),
-      system_data_(cfg.product_name, cfg.board_name_suggestion, cfg.release_stage, cfg.version),
+      system_data_(cfg.product_name, cfg.board_name_suggestion, cfg.release_stage, cfg.version,
+                   cfg.build_type),
       global_project_context_factory_(
           cfg.global_registry
               ? std::make_unique<logger::ProjectContextFactory>(std::move(cfg.global_registry))
diff --git a/src/system_data/system_data.cc b/src/system_data/system_data.cc
index 70a7cda..50707fc 100644
--- a/src/system_data/system_data.cc
+++ b/src/system_data/system_data.cc
@@ -94,12 +94,14 @@
 }  // namespace
 
 SystemData::SystemData(const std::string& product_name, const std::string& board_name_suggestion,
-                       ReleaseStage release_stage, const std::string& version)
+                       ReleaseStage release_stage, const std::string& version,
+                       SystemProfile::BuildType build_type)
     : internal_metrics_(logger::InternalMetrics::NewWithLogger(nullptr)),
       release_stage_(release_stage) {
   system_profile_.set_product_name(product_name);
   system_profile_.set_board_name(board_name_suggestion);
   system_profile_.set_system_version(version);
+  system_profile_.set_build_type(build_type);
   system_profile_.set_realm("<unset>");
   system_profile_.set_channel("<unset>");
   PopulateSystemProfile();
diff --git a/src/system_data/system_data.h b/src/system_data/system_data.h
index 53700c0..d2f9abb 100644
--- a/src/system_data/system_data.h
+++ b/src/system_data/system_data.h
@@ -82,11 +82,14 @@
   //
   // |release_stage|: The ReleaseStage of the running system.
   //
+  // |build_type|: The BuildType of the running system.
+  //
   // |version|: The version of the running system. The use of this field is
   // system-specific. For example on Fuchsia a possible value for |version| is
   // "20190220_01_RC00".
   SystemData(const std::string& product_name, const std::string& board_name_suggestion,
-             ReleaseStage release_stage, const std::string& version = "");
+             ReleaseStage release_stage, const std::string& version = "",
+             SystemProfile::BuildType build_type = SystemProfile::UNKNOWN_TYPE);
 
   ~SystemData() override = default;
 
diff --git a/src/system_data/system_data_test.cc b/src/system_data/system_data_test.cc
index f9fbdff..b9415c9 100644
--- a/src/system_data/system_data_test.cc
+++ b/src/system_data/system_data_test.cc
@@ -20,13 +20,14 @@
 namespace cobalt::system_data {
 
 TEST(SystemDataTest, BasicTest) {
-  SystemData system_data("test_product", "", GA, "test_version");
+  SystemData system_data("test_product", "", GA, "test_version", SystemProfile::ENG);
   EXPECT_NE(SystemProfile::UNKNOWN_OS, system_data.system_profile().os());
   EXPECT_NE(SystemProfile::UNKNOWN_ARCH, system_data.system_profile().arch());
   EXPECT_EQ(ReleaseStage::GA, system_data.release_stage());
   EXPECT_NE(system_data.system_profile().board_name(), "");
   EXPECT_EQ(system_data.system_profile().product_name(), "test_product");
   EXPECT_EQ(system_data.system_profile().system_version(), "test_version");
+  EXPECT_EQ(system_data.system_profile().build_type(), SystemProfile::ENG);
 
   // Board names we expect to see.
   std::set<std::string> expected_board_names = {"Eve", "Generic ARM"};