Append policy fetch timestamp to the enterprise reporting

Append last policy fetch timestamp to the Profile info. Right now we only
do it for Machine Level User Cloud Policy.

Bug: 956237
Change-Id: I94de55419a609974b05d1fdd3acb54b3a911d68a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1707550
Commit-Queue: Owen Min <zmin@chromium.org>
Reviewed-by: Julian Pastarmov <pastarmovj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#678756}
diff --git a/chrome/browser/enterprise_reporting/policy_info.cc b/chrome/browser/enterprise_reporting/policy_info.cc
index 5768441..505ce06 100644
--- a/chrome/browser/enterprise_reporting/policy_info.cc
+++ b/chrome/browser/enterprise_reporting/policy_info.cc
@@ -6,7 +6,14 @@
 
 #include "base/json/json_writer.h"
 #include "base/optional.h"
+#include "build/build_config.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/policy/chrome_browser_policy_connector.h"
+#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h"
 #include "chrome/browser/policy/policy_conversions.h"
+#include "components/policy/core/common/cloud/cloud_policy_client.h"
+#include "components/policy/core/common/cloud/cloud_policy_constants.h"
+#include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h"
 #include "components/policy/core/common/policy_types.h"
 
 namespace enterprise_reporting {
@@ -104,4 +111,19 @@
   }
 }
 
+void AppendMachineLevelUserCloudPolicyFetchTimestamp(
+    em::ChromeUserProfileInfo* profile_info) {
+#if !defined(OS_CHROMEOS)
+  MachineLevelUserCloudPolicyManager* manager =
+      g_browser_process->browser_policy_connector()
+          ->machine_level_user_cloud_policy_manager();
+  if (!manager || !manager->IsClientRegistered())
+    return;
+  auto* timestamp = profile_info->add_policy_fetched_timestamps();
+  timestamp->set_type(dm_protocol::kChromeMachineLevelExtensionCloudPolicyType);
+  timestamp->set_timestamp(
+      manager->core()->client()->last_policy_timestamp().ToJavaTime());
+#endif
+}
+
 }  // namespace enterprise_reporting
diff --git a/chrome/browser/enterprise_reporting/policy_info.h b/chrome/browser/enterprise_reporting/policy_info.h
index c8187a1d..8c7e701 100644
--- a/chrome/browser/enterprise_reporting/policy_info.h
+++ b/chrome/browser/enterprise_reporting/policy_info.h
@@ -23,6 +23,9 @@
     const base::Value& policies,
     em::ChromeUserProfileInfo* profile_info);
 
+void AppendMachineLevelUserCloudPolicyFetchTimestamp(
+    em::ChromeUserProfileInfo* profile_info);
+
 }  // namespace enterprise_reporting
 
 #endif  // CHROME_BROWSER_ENTERPRISE_REPORTING_POLICY_INFO_H_
diff --git a/chrome/browser/enterprise_reporting/policy_info_unittest.cc b/chrome/browser/enterprise_reporting/policy_info_unittest.cc
index 56030eed..0d3b8937 100644
--- a/chrome/browser/enterprise_reporting/policy_info_unittest.cc
+++ b/chrome/browser/enterprise_reporting/policy_info_unittest.cc
@@ -148,4 +148,10 @@
   EXPECT_NE(std::string(), policy1.error());
 }
 
+TEST_F(PolicyInfoTest, MachineLevelUserCloudPolicyFetchTimestamp) {
+  em::ChromeUserProfileInfo profile_info;
+  AppendMachineLevelUserCloudPolicyFetchTimestamp(&profile_info);
+  EXPECT_EQ(0, profile_info.policy_fetched_timestamps_size());
+}
+
 }  // namespace enterprise_reporting
diff --git a/chrome/browser/enterprise_reporting/profile_report_generator.cc b/chrome/browser/enterprise_reporting/profile_report_generator.cc
index 4aba7780..a7012fc 100644
--- a/chrome/browser/enterprise_reporting/profile_report_generator.cc
+++ b/chrome/browser/enterprise_reporting/profile_report_generator.cc
@@ -65,6 +65,7 @@
         /* is_pretty_print */ false, /* convert_types */ false);
     GetChromePolicyInfo();
     GetExtensionPolicyInfo();
+    GetPolicyFetchTimestampInfo();
   }
 
   CheckReportStatus();
@@ -106,6 +107,10 @@
   AppendExtensionPolicyInfoIntoProfileReport(policies_, report_.get());
 }
 
+void ProfileReportGenerator::GetPolicyFetchTimestampInfo() {
+  AppendMachineLevelUserCloudPolicyFetchTimestamp(report_.get());
+}
+
 void ProfileReportGenerator::OnPluginsLoaded(
     const std::vector<content::WebPluginInfo>& plugins) {
   for (auto plugin : plugins) {
diff --git a/chrome/browser/enterprise_reporting/profile_report_generator.h b/chrome/browser/enterprise_reporting/profile_report_generator.h
index 7372ed2..91addfa 100644
--- a/chrome/browser/enterprise_reporting/profile_report_generator.h
+++ b/chrome/browser/enterprise_reporting/profile_report_generator.h
@@ -54,7 +54,7 @@
   void GetPluginInfo();
   void GetChromePolicyInfo();
   void GetExtensionPolicyInfo();
-  // TODO(zmin): void GetPolicyFetchTimestampInfo();
+  void GetPolicyFetchTimestampInfo();
 
  private:
   void OnPluginsLoaded(const std::vector<content::WebPluginInfo>& plugins);