xref: /aosp_15_r20/external/cronet/components/metrics/metrics_log_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_log.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <string>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/base64.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/command_line.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/metrics/bucket_ranges.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/metrics/sample_vector.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/system/sys_info.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/test/simple_test_clock.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/test/simple_test_tick_clock.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/test/task_environment.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/time/default_clock.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/time/default_tick_clock.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
27*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
28*6777b538SAndroid Build Coastguard Worker #include "build/chromeos_buildflags.h"
29*6777b538SAndroid Build Coastguard Worker #include "components/metrics/cpu_metrics_provider.h"
30*6777b538SAndroid Build Coastguard Worker #include "components/metrics/delegating_provider.h"
31*6777b538SAndroid Build Coastguard Worker #include "components/metrics/environment_recorder.h"
32*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_pref_names.h"
33*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_state_manager.h"
34*6777b538SAndroid Build Coastguard Worker #include "components/metrics/test/test_metrics_provider.h"
35*6777b538SAndroid Build Coastguard Worker #include "components/metrics/test/test_metrics_service_client.h"
36*6777b538SAndroid Build Coastguard Worker #include "components/network_time/network_time_test_utils.h"
37*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_service.h"
38*6777b538SAndroid Build Coastguard Worker #include "components/prefs/testing_pref_service.h"
39*6777b538SAndroid Build Coastguard Worker #include "components/variations/active_field_trials.h"
40*6777b538SAndroid Build Coastguard Worker #include "services/network/test/test_shared_url_loader_factory.h"
41*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
42*6777b538SAndroid Build Coastguard Worker #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
45*6777b538SAndroid Build Coastguard Worker #include "base/android/build_info.h"
46*6777b538SAndroid Build Coastguard Worker #endif
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
49*6777b538SAndroid Build Coastguard Worker #include "base/win/current_module.h"
50*6777b538SAndroid Build Coastguard Worker #endif
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX)
53*6777b538SAndroid Build Coastguard Worker #include "base/nix/xdg_util.h"
54*6777b538SAndroid Build Coastguard Worker #include "base/scoped_environment_variable_override.h"
55*6777b538SAndroid Build Coastguard Worker #endif
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker namespace metrics {
58*6777b538SAndroid Build Coastguard Worker namespace {
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker const char kClientId[] = "0a94430b-18e5-43c8-a657-580f7e855ce1";
61*6777b538SAndroid Build Coastguard Worker const int kSessionId = 127;
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker class TestMetricsLog : public MetricsLog {
64*6777b538SAndroid Build Coastguard Worker  public:
TestMetricsLog(const std::string & client_id,int session_id,LogType log_type,MetricsServiceClient * client)65*6777b538SAndroid Build Coastguard Worker   TestMetricsLog(const std::string& client_id,
66*6777b538SAndroid Build Coastguard Worker                  int session_id,
67*6777b538SAndroid Build Coastguard Worker                  LogType log_type,
68*6777b538SAndroid Build Coastguard Worker                  MetricsServiceClient* client)
69*6777b538SAndroid Build Coastguard Worker       : MetricsLog(client_id, session_id, log_type, client) {}
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   TestMetricsLog(const TestMetricsLog&) = delete;
72*6777b538SAndroid Build Coastguard Worker   TestMetricsLog& operator=(const TestMetricsLog&) = delete;
73*6777b538SAndroid Build Coastguard Worker 
~TestMetricsLog()74*6777b538SAndroid Build Coastguard Worker   ~TestMetricsLog() override {}
75*6777b538SAndroid Build Coastguard Worker 
uma_proto() const76*6777b538SAndroid Build Coastguard Worker   const ChromeUserMetricsExtension& uma_proto() const {
77*6777b538SAndroid Build Coastguard Worker     return *MetricsLog::uma_proto();
78*6777b538SAndroid Build Coastguard Worker   }
79*6777b538SAndroid Build Coastguard Worker 
mutable_uma_proto()80*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension* mutable_uma_proto() {
81*6777b538SAndroid Build Coastguard Worker     return MetricsLog::uma_proto();
82*6777b538SAndroid Build Coastguard Worker   }
83*6777b538SAndroid Build Coastguard Worker 
system_profile() const84*6777b538SAndroid Build Coastguard Worker   const SystemProfileProto& system_profile() const {
85*6777b538SAndroid Build Coastguard Worker     return uma_proto().system_profile();
86*6777b538SAndroid Build Coastguard Worker   }
87*6777b538SAndroid Build Coastguard Worker };
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker // Returns the expected hardware class for a metrics log.
GetExpectedHardwareClass()90*6777b538SAndroid Build Coastguard Worker std::string GetExpectedHardwareClass() {
91*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS_ASH)
92*6777b538SAndroid Build Coastguard Worker   // Currently, we are relying on base/ implementation for functionality on our
93*6777b538SAndroid Build Coastguard Worker   // side which can be fragile if in the future someone decides to change that.
94*6777b538SAndroid Build Coastguard Worker   // This replicates the logic to get the hardware class for ChromeOS and this
95*6777b538SAndroid Build Coastguard Worker   // result should match with the result by calling
96*6777b538SAndroid Build Coastguard Worker   // base::SysInfo::HardwareModelName().
97*6777b538SAndroid Build Coastguard Worker   std::string board = base::SysInfo::GetLsbReleaseBoard();
98*6777b538SAndroid Build Coastguard Worker   if (board == "unknown") {
99*6777b538SAndroid Build Coastguard Worker     return "";
100*6777b538SAndroid Build Coastguard Worker   }
101*6777b538SAndroid Build Coastguard Worker   const size_t index = board.find("-signed-");
102*6777b538SAndroid Build Coastguard Worker   if (index != std::string::npos)
103*6777b538SAndroid Build Coastguard Worker     board.resize(index);
104*6777b538SAndroid Build Coastguard Worker   return base::ToUpperASCII(board);
105*6777b538SAndroid Build Coastguard Worker #else
106*6777b538SAndroid Build Coastguard Worker   return base::SysInfo::HardwareModelName();
107*6777b538SAndroid Build Coastguard Worker #endif
108*6777b538SAndroid Build Coastguard Worker }
109*6777b538SAndroid Build Coastguard Worker 
110*6777b538SAndroid Build Coastguard Worker // Sets the time in |network_time| to |time|.
UpdateNetworkTime(network_time::NetworkTimeTracker * network_time_tracker,base::TickClock * tick_clock,base::Time time)111*6777b538SAndroid Build Coastguard Worker void UpdateNetworkTime(network_time::NetworkTimeTracker* network_time_tracker,
112*6777b538SAndroid Build Coastguard Worker                        base::TickClock* tick_clock,
113*6777b538SAndroid Build Coastguard Worker                        base::Time time) {
114*6777b538SAndroid Build Coastguard Worker   network_time_tracker->UpdateNetworkTime(
115*6777b538SAndroid Build Coastguard Worker       time,
116*6777b538SAndroid Build Coastguard Worker       base::Seconds(1),         // resolution
117*6777b538SAndroid Build Coastguard Worker       base::Milliseconds(250),  // latency
118*6777b538SAndroid Build Coastguard Worker       tick_clock->NowTicks());  // posting time
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker }  // namespace
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker class MetricsLogTest : public testing::Test {
124*6777b538SAndroid Build Coastguard Worker  public:
MetricsLogTest()125*6777b538SAndroid Build Coastguard Worker   MetricsLogTest() { MetricsLog::RegisterPrefs(prefs_.registry()); }
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker   MetricsLogTest(const MetricsLogTest&) = delete;
128*6777b538SAndroid Build Coastguard Worker   MetricsLogTest& operator=(const MetricsLogTest&) = delete;
129*6777b538SAndroid Build Coastguard Worker 
~MetricsLogTest()130*6777b538SAndroid Build Coastguard Worker   ~MetricsLogTest() override {}
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker  protected:
133*6777b538SAndroid Build Coastguard Worker   // Check that the values in |system_values| are filled in and expected ones
134*6777b538SAndroid Build Coastguard Worker   // correspond to the test data defined at the top of this file.
CheckSystemProfile(const SystemProfileProto & system_profile)135*6777b538SAndroid Build Coastguard Worker   void CheckSystemProfile(const SystemProfileProto& system_profile) {
136*6777b538SAndroid Build Coastguard Worker     // Check for presence of core system profile fields.
137*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(system_profile.has_build_timestamp());
138*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(system_profile.has_app_version());
139*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(system_profile.has_channel());
140*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(system_profile.has_is_extended_stable_channel());
141*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(system_profile.has_application_locale());
142*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(system_profile.has_client_uuid());
143*6777b538SAndroid Build Coastguard Worker 
144*6777b538SAndroid Build Coastguard Worker     const SystemProfileProto::OS& os = system_profile.os();
145*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(os.has_name());
146*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(os.has_version());
147*6777b538SAndroid Build Coastguard Worker 
148*6777b538SAndroid Build Coastguard Worker     // Check matching test brand code.
149*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(TestMetricsServiceClient::kBrandForTesting,
150*6777b538SAndroid Build Coastguard Worker               system_profile.brand_code());
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker     // Check for presence of fields set by a metrics provider.
153*6777b538SAndroid Build Coastguard Worker     const SystemProfileProto::Hardware& hardware = system_profile.hardware();
154*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(hardware.hardware_class(), GetExpectedHardwareClass());
155*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(hardware.has_cpu());
156*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(hardware.cpu().has_vendor_name());
157*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(hardware.cpu().has_signature());
158*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(hardware.cpu().has_num_cores());
159*6777b538SAndroid Build Coastguard Worker 
160*6777b538SAndroid Build Coastguard Worker     // TODO(isherman): Verify other data written into the protobuf as a result
161*6777b538SAndroid Build Coastguard Worker     // of this call.
162*6777b538SAndroid Build Coastguard Worker   }
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker   TestMetricsServiceClient client_;
165*6777b538SAndroid Build Coastguard Worker   TestingPrefServiceSimple prefs_;
166*6777b538SAndroid Build Coastguard Worker };
167*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,FinalizedRecordId)168*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, FinalizedRecordId) {
169*6777b538SAndroid Build Coastguard Worker   MetricsLog log1(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
170*6777b538SAndroid Build Coastguard Worker   MetricsLog log2(kClientId, kSessionId, MetricsLog::INDEPENDENT_LOG, &client_);
171*6777b538SAndroid Build Coastguard Worker   MetricsLog log3(kClientId, kSessionId, MetricsLog::INITIAL_STABILITY_LOG,
172*6777b538SAndroid Build Coastguard Worker                   &client_);
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(log1.uma_proto()->has_finalized_record_id());
175*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(log2.uma_proto()->has_finalized_record_id());
176*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(log3.uma_proto()->has_finalized_record_id());
177*6777b538SAndroid Build Coastguard Worker 
178*6777b538SAndroid Build Coastguard Worker   // Set an initial finalized record-id value in prefs, so test values are
179*6777b538SAndroid Build Coastguard Worker   // predictable.
180*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsLogFinalizedRecordId, 500);
181*6777b538SAndroid Build Coastguard Worker 
182*6777b538SAndroid Build Coastguard Worker   log1.AssignFinalizedRecordId(&prefs_);
183*6777b538SAndroid Build Coastguard Worker   log2.AssignFinalizedRecordId(&prefs_);
184*6777b538SAndroid Build Coastguard Worker   log3.AssignFinalizedRecordId(&prefs_);
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(501, log1.uma_proto()->finalized_record_id());
187*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(502, log2.uma_proto()->finalized_record_id());
188*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(503, log3.uma_proto()->finalized_record_id());
189*6777b538SAndroid Build Coastguard Worker }
190*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,RecordId)191*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, RecordId) {
192*6777b538SAndroid Build Coastguard Worker   MetricsLog log1(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
193*6777b538SAndroid Build Coastguard Worker   MetricsLog log2(kClientId, kSessionId, MetricsLog::INDEPENDENT_LOG, &client_);
194*6777b538SAndroid Build Coastguard Worker   MetricsLog log3(kClientId, kSessionId, MetricsLog::INITIAL_STABILITY_LOG,
195*6777b538SAndroid Build Coastguard Worker                   &client_);
196*6777b538SAndroid Build Coastguard Worker 
197*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(log1.uma_proto()->has_record_id());
198*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(log2.uma_proto()->has_record_id());
199*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(log3.uma_proto()->has_record_id());
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker   // Set an initial record-id value in prefs, so test values are predictable.
202*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsLogRecordId, 500);
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker   log1.AssignRecordId(&prefs_);
205*6777b538SAndroid Build Coastguard Worker   log2.AssignRecordId(&prefs_);
206*6777b538SAndroid Build Coastguard Worker   log3.AssignRecordId(&prefs_);
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(501, log1.uma_proto()->record_id());
209*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(502, log2.uma_proto()->record_id());
210*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(503, log3.uma_proto()->record_id());
211*6777b538SAndroid Build Coastguard Worker }
212*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,SessionHash)213*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, SessionHash) {
214*6777b538SAndroid Build Coastguard Worker   MetricsLog log1(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
215*6777b538SAndroid Build Coastguard Worker   MetricsLog log2(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   // Verify that created logs are tagged with the same session hash.
218*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log1.uma_proto()->system_profile().has_session_hash());
219*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log2.uma_proto()->system_profile().has_session_hash());
220*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(log1.uma_proto()->system_profile().session_hash(),
221*6777b538SAndroid Build Coastguard Worker             log2.uma_proto()->system_profile().session_hash());
222*6777b538SAndroid Build Coastguard Worker }
223*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,LogType)224*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, LogType) {
225*6777b538SAndroid Build Coastguard Worker   MetricsLog log1(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
226*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(MetricsLog::ONGOING_LOG, log1.log_type());
227*6777b538SAndroid Build Coastguard Worker 
228*6777b538SAndroid Build Coastguard Worker   MetricsLog log2(kClientId, kSessionId, MetricsLog::INITIAL_STABILITY_LOG,
229*6777b538SAndroid Build Coastguard Worker                   &client_);
230*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(MetricsLog::INITIAL_STABILITY_LOG, log2.log_type());
231*6777b538SAndroid Build Coastguard Worker }
232*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,BasicRecord)233*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, BasicRecord) {
234*6777b538SAndroid Build Coastguard Worker   client_.set_version_string("bogus version");
235*6777b538SAndroid Build Coastguard Worker   const std::string kOtherClientId = "0a94430b-18e5-43c8-a657-580f7e855ce2";
236*6777b538SAndroid Build Coastguard Worker   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
237*6777b538SAndroid Build Coastguard Worker   // Clears existing command line flags and sets mock flags:
238*6777b538SAndroid Build Coastguard Worker   // "--mock-flag-1 --mock-flag-2=unused_value"
239*6777b538SAndroid Build Coastguard Worker   // Hashes of these flags should be populated on the system_profile field.
240*6777b538SAndroid Build Coastguard Worker   command_line->InitFromArgv(0, nullptr);
241*6777b538SAndroid Build Coastguard Worker   command_line->AppendSwitch("mock-flag-1");
242*6777b538SAndroid Build Coastguard Worker   command_line->AppendSwitchASCII("mock-flag-2", "unused_value");
243*6777b538SAndroid Build Coastguard Worker 
244*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX)
245*6777b538SAndroid Build Coastguard Worker   base::ScopedEnvironmentVariableOverride scoped_desktop_override(
246*6777b538SAndroid Build Coastguard Worker       base::nix::kXdgCurrentDesktopEnvVar, "GNOME");
247*6777b538SAndroid Build Coastguard Worker   metrics::SystemProfileProto::OS::XdgCurrentDesktop expected_current_desktop =
248*6777b538SAndroid Build Coastguard Worker       metrics::SystemProfileProto::OS::GNOME;
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker   base::ScopedEnvironmentVariableOverride scoped_session_override(
251*6777b538SAndroid Build Coastguard Worker       base::nix::kXdgSessionTypeEnvVar, "wayland");
252*6777b538SAndroid Build Coastguard Worker   metrics::SystemProfileProto::OS::XdgSessionType expected_session_type =
253*6777b538SAndroid Build Coastguard Worker       metrics::SystemProfileProto::OS::WAYLAND;
254*6777b538SAndroid Build Coastguard Worker #endif
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker   MetricsLog log(kOtherClientId, 137, MetricsLog::ONGOING_LOG, &client_);
257*6777b538SAndroid Build Coastguard Worker 
258*6777b538SAndroid Build Coastguard Worker   std::string encoded;
259*6777b538SAndroid Build Coastguard Worker   log.FinalizeLog(/*truncate_events=*/false, client_.GetVersionString(),
260*6777b538SAndroid Build Coastguard Worker                   log.GetCurrentClockTime(/*record_time_zone=*/true), &encoded);
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker   // A couple of fields are hard to mock, so these will be copied over directly
263*6777b538SAndroid Build Coastguard Worker   // for the expected output.
264*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension parsed;
265*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(parsed.ParseFromString(encoded));
266*6777b538SAndroid Build Coastguard Worker 
267*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension expected;
268*6777b538SAndroid Build Coastguard Worker   expected.set_client_id(13917849739535108017ull);  // Hashed kOtherClientId
269*6777b538SAndroid Build Coastguard Worker   expected.set_session_id(137);
270*6777b538SAndroid Build Coastguard Worker 
271*6777b538SAndroid Build Coastguard Worker   SystemProfileProto* system_profile = expected.mutable_system_profile();
272*6777b538SAndroid Build Coastguard Worker   system_profile->set_app_version("bogus version");
273*6777b538SAndroid Build Coastguard Worker   // Make sure |client_uuid| in the system profile is the unhashed client id
274*6777b538SAndroid Build Coastguard Worker   // and is the same as the client id in |local_prefs|.
275*6777b538SAndroid Build Coastguard Worker   system_profile->set_client_uuid(kOtherClientId);
276*6777b538SAndroid Build Coastguard Worker   system_profile->set_channel(client_.GetChannel());
277*6777b538SAndroid Build Coastguard Worker   system_profile->set_application_locale(client_.GetApplicationLocale());
278*6777b538SAndroid Build Coastguard Worker   system_profile->set_brand_code(TestMetricsServiceClient::kBrandForTesting);
279*6777b538SAndroid Build Coastguard Worker   // Hashes of "mock-flag-1" and "mock-flag-2" from SetUpCommandLine.
280*6777b538SAndroid Build Coastguard Worker   system_profile->add_command_line_key_hash(2578836236);
281*6777b538SAndroid Build Coastguard Worker   system_profile->add_command_line_key_hash(2867288449);
282*6777b538SAndroid Build Coastguard Worker   // The session hash.
283*6777b538SAndroid Build Coastguard Worker   system_profile->set_session_hash(
284*6777b538SAndroid Build Coastguard Worker       log.uma_proto()->system_profile().session_hash());
285*6777b538SAndroid Build Coastguard Worker 
286*6777b538SAndroid Build Coastguard Worker #if defined(ADDRESS_SANITIZER) || DCHECK_IS_ON()
287*6777b538SAndroid Build Coastguard Worker   system_profile->set_is_instrumented_build(true);
288*6777b538SAndroid Build Coastguard Worker #endif
289*6777b538SAndroid Build Coastguard Worker   metrics::SystemProfileProto::Hardware* hardware =
290*6777b538SAndroid Build Coastguard Worker       system_profile->mutable_hardware();
291*6777b538SAndroid Build Coastguard Worker   hardware->set_cpu_architecture(base::SysInfo::OperatingSystemArchitecture());
292*6777b538SAndroid Build Coastguard Worker   auto app_os_arch = base::SysInfo::ProcessCPUArchitecture();
293*6777b538SAndroid Build Coastguard Worker   if (!app_os_arch.empty())
294*6777b538SAndroid Build Coastguard Worker     hardware->set_app_cpu_architecture(app_os_arch);
295*6777b538SAndroid Build Coastguard Worker   hardware->set_system_ram_mb(base::SysInfo::AmountOfPhysicalMemoryMB());
296*6777b538SAndroid Build Coastguard Worker   hardware->set_hardware_class(GetExpectedHardwareClass());
297*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
298*6777b538SAndroid Build Coastguard Worker   hardware->set_dll_base(reinterpret_cast<uint64_t>(CURRENT_MODULE()));
299*6777b538SAndroid Build Coastguard Worker #endif
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS_LACROS)
302*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_name("Lacros");
303*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_CHROMEOS_ASH)
304*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_name("CrOS");
305*6777b538SAndroid Build Coastguard Worker #else
306*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_name(base::SysInfo::OperatingSystemName());
307*6777b538SAndroid Build Coastguard Worker #endif
308*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_version(
309*6777b538SAndroid Build Coastguard Worker       base::SysInfo::OperatingSystemVersion());
310*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS_ASH)
311*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_kernel_version(
312*6777b538SAndroid Build Coastguard Worker       base::SysInfo::KernelVersion());
313*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
314*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_kernel_version(
315*6777b538SAndroid Build Coastguard Worker       base::SysInfo::OperatingSystemVersion());
316*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_ANDROID)
317*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_build_fingerprint(
318*6777b538SAndroid Build Coastguard Worker       base::android::BuildInfo::GetInstance()->android_build_fp());
319*6777b538SAndroid Build Coastguard Worker   system_profile->set_app_package_name("test app");
320*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_IOS)
321*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_build_number(
322*6777b538SAndroid Build Coastguard Worker       base::SysInfo::GetIOSBuildNumber());
323*6777b538SAndroid Build Coastguard Worker #endif
324*6777b538SAndroid Build Coastguard Worker 
325*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX)
326*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_xdg_session_type(expected_session_type);
327*6777b538SAndroid Build Coastguard Worker   system_profile->mutable_os()->set_xdg_current_desktop(
328*6777b538SAndroid Build Coastguard Worker       expected_current_desktop);
329*6777b538SAndroid Build Coastguard Worker #endif
330*6777b538SAndroid Build Coastguard Worker 
331*6777b538SAndroid Build Coastguard Worker   // Hard to mock.
332*6777b538SAndroid Build Coastguard Worker   system_profile->set_build_timestamp(
333*6777b538SAndroid Build Coastguard Worker       parsed.system_profile().build_timestamp());
334*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
335*6777b538SAndroid Build Coastguard Worker   system_profile->set_installer_package(
336*6777b538SAndroid Build Coastguard Worker       parsed.system_profile().installer_package());
337*6777b538SAndroid Build Coastguard Worker #endif
338*6777b538SAndroid Build Coastguard Worker 
339*6777b538SAndroid Build Coastguard Worker   // Not tested here; instead tested in Timestamps_* tests below.
340*6777b538SAndroid Build Coastguard Worker   expected.mutable_time_log_created()->CopyFrom(parsed.time_log_created());
341*6777b538SAndroid Build Coastguard Worker   expected.mutable_time_log_closed()->CopyFrom(parsed.time_log_closed());
342*6777b538SAndroid Build Coastguard Worker 
343*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected.SerializeAsString(), encoded);
344*6777b538SAndroid Build Coastguard Worker }
345*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,FinalizeLog)346*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, FinalizeLog) {
347*6777b538SAndroid Build Coastguard Worker   static const char kVersionString[] = "1";
348*6777b538SAndroid Build Coastguard Worker   static const char kNewVersionString[] = "2";
349*6777b538SAndroid Build Coastguard Worker   client_.set_version_string(kVersionString);
350*6777b538SAndroid Build Coastguard Worker 
351*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
352*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log2(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
353*6777b538SAndroid Build Coastguard Worker 
354*6777b538SAndroid Build Coastguard Worker   // Fill logs with user actions and omnibox events. We put more than the limit
355*6777b538SAndroid Build Coastguard Worker   // to verify that when calling FinalizeLog(), we may optionally truncate
356*6777b538SAndroid Build Coastguard Worker   // those events.
357*6777b538SAndroid Build Coastguard Worker   const int kUserActionCount = internal::kUserActionEventLimit * 2;
358*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kUserActionCount; ++i) {
359*6777b538SAndroid Build Coastguard Worker     log.RecordUserAction("BasicAction", base::TimeTicks::Now());
360*6777b538SAndroid Build Coastguard Worker     log2.RecordUserAction("BasicAction", base::TimeTicks::Now());
361*6777b538SAndroid Build Coastguard Worker   }
362*6777b538SAndroid Build Coastguard Worker   const int kOmniboxEventCount = internal::kOmniboxEventLimit * 2;
363*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < kOmniboxEventCount; ++i) {
364*6777b538SAndroid Build Coastguard Worker     // Add an empty omnibox event. Not fully realistic since these are normally
365*6777b538SAndroid Build Coastguard Worker     // supplied by a metrics provider.
366*6777b538SAndroid Build Coastguard Worker     log.mutable_uma_proto()->add_omnibox_event();
367*6777b538SAndroid Build Coastguard Worker     log2.mutable_uma_proto()->add_omnibox_event();
368*6777b538SAndroid Build Coastguard Worker   }
369*6777b538SAndroid Build Coastguard Worker 
370*6777b538SAndroid Build Coastguard Worker   // Finalize |log|. We truncate events, and we pass the same version string as
371*6777b538SAndroid Build Coastguard Worker   // the one that was used when the log was created.
372*6777b538SAndroid Build Coastguard Worker   std::string encoded;
373*6777b538SAndroid Build Coastguard Worker   log.FinalizeLog(/*truncate_events=*/true, client_.GetVersionString(),
374*6777b538SAndroid Build Coastguard Worker                   log.GetCurrentClockTime(/*record_time_zone=*/true), &encoded);
375*6777b538SAndroid Build Coastguard Worker 
376*6777b538SAndroid Build Coastguard Worker   // Finalize |log2|. We do not truncate events, and we pass a different version
377*6777b538SAndroid Build Coastguard Worker   // string than the one that was used when the log was created.
378*6777b538SAndroid Build Coastguard Worker   client_.set_version_string(kNewVersionString);
379*6777b538SAndroid Build Coastguard Worker   std::string encoded2;
380*6777b538SAndroid Build Coastguard Worker   log2.FinalizeLog(/*truncate_events=*/false, client_.GetVersionString(),
381*6777b538SAndroid Build Coastguard Worker                    log.GetCurrentClockTime(/*record_time_zone=*/true),
382*6777b538SAndroid Build Coastguard Worker                    &encoded2);
383*6777b538SAndroid Build Coastguard Worker 
384*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension parsed;
385*6777b538SAndroid Build Coastguard Worker   parsed.ParseFromString(encoded);
386*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension parsed2;
387*6777b538SAndroid Build Coastguard Worker   parsed2.ParseFromString(encoded2);
388*6777b538SAndroid Build Coastguard Worker 
389*6777b538SAndroid Build Coastguard Worker   // The user actions and omnibox events in |parsed| should have been truncated
390*6777b538SAndroid Build Coastguard Worker   // to the limits, while |parsed2| should be untouched.
391*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.user_action_event_size(), internal::kUserActionEventLimit);
392*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.omnibox_event_size(), internal::kOmniboxEventLimit);
393*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed2.user_action_event_size(), kUserActionCount);
394*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed2.omnibox_event_size(), kOmniboxEventCount);
395*6777b538SAndroid Build Coastguard Worker 
396*6777b538SAndroid Build Coastguard Worker   // |kNewVersionString| (the version string when |log2| was closed) should
397*6777b538SAndroid Build Coastguard Worker   // have been written to |parsed2| since it differs from |kVersionString|
398*6777b538SAndroid Build Coastguard Worker   // (the version string when |log2| was created). |parsed| should not have it
399*6777b538SAndroid Build Coastguard Worker   // since the version strings were the same.
400*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed2.system_profile().app_version(), kVersionString);
401*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed2.system_profile().log_written_by_app_version(),
402*6777b538SAndroid Build Coastguard Worker             kNewVersionString);
403*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.system_profile().app_version(), kVersionString);
404*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(parsed.system_profile().has_log_written_by_app_version());
405*6777b538SAndroid Build Coastguard Worker }
406*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,Timestamps_InitialStabilityLog)407*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, Timestamps_InitialStabilityLog) {
408*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<base::SimpleTestClock> clock =
409*6777b538SAndroid Build Coastguard Worker       std::make_unique<base::SimpleTestClock>();
410*6777b538SAndroid Build Coastguard Worker 
411*6777b538SAndroid Build Coastguard Worker   // Should not have times from initial stability logs.
412*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(1));
413*6777b538SAndroid Build Coastguard Worker   MetricsLog log(kClientId, kSessionId, MetricsLog::INITIAL_STABILITY_LOG,
414*6777b538SAndroid Build Coastguard Worker                  clock.get(), nullptr, &client_);
415*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(2));
416*6777b538SAndroid Build Coastguard Worker   std::string encoded;
417*6777b538SAndroid Build Coastguard Worker   // Don't set the close_time param since this is an initial stability log.
418*6777b538SAndroid Build Coastguard Worker   log.FinalizeLog(/*truncate_events=*/false, client_.GetVersionString(),
419*6777b538SAndroid Build Coastguard Worker                   /*close_time=*/std::nullopt, &encoded);
420*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension parsed;
421*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(parsed.ParseFromString(encoded));
422*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(parsed.has_time_log_created());
423*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(parsed.has_time_log_closed());
424*6777b538SAndroid Build Coastguard Worker }
425*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,Timestamps_IndependentLog)426*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, Timestamps_IndependentLog) {
427*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<base::SimpleTestClock> clock =
428*6777b538SAndroid Build Coastguard Worker       std::make_unique<base::SimpleTestClock>();
429*6777b538SAndroid Build Coastguard Worker 
430*6777b538SAndroid Build Coastguard Worker   // Should not have times from independent logs.
431*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(1));
432*6777b538SAndroid Build Coastguard Worker   MetricsLog log(kClientId, kSessionId, MetricsLog::INDEPENDENT_LOG,
433*6777b538SAndroid Build Coastguard Worker                  clock.get(), nullptr, &client_);
434*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(2));
435*6777b538SAndroid Build Coastguard Worker   std::string encoded;
436*6777b538SAndroid Build Coastguard Worker   // Don't set the close_time param since this is an independent log.
437*6777b538SAndroid Build Coastguard Worker   log.FinalizeLog(/*truncate_events=*/false, client_.GetVersionString(),
438*6777b538SAndroid Build Coastguard Worker                   /*close_time=*/std::nullopt, &encoded);
439*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension parsed;
440*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(parsed.ParseFromString(encoded));
441*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(parsed.has_time_log_created());
442*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(parsed.has_time_log_closed());
443*6777b538SAndroid Build Coastguard Worker }
444*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,Timestamps_OngoingLog)445*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, Timestamps_OngoingLog) {
446*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<base::SimpleTestClock> clock =
447*6777b538SAndroid Build Coastguard Worker       std::make_unique<base::SimpleTestClock>();
448*6777b538SAndroid Build Coastguard Worker 
449*6777b538SAndroid Build Coastguard Worker   // Should have times from regular (ongoing) logs.
450*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(1));
451*6777b538SAndroid Build Coastguard Worker   MetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, clock.get(),
452*6777b538SAndroid Build Coastguard Worker                  nullptr, &client_);
453*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(2));
454*6777b538SAndroid Build Coastguard Worker   std::string encoded;
455*6777b538SAndroid Build Coastguard Worker   log.FinalizeLog(/*truncate_events=*/false, client_.GetVersionString(),
456*6777b538SAndroid Build Coastguard Worker                   log.GetCurrentClockTime(/*record_time_zone=*/true), &encoded);
457*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension parsed;
458*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(parsed.ParseFromString(encoded));
459*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.has_time_log_created());
460*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_created().time_sec(), 1);
461*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_created().time_source(),
462*6777b538SAndroid Build Coastguard Worker             ChromeUserMetricsExtension::RealLocalTime::CLIENT_CLOCK);
463*6777b538SAndroid Build Coastguard Worker   // The timezone should not be set in the time_log_created field.
464*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(parsed.time_log_created().has_time_zone_offset_from_gmt_sec());
465*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.has_time_log_closed());
466*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_closed().time_sec(), 2);
467*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_closed().time_source(),
468*6777b538SAndroid Build Coastguard Worker             ChromeUserMetricsExtension::RealLocalTime::CLIENT_CLOCK);
469*6777b538SAndroid Build Coastguard Worker   // The timezone should be set, but we don't check what it is.
470*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.time_log_closed().has_time_zone_offset_from_gmt_sec());
471*6777b538SAndroid Build Coastguard Worker }
472*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,Timestamps_OngoingLogLog_WithNetworkClockExists_AlwaysUnavailable)473*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest,
474*6777b538SAndroid Build Coastguard Worker        Timestamps_OngoingLogLog_WithNetworkClockExists_AlwaysUnavailable) {
475*6777b538SAndroid Build Coastguard Worker   // Setup a network clock that doesn't provide a timestamp (time unavailable).
476*6777b538SAndroid Build Coastguard Worker   base::test::TaskEnvironment task_environment(
477*6777b538SAndroid Build Coastguard Worker       base::test::TaskEnvironment::MainThreadType::IO);
478*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<network_time::FieldTrialTest> field_trial_test(
479*6777b538SAndroid Build Coastguard Worker       new network_time::FieldTrialTest());
480*6777b538SAndroid Build Coastguard Worker   field_trial_test->SetFeatureParams(
481*6777b538SAndroid Build Coastguard Worker       true, 0.0, network_time::NetworkTimeTracker::FETCHES_ON_DEMAND_ONLY);
482*6777b538SAndroid Build Coastguard Worker   scoped_refptr<network::TestSharedURLLoaderFactory> shared_url_loader_factory =
483*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<network::TestSharedURLLoaderFactory>();
484*6777b538SAndroid Build Coastguard Worker   TestingPrefServiceSimple pref_service;
485*6777b538SAndroid Build Coastguard Worker   network_time::NetworkTimeTracker::RegisterPrefs(pref_service.registry());
486*6777b538SAndroid Build Coastguard Worker   network_time::NetworkTimeTracker network_time_tracker(
487*6777b538SAndroid Build Coastguard Worker       std::make_unique<base::DefaultClock>(),
488*6777b538SAndroid Build Coastguard Worker       std::make_unique<base::DefaultTickClock>(), &pref_service,
489*6777b538SAndroid Build Coastguard Worker       shared_url_loader_factory, /*fetch_behavior=*/std::nullopt);
490*6777b538SAndroid Build Coastguard Worker 
491*6777b538SAndroid Build Coastguard Worker   // Set up the backup client clock.
492*6777b538SAndroid Build Coastguard Worker   TestMetricsServiceClient client;
493*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<base::SimpleTestClock> clock =
494*6777b538SAndroid Build Coastguard Worker       std::make_unique<base::SimpleTestClock>();
495*6777b538SAndroid Build Coastguard Worker 
496*6777b538SAndroid Build Coastguard Worker   // Should have times from regular (ongoing) logs.  These times should come
497*6777b538SAndroid Build Coastguard Worker   // from the backup client clock, not the (unavailable) network clock.
498*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(1));
499*6777b538SAndroid Build Coastguard Worker   MetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, clock.get(),
500*6777b538SAndroid Build Coastguard Worker                  &network_time_tracker, &client);
501*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(2));
502*6777b538SAndroid Build Coastguard Worker 
503*6777b538SAndroid Build Coastguard Worker   // Check the output.
504*6777b538SAndroid Build Coastguard Worker   std::string encoded;
505*6777b538SAndroid Build Coastguard Worker   log.FinalizeLog(/*truncate_events=*/false, client_.GetVersionString(),
506*6777b538SAndroid Build Coastguard Worker                   log.GetCurrentClockTime(/*record_time_zone=*/true), &encoded);
507*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension parsed;
508*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(parsed.ParseFromString(encoded));
509*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.has_time_log_created());
510*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_created().time_sec(), 1);
511*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_created().time_source(),
512*6777b538SAndroid Build Coastguard Worker             ChromeUserMetricsExtension::RealLocalTime::CLIENT_CLOCK);
513*6777b538SAndroid Build Coastguard Worker   // The timezone should not be set in the time_log_created field.
514*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(parsed.time_log_created().has_time_zone_offset_from_gmt_sec());
515*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.has_time_log_closed());
516*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_closed().time_sec(), 2);
517*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_closed().time_source(),
518*6777b538SAndroid Build Coastguard Worker             ChromeUserMetricsExtension::RealLocalTime::CLIENT_CLOCK);
519*6777b538SAndroid Build Coastguard Worker   // The timezone should be set, but we don't check what it is.
520*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.time_log_closed().has_time_zone_offset_from_gmt_sec());
521*6777b538SAndroid Build Coastguard Worker }
522*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,Timestamps_OngoingLogLog_WithNetworkClockExists_UnavailableThenAvailable)523*6777b538SAndroid Build Coastguard Worker TEST_F(
524*6777b538SAndroid Build Coastguard Worker     MetricsLogTest,
525*6777b538SAndroid Build Coastguard Worker     Timestamps_OngoingLogLog_WithNetworkClockExists_UnavailableThenAvailable) {
526*6777b538SAndroid Build Coastguard Worker   // Setup a network clock that initially doesn't provide a timestamp (time
527*6777b538SAndroid Build Coastguard Worker   // unavailable).
528*6777b538SAndroid Build Coastguard Worker   base::test::TaskEnvironment task_environment(
529*6777b538SAndroid Build Coastguard Worker       base::test::TaskEnvironment::MainThreadType::IO);
530*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<network_time::FieldTrialTest> field_trial_test(
531*6777b538SAndroid Build Coastguard Worker       new network_time::FieldTrialTest());
532*6777b538SAndroid Build Coastguard Worker   field_trial_test->SetFeatureParams(
533*6777b538SAndroid Build Coastguard Worker       true, 0.0, network_time::NetworkTimeTracker::FETCHES_ON_DEMAND_ONLY);
534*6777b538SAndroid Build Coastguard Worker   scoped_refptr<network::TestSharedURLLoaderFactory> shared_url_loader_factory =
535*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<network::TestSharedURLLoaderFactory>();
536*6777b538SAndroid Build Coastguard Worker   TestingPrefServiceSimple pref_service;
537*6777b538SAndroid Build Coastguard Worker   network_time::NetworkTimeTracker::RegisterPrefs(pref_service.registry());
538*6777b538SAndroid Build Coastguard Worker   base::SimpleTestClock* clock = new base::SimpleTestClock;
539*6777b538SAndroid Build Coastguard Worker   base::SimpleTestTickClock* tick_clock = new base::SimpleTestTickClock();
540*6777b538SAndroid Build Coastguard Worker   // Do this to be sure that |is_null| returns false.
541*6777b538SAndroid Build Coastguard Worker   clock->Advance(base::Days(111));
542*6777b538SAndroid Build Coastguard Worker   tick_clock->Advance(base::Days(222));
543*6777b538SAndroid Build Coastguard Worker   network_time::NetworkTimeTracker network_time_tracker(
544*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<base::Clock>(clock),
545*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<const base::TickClock>(tick_clock), &pref_service,
546*6777b538SAndroid Build Coastguard Worker       shared_url_loader_factory, /*fetch_behavior=*/std::nullopt);
547*6777b538SAndroid Build Coastguard Worker 
548*6777b538SAndroid Build Coastguard Worker   // Should have times from regular (ongoing) logs.  The creation time should
549*6777b538SAndroid Build Coastguard Worker   // come from the backup client clock; the closure time should come from the
550*6777b538SAndroid Build Coastguard Worker   // network clock.
551*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(1));
552*6777b538SAndroid Build Coastguard Worker   TestMetricsServiceClient client;
553*6777b538SAndroid Build Coastguard Worker   MetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, clock,
554*6777b538SAndroid Build Coastguard Worker                  &network_time_tracker, &client);
555*6777b538SAndroid Build Coastguard Worker   // Advance the backup client clock.  (Value should not be used; merely
556*6777b538SAndroid Build Coastguard Worker   // advanced to make sure the new value doesn't show up anywhere.)
557*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(2));
558*6777b538SAndroid Build Coastguard Worker   // Set the network time tracker.
559*6777b538SAndroid Build Coastguard Worker   UpdateNetworkTime(&network_time_tracker, tick_clock,
560*6777b538SAndroid Build Coastguard Worker                     base::Time::FromTimeT(3));
561*6777b538SAndroid Build Coastguard Worker 
562*6777b538SAndroid Build Coastguard Worker   // Check the output.
563*6777b538SAndroid Build Coastguard Worker   std::string encoded;
564*6777b538SAndroid Build Coastguard Worker   log.FinalizeLog(/*truncate_events=*/false, client_.GetVersionString(),
565*6777b538SAndroid Build Coastguard Worker                   log.GetCurrentClockTime(/*record_time_zone=*/true), &encoded);
566*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension parsed;
567*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(parsed.ParseFromString(encoded));
568*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.has_time_log_created());
569*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_created().time_sec(), 1);
570*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_created().time_source(),
571*6777b538SAndroid Build Coastguard Worker             ChromeUserMetricsExtension::RealLocalTime::CLIENT_CLOCK);
572*6777b538SAndroid Build Coastguard Worker   // The timezone should not be set in the time_log_created field.
573*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(parsed.time_log_created().has_time_zone_offset_from_gmt_sec());
574*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.has_time_log_closed());
575*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_closed().time_sec(), 3);
576*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_closed().time_source(),
577*6777b538SAndroid Build Coastguard Worker             ChromeUserMetricsExtension::RealLocalTime::NETWORK_TIME_CLOCK);
578*6777b538SAndroid Build Coastguard Worker   // The timezone should be set, but we don't check what it is.
579*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.time_log_closed().has_time_zone_offset_from_gmt_sec());
580*6777b538SAndroid Build Coastguard Worker }
581*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,Timestamps_OngoingLogLog_WithNetworkClockExists_AlwaysAvailable)582*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest,
583*6777b538SAndroid Build Coastguard Worker        Timestamps_OngoingLogLog_WithNetworkClockExists_AlwaysAvailable) {
584*6777b538SAndroid Build Coastguard Worker   // Setup a network clock that provides a timestamp.
585*6777b538SAndroid Build Coastguard Worker   base::test::TaskEnvironment task_environment(
586*6777b538SAndroid Build Coastguard Worker       base::test::TaskEnvironment::MainThreadType::IO);
587*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<network_time::FieldTrialTest> field_trial_test(
588*6777b538SAndroid Build Coastguard Worker       new network_time::FieldTrialTest());
589*6777b538SAndroid Build Coastguard Worker   field_trial_test->SetFeatureParams(
590*6777b538SAndroid Build Coastguard Worker       true, 0.0, network_time::NetworkTimeTracker::FETCHES_ON_DEMAND_ONLY);
591*6777b538SAndroid Build Coastguard Worker   scoped_refptr<network::TestSharedURLLoaderFactory> shared_url_loader_factory =
592*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<network::TestSharedURLLoaderFactory>();
593*6777b538SAndroid Build Coastguard Worker   TestingPrefServiceSimple pref_service;
594*6777b538SAndroid Build Coastguard Worker   network_time::NetworkTimeTracker::RegisterPrefs(pref_service.registry());
595*6777b538SAndroid Build Coastguard Worker   base::SimpleTestClock* clock = new base::SimpleTestClock;
596*6777b538SAndroid Build Coastguard Worker   base::SimpleTestTickClock* tick_clock = new base::SimpleTestTickClock();
597*6777b538SAndroid Build Coastguard Worker   // Do this to be sure that |is_null| returns false.
598*6777b538SAndroid Build Coastguard Worker   clock->Advance(base::Days(111));
599*6777b538SAndroid Build Coastguard Worker   tick_clock->Advance(base::Days(222));
600*6777b538SAndroid Build Coastguard Worker   network_time::NetworkTimeTracker network_time_tracker(
601*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<base::Clock>(clock),
602*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<const base::TickClock>(tick_clock), &pref_service,
603*6777b538SAndroid Build Coastguard Worker       shared_url_loader_factory, /*fetch_behavior=*/std::nullopt);
604*6777b538SAndroid Build Coastguard Worker 
605*6777b538SAndroid Build Coastguard Worker   // Should have times from regular (ongoing) logs.  These times should come
606*6777b538SAndroid Build Coastguard Worker   // from the network clock.
607*6777b538SAndroid Build Coastguard Worker   // Set the backup client clock time.  (Value should not be used; merely set
608*6777b538SAndroid Build Coastguard Worker   // to make sure the value doesn't show up anywhere.)
609*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(1));
610*6777b538SAndroid Build Coastguard Worker   // Set the network time tracker.
611*6777b538SAndroid Build Coastguard Worker   UpdateNetworkTime(&network_time_tracker, tick_clock,
612*6777b538SAndroid Build Coastguard Worker                     base::Time::FromTimeT(2));
613*6777b538SAndroid Build Coastguard Worker   TestMetricsServiceClient client;
614*6777b538SAndroid Build Coastguard Worker   MetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, clock,
615*6777b538SAndroid Build Coastguard Worker                  &network_time_tracker, &client);
616*6777b538SAndroid Build Coastguard Worker   // Advance the backup client clock.  (Value should not be used; merely
617*6777b538SAndroid Build Coastguard Worker   // advanced to make sure the new value doesn't show up anywhere.)
618*6777b538SAndroid Build Coastguard Worker   clock->SetNow(base::Time::FromTimeT(3));
619*6777b538SAndroid Build Coastguard Worker   // Advance and set the network time clock.
620*6777b538SAndroid Build Coastguard Worker   UpdateNetworkTime(&network_time_tracker, tick_clock,
621*6777b538SAndroid Build Coastguard Worker                     base::Time::FromTimeT(4));
622*6777b538SAndroid Build Coastguard Worker 
623*6777b538SAndroid Build Coastguard Worker   // Check the output.
624*6777b538SAndroid Build Coastguard Worker   std::string encoded;
625*6777b538SAndroid Build Coastguard Worker   log.FinalizeLog(/*truncate_events=*/false, client_.GetVersionString(),
626*6777b538SAndroid Build Coastguard Worker                   log.GetCurrentClockTime(/*record_time_zone=*/true), &encoded);
627*6777b538SAndroid Build Coastguard Worker   ChromeUserMetricsExtension parsed;
628*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(parsed.ParseFromString(encoded));
629*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.has_time_log_created());
630*6777b538SAndroid Build Coastguard Worker   // Time should be the first time returned by the network time tracker.
631*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_created().time_sec(), 2);
632*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_created().time_source(),
633*6777b538SAndroid Build Coastguard Worker             ChromeUserMetricsExtension::RealLocalTime::NETWORK_TIME_CLOCK);
634*6777b538SAndroid Build Coastguard Worker   // The timezone should not be set in the time_log_created field.
635*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(parsed.time_log_created().has_time_zone_offset_from_gmt_sec());
636*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.has_time_log_closed());
637*6777b538SAndroid Build Coastguard Worker   // Time should be the second time returned by the network time tracker.
638*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_closed().time_sec(), 4);
639*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(parsed.time_log_closed().time_source(),
640*6777b538SAndroid Build Coastguard Worker             ChromeUserMetricsExtension::RealLocalTime::NETWORK_TIME_CLOCK);
641*6777b538SAndroid Build Coastguard Worker   // The timezone should be set, but we don't check what it is.
642*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(parsed.time_log_closed().has_time_zone_offset_from_gmt_sec());
643*6777b538SAndroid Build Coastguard Worker }
644*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,HistogramBucketFields)645*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, HistogramBucketFields) {
646*6777b538SAndroid Build Coastguard Worker   // Create buckets: 1-5, 5-7, 7-8, 8-9, 9-10, 10-11, 11-12.
647*6777b538SAndroid Build Coastguard Worker   base::BucketRanges ranges(8);
648*6777b538SAndroid Build Coastguard Worker   ranges.set_range(0, 1);
649*6777b538SAndroid Build Coastguard Worker   ranges.set_range(1, 5);
650*6777b538SAndroid Build Coastguard Worker   ranges.set_range(2, 7);
651*6777b538SAndroid Build Coastguard Worker   ranges.set_range(3, 8);
652*6777b538SAndroid Build Coastguard Worker   ranges.set_range(4, 9);
653*6777b538SAndroid Build Coastguard Worker   ranges.set_range(5, 10);
654*6777b538SAndroid Build Coastguard Worker   ranges.set_range(6, 11);
655*6777b538SAndroid Build Coastguard Worker   ranges.set_range(7, 12);
656*6777b538SAndroid Build Coastguard Worker 
657*6777b538SAndroid Build Coastguard Worker   base::SampleVector samples(1, &ranges);
658*6777b538SAndroid Build Coastguard Worker   samples.Accumulate(3, 1);   // Bucket 1-5.
659*6777b538SAndroid Build Coastguard Worker   samples.Accumulate(6, 1);   // Bucket 5-7.
660*6777b538SAndroid Build Coastguard Worker   samples.Accumulate(8, 1);   // Bucket 8-9. (7-8 skipped)
661*6777b538SAndroid Build Coastguard Worker   samples.Accumulate(10, 1);  // Bucket 10-11. (9-10 skipped)
662*6777b538SAndroid Build Coastguard Worker   samples.Accumulate(11, 1);  // Bucket 11-12.
663*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
664*6777b538SAndroid Build Coastguard Worker   log.RecordHistogramDelta("Test", samples);
665*6777b538SAndroid Build Coastguard Worker 
666*6777b538SAndroid Build Coastguard Worker   const ChromeUserMetricsExtension& uma_proto = log.uma_proto();
667*6777b538SAndroid Build Coastguard Worker   const HistogramEventProto& histogram_proto =
668*6777b538SAndroid Build Coastguard Worker       uma_proto.histogram_event(uma_proto.histogram_event_size() - 1);
669*6777b538SAndroid Build Coastguard Worker 
670*6777b538SAndroid Build Coastguard Worker   // Buckets with samples: 1-5, 5-7, 8-9, 10-11, 11-12.
671*6777b538SAndroid Build Coastguard Worker   // Should become: 1-/, 5-7, /-9, 10-/, /-12.
672*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(5, histogram_proto.bucket_size());
673*6777b538SAndroid Build Coastguard Worker 
674*6777b538SAndroid Build Coastguard Worker   // 1-5 becomes 1-/ (max is same as next min).
675*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(histogram_proto.bucket(0).has_min());
676*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(histogram_proto.bucket(0).has_max());
677*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, histogram_proto.bucket(0).min());
678*6777b538SAndroid Build Coastguard Worker 
679*6777b538SAndroid Build Coastguard Worker   // 5-7 stays 5-7 (no optimization possible).
680*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(histogram_proto.bucket(1).has_min());
681*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(histogram_proto.bucket(1).has_max());
682*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(5, histogram_proto.bucket(1).min());
683*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(7, histogram_proto.bucket(1).max());
684*6777b538SAndroid Build Coastguard Worker 
685*6777b538SAndroid Build Coastguard Worker   // 8-9 becomes /-9 (min is same as max - 1).
686*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(histogram_proto.bucket(2).has_min());
687*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(histogram_proto.bucket(2).has_max());
688*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(9, histogram_proto.bucket(2).max());
689*6777b538SAndroid Build Coastguard Worker 
690*6777b538SAndroid Build Coastguard Worker   // 10-11 becomes 10-/ (both optimizations apply, omit max is prioritized).
691*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(histogram_proto.bucket(3).has_min());
692*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(histogram_proto.bucket(3).has_max());
693*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(10, histogram_proto.bucket(3).min());
694*6777b538SAndroid Build Coastguard Worker 
695*6777b538SAndroid Build Coastguard Worker   // 11-12 becomes /-12 (last record must keep max, min is same as max - 1).
696*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(histogram_proto.bucket(4).has_min());
697*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(histogram_proto.bucket(4).has_max());
698*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(12, histogram_proto.bucket(4).max());
699*6777b538SAndroid Build Coastguard Worker }
700*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,HistogramSamplesCount)701*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, HistogramSamplesCount) {
702*6777b538SAndroid Build Coastguard Worker   const std::string histogram_name = "test";
703*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
704*6777b538SAndroid Build Coastguard Worker 
705*6777b538SAndroid Build Coastguard Worker   // Create buckets: 1-5.
706*6777b538SAndroid Build Coastguard Worker   base::BucketRanges ranges(2);
707*6777b538SAndroid Build Coastguard Worker   ranges.set_range(0, 1);
708*6777b538SAndroid Build Coastguard Worker   ranges.set_range(1, 5);
709*6777b538SAndroid Build Coastguard Worker 
710*6777b538SAndroid Build Coastguard Worker   // Add two samples.
711*6777b538SAndroid Build Coastguard Worker   base::SampleVector samples(1, &ranges);
712*6777b538SAndroid Build Coastguard Worker   samples.Accumulate(3, 2);
713*6777b538SAndroid Build Coastguard Worker   log.RecordHistogramDelta(histogram_name, samples);
714*6777b538SAndroid Build Coastguard Worker 
715*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, log.log_metadata().samples_count.value());
716*6777b538SAndroid Build Coastguard Worker 
717*6777b538SAndroid Build Coastguard Worker   // Add two more samples.
718*6777b538SAndroid Build Coastguard Worker   log.RecordHistogramDelta(histogram_name, samples);
719*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(4, log.log_metadata().samples_count.value());
720*6777b538SAndroid Build Coastguard Worker }
721*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,RecordEnvironment)722*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, RecordEnvironment) {
723*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
724*6777b538SAndroid Build Coastguard Worker 
725*6777b538SAndroid Build Coastguard Worker   DelegatingProvider delegating_provider;
726*6777b538SAndroid Build Coastguard Worker   auto cpu_provider = std::make_unique<metrics::CPUMetricsProvider>();
727*6777b538SAndroid Build Coastguard Worker   delegating_provider.RegisterMetricsProvider(std::move(cpu_provider));
728*6777b538SAndroid Build Coastguard Worker   log.RecordEnvironment(&delegating_provider);
729*6777b538SAndroid Build Coastguard Worker 
730*6777b538SAndroid Build Coastguard Worker   // Check non-system profile values.
731*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(MetricsLog::Hash(kClientId), log.uma_proto().client_id());
732*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSessionId, log.uma_proto().session_id());
733*6777b538SAndroid Build Coastguard Worker   // Check that the system profile on the log has the correct values set.
734*6777b538SAndroid Build Coastguard Worker   CheckSystemProfile(log.system_profile());
735*6777b538SAndroid Build Coastguard Worker 
736*6777b538SAndroid Build Coastguard Worker   // Call RecordEnvironment() again and verify things are are still filled in.
737*6777b538SAndroid Build Coastguard Worker   log.RecordEnvironment(&delegating_provider);
738*6777b538SAndroid Build Coastguard Worker 
739*6777b538SAndroid Build Coastguard Worker   // Check non-system profile values.
740*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(MetricsLog::Hash(kClientId), log.uma_proto().client_id());
741*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kSessionId, log.uma_proto().session_id());
742*6777b538SAndroid Build Coastguard Worker   // Check that the system profile on the log has the correct values set.
743*6777b538SAndroid Build Coastguard Worker   CheckSystemProfile(log.system_profile());
744*6777b538SAndroid Build Coastguard Worker }
745*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,RecordEnvironmentExtendedStable)746*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, RecordEnvironmentExtendedStable) {
747*6777b538SAndroid Build Coastguard Worker   client_.set_is_extended_stable_channel(true);
748*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
749*6777b538SAndroid Build Coastguard Worker 
750*6777b538SAndroid Build Coastguard Worker   DelegatingProvider delegating_provider;
751*6777b538SAndroid Build Coastguard Worker   auto cpu_provider = std::make_unique<metrics::CPUMetricsProvider>();
752*6777b538SAndroid Build Coastguard Worker   delegating_provider.RegisterMetricsProvider(std::move(cpu_provider));
753*6777b538SAndroid Build Coastguard Worker   log.RecordEnvironment(&delegating_provider);
754*6777b538SAndroid Build Coastguard Worker 
755*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log.system_profile().has_is_extended_stable_channel());
756*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log.system_profile().is_extended_stable_channel());
757*6777b538SAndroid Build Coastguard Worker }
758*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,RecordEnvironmentEnableDefault)759*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, RecordEnvironmentEnableDefault) {
760*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log_unknown(kClientId, kSessionId, MetricsLog::ONGOING_LOG,
761*6777b538SAndroid Build Coastguard Worker                              &client_);
762*6777b538SAndroid Build Coastguard Worker 
763*6777b538SAndroid Build Coastguard Worker   DelegatingProvider delegating_provider;
764*6777b538SAndroid Build Coastguard Worker   log_unknown.RecordEnvironment(&delegating_provider);
765*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(log_unknown.system_profile().has_uma_default_state());
766*6777b538SAndroid Build Coastguard Worker 
767*6777b538SAndroid Build Coastguard Worker   client_.set_enable_default(EnableMetricsDefault::OPT_IN);
768*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log_opt_in(kClientId, kSessionId, MetricsLog::ONGOING_LOG,
769*6777b538SAndroid Build Coastguard Worker                             &client_);
770*6777b538SAndroid Build Coastguard Worker   log_opt_in.RecordEnvironment(&delegating_provider);
771*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log_opt_in.system_profile().has_uma_default_state());
772*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(SystemProfileProto_UmaDefaultState_OPT_IN,
773*6777b538SAndroid Build Coastguard Worker             log_opt_in.system_profile().uma_default_state());
774*6777b538SAndroid Build Coastguard Worker 
775*6777b538SAndroid Build Coastguard Worker   client_.set_enable_default(EnableMetricsDefault::OPT_OUT);
776*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log_opt_out(kClientId, kSessionId, MetricsLog::ONGOING_LOG,
777*6777b538SAndroid Build Coastguard Worker                              &client_);
778*6777b538SAndroid Build Coastguard Worker   log_opt_out.RecordEnvironment(&delegating_provider);
779*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log_opt_out.system_profile().has_uma_default_state());
780*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(SystemProfileProto_UmaDefaultState_OPT_OUT,
781*6777b538SAndroid Build Coastguard Worker             log_opt_out.system_profile().uma_default_state());
782*6777b538SAndroid Build Coastguard Worker 
783*6777b538SAndroid Build Coastguard Worker   client_.set_reporting_is_managed(true);
784*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log_managed(kClientId, kSessionId, MetricsLog::ONGOING_LOG,
785*6777b538SAndroid Build Coastguard Worker                              &client_);
786*6777b538SAndroid Build Coastguard Worker   log_managed.RecordEnvironment(&delegating_provider);
787*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log_managed.system_profile().has_uma_default_state());
788*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(SystemProfileProto_UmaDefaultState_POLICY_FORCED_ENABLED,
789*6777b538SAndroid Build Coastguard Worker             log_managed.system_profile().uma_default_state());
790*6777b538SAndroid Build Coastguard Worker }
791*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,InitialLogStabilityMetrics)792*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, InitialLogStabilityMetrics) {
793*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::INITIAL_STABILITY_LOG,
794*6777b538SAndroid Build Coastguard Worker                      &client_);
795*6777b538SAndroid Build Coastguard Worker   TestMetricsProvider* test_provider = new TestMetricsProvider();
796*6777b538SAndroid Build Coastguard Worker   DelegatingProvider delegating_provider;
797*6777b538SAndroid Build Coastguard Worker   delegating_provider.RegisterMetricsProvider(
798*6777b538SAndroid Build Coastguard Worker       base::WrapUnique<MetricsProvider>(test_provider));
799*6777b538SAndroid Build Coastguard Worker   log.RecordEnvironment(&delegating_provider);
800*6777b538SAndroid Build Coastguard Worker   log.RecordPreviousSessionData(&delegating_provider, &prefs_);
801*6777b538SAndroid Build Coastguard Worker 
802*6777b538SAndroid Build Coastguard Worker   // The test provider should have been called upon to provide initial
803*6777b538SAndroid Build Coastguard Worker   // stability and regular stability metrics.
804*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(test_provider->provide_initial_stability_metrics_called());
805*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(test_provider->provide_stability_metrics_called());
806*6777b538SAndroid Build Coastguard Worker }
807*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,OngoingLogStabilityMetrics)808*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, OngoingLogStabilityMetrics) {
809*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
810*6777b538SAndroid Build Coastguard Worker   TestMetricsProvider* test_provider = new TestMetricsProvider();
811*6777b538SAndroid Build Coastguard Worker   DelegatingProvider delegating_provider;
812*6777b538SAndroid Build Coastguard Worker   delegating_provider.RegisterMetricsProvider(
813*6777b538SAndroid Build Coastguard Worker       base::WrapUnique<MetricsProvider>(test_provider));
814*6777b538SAndroid Build Coastguard Worker   log.RecordEnvironment(&delegating_provider);
815*6777b538SAndroid Build Coastguard Worker   log.RecordCurrentSessionData(base::TimeDelta(), base::TimeDelta(),
816*6777b538SAndroid Build Coastguard Worker                                &delegating_provider, &prefs_);
817*6777b538SAndroid Build Coastguard Worker 
818*6777b538SAndroid Build Coastguard Worker   // The test provider should have been called upon to provide regular but not
819*6777b538SAndroid Build Coastguard Worker   // initial stability metrics.
820*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(test_provider->provide_initial_stability_metrics_called());
821*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(test_provider->provide_stability_metrics_called());
822*6777b538SAndroid Build Coastguard Worker }
823*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,ChromeChannelWrittenToProtobuf)824*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, ChromeChannelWrittenToProtobuf) {
825*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
826*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log.uma_proto().system_profile().has_channel());
827*6777b538SAndroid Build Coastguard Worker }
828*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,ProductNotSetIfDefault)829*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, ProductNotSetIfDefault) {
830*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ChromeUserMetricsExtension::CHROME, client_.GetProduct());
831*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
832*6777b538SAndroid Build Coastguard Worker   // Check that the product isn't set, since it's default and also verify the
833*6777b538SAndroid Build Coastguard Worker   // default value is indeed equal to Chrome.
834*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(log.uma_proto().has_product());
835*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ChromeUserMetricsExtension::CHROME, log.uma_proto().product());
836*6777b538SAndroid Build Coastguard Worker }
837*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,ProductSetIfNotDefault)838*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, ProductSetIfNotDefault) {
839*6777b538SAndroid Build Coastguard Worker   const int32_t kTestProduct = 100;
840*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(ChromeUserMetricsExtension::CHROME, kTestProduct);
841*6777b538SAndroid Build Coastguard Worker   client_.set_product(kTestProduct);
842*6777b538SAndroid Build Coastguard Worker   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client_);
843*6777b538SAndroid Build Coastguard Worker   // Check that the product is set to |kTestProduct|.
844*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log.uma_proto().has_product());
845*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kTestProduct, log.uma_proto().product());
846*6777b538SAndroid Build Coastguard Worker }
847*6777b538SAndroid Build Coastguard Worker 
TEST_F(MetricsLogTest,ToInstallerPackage)848*6777b538SAndroid Build Coastguard Worker TEST_F(MetricsLogTest, ToInstallerPackage) {
849*6777b538SAndroid Build Coastguard Worker   using internal::ToInstallerPackage;
850*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(SystemProfileProto::INSTALLER_PACKAGE_NONE, ToInstallerPackage(""));
851*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(SystemProfileProto::INSTALLER_PACKAGE_GOOGLE_PLAY_STORE,
852*6777b538SAndroid Build Coastguard Worker             ToInstallerPackage("com.android.vending"));
853*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(SystemProfileProto::INSTALLER_PACKAGE_OTHER,
854*6777b538SAndroid Build Coastguard Worker             ToInstallerPackage("foo"));
855*6777b538SAndroid Build Coastguard Worker }
856*6777b538SAndroid Build Coastguard Worker 
857*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
858