1// Copyright (c) 2011 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_test.h"
6
7#include "base/files/file_path.h"
8#include "base/logging.h"
9#include "base/metrics/histogram.h"
10#include "base/path_service.h"
11#include "chrome/common/chrome_constants.h"
12#include "chrome/common/chrome_paths.h"
13
14namespace diagnostics {
15
16DiagnosticsTest::DiagnosticsTest(DiagnosticsTestId id)
17    : id_(id), outcome_code_(-1), result_(DiagnosticsModel::TEST_NOT_RUN) {}
18
19DiagnosticsTest::~DiagnosticsTest() {}
20
21bool DiagnosticsTest::Execute(DiagnosticsModel::Observer* observer,
22                              DiagnosticsModel* model,
23                              size_t index) {
24  start_time_ = base::Time::Now();
25  result_ = DiagnosticsModel::TEST_RUNNING;
26  bool keep_going = ExecuteImpl(observer);
27  if (observer)
28    observer->OnTestFinished(index, model);
29  return keep_going;
30}
31
32bool DiagnosticsTest::Recover(DiagnosticsModel::Observer* observer,
33                              DiagnosticsModel* model,
34                              size_t index) {
35  result_ = DiagnosticsModel::RECOVERY_RUNNING;
36  bool keep_going = RecoveryImpl(observer);
37  result_ = keep_going ? DiagnosticsModel::RECOVERY_OK
38                       : DiagnosticsModel::RECOVERY_FAIL_STOP;
39#if defined(OS_CHROMEOS)  // Only collecting UMA stats on ChromeOS
40  if (result_ == DiagnosticsModel::RECOVERY_OK) {
41    RecordUMARecoveryResult(static_cast<DiagnosticsTestId>(GetId()),
42                            RESULT_SUCCESS);
43  } else {
44    RecordUMARecoveryResult(static_cast<DiagnosticsTestId>(GetId()),
45                            RESULT_FAILURE);
46  }
47#endif
48  if (observer)
49    observer->OnRecoveryFinished(index, model);
50  return keep_going;
51}
52
53void DiagnosticsTest::RecordOutcome(int outcome_code,
54                                    const std::string& additional_info,
55                                    DiagnosticsModel::TestResult result) {
56  end_time_ = base::Time::Now();
57  outcome_code_ = outcome_code;
58  additional_info_ = additional_info;
59  result_ = result;
60#if defined(OS_CHROMEOS)  // Only collecting UMA stats on ChromeOS
61  if (result_ == DiagnosticsModel::TEST_OK) {
62    // Record individual test success.
63    RecordUMATestResult(static_cast<DiagnosticsTestId>(GetId()),
64                        RESULT_SUCCESS);
65  } else if (result_ == DiagnosticsModel::TEST_FAIL_CONTINUE ||
66             result_ == DiagnosticsModel::TEST_FAIL_STOP) {
67    // Record test failure in summary histogram.
68    UMA_HISTOGRAM_ENUMERATION(
69        "Diagnostics.TestFailures", GetId(), DIAGNOSTICS_TEST_ID_COUNT);
70    // Record individual test failure.
71    RecordUMATestResult(static_cast<DiagnosticsTestId>(GetId()),
72                        RESULT_FAILURE);
73  }
74#endif
75}
76
77// static
78base::FilePath DiagnosticsTest::GetUserDefaultProfileDir() {
79  base::FilePath path;
80  if (!PathService::Get(chrome::DIR_USER_DATA, &path))
81    return base::FilePath();
82  return path.AppendASCII(chrome::kInitialProfile);
83}
84
85int DiagnosticsTest::GetId() const { return id_; }
86
87std::string DiagnosticsTest::GetName() const { return GetTestName(id_); }
88
89std::string DiagnosticsTest::GetTitle() const {
90  return GetTestDescription(id_);
91}
92
93DiagnosticsModel::TestResult DiagnosticsTest::GetResult() const {
94  return result_;
95}
96
97int DiagnosticsTest::GetOutcomeCode() const { return outcome_code_; }
98
99std::string DiagnosticsTest::GetAdditionalInfo() const {
100  return additional_info_;
101}
102
103base::Time DiagnosticsTest::GetStartTime() const { return start_time_; }
104
105base::Time DiagnosticsTest::GetEndTime() const { return end_time_; }
106
107bool DiagnosticsTest::RecoveryImpl(DiagnosticsModel::Observer* observer) {
108  return true;
109}
110
111}  // namespace diagnostics
112