blob: 5c907a87748fab08620ffee21c6d3e22df899fe4 [file] [log] [blame]
// Copyright 2021 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/chromeos/extensions/telemetry/api/diagnostics_api.h"
#include <memory>
#include <string>
#include <utility>
#include "base/bind.h"
#include "base/values.h"
#include "chrome/browser/chromeos/extensions/telemetry/api/diagnostics_api_converters.h"
#include "chrome/common/chromeos/extensions/api/diagnostics.h"
namespace chromeos {
// DiagnosticsApiFunctionBase --------------------------------------------------
DiagnosticsApiFunctionBase::DiagnosticsApiFunctionBase()
: diagnostics_service_(
remote_diagnostics_service_.BindNewPipeAndPassReceiver()) {}
DiagnosticsApiFunctionBase::~DiagnosticsApiFunctionBase() = default;
// OsDiagnosticsGetAvailableRoutinesFunction -----------------------------------
OsDiagnosticsGetAvailableRoutinesFunction::
OsDiagnosticsGetAvailableRoutinesFunction() = default;
OsDiagnosticsGetAvailableRoutinesFunction::
~OsDiagnosticsGetAvailableRoutinesFunction() = default;
void OsDiagnosticsGetAvailableRoutinesFunction::RunIfAllowed() {
auto cb = base::BindOnce(&OsDiagnosticsGetAvailableRoutinesFunction::OnResult,
this);
remote_diagnostics_service_->GetAvailableRoutines(std::move(cb));
}
void OsDiagnosticsGetAvailableRoutinesFunction::OnResult(
const std::vector<ash::health::mojom::DiagnosticRoutineEnum>& routines) {
api::os_diagnostics::GetAvailableRoutinesResponse result;
for (const auto in : routines) {
api::os_diagnostics::RoutineType out;
if (converters::ConvertMojoRoutine(in, &out)) {
result.routines.push_back(out);
}
}
Respond(ArgumentList(
api::os_diagnostics::GetAvailableRoutines::Results::Create(result)));
}
// OsDiagnosticsGetRoutineUpdateFunction ---------------------------------------
OsDiagnosticsGetRoutineUpdateFunction::OsDiagnosticsGetRoutineUpdateFunction() =
default;
OsDiagnosticsGetRoutineUpdateFunction::
~OsDiagnosticsGetRoutineUpdateFunction() = default;
void OsDiagnosticsGetRoutineUpdateFunction::RunIfAllowed() {
std::unique_ptr<api::os_diagnostics::GetRoutineUpdate::Params> params(
api::os_diagnostics::GetRoutineUpdate::Params::Create(args()));
if (!params) {
SetBadMessage();
Respond(BadMessage());
return;
}
auto cb =
base::BindOnce(&OsDiagnosticsGetRoutineUpdateFunction::OnResult, this);
remote_diagnostics_service_->GetRoutineUpdate(
params->request.id,
converters::ConvertRoutineCommand(params->request.command),
/* include_output= */ true, std::move(cb));
}
void OsDiagnosticsGetRoutineUpdateFunction::OnResult(
ash::health::mojom::RoutineUpdatePtr ptr) {
if (!ptr) {
// |ptr| should never be null, otherwise Mojo validation will fail.
// However it's safer to handle it in case of API changes.
Respond(Error("API internal error"));
return;
}
api::os_diagnostics::GetRoutineUpdateResponse result;
result.progress_percent = ptr->progress_percent;
if (ptr->output.has_value() && !ptr->output.value().empty()) {
result.output =
std::make_unique<std::string>(std::move(ptr->output.value()));
}
switch (ptr->routine_update_union->which()) {
case ash::health::mojom::RoutineUpdateUnion::Tag::NONINTERACTIVE_UPDATE: {
auto& routine_update =
ptr->routine_update_union->get_noninteractive_update();
result.status = converters::ConvertRoutineStatus(routine_update->status);
result.status_message = std::move(routine_update->status_message);
break;
}
case ash::health::mojom::RoutineUpdateUnion::Tag::INTERACTIVE_UPDATE:
// Routine is waiting for user action. Set the status to waiting.
result.status = api::os_diagnostics::RoutineStatus::
ROUTINE_STATUS_WAITING_USER_ACTION;
result.status_message = "Waiting for user action. See user_message";
result.user_message = converters::ConvertRoutineUserMessage(
ptr->routine_update_union->get_interactive_update()->user_message);
break;
}
Respond(ArgumentList(
api::os_diagnostics::GetRoutineUpdate::Results::Create(result)));
}
// DiagnosticsApiRunRoutineFunctionBase ----------------------------------------
DiagnosticsApiRunRoutineFunctionBase::DiagnosticsApiRunRoutineFunctionBase() =
default;
DiagnosticsApiRunRoutineFunctionBase::~DiagnosticsApiRunRoutineFunctionBase() =
default;
void DiagnosticsApiRunRoutineFunctionBase::OnResult(
ash::health::mojom::RunRoutineResponsePtr ptr) {
if (!ptr) {
// |ptr| should never be null, otherwise Mojo validation will fail.
// However it's safer to handle it in case of API changes.
Respond(Error("API internal error"));
return;
}
api::os_diagnostics::RunRoutineResponse result;
result.id = ptr->id;
result.status = converters::ConvertRoutineStatus(ptr->status);
Respond(OneArgument(base::Value::FromUniquePtrValue(result.ToValue())));
}
// OsDiagnosticsRunBatteryCapacityRoutineFunction ------------------------------
OsDiagnosticsRunBatteryCapacityRoutineFunction::
OsDiagnosticsRunBatteryCapacityRoutineFunction() = default;
OsDiagnosticsRunBatteryCapacityRoutineFunction::
~OsDiagnosticsRunBatteryCapacityRoutineFunction() = default;
void OsDiagnosticsRunBatteryCapacityRoutineFunction::RunIfAllowed() {
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunBatteryCapacityRoutine(std::move(cb));
}
// OsDiagnosticsRunBatteryChargeRoutineFunction --------------------------------
OsDiagnosticsRunBatteryChargeRoutineFunction::
OsDiagnosticsRunBatteryChargeRoutineFunction() = default;
OsDiagnosticsRunBatteryChargeRoutineFunction::
~OsDiagnosticsRunBatteryChargeRoutineFunction() = default;
void OsDiagnosticsRunBatteryChargeRoutineFunction::RunIfAllowed() {
std::unique_ptr<api::os_diagnostics::RunBatteryChargeRoutine::Params> params(
api::os_diagnostics::RunBatteryChargeRoutine::Params::Create(args()));
if (!params) {
SetBadMessage();
Respond(BadMessage());
return;
}
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunBatteryChargeRoutine(
params->request.length_seconds,
params->request.minimum_charge_percent_required, std::move(cb));
}
// OsDiagnosticsRunBatteryDischargeRoutineFunction -----------------------------
OsDiagnosticsRunBatteryDischargeRoutineFunction::
OsDiagnosticsRunBatteryDischargeRoutineFunction() = default;
OsDiagnosticsRunBatteryDischargeRoutineFunction::
~OsDiagnosticsRunBatteryDischargeRoutineFunction() = default;
void OsDiagnosticsRunBatteryDischargeRoutineFunction::RunIfAllowed() {
std::unique_ptr<api::os_diagnostics::RunBatteryDischargeRoutine::Params>
params(api::os_diagnostics::RunBatteryDischargeRoutine::Params::Create(
args()));
if (!params) {
SetBadMessage();
Respond(BadMessage());
return;
}
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunBatteryDischargeRoutine(
params->request.length_seconds,
params->request.maximum_discharge_percent_allowed, std::move(cb));
}
// OsDiagnosticsRunBatteryHealthRoutineFunction --------------------------------
OsDiagnosticsRunBatteryHealthRoutineFunction::
OsDiagnosticsRunBatteryHealthRoutineFunction() = default;
OsDiagnosticsRunBatteryHealthRoutineFunction::
~OsDiagnosticsRunBatteryHealthRoutineFunction() = default;
void OsDiagnosticsRunBatteryHealthRoutineFunction::RunIfAllowed() {
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunBatteryHealthRoutine(std::move(cb));
}
// OsDiagnosticsRunCpuCacheRoutineFunction -------------------------------------
OsDiagnosticsRunCpuCacheRoutineFunction::
OsDiagnosticsRunCpuCacheRoutineFunction() = default;
OsDiagnosticsRunCpuCacheRoutineFunction::
~OsDiagnosticsRunCpuCacheRoutineFunction() = default;
void OsDiagnosticsRunCpuCacheRoutineFunction::RunIfAllowed() {
std::unique_ptr<api::os_diagnostics::RunCpuCacheRoutine::Params> params(
api::os_diagnostics::RunCpuCacheRoutine::Params::Create(args()));
if (!params) {
SetBadMessage();
Respond(BadMessage());
return;
}
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunCpuCacheRoutine(
params->request.length_seconds, std::move(cb));
}
// OsDiagnosticsRunCpuFloatingPointAccuracyRoutineFunction ---------------------
OsDiagnosticsRunCpuFloatingPointAccuracyRoutineFunction::
OsDiagnosticsRunCpuFloatingPointAccuracyRoutineFunction() = default;
OsDiagnosticsRunCpuFloatingPointAccuracyRoutineFunction::
~OsDiagnosticsRunCpuFloatingPointAccuracyRoutineFunction() = default;
void OsDiagnosticsRunCpuFloatingPointAccuracyRoutineFunction::RunIfAllowed() {
std::unique_ptr<
api::os_diagnostics::RunCpuFloatingPointAccuracyRoutine::Params>
params(api::os_diagnostics::RunCpuFloatingPointAccuracyRoutine::Params::
Create(args()));
if (!params) {
SetBadMessage();
Respond(BadMessage());
return;
}
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunFloatingPointAccuracyRoutine(
params->request.length_seconds, std::move(cb));
}
// OsDiagnosticsRunCpuPrimeSearchRoutineFunction -------------------------------
OsDiagnosticsRunCpuPrimeSearchRoutineFunction::
OsDiagnosticsRunCpuPrimeSearchRoutineFunction() = default;
OsDiagnosticsRunCpuPrimeSearchRoutineFunction::
~OsDiagnosticsRunCpuPrimeSearchRoutineFunction() = default;
void OsDiagnosticsRunCpuPrimeSearchRoutineFunction::RunIfAllowed() {
std::unique_ptr<api::os_diagnostics::RunCpuPrimeSearchRoutine::Params> params(
api::os_diagnostics::RunCpuPrimeSearchRoutine::Params::Create(args()));
if (!params) {
SetBadMessage();
Respond(BadMessage());
return;
}
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunPrimeSearchRoutine(
params->request.length_seconds, std::move(cb));
}
// OsDiagnosticsRunCpuStressRoutineFunction ------------------------------------
OsDiagnosticsRunCpuStressRoutineFunction::
OsDiagnosticsRunCpuStressRoutineFunction() = default;
OsDiagnosticsRunCpuStressRoutineFunction::
~OsDiagnosticsRunCpuStressRoutineFunction() = default;
void OsDiagnosticsRunCpuStressRoutineFunction::RunIfAllowed() {
std::unique_ptr<api::os_diagnostics::RunCpuStressRoutine::Params> params(
api::os_diagnostics::RunCpuStressRoutine::Params::Create(args()));
if (!params) {
SetBadMessage();
Respond(BadMessage());
return;
}
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunCpuStressRoutine(
params->request.length_seconds, std::move(cb));
}
// OsDiagnosticsRunDiskReadRoutineFunction -------------------------------------
OsDiagnosticsRunDiskReadRoutineFunction::
OsDiagnosticsRunDiskReadRoutineFunction() = default;
OsDiagnosticsRunDiskReadRoutineFunction::
~OsDiagnosticsRunDiskReadRoutineFunction() = default;
void OsDiagnosticsRunDiskReadRoutineFunction::RunIfAllowed() {
std::unique_ptr<api::os_diagnostics::RunDiskReadRoutine::Params> params(
api::os_diagnostics::RunDiskReadRoutine::Params::Create(args()));
if (!params) {
SetBadMessage();
Respond(BadMessage());
return;
}
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunDiskReadRoutine(
converters::ConvertDiskReadRoutineType(params->request.type),
params->request.length_seconds, params->request.file_size_mb,
std::move(cb));
}
// OsDiagnosticsRunMemoryRoutineFunction ---------------------------------------
OsDiagnosticsRunMemoryRoutineFunction::OsDiagnosticsRunMemoryRoutineFunction() =
default;
OsDiagnosticsRunMemoryRoutineFunction::
~OsDiagnosticsRunMemoryRoutineFunction() = default;
void OsDiagnosticsRunMemoryRoutineFunction::RunIfAllowed() {
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunMemoryRoutine(std::move(cb));
}
// OsDiagnosticsRunNvmeWearLevelRoutineFunction --------------------------------
OsDiagnosticsRunNvmeWearLevelRoutineFunction::
OsDiagnosticsRunNvmeWearLevelRoutineFunction() = default;
OsDiagnosticsRunNvmeWearLevelRoutineFunction::
~OsDiagnosticsRunNvmeWearLevelRoutineFunction() = default;
void OsDiagnosticsRunNvmeWearLevelRoutineFunction::RunIfAllowed() {
std::unique_ptr<api::os_diagnostics::RunNvmeWearLevelRoutine::Params> params(
api::os_diagnostics::RunNvmeWearLevelRoutine::Params::Create(args()));
if (!params) {
SetBadMessage();
Respond(BadMessage());
return;
}
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunNvmeWearLevelRoutine(
params->request.wear_level_threshold, std::move(cb));
}
// OsDiagnosticsRunSmartctlCheckRoutineFunction --------------------------------
OsDiagnosticsRunSmartctlCheckRoutineFunction::
OsDiagnosticsRunSmartctlCheckRoutineFunction() = default;
OsDiagnosticsRunSmartctlCheckRoutineFunction::
~OsDiagnosticsRunSmartctlCheckRoutineFunction() = default;
void OsDiagnosticsRunSmartctlCheckRoutineFunction::RunIfAllowed() {
auto cb =
base::BindOnce(&DiagnosticsApiRunRoutineFunctionBase::OnResult, this);
remote_diagnostics_service_->RunSmartctlCheckRoutine(std::move(cb));
}
} // namespace chromeos