blob: 494a5a3f7e6fc23d4d15ec46b98f045486548e99 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "src/developer/forensics/public/fakes/crash_reporter.h"
#include <fuchsia/feedback/cpp/fidl.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/errors.h>
#include <zircon/types.h>
#include <memory>
namespace forensics {
namespace fakes {
using namespace fuchsia::feedback;
void CrashReporter::File(CrashReport report, FileCallback callback) {
if (!report.has_program_name()) {
callback(CrashReporter_File_Result::WithErr(ZX_ERR_INVALID_ARGS));
} else {
callback(CrashReporter_File_Result::WithResponse(CrashReporter_File_Response()));
}
++num_crash_reports_filed_;
if (querier_) {
querier_->UpdateAndNotify(num_crash_reports_filed_);
}
}
void CrashReporter::SetQuerier(
fidl::InterfaceRequest<fuchsia::feedback::testing::FakeCrashReporterQuerier> request) {
FX_LOGS(INFO) << "Registering FakeCrashReporterQuerier";
querier_ = std::make_unique<FakeCrashReporterQuerier>(this, std::move(request),
num_crash_reports_filed_);
}
void CrashReporter::ResetQuerier() {
FX_LOGS(INFO) << "Deregistering FakeCrashReporterQuerier";
querier_.reset();
// We reset so that the next Querier gets values starting at 0 as they would expect.
num_crash_reports_filed_ = 0;
}
FakeCrashReporterQuerier::FakeCrashReporterQuerier(
CrashReporter* crash_reporter,
fidl::InterfaceRequest<fuchsia::feedback::testing::FakeCrashReporterQuerier> request,
size_t num_crash_reports_filed)
: connection_(this, std::move(request)),
num_crash_reports_filed_(num_crash_reports_filed),
watch_file_dirty_bit_(true) {
connection_.set_error_handler(
[crash_reporter](const zx_status_t status) { crash_reporter->ResetQuerier(); });
}
void FakeCrashReporterQuerier::UpdateAndNotify(size_t num_crash_reports_filed) {
num_crash_reports_filed_ = num_crash_reports_filed;
watch_file_dirty_bit_ = true;
Notify();
}
void FakeCrashReporterQuerier::Notify() {
if (!callback_.has_value() || !watch_file_dirty_bit_) {
return;
}
(*callback_)(num_crash_reports_filed_);
callback_ = std::nullopt;
watch_file_dirty_bit_ = false;
}
void FakeCrashReporterQuerier::WatchFile(WatchFileCallback callback) {
callback_ = std::move(callback);
Notify();
}
} // namespace fakes
} // namespace forensics