15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/port.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/strings/string_number_conversions.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google/google_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/metrics/metrics_log.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/metrics/proto/profiler_event.pb.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/metrics/proto/system_profile.pb.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/metrics/variations/variations_util.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_settings.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/common/process_type.h" 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h" 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // OS_CHROMEOS 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using metrics::ProfilerEventProto; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using tracked_objects::ProcessDataSnapshot; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using tracked_objects::TaskSnapshot; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kClientId[] = "bogus client ID"; 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int64 kInstallDate = 1373051956; 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int64 kEnabledDate = 1373001211; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSessionId = 127; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kScreenWidth = 1024; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kScreenHeight = 768; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kScreenCount = 3; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kScreenScaleFactor = 2; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kBrandForTesting[] = "brand_for_testing"; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const chrome_variations::ActiveGroupId kFieldTrialIds[] = { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {37, 43}, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {13, 47}, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {23, 17} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestMetricsLog : public MetricsLog { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMetricsLog(const std::string& client_id, int session_id) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : MetricsLog(client_id, session_id), 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brand_for_testing_(kBrandForTesting) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::RegisterLocalState(prefs_.registry()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch prefs_.SetInt64(prefs::kInstallDate, kInstallDate); 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch prefs_.SetString(prefs::kMetricsClientIDTimestamp, 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Int64ToString(kEnabledDate)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_.SetInteger(prefs::kStabilityChildProcessCrashCount, 10); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_.SetInteger(prefs::kStabilityOtherUserCrashCount, 11); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_.SetInteger(prefs::kStabilityKernelCrashCount, 12); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_.SetInteger(prefs::kStabilitySystemUncleanShutdownCount, 13); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_CHROMEOS 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestMetricsLog() {} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PrefService* GetPrefService() OVERRIDE { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &prefs_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const metrics::ChromeUserMetricsExtension& uma_proto() const { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *MetricsLog::uma_proto(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const metrics::SystemProfileProto& system_profile() const { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return uma_proto().system_profile(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetFieldTrialIds( 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<chrome_variations::ActiveGroupId>* field_trial_ids) const 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERRIDE { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(field_trial_ids->empty()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kFieldTrialIds); ++i) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_trial_ids->push_back(kFieldTrialIds[i]); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetScreenSize() const OVERRIDE { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(kScreenWidth, kScreenHeight); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual float GetScreenDeviceScaleFactor() const OVERRIDE { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kScreenScaleFactor; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetScreenCount() const OVERRIDE { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kScreenCount; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingPrefServiceSimple prefs_; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_util::BrandForTesting brand_for_testing_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestMetricsLog); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MetricsLogTest : public testing::Test { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MetricsLogTest() : message_loop_(base::MessageLoop::TYPE_IO) {} 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestRecordEnvironment(bool proto_only) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMetricsLog log(kClientId, kSessionId); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::vector<content::WebPluginInfo> plugins; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleUpdateMetrics google_update_metrics; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (proto_only) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.RecordEnvironmentProto(plugins, google_update_metrics); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch log.RecordEnvironment(plugins, google_update_metrics); 1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Computed from original time of 1373051956. 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1373050800, log.system_profile().install_date()); 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Computed from original time of 1373001211. 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1373000400, log.system_profile().uma_enabled_date()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const metrics::SystemProfileProto& system_profile = log.system_profile(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(arraysize(kFieldTrialIds), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<size_t>(system_profile.field_trial_size())); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kFieldTrialIds); ++i) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const metrics::SystemProfileProto::FieldTrial& field_trial = 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_profile.field_trial(i); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFieldTrialIds[i].name, field_trial.name_id()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFieldTrialIds[i].group, field_trial.group_id()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kBrandForTesting, system_profile.brand_code()); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const metrics::SystemProfileProto::Hardware& hardware = 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_profile.hardware(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kScreenWidth, hardware.primary_screen_width()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kScreenHeight, hardware.primary_screen_height()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kScreenScaleFactor, hardware.primary_screen_scale_factor()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kScreenCount, hardware.screen_count()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 163ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(hardware.has_cpu()); 164ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(hardware.cpu().has_vendor_name()); 165ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(hardware.cpu().has_signature()); 166ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(isherman): Verify other data written into the protobuf as a result 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of this call. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_dbus_thread_manager_ = 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new chromeos::MockDBusThreadManagerWithoutGMock(); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::DBusThreadManager::InitializeForTesting( 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_dbus_thread_manager_); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // OS_CHROMEOS 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() OVERRIDE { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Drain the blocking pool from PostTaskAndReply executed by 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // MetrticsLog.network_observer_. 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::GetBlockingPool()->FlushForTesting(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunAllPendingInMessageLoop(); 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::DBusThreadManager::Shutdown(); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // OS_CHROMEOS 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is necessary because eventually some tests call base::RepeatingTimer 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // functions and a message loop is required for that. 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager_; 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // OS_CHROMEOS 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MetricsLogTest, RecordEnvironment) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that recording the environment works via both of the public methods 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RecordEnvironment() and RecordEnvironmentProto(). 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRecordEnvironment(false); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRecordEnvironment(true); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we properly write profiler data to the log. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MetricsLogTest, RecordProfilerData) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMetricsLog log(kClientId, kSessionId); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, log.uma_proto().profiler_event_size()); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.process_id = 177; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.push_back(TaskSnapshot()); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.location.file_name = "file"; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.location.function_name = "function"; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.location.line_number = 1337; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.thread_name = "birth_thread"; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.count = 37; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.run_duration_sum = 31; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.run_duration_max = 17; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.run_duration_sample = 13; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.queue_duration_sum = 8; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.queue_duration_max = 5; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.queue_duration_sample = 3; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_thread_name = "Still_Alive"; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.push_back(TaskSnapshot()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.location.file_name = "file2"; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.location.function_name = "function2"; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.location.line_number = 1773; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.thread_name = "birth_thread2"; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.count = 19; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.run_duration_sum = 23; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.run_duration_max = 11; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.run_duration_sample = 7; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.queue_duration_sum = 0; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.queue_duration_max = 0; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.queue_duration_sample = 0; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_thread_name = "death_thread"; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.RecordProfilerData(process_data, content::PROCESS_TYPE_BROWSER); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, log.uma_proto().profiler_event_size()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.uma_proto().profiler_event(0).profile_type()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.uma_proto().profiler_event(0).time_source()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, log.uma_proto().profiler_event(0).tracked_object_size()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProfilerEventProto::TrackedObject* tracked_object = 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &log.uma_proto().profiler_event(0).tracked_object(0); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(10123486280357988687), 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->source_file_name_hash()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(13962325592283560029), 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->source_function_name_hash()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1337, tracked_object->source_line_number()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(3400908935414830400), 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->birth_thread_name_hash()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(37, tracked_object->exec_count()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(31, tracked_object->exec_time_total()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(13, tracked_object->exec_time_sampled()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(8, tracked_object->queue_time_total()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, tracked_object->queue_time_sampled()); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(10151977472163283085), 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->exec_thread_name_hash()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(177U, tracked_object->process_id()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->process_type()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object = &log.uma_proto().profiler_event(0).tracked_object(1); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(2025659946535236365), 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->source_file_name_hash()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(55232426147951219), 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->source_function_name_hash()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1773, tracked_object->source_line_number()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(15727396632046120663), 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->birth_thread_name_hash()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(19, tracked_object->exec_count()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(23, tracked_object->exec_time_total()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(7, tracked_object->exec_time_sampled()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, tracked_object->queue_time_total()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, tracked_object->queue_time_sampled()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(14275151213201158253), 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->exec_thread_name_hash()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(177U, tracked_object->process_id()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->process_type()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.process_id = 1177; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.push_back(TaskSnapshot()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.location.file_name = "file3"; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.location.function_name = "function3"; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.location.line_number = 7331; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().birth.thread_name = "birth_thread3"; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.count = 137; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.run_duration_sum = 131; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.run_duration_max = 117; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.run_duration_sample = 113; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.queue_duration_sum = 108; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.queue_duration_max = 105; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_data.queue_duration_sample = 103; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks.back().death_thread_name = "death_thread3"; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.RecordProfilerData(process_data, content::PROCESS_TYPE_RENDERER); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, log.uma_proto().profiler_event_size()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.uma_proto().profiler_event(0).profile_type()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.uma_proto().profiler_event(0).time_source()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3, log.uma_proto().profiler_event(0).tracked_object_size()); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProfilerEventProto::TrackedObject* tracked_object = 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &log.uma_proto().profiler_event(0).tracked_object(2); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(2686523203278102732), 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->source_file_name_hash()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(5081672290546182009), 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->source_function_name_hash()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(7331, tracked_object->source_line_number()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(8768512930949373716), 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->birth_thread_name_hash()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(137, tracked_object->exec_count()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(131, tracked_object->exec_time_total()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(113, tracked_object->exec_time_sampled()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(108, tracked_object->queue_time_total()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(103, tracked_object->queue_time_sampled()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GG_UINT64_C(7246674144371406371), 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->exec_thread_name_hash()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1177U, tracked_object->process_id()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProfilerEventProto::TrackedObject::RENDERER, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_object->process_type()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 338