| // 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 |