• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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/diagnostics/diagnostics_metrics.h"
6 
7 #include <string>
8 
9 #include "base/basictypes.h"
10 #include "base/metrics/histogram.h"
11 #include "chrome/browser/diagnostics/diagnostics_test.h"
12 
13 namespace diagnostics {
14 
15 namespace {
16 
17 // A struct to hold information about the tests.
18 struct TestNameInfo {
19   // Should only contain characters [A-Za-z0-9] (no spaces).
20   const char* name;
21 
22   // A non-localized description only meant for developer consumption.
23   const char* description;
24 };
25 
26 // This structure MUST have DIAGNOSTICS_TEST_COUNT entries in it: one for each
27 // value of DiagnosticsTestId.  Note that the values in the "name" fields are
28 // used for UMA metrics names (with "Diagnostics.Test." or
29 // "Diagnostics.Recovery." prepended), so do not change them without
30 // understanding the consequences.
31 const TestNameInfo kTestNameInfo[] = {
32     {"ConflictingDlls", "Conflicting modules"},
33     {"DiskSpace", "Available disk space"},
34     {"InstallType", "Install type"},
35     {"JSONBookmarks", "Bookmark file"},
36     {"JSONLocalState", "Local state integrity"},
37     {"JSONPreferences", "User preferences integrity"},
38     {"OperatingSystem", "Operating system supported version"},
39     {"PathDictionaries", "App dictionaries directory path"},
40     {"PathLocalState", "Local state path"},
41     {"PathResources", "Resources path"},
42     {"PathUserData", "User data path"},
43     {"Version", "Chrome version test"},
44     {"SQLiteIntegrityAppCache", "Application cache database"},
45     {"SQLiteIntegrityArchivedHistory", "Archived history database"},
46     {"SQLiteIntegrityCookie", "Cookie database"},
47     {"SQLiteIntegrityDatabaseTracker", "Database tracker database"},
48     {"SQLiteIntegrityHistory", "History database"},
49     {"SQLiteIntegrityNSSCert", "NSS certificate database"},
50     {"SQLiteIntegrityNSSKey", "NSS Key database"},
51     {"SQLiteIntegrityThumbnails", "Thumbnails database"},
52     {"SQLiteIntegrityWebData", "Web Data database"},
53     // Add new entries in the same order as DiagnosticsTestId.
54 };
55 
56 COMPILE_ASSERT(arraysize(kTestNameInfo) == DIAGNOSTICS_TEST_ID_COUNT,
57                diagnostics_test_info_mismatch);
58 
FindTestInfo(DiagnosticsTestId id)59 const TestNameInfo* FindTestInfo(DiagnosticsTestId id) {
60   DCHECK(id < DIAGNOSTICS_TEST_ID_COUNT);
61   return &kTestNameInfo[id];
62 }
63 
64 }  // namespace
65 
GetTestName(DiagnosticsTestId id)66 std::string GetTestName(DiagnosticsTestId id) {
67   return std::string(FindTestInfo(id)->name);
68 }
69 
GetTestDescription(DiagnosticsTestId id)70 std::string GetTestDescription(DiagnosticsTestId id) {
71   return std::string(FindTestInfo(id)->description);
72 }
73 
74 #define TEST_CASE(name, id)                                \
75   case id:                                                 \
76     UMA_HISTOGRAM_ENUMERATION(name, result, RESULT_COUNT); \
77     break
78 
79 // These must each have their own complete case so that the UMA macros create
80 // a unique static pointer block for each individual metric.  This is done as a
81 // macro to prevent errors where the ID is added to one function below, but not
82 // the other, because they must match.
83 #define TEST_CASES(name)                                               \
84   TEST_CASE(name, DIAGNOSTICS_CONFLICTING_DLLS_TEST);                  \
85   TEST_CASE(name, DIAGNOSTICS_DISK_SPACE_TEST);                        \
86   TEST_CASE(name, DIAGNOSTICS_INSTALL_TYPE_TEST);                      \
87   TEST_CASE(name, DIAGNOSTICS_JSON_BOOKMARKS_TEST);                    \
88   TEST_CASE(name, DIAGNOSTICS_JSON_LOCAL_STATE_TEST);                  \
89   TEST_CASE(name, DIAGNOSTICS_JSON_PREFERENCES_TEST);                  \
90   TEST_CASE(name, DIAGNOSTICS_OPERATING_SYSTEM_TEST);                  \
91   TEST_CASE(name, DIAGNOSTICS_PATH_DICTIONARIES_TEST);                 \
92   TEST_CASE(name, DIAGNOSTICS_PATH_LOCAL_STATE_TEST);                  \
93   TEST_CASE(name, DIAGNOSTICS_PATH_RESOURCES_TEST);                    \
94   TEST_CASE(name, DIAGNOSTICS_PATH_USER_DATA_TEST);                    \
95   TEST_CASE(name, DIAGNOSTICS_VERSION_TEST);                           \
96   TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_APP_CACHE_TEST);        \
97   TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_ARCHIVED_HISTORY_TEST); \
98   TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_COOKIE_TEST);           \
99   TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_DATABASE_TRACKER_TEST); \
100   TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_HISTORY_TEST);          \
101   TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_NSS_CERT_TEST);         \
102   TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_NSS_KEY_TEST);          \
103   TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_THUMBNAILS_TEST);       \
104   TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_WEB_DATA_TEST)
105 
RecordUMARecoveryResult(DiagnosticsTestId id,RunResultMetrics result)106 void RecordUMARecoveryResult(DiagnosticsTestId id, RunResultMetrics result) {
107   const std::string name("Diagnostics.Recovery." +
108                          GetTestName(static_cast<DiagnosticsTestId>(id)));
109   switch (id) {
110     TEST_CASES(name);  // See above
111     default:
112       NOTREACHED() << "Unhandled UMA Metric type" << id;
113   }
114 }
115 
RecordUMATestResult(DiagnosticsTestId id,RunResultMetrics result)116 void RecordUMATestResult(DiagnosticsTestId id, RunResultMetrics result) {
117   const std::string name("Diagnostics.Test." +
118                          GetTestName(static_cast<DiagnosticsTestId>(id)));
119   switch (id) {
120     TEST_CASES(name);  // See above
121     default:
122       NOTREACHED() << "Unhandled UMA Metric type" << id;
123   }
124 }
125 #undef TEST_CASE
126 #undef TEST_CASES
127 
128 }  // namespace diagnostics
129