910e62b5创建于 1月15日历史提交
// Copyright 2011 The Chromium Authors
// 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_test.h"

#include <array>
#include <string>
#include <string_view>

#include "base/files/file_path.h"
#include "base/metrics/histogram_macros.h"
#include "base/path_service.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_paths.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.
constexpr auto kTestNameInfo = std::to_array<TestNameInfo>({
    {"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 (obsolete)"},
    {"SQLiteIntegrityWebData", "Web Data database"},
    {"SQLiteIntegrityFavicons", "Favicons database"},
    {"SQLiteIntegrityTopSites", "Top Sites database"},
    // Add new entries in the same order as DiagnosticsTestId.
});

static_assert(std::size(kTestNameInfo) == DIAGNOSTICS_TEST_ID_COUNT,
              "diagnostics test info mismatch");

const TestNameInfo& FindTestInfo(DiagnosticsTestId id) {
  return kTestNameInfo[id];
}

}  // namespace

DiagnosticsTest::DiagnosticsTest(DiagnosticsTestId id)
    : id_(id), outcome_code_(-1), result_(DiagnosticsModel::TEST_NOT_RUN) {}

DiagnosticsTest::~DiagnosticsTest() = default;

bool DiagnosticsTest::Execute(DiagnosticsModel::Observer* observer,
                              DiagnosticsModel* model,
                              size_t index) {
  start_time_ = base::Time::Now();
  result_ = DiagnosticsModel::TEST_RUNNING;
  bool keep_going = ExecuteImpl(observer);
  if (observer)
    observer->OnTestFinished(index, model);
  return keep_going;
}

bool DiagnosticsTest::Recover(DiagnosticsModel::Observer* observer,
                              DiagnosticsModel* model,
                              size_t index) {
  result_ = DiagnosticsModel::RECOVERY_RUNNING;
  bool keep_going = RecoveryImpl(observer);
  result_ = keep_going ? DiagnosticsModel::RECOVERY_OK
                       : DiagnosticsModel::RECOVERY_FAIL_STOP;
  if (observer)
    observer->OnRecoveryFinished(index, model);
  return keep_going;
}

void DiagnosticsTest::RecordOutcome(int outcome_code,
                                    const std::string& additional_info,
                                    DiagnosticsModel::TestResult result) {
  end_time_ = base::Time::Now();
  outcome_code_ = outcome_code;
  additional_info_ = additional_info;
  result_ = result;
}

// static
base::FilePath DiagnosticsTest::GetUserDefaultProfileDir() {
  base::FilePath path;
  if (!base::PathService::Get(chrome::DIR_USER_DATA, &path))
    return base::FilePath();
  return path.AppendASCII(chrome::kInitialProfile);
}

int DiagnosticsTest::GetId() const { return id_; }

std::string_view DiagnosticsTest::GetName() const {
  return FindTestInfo(id_).name;
}

std::string_view DiagnosticsTest::GetTitle() const {
  return FindTestInfo(id_).description;
}

DiagnosticsModel::TestResult DiagnosticsTest::GetResult() const {
  return result_;
}

int DiagnosticsTest::GetOutcomeCode() const { return outcome_code_; }

std::string DiagnosticsTest::GetAdditionalInfo() const {
  return additional_info_;
}

base::Time DiagnosticsTest::GetStartTime() const { return start_time_; }

base::Time DiagnosticsTest::GetEndTime() const { return end_time_; }

bool DiagnosticsTest::RecoveryImpl(DiagnosticsModel::Observer* observer) {
  return true;
}

}  // namespace diagnostics