blob: e70db9b835ec11c2f7d29d1282bee6e69fdf0bcc [file] [log] [blame]
// 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