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 #ifndef BASE_FUCHSIA_FUCHSIA_LOGGING_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_FUCHSIA_FUCHSIA_LOGGING_H_
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #include <lib/fidl/cpp/wire/connect_service.h>
9*6777b538SAndroid Build Coastguard Worker #include <lib/fidl/cpp/wire/traits.h>
10*6777b538SAndroid Build Coastguard Worker #include <lib/fit/function.h>
11*6777b538SAndroid Build Coastguard Worker #include <lib/zx/result.h>
12*6777b538SAndroid Build Coastguard Worker #include <zircon/types.h>
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker #include <string>
15*6777b538SAndroid Build Coastguard Worker #include <string_view>
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker // Use the ZX_LOG family of macros along with a zx_status_t containing a Zircon
22*6777b538SAndroid Build Coastguard Worker // error. The error value will be decoded so that logged messages explain the
23*6777b538SAndroid Build Coastguard Worker // error.
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker namespace logging {
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ZxLogMessage : public logging::LogMessage {
28*6777b538SAndroid Build Coastguard Worker public:
29*6777b538SAndroid Build Coastguard Worker ZxLogMessage(const char* file_path,
30*6777b538SAndroid Build Coastguard Worker int line,
31*6777b538SAndroid Build Coastguard Worker LogSeverity severity,
32*6777b538SAndroid Build Coastguard Worker zx_status_t zx_status);
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker ZxLogMessage(const ZxLogMessage&) = delete;
35*6777b538SAndroid Build Coastguard Worker ZxLogMessage& operator=(const ZxLogMessage&) = delete;
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker ~ZxLogMessage() override;
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker protected:
40*6777b538SAndroid Build Coastguard Worker void AppendError();
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker private:
43*6777b538SAndroid Build Coastguard Worker zx_status_t zx_status_;
44*6777b538SAndroid Build Coastguard Worker };
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ZxLogMessageFatal final : public ZxLogMessage {
47*6777b538SAndroid Build Coastguard Worker public:
48*6777b538SAndroid Build Coastguard Worker using ZxLogMessage::ZxLogMessage;
49*6777b538SAndroid Build Coastguard Worker [[noreturn]] ~ZxLogMessageFatal() override;
50*6777b538SAndroid Build Coastguard Worker };
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker } // namespace logging
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker #define ZX_LOG_STREAM(severity, zx_status) \
55*6777b538SAndroid Build Coastguard Worker COMPACT_GOOGLE_LOG_EX_##severity(ZxLogMessage, zx_status).stream()
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker #define ZX_LOG(severity, zx_status) \
58*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(ZX_LOG_STREAM(severity, zx_status), LOG_IS_ON(severity))
59*6777b538SAndroid Build Coastguard Worker #define ZX_LOG_IF(severity, condition, zx_status) \
60*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(ZX_LOG_STREAM(severity, zx_status), \
61*6777b538SAndroid Build Coastguard Worker LOG_IS_ON(severity) && (condition))
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker #define ZX_CHECK(condition, zx_status) \
64*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(ZX_LOG_STREAM(FATAL, zx_status), !(condition)) \
65*6777b538SAndroid Build Coastguard Worker << "Check failed: " #condition << ". "
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker #define ZX_DLOG(severity, zx_status) \
68*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(ZX_LOG_STREAM(severity, zx_status), DLOG_IS_ON(severity))
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
71*6777b538SAndroid Build Coastguard Worker #define ZX_DLOG_IF(severity, condition, zx_status) \
72*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(ZX_LOG_STREAM(severity, zx_status), \
73*6777b538SAndroid Build Coastguard Worker DLOG_IS_ON(severity) && (condition))
74*6777b538SAndroid Build Coastguard Worker #else // DCHECK_IS_ON()
75*6777b538SAndroid Build Coastguard Worker #define ZX_DLOG_IF(severity, condition, zx_status) EAT_STREAM_PARAMETERS
76*6777b538SAndroid Build Coastguard Worker #endif // DCHECK_IS_ON()
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker #define ZX_DCHECK(condition, zx_status) \
79*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(ZX_LOG_STREAM(DFATAL, zx_status), \
80*6777b538SAndroid Build Coastguard Worker DCHECK_IS_ON() && !(condition)) \
81*6777b538SAndroid Build Coastguard Worker << "Check failed: " #condition << ". "
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker namespace base {
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker namespace internal {
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string FidlMethodResultErrorMessage(
88*6777b538SAndroid Build Coastguard Worker std::string_view formatted_error,
89*6777b538SAndroid Build Coastguard Worker std::string_view method_name);
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string FidlConnectionErrorMessage(
92*6777b538SAndroid Build Coastguard Worker std::string_view protocol_name,
93*6777b538SAndroid Build Coastguard Worker std::string_view status_string);
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker } // namespace internal
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker class Location;
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker // Returns a function suitable for use as error-handler for a FIDL binding or
100*6777b538SAndroid Build Coastguard Worker // helper (e.g. ScenicSession) required by the process to function. Typically
101*6777b538SAndroid Build Coastguard Worker // it is unhelpful to simply crash on such failures, so the returned handler
102*6777b538SAndroid Build Coastguard Worker // will instead log an ERROR and exit the process.
103*6777b538SAndroid Build Coastguard Worker // The Location and protocol name string must be kept valid by the caller, for
104*6777b538SAndroid Build Coastguard Worker // as long as the returned fit::function<> remains live.
105*6777b538SAndroid Build Coastguard Worker BASE_EXPORT fit::function<void(zx_status_t)> LogFidlErrorAndExitProcess(
106*6777b538SAndroid Build Coastguard Worker const Location& from_here,
107*6777b538SAndroid Build Coastguard Worker std::string_view protocol_name);
108*6777b538SAndroid Build Coastguard Worker
109*6777b538SAndroid Build Coastguard Worker template <typename Protocol>
FidlConnectionErrorMessage(const zx::result<fidl::ClientEnd<Protocol>> & result)110*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string FidlConnectionErrorMessage(
111*6777b538SAndroid Build Coastguard Worker const zx::result<fidl::ClientEnd<Protocol>>& result) {
112*6777b538SAndroid Build Coastguard Worker CHECK(result.is_error());
113*6777b538SAndroid Build Coastguard Worker return internal::FidlConnectionErrorMessage(
114*6777b538SAndroid Build Coastguard Worker fidl::DiscoverableProtocolName<Protocol>, result.status_string());
115*6777b538SAndroid Build Coastguard Worker }
116*6777b538SAndroid Build Coastguard Worker
117*6777b538SAndroid Build Coastguard Worker template <typename FidlMethod>
FidlMethodResultErrorMessage(const fidl::Result<FidlMethod> & result,std::string_view method_name)118*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string FidlMethodResultErrorMessage(
119*6777b538SAndroid Build Coastguard Worker const fidl::Result<FidlMethod>& result,
120*6777b538SAndroid Build Coastguard Worker std::string_view method_name) {
121*6777b538SAndroid Build Coastguard Worker CHECK(result.is_error());
122*6777b538SAndroid Build Coastguard Worker return internal::FidlMethodResultErrorMessage(
123*6777b538SAndroid Build Coastguard Worker result.error_value().FormatDescription(), method_name);
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker
126*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string FidlMethodResultErrorMessage(
127*6777b538SAndroid Build Coastguard Worker const fit::result<fidl::OneWayError>& result,
128*6777b538SAndroid Build Coastguard Worker std::string_view method_name);
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker BASE_EXPORT fit::function<void(fidl::UnbindInfo)>
131*6777b538SAndroid Build Coastguard Worker FidlBindingClosureWarningLogger(std::string_view protocol_name);
132*6777b538SAndroid Build Coastguard Worker
133*6777b538SAndroid Build Coastguard Worker template <typename Protocol>
134*6777b538SAndroid Build Coastguard Worker BASE_EXPORT fit::function<void(fidl::UnbindInfo)>
FidlBindingClosureWarningLogger()135*6777b538SAndroid Build Coastguard Worker FidlBindingClosureWarningLogger() {
136*6777b538SAndroid Build Coastguard Worker return FidlBindingClosureWarningLogger(
137*6777b538SAndroid Build Coastguard Worker fidl::DiscoverableProtocolName<Protocol>);
138*6777b538SAndroid Build Coastguard Worker }
139*6777b538SAndroid Build Coastguard Worker
140*6777b538SAndroid Build Coastguard Worker } // namespace base
141*6777b538SAndroid Build Coastguard Worker
142*6777b538SAndroid Build Coastguard Worker #endif // BASE_FUCHSIA_FUCHSIA_LOGGING_H_
143