metrics_log_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/message_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/port.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_process_type.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/metrics/proto/profiler_event.pb.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/metrics/proto/system_profile.pb.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/metrics/variations/variations_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_settings.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/webplugininfo.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // OS_CHROMEOS
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using metrics::ProfilerEventProto;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using tracked_objects::ProcessDataSnapshot;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using tracked_objects::TaskSnapshot;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kClientId[] = "bogus client ID";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSessionId = 127;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kScreenWidth = 1024;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kScreenHeight = 768;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kScreenCount = 3;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kScreenScaleFactor = 2;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kBrandForTesting[] = "brand_for_testing";
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const chrome_variations::ActiveGroupId kFieldTrialIds[] = {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {37, 43},
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {13, 47},
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {23, 17}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestMetricsLog : public MetricsLog {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMetricsLog(const std::string& client_id, int session_id)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : MetricsLog(client_id, session_id),
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        brand_for_testing_(kBrandForTesting) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::RegisterLocalState(prefs_.registry());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs_.SetInteger(prefs::kStabilityChildProcessCrashCount, 10);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs_.SetInteger(prefs::kStabilityOtherUserCrashCount, 11);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs_.SetInteger(prefs::kStabilityKernelCrashCount, 12);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs_.SetInteger(prefs::kStabilitySystemUncleanShutdownCount, 13);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_CHROMEOS
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestMetricsLog() {}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PrefService* GetPrefService() OVERRIDE {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &prefs_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const metrics::ChromeUserMetricsExtension& uma_proto() const {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *MetricsLog::uma_proto();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const metrics::SystemProfileProto& system_profile() const {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return uma_proto().system_profile();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetCurrentTimeString() OVERRIDE {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
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:
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MetricsLogTest() : message_loop_(MessageLoop::TYPE_IO) {}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestRecordEnvironment(bool proto_only) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestMetricsLog log(kClientId, kSessionId);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<webkit::WebPluginInfo> plugins;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoogleUpdateMetrics google_update_metrics;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (proto_only)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log.RecordEnvironmentProto(plugins, google_update_metrics);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log.RecordEnvironment(plugins, google_update_metrics, NULL);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const metrics::SystemProfileProto& system_profile = log.system_profile();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(arraysize(kFieldTrialIds),
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              static_cast<size_t>(system_profile.field_trial_size()));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < arraysize(kFieldTrialIds); ++i) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const metrics::SystemProfileProto::FieldTrial& field_trial =
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          system_profile.field_trial(i);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(kFieldTrialIds[i].name, field_trial.name_id());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(kFieldTrialIds[i].group, field_trial.group_id());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kBrandForTesting, system_profile.brand_code());
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const metrics::SystemProfileProto::Hardware& hardware =
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        system_profile.hardware();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kScreenWidth, hardware.primary_screen_width());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kScreenHeight, hardware.primary_screen_height());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kScreenScaleFactor, hardware.primary_screen_scale_factor());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kScreenCount, hardware.screen_count());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(isherman): Verify other data written into the protobuf as a result
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // of this call.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!CommandLine::ForCurrentProcess()->HasSwitch(
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            chromeos::switches::kEnableExperimentalBluetooth))
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CommandLine::ForCurrentProcess()->AppendSwitch(
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          chromeos::switches::kEnableExperimentalBluetooth);
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mock_dbus_thread_manager_ =
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new chromeos::MockDBusThreadManagerWithoutGMock();
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    chromeos::DBusThreadManager::InitializeForTesting(
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mock_dbus_thread_manager_);
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // OS_CHROMEOS
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Drain the blocking pool from PostTaskAndReply executed by
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // MetrticsLog.network_observer_.
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::BrowserThread::GetBlockingPool()->FlushForTesting();
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunAllPendingInMessageLoop();
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    chromeos::DBusThreadManager::Shutdown();
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // OS_CHROMEOS
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is necessary because eventually some tests call base::RepeatingTimer
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // functions and a message loop is required for that.
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop message_loop_;
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager_;
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // OS_CHROMEOS
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MetricsLogTest, RecordEnvironment) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that recording the environment works via both of the public methods
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RecordEnvironment() and RecordEnvironmentProto().
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestRecordEnvironment(false);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestRecordEnvironment(true);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we properly write profiler data to the log.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MetricsLogTest, RecordProfilerData) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMetricsLog log(kClientId, kSessionId);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, log.uma_proto().profiler_event_size());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProcessDataSnapshot process_data;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.process_id = 177;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.push_back(TaskSnapshot());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.location.file_name = "file";
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.location.function_name = "function";
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.location.line_number = 1337;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.thread_name = "birth_thread";
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.count = 37;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.run_duration_sum = 31;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.run_duration_max = 17;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.run_duration_sample = 13;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.queue_duration_sum = 8;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.queue_duration_max = 5;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.queue_duration_sample = 3;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_thread_name = "Still_Alive";
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.push_back(TaskSnapshot());
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.location.file_name = "file2";
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.location.function_name = "function2";
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.location.line_number = 1773;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.thread_name = "birth_thread2";
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.count = 19;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.run_duration_sum = 23;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.run_duration_max = 11;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.run_duration_sample = 7;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.queue_duration_sum = 0;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.queue_duration_max = 0;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.queue_duration_sample = 0;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_thread_name = "death_thread";
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log.RecordProfilerData(process_data, content::PROCESS_TYPE_BROWSER);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1, log.uma_proto().profiler_event_size());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              log.uma_proto().profiler_event(0).profile_type());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              log.uma_proto().profiler_event(0).time_source());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2, log.uma_proto().profiler_event(0).tracked_object_size());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ProfilerEventProto::TrackedObject* tracked_object =
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &log.uma_proto().profiler_event(0).tracked_object(0);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(10123486280357988687),
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->source_file_name_hash());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(13962325592283560029),
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->source_function_name_hash());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1337, tracked_object->source_line_number());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(3400908935414830400),
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->birth_thread_name_hash());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(37, tracked_object->exec_count());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(31, tracked_object->exec_time_total());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(13, tracked_object->exec_time_sampled());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(8, tracked_object->queue_time_total());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, tracked_object->queue_time_sampled());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(10151977472163283085),
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->exec_thread_name_hash());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(177U, tracked_object->process_id());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->process_type());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tracked_object = &log.uma_proto().profiler_event(0).tracked_object(1);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(2025659946535236365),
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->source_file_name_hash());
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(55232426147951219),
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->source_function_name_hash());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1773, tracked_object->source_line_number());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(15727396632046120663),
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->birth_thread_name_hash());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(19, tracked_object->exec_count());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(23, tracked_object->exec_time_total());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(7, tracked_object->exec_time_sampled());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, tracked_object->queue_time_total());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, tracked_object->queue_time_sampled());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(14275151213201158253),
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->exec_thread_name_hash());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(177U, tracked_object->process_id());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->process_type());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProcessDataSnapshot process_data;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.process_id = 1177;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.push_back(TaskSnapshot());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.location.file_name = "file3";
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.location.function_name = "function3";
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.location.line_number = 7331;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().birth.thread_name = "birth_thread3";
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.count = 137;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.run_duration_sum = 131;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.run_duration_max = 117;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.run_duration_sample = 113;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.queue_duration_sum = 108;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.queue_duration_max = 105;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_data.queue_duration_sample = 103;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_data.tasks.back().death_thread_name = "death_thread3";
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log.RecordProfilerData(process_data, content::PROCESS_TYPE_RENDERER);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1, log.uma_proto().profiler_event_size());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              log.uma_proto().profiler_event(0).profile_type());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              log.uma_proto().profiler_event(0).time_source());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(3, log.uma_proto().profiler_event(0).tracked_object_size());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ProfilerEventProto::TrackedObject* tracked_object =
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &log.uma_proto().profiler_event(0).tracked_object(2);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(2686523203278102732),
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->source_file_name_hash());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(5081672290546182009),
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->source_function_name_hash());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(7331, tracked_object->source_line_number());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(8768512930949373716),
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->birth_thread_name_hash());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(137, tracked_object->exec_count());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(131, tracked_object->exec_time_total());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(113, tracked_object->exec_time_sampled());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(108, tracked_object->queue_time_total());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(103, tracked_object->queue_time_sampled());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GG_UINT64_C(7246674144371406371),
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->exec_thread_name_hash());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1177U, tracked_object->process_id());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ProfilerEventProto::TrackedObject::RENDERER,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tracked_object->process_type());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MetricsLogTest, ChromeOSStabilityData) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMetricsLog log(kClientId, kSessionId);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect 3 warnings about not yet being able to send the
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Chrome OS stability stats.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<webkit::WebPluginInfo> plugins;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = log.GetPrefService();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log.WriteStabilityElement(plugins, prefs);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log.CloseLog();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = log.GetEncodedLogSizeXml();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(size, 0);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, prefs->GetInteger(prefs::kStabilityChildProcessCrashCount));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, prefs->GetInteger(prefs::kStabilityOtherUserCrashCount));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, prefs->GetInteger(prefs::kStabilityKernelCrashCount));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, prefs->GetInteger(prefs::kStabilitySystemUncleanShutdownCount));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string encoded;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Leave room for the NUL terminator.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool encoding_result = log.GetEncodedLogXml(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteInto(&encoded, size + 1), size);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(encoding_result);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we can find childprocesscrashcount, but not
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // any of the ChromeOS ones that we are not emitting until log
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // servers can handle them.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(std::string::npos,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded.find(" childprocesscrashcount=\"10\""));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string::npos,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded.find(" otherusercrashcount="));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string::npos,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded.find(" kernelcrashcount="));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string::npos,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded.find(" systemuncleanshutdowns="));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_CHROMEOS
371