1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/metrics/extensions_metrics_provider.h" 6 7#include <string> 8 9#include "base/memory/scoped_ptr.h" 10#include "base/prefs/testing_pref_service.h" 11#include "components/metrics/client_info.h" 12#include "components/metrics/metrics_service.h" 13#include "components/metrics/metrics_state_manager.h" 14#include "components/metrics/proto/system_profile.pb.h" 15#include "extensions/common/extension.h" 16#include "extensions/common/extension_builder.h" 17#include "extensions/common/extension_set.h" 18#include "testing/gtest/include/gtest/gtest.h" 19 20namespace { 21 22bool IsMetricsReportingEnabled() { 23 return true; 24} 25 26void StoreNoClientInfoBackup(const metrics::ClientInfo& /* client_info */) { 27} 28 29scoped_ptr<metrics::ClientInfo> ReturnNoBackup() { 30 return scoped_ptr<metrics::ClientInfo>(); 31} 32 33class TestExtensionsMetricsProvider : public ExtensionsMetricsProvider { 34 public: 35 explicit TestExtensionsMetricsProvider( 36 metrics::MetricsStateManager* metrics_state_manager) 37 : ExtensionsMetricsProvider(metrics_state_manager) {} 38 39 // Makes the protected HashExtension method available to testing code. 40 using ExtensionsMetricsProvider::HashExtension; 41 42 protected: 43 // Override the GetInstalledExtensions method to return a set of extensions 44 // for tests. 45 virtual scoped_ptr<extensions::ExtensionSet> GetInstalledExtensions( 46 Profile* profile) OVERRIDE { 47 scoped_ptr<extensions::ExtensionSet> extensions( 48 new extensions::ExtensionSet()); 49 scoped_refptr<const extensions::Extension> extension; 50 extension = extensions::ExtensionBuilder() 51 .SetManifest(extensions::DictionaryBuilder() 52 .Set("name", "Test extension") 53 .Set("version", "1.0.0") 54 .Set("manifest_version", 2)) 55 .SetID("ahfgeienlihckogmohjhadlkjgocpleb") 56 .Build(); 57 extensions->Insert(extension); 58 extension = extensions::ExtensionBuilder() 59 .SetManifest(extensions::DictionaryBuilder() 60 .Set("name", "Test extension 2") 61 .Set("version", "1.0.0") 62 .Set("manifest_version", 2)) 63 .SetID("pknkgggnfecklokoggaggchhaebkajji") 64 .Build(); 65 extensions->Insert(extension); 66 extension = extensions::ExtensionBuilder() 67 .SetManifest(extensions::DictionaryBuilder() 68 .Set("name", "Colliding Extension") 69 .Set("version", "1.0.0") 70 .Set("manifest_version", 2)) 71 .SetID("mdhofdjgenpkhlmddfaegdjddcecipmo") 72 .Build(); 73 extensions->Insert(extension); 74 return extensions.Pass(); 75 } 76 77 // Override GetClientID() to return a specific value on which test 78 // expectations are based. 79 virtual uint64 GetClientID() OVERRIDE { return 0x3f1bfee9; } 80}; 81 82} // namespace 83 84// Checks that the hash function used to hide precise extension IDs produces 85// the expected values. 86TEST(ExtensionsMetricsProvider, HashExtension) { 87 EXPECT_EQ(978, 88 TestExtensionsMetricsProvider::HashExtension( 89 "ahfgeienlihckogmohjhadlkjgocpleb", 0)); 90 EXPECT_EQ(10, 91 TestExtensionsMetricsProvider::HashExtension( 92 "ahfgeienlihckogmohjhadlkjgocpleb", 3817)); 93 EXPECT_EQ(1007, 94 TestExtensionsMetricsProvider::HashExtension( 95 "pknkgggnfecklokoggaggchhaebkajji", 3817)); 96 EXPECT_EQ(10, 97 TestExtensionsMetricsProvider::HashExtension( 98 "mdhofdjgenpkhlmddfaegdjddcecipmo", 3817)); 99} 100 101// Checks that the fake set of extensions provided by 102// TestExtensionsMetricsProvider is encoded properly. 103TEST(ExtensionsMetricsProvider, SystemProtoEncoding) { 104 metrics::SystemProfileProto system_profile; 105 TestingPrefServiceSimple local_state; 106 metrics::MetricsService::RegisterPrefs(local_state.registry()); 107 scoped_ptr<metrics::MetricsStateManager> metrics_state_manager( 108 metrics::MetricsStateManager::Create( 109 &local_state, 110 base::Bind(&IsMetricsReportingEnabled), 111 base::Bind(&StoreNoClientInfoBackup), 112 base::Bind(&ReturnNoBackup))); 113 TestExtensionsMetricsProvider extension_metrics(metrics_state_manager.get()); 114 extension_metrics.ProvideSystemProfileMetrics(&system_profile); 115 ASSERT_EQ(2, system_profile.occupied_extension_bucket_size()); 116 EXPECT_EQ(10, system_profile.occupied_extension_bucket(0)); 117 EXPECT_EQ(1007, system_profile.occupied_extension_bucket(1)); 118} 119