blob: b483505f91594b20665524ea01dadfae1e393978 [file] [log] [blame]
// Copyright 2020 The Chromium OS 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 "diagnostics/cros_healthd/routines/simple_routine.h"
#include <cstdint>
#include <string>
#include <utility>
#include <base/json/json_writer.h>
#include <base/logging.h>
#include <base/strings/string_piece.h>
#include <base/strings/stringprintf.h>
#include "diagnostics/common/mojo_utils.h"
#include "mojo/cros_healthd_diagnostics.mojom.h"
namespace diagnostics {
namespace {
namespace mojo_ipc = ::chromeos::cros_healthd::mojom;
uint32_t CalculateProgressPercent(
mojo_ipc::DiagnosticRoutineStatusEnum status) {
// Since simple routines cannot be cancelled, the progress percent can only be
// 0 or 100.
if (status == mojo_ipc::DiagnosticRoutineStatusEnum::kPassed ||
status == mojo_ipc::DiagnosticRoutineStatusEnum::kFailed ||
status == mojo_ipc::DiagnosticRoutineStatusEnum::kError)
return 100;
return 0;
}
} // namespace
SimpleRoutine::SimpleRoutine(Task task)
: task_(std::move(task)),
status_(mojo_ipc::DiagnosticRoutineStatusEnum::kReady) {}
SimpleRoutine::~SimpleRoutine() = default;
void SimpleRoutine::Start() {
DCHECK_EQ(status_, mojo_ipc::DiagnosticRoutineStatusEnum::kReady);
std::move(task_).Run(&status_, &status_message_, &output_dict_);
if (status_ != mojo_ipc::DiagnosticRoutineStatusEnum::kPassed &&
status_ != mojo_ipc::DiagnosticRoutineStatusEnum::kRunning) {
LOG(ERROR) << base::StringPrintf(
"Routine unsuccessful with status: %d and message: %s.", status_,
status_message_.c_str());
}
}
// Simple routines can only be started.
void SimpleRoutine::Resume() {}
void SimpleRoutine::Cancel() {}
void SimpleRoutine::PopulateStatusUpdate(mojo_ipc::RoutineUpdate* response,
bool include_output) {
// Because simple routines are non-interactive, we will never include a user
// message.
mojo_ipc::NonInteractiveRoutineUpdate update;
update.status = status_;
update.status_message = status_message_;
response->routine_update_union->set_noninteractive_update(update.Clone());
response->progress_percent = CalculateProgressPercent(status_);
if (include_output && !output_dict_.DictEmpty()) {
std::string json;
base::JSONWriter::WriteWithOptions(
output_dict_, base::JSONWriter::Options::OPTIONS_PRETTY_PRINT, &json);
response->output =
CreateReadOnlySharedMemoryRegionMojoHandle(base::StringPiece(json));
}
}
mojo_ipc::DiagnosticRoutineStatusEnum SimpleRoutine::GetStatus() {
return status_;
}
} // namespace diagnostics