xref: /aosp_15_r20/external/cronet/base/fuchsia/fuchsia_logging_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 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 <fidl/base.testfidl/cpp/fidl.h>
8*6777b538SAndroid Build Coastguard Worker #include <fidl/fuchsia.logger/cpp/fidl.h>
9*6777b538SAndroid Build Coastguard Worker #include <lib/async/default.h>
10*6777b538SAndroid Build Coastguard Worker #include <lib/fidl/cpp/binding.h>
11*6777b538SAndroid Build Coastguard Worker #include <lib/sys/cpp/component_context.h>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include <string_view>
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/fuchsia_component_connect.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/scoped_fx_logger.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/test_component_context_for_process.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/test_log_listener_safe.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_logging_settings.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/test/task_environment.h"
22*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
23*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker namespace base {
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker namespace {
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker class MockLogSource {
30*6777b538SAndroid Build Coastguard Worker  public:
31*6777b538SAndroid Build Coastguard Worker   MOCK_METHOD0(Log, const char*());
32*6777b538SAndroid Build Coastguard Worker };
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker }  // namespace
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker // Verifies that calling the log macro goes to the Fuchsia system logs, by
37*6777b538SAndroid Build Coastguard Worker // default.
TEST(FuchsiaLoggingTest,SystemLogging)38*6777b538SAndroid Build Coastguard Worker TEST(FuchsiaLoggingTest, SystemLogging) {
39*6777b538SAndroid Build Coastguard Worker   constexpr char kLogMessage[] = "This is FuchsiaLoggingTest.SystemLogging!";
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker   test::SingleThreadTaskEnvironment task_environment_{
42*6777b538SAndroid Build Coastguard Worker       test::SingleThreadTaskEnvironment::MainThreadType::IO};
43*6777b538SAndroid Build Coastguard Worker   SimpleTestLogListener listener;
44*6777b538SAndroid Build Coastguard Worker   ListenFilteredByCurrentProcessId(listener);
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker   // Ensure that logging is directed to the system debug log.
47*6777b538SAndroid Build Coastguard Worker   logging::ScopedLoggingSettings scoped_logging_settings;
48*6777b538SAndroid Build Coastguard Worker   CHECK(logging::InitLogging({.logging_dest = logging::LOG_DEFAULT}));
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   // Emit the test log message, and spin the loop until it is reported to the
51*6777b538SAndroid Build Coastguard Worker   // test listener.
52*6777b538SAndroid Build Coastguard Worker   LOG(ERROR) << kLogMessage;
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   std::optional<fuchsia_logger::LogMessage> logged_message =
55*6777b538SAndroid Build Coastguard Worker       listener.RunUntilMessageReceived(kLogMessage);
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(logged_message.has_value());
58*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(logged_message->severity(),
59*6777b538SAndroid Build Coastguard Worker             static_cast<int32_t>(fuchsia_logger::LogLevelFilter::kError));
60*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(logged_message->tags().size(), 1u);
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(logged_message->tags()[0], "base_unittests__exec");
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker // Verifies that configuring a system logger with multiple tags works.
TEST(FuchsiaLoggingTest,SystemLoggingMultipleTags)66*6777b538SAndroid Build Coastguard Worker TEST(FuchsiaLoggingTest, SystemLoggingMultipleTags) {
67*6777b538SAndroid Build Coastguard Worker   constexpr char kLogMessage[] =
68*6777b538SAndroid Build Coastguard Worker       "This is FuchsiaLoggingTest.SystemLoggingMultipleTags!";
69*6777b538SAndroid Build Coastguard Worker   const std::vector<std::string_view> kTags = {"tag1", "tag2"};
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   test::SingleThreadTaskEnvironment task_environment_{
72*6777b538SAndroid Build Coastguard Worker       test::SingleThreadTaskEnvironment::MainThreadType::IO};
73*6777b538SAndroid Build Coastguard Worker   SimpleTestLogListener listener;
74*6777b538SAndroid Build Coastguard Worker   ListenFilteredByCurrentProcessId(listener);
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   // Connect the test LogListenerSafe to the Log.
77*6777b538SAndroid Build Coastguard Worker   auto log_sink_client_end =
78*6777b538SAndroid Build Coastguard Worker       fuchsia_component::Connect<fuchsia_logger::LogSink>();
79*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(log_sink_client_end.is_ok())
80*6777b538SAndroid Build Coastguard Worker       << FidlConnectionErrorMessage(log_sink_client_end);
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   // Create a logger with multiple tags and emit a message to it.
83*6777b538SAndroid Build Coastguard Worker   ScopedFxLogger logger = ScopedFxLogger::CreateFromLogSink(
84*6777b538SAndroid Build Coastguard Worker       std::move(log_sink_client_end.value()), kTags);
85*6777b538SAndroid Build Coastguard Worker   logger.LogMessage("", 0, kLogMessage, FUCHSIA_LOG_ERROR);
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker   std::optional<fuchsia_logger::LogMessage> logged_message =
88*6777b538SAndroid Build Coastguard Worker       listener.RunUntilMessageReceived(kLogMessage);
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(logged_message.has_value());
91*6777b538SAndroid Build Coastguard Worker   auto tags = std::vector<std::string_view>(logged_message->tags().begin(),
92*6777b538SAndroid Build Coastguard Worker                                             logged_message->tags().end());
93*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(tags, kTags);
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker // Verifies the Fuchsia-specific ZX_*() logging macros.
TEST(FuchsiaLoggingTest,FuchsiaLogging)97*6777b538SAndroid Build Coastguard Worker TEST(FuchsiaLoggingTest, FuchsiaLogging) {
98*6777b538SAndroid Build Coastguard Worker   MockLogSource mock_log_source;
99*6777b538SAndroid Build Coastguard Worker   EXPECT_CALL(mock_log_source, Log())
100*6777b538SAndroid Build Coastguard Worker       .Times(DCHECK_IS_ON() ? 2 : 1)
101*6777b538SAndroid Build Coastguard Worker       .WillRepeatedly(testing::Return("log message"));
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker   logging::ScopedLoggingSettings scoped_logging_settings;
104*6777b538SAndroid Build Coastguard Worker   logging::SetMinLogLevel(logging::LOGGING_INFO);
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(LOG_IS_ON(INFO));
107*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(DCHECK_IS_ON(), DLOG_IS_ON(INFO));
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker   ZX_LOG(INFO, ZX_ERR_INTERNAL) << mock_log_source.Log();
110*6777b538SAndroid Build Coastguard Worker   ZX_DLOG(INFO, ZX_ERR_INTERNAL) << mock_log_source.Log();
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker   ZX_CHECK(true, ZX_ERR_INTERNAL);
113*6777b538SAndroid Build Coastguard Worker   ZX_DCHECK(true, ZX_ERR_INTERNAL);
114*6777b538SAndroid Build Coastguard Worker }
115*6777b538SAndroid Build Coastguard Worker 
TEST(FuchsiaLoggingTest,ConnectionErrorMessage)116*6777b538SAndroid Build Coastguard Worker TEST(FuchsiaLoggingTest, ConnectionErrorMessage) {
117*6777b538SAndroid Build Coastguard Worker   zx::result<fidl::ClientEnd<base_testfidl::TestInterface>> result =
118*6777b538SAndroid Build Coastguard Worker       zx::error_result{ZX_ERR_PEER_CLOSED};
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
121*6777b538SAndroid Build Coastguard Worker       "Failed to connect to base.testfidl.TestInterface: "
122*6777b538SAndroid Build Coastguard Worker       "ZX_ERR_PEER_CLOSED",
123*6777b538SAndroid Build Coastguard Worker       base::FidlConnectionErrorMessage(result));
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker 
TEST(FuchsiaLoggingTest,FidlMethodErrorMessage_TwoWay)126*6777b538SAndroid Build Coastguard Worker TEST(FuchsiaLoggingTest, FidlMethodErrorMessage_TwoWay) {
127*6777b538SAndroid Build Coastguard Worker   fidl::Result<base_testfidl::TestInterface::Add> result =
128*6777b538SAndroid Build Coastguard Worker       fit::error(fidl::Status::Unbound());
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
131*6777b538SAndroid Build Coastguard Worker       "Error calling Add: FIDL operation failed due to user initiated unbind, "
132*6777b538SAndroid Build Coastguard Worker       "status: ZX_ERR_CANCELED (-23), detail: unbound endpoint",
133*6777b538SAndroid Build Coastguard Worker       base::FidlMethodResultErrorMessage(result, "Add"));
134*6777b538SAndroid Build Coastguard Worker }
135*6777b538SAndroid Build Coastguard Worker 
TEST(FuchsiaLoggingTest,FidlMethodErrorMessage_OneWay)136*6777b538SAndroid Build Coastguard Worker TEST(FuchsiaLoggingTest, FidlMethodErrorMessage_OneWay) {
137*6777b538SAndroid Build Coastguard Worker   fit::result<fidl::OneWayError> result = fit::error(fidl::Status::Unbound());
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
140*6777b538SAndroid Build Coastguard Worker       "Error calling Add: FIDL operation failed due to user initiated unbind, "
141*6777b538SAndroid Build Coastguard Worker       "status: ZX_ERR_CANCELED (-23), detail: unbound endpoint",
142*6777b538SAndroid Build Coastguard Worker       base::FidlMethodResultErrorMessage(result, "Add"));
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker 
TEST(FuchsiaLoggingTest,FidlBindingClosureWarningLogger)145*6777b538SAndroid Build Coastguard Worker TEST(FuchsiaLoggingTest, FidlBindingClosureWarningLogger) {
146*6777b538SAndroid Build Coastguard Worker   test::SingleThreadTaskEnvironment task_environment{
147*6777b538SAndroid Build Coastguard Worker       test::SingleThreadTaskEnvironment::MainThreadType::IO};
148*6777b538SAndroid Build Coastguard Worker   SimpleTestLogListener listener;
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker   // Ensure that logging is directed to the system debug log.
151*6777b538SAndroid Build Coastguard Worker   logging::ScopedLoggingSettings scoped_logging_settings;
152*6777b538SAndroid Build Coastguard Worker   TestComponentContextForProcess test_context;
153*6777b538SAndroid Build Coastguard Worker   test_context.AddService(fidl::DiscoverableProtocolName<fuchsia_logger::Log>);
154*6777b538SAndroid Build Coastguard Worker   ListenFilteredByCurrentProcessId(listener);
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   // Initialize logging in the `scoped_logging_settings_`.
157*6777b538SAndroid Build Coastguard Worker   CHECK(logging::InitLogging({.logging_dest = logging::LOG_DEFAULT}));
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker   base::FidlBindingClosureWarningLogger<base_testfidl::TestInterface>()(
160*6777b538SAndroid Build Coastguard Worker       fidl::UnbindInfo::PeerClosed(ZX_ERR_PEER_CLOSED));
161*6777b538SAndroid Build Coastguard Worker 
162*6777b538SAndroid Build Coastguard Worker   std::optional<fuchsia_logger::LogMessage> logged_message =
163*6777b538SAndroid Build Coastguard Worker       listener.RunUntilMessageReceived(
164*6777b538SAndroid Build Coastguard Worker           "base.testfidl.TestInterface unbound: ZX_ERR_PEER_CLOSED (-24)");
165*6777b538SAndroid Build Coastguard Worker 
166*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(logged_message.has_value());
167*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(logged_message->severity(),
168*6777b538SAndroid Build Coastguard Worker             static_cast<int32_t>(fuchsia_logger::LogLevelFilter::kWarn));
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker }  // namespace base
172