1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/fuchsia_logging.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <zircon/status.h>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include <iomanip>
10*6777b538SAndroid Build Coastguard Worker #include <string_view>
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/process/process.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker namespace logging {
17*6777b538SAndroid Build Coastguard Worker
ZxLogMessage(const char * file_path,int line,LogSeverity severity,zx_status_t zx_status)18*6777b538SAndroid Build Coastguard Worker ZxLogMessage::ZxLogMessage(const char* file_path,
19*6777b538SAndroid Build Coastguard Worker int line,
20*6777b538SAndroid Build Coastguard Worker LogSeverity severity,
21*6777b538SAndroid Build Coastguard Worker zx_status_t zx_status)
22*6777b538SAndroid Build Coastguard Worker : LogMessage(file_path, line, severity), zx_status_(zx_status) {}
23*6777b538SAndroid Build Coastguard Worker
~ZxLogMessage()24*6777b538SAndroid Build Coastguard Worker ZxLogMessage::~ZxLogMessage() {
25*6777b538SAndroid Build Coastguard Worker AppendError();
26*6777b538SAndroid Build Coastguard Worker }
27*6777b538SAndroid Build Coastguard Worker
AppendError()28*6777b538SAndroid Build Coastguard Worker void ZxLogMessage::AppendError() {
29*6777b538SAndroid Build Coastguard Worker // zx_status_t error values are negative, so log the numeric version as
30*6777b538SAndroid Build Coastguard Worker // decimal rather than hex. This is also useful to match zircon/errors.h for
31*6777b538SAndroid Build Coastguard Worker // grepping.
32*6777b538SAndroid Build Coastguard Worker stream() << ": " << zx_status_get_string(zx_status_) << " (" << zx_status_
33*6777b538SAndroid Build Coastguard Worker << ")";
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker
~ZxLogMessageFatal()36*6777b538SAndroid Build Coastguard Worker ZxLogMessageFatal::~ZxLogMessageFatal() {
37*6777b538SAndroid Build Coastguard Worker AppendError();
38*6777b538SAndroid Build Coastguard Worker Flush();
39*6777b538SAndroid Build Coastguard Worker base::ImmediateCrash();
40*6777b538SAndroid Build Coastguard Worker }
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker } // namespace logging
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker namespace base {
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker namespace internal {
47*6777b538SAndroid Build Coastguard Worker
FidlConnectionErrorMessage(std::string_view protocol_name,std::string_view status_string)48*6777b538SAndroid Build Coastguard Worker std::string FidlConnectionErrorMessage(std::string_view protocol_name,
49*6777b538SAndroid Build Coastguard Worker std::string_view status_string) {
50*6777b538SAndroid Build Coastguard Worker return base::StringPrintf("Failed to connect to %s: %s", protocol_name.data(),
51*6777b538SAndroid Build Coastguard Worker status_string.data());
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker
FidlMethodResultErrorMessage(std::string_view formatted_error,std::string_view method_name)54*6777b538SAndroid Build Coastguard Worker std::string FidlMethodResultErrorMessage(std::string_view formatted_error,
55*6777b538SAndroid Build Coastguard Worker std::string_view method_name) {
56*6777b538SAndroid Build Coastguard Worker return base::StringPrintf("Error calling %s: %s", method_name.data(),
57*6777b538SAndroid Build Coastguard Worker formatted_error.data());
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker
60*6777b538SAndroid Build Coastguard Worker } // namespace internal
61*6777b538SAndroid Build Coastguard Worker
LogFidlErrorAndExitProcess(const Location & from_here,std::string_view protocol_name)62*6777b538SAndroid Build Coastguard Worker fit::function<void(zx_status_t)> LogFidlErrorAndExitProcess(
63*6777b538SAndroid Build Coastguard Worker const Location& from_here,
64*6777b538SAndroid Build Coastguard Worker std::string_view protocol_name) {
65*6777b538SAndroid Build Coastguard Worker return [from_here, protocol_name](zx_status_t status) {
66*6777b538SAndroid Build Coastguard Worker {
67*6777b538SAndroid Build Coastguard Worker logging::ZxLogMessage(from_here.file_name(), from_here.line_number(),
68*6777b538SAndroid Build Coastguard Worker logging::LOGGING_ERROR, status)
69*6777b538SAndroid Build Coastguard Worker .stream()
70*6777b538SAndroid Build Coastguard Worker << protocol_name << " disconnected unexpectedly, exiting";
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker base::Process::TerminateCurrentProcessImmediately(1);
73*6777b538SAndroid Build Coastguard Worker };
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker
FidlMethodResultErrorMessage(const fit::result<fidl::OneWayError> & result,std::string_view method_name)76*6777b538SAndroid Build Coastguard Worker std::string FidlMethodResultErrorMessage(
77*6777b538SAndroid Build Coastguard Worker const fit::result<fidl::OneWayError>& result,
78*6777b538SAndroid Build Coastguard Worker std::string_view method_name) {
79*6777b538SAndroid Build Coastguard Worker CHECK(result.is_error());
80*6777b538SAndroid Build Coastguard Worker return internal::FidlMethodResultErrorMessage(
81*6777b538SAndroid Build Coastguard Worker result.error_value().FormatDescription(), method_name);
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker
FidlBindingClosureWarningLogger(std::string_view protocol_name)84*6777b538SAndroid Build Coastguard Worker fit::function<void(fidl::UnbindInfo)> FidlBindingClosureWarningLogger(
85*6777b538SAndroid Build Coastguard Worker std::string_view protocol_name) {
86*6777b538SAndroid Build Coastguard Worker return [protocol_name](fidl::UnbindInfo info) {
87*6777b538SAndroid Build Coastguard Worker ZX_LOG(WARNING, info.status()) << protocol_name << " unbound";
88*6777b538SAndroid Build Coastguard Worker };
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker } // namespace base
92