summaryrefslogtreecommitdiffstats
path: root/chrome/browser/diagnostics/diagnostics_metrics.cc
blob: 51d4769ef198a8bf8db683f183b94801d0eaba83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/diagnostics/diagnostics_metrics.h"

#include <string>

#include "base/basictypes.h"
#include "base/metrics/histogram.h"
#include "chrome/browser/diagnostics/diagnostics_test.h"

namespace diagnostics {

namespace {

// A struct to hold information about the tests.
struct TestNameInfo {
  // Should only contain characters [A-Za-z0-9] (no spaces).
  const char* name;

  // A non-localized description only meant for developer consumption.
  const char* description;
};

// This structure MUST have DIAGNOSTICS_TEST_COUNT entries in it: one for each
// value of DiagnosticsTestId.  Note that the values in the "name" fields are
// used for UMA metrics names (with "Diagnostics.Test." or
// "Diagnostics.Recovery." prepended), so do not change them without
// understanding the consequences.
const TestNameInfo kTestNameInfo[] = {
    {"ConflictingDlls", "Conflicting modules"},
    {"DiskSpace", "Available disk space"},
    {"InstallType", "Install type"},
    {"JSONBookmarks", "Bookmark file"},
    {"JSONLocalState", "Local state integrity"},
    {"JSONPreferences", "User preferences integrity"},
    {"OperatingSystem", "Operating system supported version"},
    {"PathDictionaries", "App dictionaries directory path"},
    {"PathLocalState", "Local state path"},
    {"PathResources", "Resources path"},
    {"PathUserData", "User data path"},
    {"Version", "Chrome version test"},
    {"SQLiteIntegrityAppCache", "Application cache database"},
    {"SQLiteIntegrityArchivedHistory", "Archived history database (obsolete)"},
    {"SQLiteIntegrityCookie", "Cookie database"},
    {"SQLiteIntegrityDatabaseTracker", "Database tracker database"},
    {"SQLiteIntegrityHistory", "History database"},
    {"SQLiteIntegrityNSSCert", "NSS certificate database"},
    {"SQLiteIntegrityNSSKey", "NSS Key database"},
    {"SQLiteIntegrityThumbnails", "Thumbnails database"},
    {"SQLiteIntegrityWebData", "Web Data database"},
    // Add new entries in the same order as DiagnosticsTestId.
};

COMPILE_ASSERT(arraysize(kTestNameInfo) == DIAGNOSTICS_TEST_ID_COUNT,
               diagnostics_test_info_mismatch);

const TestNameInfo* FindTestInfo(DiagnosticsTestId id) {
  DCHECK(id < DIAGNOSTICS_TEST_ID_COUNT);
  return &kTestNameInfo[id];
}

}  // namespace

std::string GetTestName(DiagnosticsTestId id) {
  return std::string(FindTestInfo(id)->name);
}

std::string GetTestDescription(DiagnosticsTestId id) {
  return std::string(FindTestInfo(id)->description);
}

#define TEST_CASE(name, id)                                \
  case id:                                                 \
    UMA_HISTOGRAM_ENUMERATION(name, result, RESULT_COUNT); \
    break

// These must each have their own complete case so that the UMA macros create
// a unique static pointer block for each individual metric.  This is done as a
// macro to prevent errors where the ID is added to one function below, but not
// the other, because they must match.
#define TEST_CASES(name)                                               \
  TEST_CASE(name, DIAGNOSTICS_CONFLICTING_DLLS_TEST);                  \
  TEST_CASE(name, DIAGNOSTICS_DISK_SPACE_TEST);                        \
  TEST_CASE(name, DIAGNOSTICS_INSTALL_TYPE_TEST);                      \
  TEST_CASE(name, DIAGNOSTICS_JSON_BOOKMARKS_TEST);                    \
  TEST_CASE(name, DIAGNOSTICS_JSON_LOCAL_STATE_TEST);                  \
  TEST_CASE(name, DIAGNOSTICS_JSON_PREFERENCES_TEST);                  \
  TEST_CASE(name, DIAGNOSTICS_OPERATING_SYSTEM_TEST);                  \
  TEST_CASE(name, DIAGNOSTICS_PATH_DICTIONARIES_TEST);                 \
  TEST_CASE(name, DIAGNOSTICS_PATH_LOCAL_STATE_TEST);                  \
  TEST_CASE(name, DIAGNOSTICS_PATH_RESOURCES_TEST);                    \
  TEST_CASE(name, DIAGNOSTICS_PATH_USER_DATA_TEST);                    \
  TEST_CASE(name, DIAGNOSTICS_VERSION_TEST);                           \
  TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_APP_CACHE_TEST);        \
  TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_ARCHIVED_HISTORY_TEST_OBSOLETE);\
  TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_COOKIE_TEST);           \
  TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_DATABASE_TRACKER_TEST); \
  TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_HISTORY_TEST);          \
  TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_NSS_CERT_TEST);         \
  TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_NSS_KEY_TEST);          \
  TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_THUMBNAILS_TEST);       \
  TEST_CASE(name, DIAGNOSTICS_SQLITE_INTEGRITY_WEB_DATA_TEST)

void RecordUMARecoveryResult(DiagnosticsTestId id, RunResultMetrics result) {
  const std::string name("Diagnostics.Recovery." +
                         GetTestName(static_cast<DiagnosticsTestId>(id)));
  switch (id) {
    TEST_CASES(name);  // See above
    default:
      NOTREACHED() << "Unhandled UMA Metric type" << id;
  }
}

void RecordUMATestResult(DiagnosticsTestId id, RunResultMetrics result) {
  const std::string name("Diagnostics.Test." +
                         GetTestName(static_cast<DiagnosticsTestId>(id)));
  switch (id) {
    TEST_CASES(name);  // See above
    default:
      NOTREACHED() << "Unhandled UMA Metric type" << id;
  }
}
#undef TEST_CASE
#undef TEST_CASES

}  // namespace diagnostics