1*9356374aSAndroid Build Coastguard Worker //
2*9356374aSAndroid Build Coastguard Worker // Copyright 2022 The Abseil Authors.
3*9356374aSAndroid Build Coastguard Worker //
4*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*9356374aSAndroid Build Coastguard Worker //
8*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
9*9356374aSAndroid Build Coastguard Worker //
10*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*9356374aSAndroid Build Coastguard Worker // limitations under the License.
15*9356374aSAndroid Build Coastguard Worker
16*9356374aSAndroid Build Coastguard Worker #include "absl/log/log_sink.h"
17*9356374aSAndroid Build Coastguard Worker
18*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
19*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
20*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
21*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/test_actions.h"
22*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/test_helpers.h"
23*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/test_matchers.h"
24*9356374aSAndroid Build Coastguard Worker #include "absl/log/log.h"
25*9356374aSAndroid Build Coastguard Worker #include "absl/log/log_sink_registry.h"
26*9356374aSAndroid Build Coastguard Worker #include "absl/log/scoped_mock_log.h"
27*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
28*9356374aSAndroid Build Coastguard Worker
29*9356374aSAndroid Build Coastguard Worker namespace {
30*9356374aSAndroid Build Coastguard Worker
31*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::DeathTestExpectedLogging;
32*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::DeathTestUnexpectedLogging;
33*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::DeathTestValidateExpectations;
34*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::DiedOfFatal;
35*9356374aSAndroid Build Coastguard Worker using ::testing::_;
36*9356374aSAndroid Build Coastguard Worker using ::testing::AnyNumber;
37*9356374aSAndroid Build Coastguard Worker using ::testing::HasSubstr;
38*9356374aSAndroid Build Coastguard Worker using ::testing::InSequence;
39*9356374aSAndroid Build Coastguard Worker
40*9356374aSAndroid Build Coastguard Worker auto* test_env ABSL_ATTRIBUTE_UNUSED = ::testing::AddGlobalTestEnvironment(
41*9356374aSAndroid Build Coastguard Worker new absl::log_internal::LogTestEnvironment);
42*9356374aSAndroid Build Coastguard Worker
43*9356374aSAndroid Build Coastguard Worker // Tests for global log sink registration.
44*9356374aSAndroid Build Coastguard Worker // ---------------------------------------
45*9356374aSAndroid Build Coastguard Worker
TEST(LogSinkRegistryTest,AddLogSink)46*9356374aSAndroid Build Coastguard Worker TEST(LogSinkRegistryTest, AddLogSink) {
47*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
48*9356374aSAndroid Build Coastguard Worker
49*9356374aSAndroid Build Coastguard Worker InSequence s;
50*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(_, _, "hello world")).Times(0);
51*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(absl::LogSeverity::kInfo, __FILE__, "Test : 42"));
52*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
53*9356374aSAndroid Build Coastguard Worker Log(absl::LogSeverity::kWarning, __FILE__, "Danger ahead"));
54*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
55*9356374aSAndroid Build Coastguard Worker Log(absl::LogSeverity::kError, __FILE__, "This is an error"));
56*9356374aSAndroid Build Coastguard Worker
57*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "hello world";
58*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
59*9356374aSAndroid Build Coastguard Worker
60*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "Test : " << 42;
61*9356374aSAndroid Build Coastguard Worker LOG(WARNING) << "Danger" << ' ' << "ahead";
62*9356374aSAndroid Build Coastguard Worker LOG(ERROR) << "This is an error";
63*9356374aSAndroid Build Coastguard Worker
64*9356374aSAndroid Build Coastguard Worker test_sink.StopCapturingLogs();
65*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "Goodby world";
66*9356374aSAndroid Build Coastguard Worker }
67*9356374aSAndroid Build Coastguard Worker
TEST(LogSinkRegistryTest,MultipleLogSinks)68*9356374aSAndroid Build Coastguard Worker TEST(LogSinkRegistryTest, MultipleLogSinks) {
69*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink1(absl::MockLogDefault::kDisallowUnexpected);
70*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink2(absl::MockLogDefault::kDisallowUnexpected);
71*9356374aSAndroid Build Coastguard Worker
72*9356374aSAndroid Build Coastguard Worker ::testing::InSequence seq;
73*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink1, Log(absl::LogSeverity::kInfo, _, "First")).Times(1);
74*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink2, Log(absl::LogSeverity::kInfo, _, "First")).Times(0);
75*9356374aSAndroid Build Coastguard Worker
76*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink1, Log(absl::LogSeverity::kInfo, _, "Second")).Times(1);
77*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink2, Log(absl::LogSeverity::kInfo, _, "Second")).Times(1);
78*9356374aSAndroid Build Coastguard Worker
79*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink1, Log(absl::LogSeverity::kInfo, _, "Third")).Times(0);
80*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink2, Log(absl::LogSeverity::kInfo, _, "Third")).Times(1);
81*9356374aSAndroid Build Coastguard Worker
82*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "Before first";
83*9356374aSAndroid Build Coastguard Worker
84*9356374aSAndroid Build Coastguard Worker test_sink1.StartCapturingLogs();
85*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "First";
86*9356374aSAndroid Build Coastguard Worker
87*9356374aSAndroid Build Coastguard Worker test_sink2.StartCapturingLogs();
88*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "Second";
89*9356374aSAndroid Build Coastguard Worker
90*9356374aSAndroid Build Coastguard Worker test_sink1.StopCapturingLogs();
91*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "Third";
92*9356374aSAndroid Build Coastguard Worker
93*9356374aSAndroid Build Coastguard Worker test_sink2.StopCapturingLogs();
94*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "Fourth";
95*9356374aSAndroid Build Coastguard Worker }
96*9356374aSAndroid Build Coastguard Worker
TEST(LogSinkRegistrationDeathTest,DuplicateSinkRegistration)97*9356374aSAndroid Build Coastguard Worker TEST(LogSinkRegistrationDeathTest, DuplicateSinkRegistration) {
98*9356374aSAndroid Build Coastguard Worker ASSERT_DEATH_IF_SUPPORTED(
99*9356374aSAndroid Build Coastguard Worker {
100*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog sink;
101*9356374aSAndroid Build Coastguard Worker sink.StartCapturingLogs();
102*9356374aSAndroid Build Coastguard Worker absl::AddLogSink(&sink.UseAsLocalSink());
103*9356374aSAndroid Build Coastguard Worker },
104*9356374aSAndroid Build Coastguard Worker HasSubstr("Duplicate log sinks"));
105*9356374aSAndroid Build Coastguard Worker }
106*9356374aSAndroid Build Coastguard Worker
TEST(LogSinkRegistrationDeathTest,MismatchSinkRemoval)107*9356374aSAndroid Build Coastguard Worker TEST(LogSinkRegistrationDeathTest, MismatchSinkRemoval) {
108*9356374aSAndroid Build Coastguard Worker ASSERT_DEATH_IF_SUPPORTED(
109*9356374aSAndroid Build Coastguard Worker {
110*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog sink;
111*9356374aSAndroid Build Coastguard Worker absl::RemoveLogSink(&sink.UseAsLocalSink());
112*9356374aSAndroid Build Coastguard Worker },
113*9356374aSAndroid Build Coastguard Worker HasSubstr("Mismatched log sink"));
114*9356374aSAndroid Build Coastguard Worker }
115*9356374aSAndroid Build Coastguard Worker
116*9356374aSAndroid Build Coastguard Worker // Tests for log sink semantic.
117*9356374aSAndroid Build Coastguard Worker // ---------------------------------------
118*9356374aSAndroid Build Coastguard Worker
TEST(LogSinkTest,FlushSinks)119*9356374aSAndroid Build Coastguard Worker TEST(LogSinkTest, FlushSinks) {
120*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
121*9356374aSAndroid Build Coastguard Worker
122*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Flush()).Times(2);
123*9356374aSAndroid Build Coastguard Worker
124*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
125*9356374aSAndroid Build Coastguard Worker
126*9356374aSAndroid Build Coastguard Worker absl::FlushLogSinks();
127*9356374aSAndroid Build Coastguard Worker absl::FlushLogSinks();
128*9356374aSAndroid Build Coastguard Worker }
129*9356374aSAndroid Build Coastguard Worker
TEST(LogSinkDeathTest,DeathInSend)130*9356374aSAndroid Build Coastguard Worker TEST(LogSinkDeathTest, DeathInSend) {
131*9356374aSAndroid Build Coastguard Worker class FatalSendSink : public absl::LogSink {
132*9356374aSAndroid Build Coastguard Worker public:
133*9356374aSAndroid Build Coastguard Worker void Send(const absl::LogEntry&) override { LOG(FATAL) << "goodbye world"; }
134*9356374aSAndroid Build Coastguard Worker };
135*9356374aSAndroid Build Coastguard Worker
136*9356374aSAndroid Build Coastguard Worker FatalSendSink sink;
137*9356374aSAndroid Build Coastguard Worker EXPECT_EXIT({ LOG(INFO).ToSinkAlso(&sink) << "hello world"; }, DiedOfFatal,
138*9356374aSAndroid Build Coastguard Worker _);
139*9356374aSAndroid Build Coastguard Worker }
140*9356374aSAndroid Build Coastguard Worker
141*9356374aSAndroid Build Coastguard Worker // Tests for explicit log sink redirection.
142*9356374aSAndroid Build Coastguard Worker // ---------------------------------------
143*9356374aSAndroid Build Coastguard Worker
TEST(LogSinkTest,ToSinkAlso)144*9356374aSAndroid Build Coastguard Worker TEST(LogSinkTest, ToSinkAlso) {
145*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
146*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog another_sink(absl::MockLogDefault::kDisallowUnexpected);
147*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(_, _, "hello world"));
148*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(another_sink, Log(_, _, "hello world"));
149*9356374aSAndroid Build Coastguard Worker
150*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
151*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkAlso(&another_sink.UseAsLocalSink()) << "hello world";
152*9356374aSAndroid Build Coastguard Worker }
153*9356374aSAndroid Build Coastguard Worker
TEST(LogSinkTest,ToSinkOnly)154*9356374aSAndroid Build Coastguard Worker TEST(LogSinkTest, ToSinkOnly) {
155*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog another_sink(absl::MockLogDefault::kDisallowUnexpected);
156*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(another_sink, Log(_, _, "hello world"));
157*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkOnly(&another_sink.UseAsLocalSink()) << "hello world";
158*9356374aSAndroid Build Coastguard Worker }
159*9356374aSAndroid Build Coastguard Worker
TEST(LogSinkTest,ToManySinks)160*9356374aSAndroid Build Coastguard Worker TEST(LogSinkTest, ToManySinks) {
161*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog sink1(absl::MockLogDefault::kDisallowUnexpected);
162*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog sink2(absl::MockLogDefault::kDisallowUnexpected);
163*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog sink3(absl::MockLogDefault::kDisallowUnexpected);
164*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog sink4(absl::MockLogDefault::kDisallowUnexpected);
165*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog sink5(absl::MockLogDefault::kDisallowUnexpected);
166*9356374aSAndroid Build Coastguard Worker
167*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(sink3, Log(_, _, "hello world"));
168*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(sink4, Log(_, _, "hello world"));
169*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(sink5, Log(_, _, "hello world"));
170*9356374aSAndroid Build Coastguard Worker
171*9356374aSAndroid Build Coastguard Worker LOG(INFO)
172*9356374aSAndroid Build Coastguard Worker .ToSinkAlso(&sink1.UseAsLocalSink())
173*9356374aSAndroid Build Coastguard Worker .ToSinkAlso(&sink2.UseAsLocalSink())
174*9356374aSAndroid Build Coastguard Worker .ToSinkOnly(&sink3.UseAsLocalSink())
175*9356374aSAndroid Build Coastguard Worker .ToSinkAlso(&sink4.UseAsLocalSink())
176*9356374aSAndroid Build Coastguard Worker .ToSinkAlso(&sink5.UseAsLocalSink())
177*9356374aSAndroid Build Coastguard Worker << "hello world";
178*9356374aSAndroid Build Coastguard Worker }
179*9356374aSAndroid Build Coastguard Worker
180*9356374aSAndroid Build Coastguard Worker class ReentrancyTest : public ::testing::Test {
181*9356374aSAndroid Build Coastguard Worker protected:
182*9356374aSAndroid Build Coastguard Worker ReentrancyTest() = default;
183*9356374aSAndroid Build Coastguard Worker enum class LogMode : int { kNormal, kToSinkAlso, kToSinkOnly };
184*9356374aSAndroid Build Coastguard Worker
185*9356374aSAndroid Build Coastguard Worker class ReentrantSendLogSink : public absl::LogSink {
186*9356374aSAndroid Build Coastguard Worker public:
ReentrantSendLogSink(absl::LogSeverity severity,absl::LogSink * sink,LogMode mode)187*9356374aSAndroid Build Coastguard Worker explicit ReentrantSendLogSink(absl::LogSeverity severity,
188*9356374aSAndroid Build Coastguard Worker absl::LogSink* sink, LogMode mode)
189*9356374aSAndroid Build Coastguard Worker : severity_(severity), sink_(sink), mode_(mode) {}
ReentrantSendLogSink(absl::LogSeverity severity)190*9356374aSAndroid Build Coastguard Worker explicit ReentrantSendLogSink(absl::LogSeverity severity)
191*9356374aSAndroid Build Coastguard Worker : ReentrantSendLogSink(severity, nullptr, LogMode::kNormal) {}
192*9356374aSAndroid Build Coastguard Worker
Send(const absl::LogEntry &)193*9356374aSAndroid Build Coastguard Worker void Send(const absl::LogEntry&) override {
194*9356374aSAndroid Build Coastguard Worker switch (mode_) {
195*9356374aSAndroid Build Coastguard Worker case LogMode::kNormal:
196*9356374aSAndroid Build Coastguard Worker LOG(LEVEL(severity_)) << "The log is coming from *inside the sink*.";
197*9356374aSAndroid Build Coastguard Worker break;
198*9356374aSAndroid Build Coastguard Worker case LogMode::kToSinkAlso:
199*9356374aSAndroid Build Coastguard Worker LOG(LEVEL(severity_)).ToSinkAlso(sink_)
200*9356374aSAndroid Build Coastguard Worker << "The log is coming from *inside the sink*.";
201*9356374aSAndroid Build Coastguard Worker break;
202*9356374aSAndroid Build Coastguard Worker case LogMode::kToSinkOnly:
203*9356374aSAndroid Build Coastguard Worker LOG(LEVEL(severity_)).ToSinkOnly(sink_)
204*9356374aSAndroid Build Coastguard Worker << "The log is coming from *inside the sink*.";
205*9356374aSAndroid Build Coastguard Worker break;
206*9356374aSAndroid Build Coastguard Worker default:
207*9356374aSAndroid Build Coastguard Worker LOG(FATAL) << "Invalid mode " << static_cast<int>(mode_);
208*9356374aSAndroid Build Coastguard Worker }
209*9356374aSAndroid Build Coastguard Worker }
210*9356374aSAndroid Build Coastguard Worker
211*9356374aSAndroid Build Coastguard Worker private:
212*9356374aSAndroid Build Coastguard Worker absl::LogSeverity severity_;
213*9356374aSAndroid Build Coastguard Worker absl::LogSink* sink_;
214*9356374aSAndroid Build Coastguard Worker LogMode mode_;
215*9356374aSAndroid Build Coastguard Worker };
216*9356374aSAndroid Build Coastguard Worker
LogAndReturn(absl::LogSeverity severity,absl::string_view to_log,absl::string_view to_return)217*9356374aSAndroid Build Coastguard Worker static absl::string_view LogAndReturn(absl::LogSeverity severity,
218*9356374aSAndroid Build Coastguard Worker absl::string_view to_log,
219*9356374aSAndroid Build Coastguard Worker absl::string_view to_return) {
220*9356374aSAndroid Build Coastguard Worker LOG(LEVEL(severity)) << to_log;
221*9356374aSAndroid Build Coastguard Worker return to_return;
222*9356374aSAndroid Build Coastguard Worker }
223*9356374aSAndroid Build Coastguard Worker };
224*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyTest,LogFunctionThatLogs)225*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyTest, LogFunctionThatLogs) {
226*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
227*9356374aSAndroid Build Coastguard Worker
228*9356374aSAndroid Build Coastguard Worker InSequence seq;
229*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(absl::LogSeverity::kInfo, _, "hello"));
230*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(absl::LogSeverity::kInfo, _, "world"));
231*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(absl::LogSeverity::kWarning, _, "danger"));
232*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(absl::LogSeverity::kInfo, _, "here"));
233*9356374aSAndroid Build Coastguard Worker
234*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
235*9356374aSAndroid Build Coastguard Worker LOG(INFO) << LogAndReturn(absl::LogSeverity::kInfo, "hello", "world");
236*9356374aSAndroid Build Coastguard Worker LOG(INFO) << LogAndReturn(absl::LogSeverity::kWarning, "danger", "here");
237*9356374aSAndroid Build Coastguard Worker }
238*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyTest,RegisteredLogSinkThatLogsInSend)239*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyTest, RegisteredLogSinkThatLogsInSend) {
240*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
241*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink renentrant_sink(absl::LogSeverity::kInfo);
242*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(_, _, "hello world"));
243*9356374aSAndroid Build Coastguard Worker
244*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
245*9356374aSAndroid Build Coastguard Worker absl::AddLogSink(&renentrant_sink);
246*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "hello world";
247*9356374aSAndroid Build Coastguard Worker absl::RemoveLogSink(&renentrant_sink);
248*9356374aSAndroid Build Coastguard Worker }
249*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyTest,AlsoLogSinkThatLogsInSend)250*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyTest, AlsoLogSinkThatLogsInSend) {
251*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
252*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink reentrant_sink(absl::LogSeverity::kInfo);
253*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(_, _, "hello world"));
254*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
255*9356374aSAndroid Build Coastguard Worker Log(_, _, "The log is coming from *inside the sink*."));
256*9356374aSAndroid Build Coastguard Worker
257*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
258*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkAlso(&reentrant_sink) << "hello world";
259*9356374aSAndroid Build Coastguard Worker }
260*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyTest,RegisteredAlsoLogSinkThatLogsInSend)261*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyTest, RegisteredAlsoLogSinkThatLogsInSend) {
262*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
263*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink reentrant_sink(absl::LogSeverity::kInfo);
264*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(_, _, "hello world"));
265*9356374aSAndroid Build Coastguard Worker // We only call into the test_log sink once with this message, since the
266*9356374aSAndroid Build Coastguard Worker // second time log statement is run we are in "ThreadIsLogging" mode and all
267*9356374aSAndroid Build Coastguard Worker // the log statements are redirected into stderr.
268*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
269*9356374aSAndroid Build Coastguard Worker Log(_, _, "The log is coming from *inside the sink*."));
270*9356374aSAndroid Build Coastguard Worker
271*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
272*9356374aSAndroid Build Coastguard Worker absl::AddLogSink(&reentrant_sink);
273*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkAlso(&reentrant_sink) << "hello world";
274*9356374aSAndroid Build Coastguard Worker absl::RemoveLogSink(&reentrant_sink);
275*9356374aSAndroid Build Coastguard Worker }
276*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyTest,OnlyLogSinkThatLogsInSend)277*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyTest, OnlyLogSinkThatLogsInSend) {
278*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
279*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink reentrant_sink(absl::LogSeverity::kInfo);
280*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
281*9356374aSAndroid Build Coastguard Worker Log(_, _, "The log is coming from *inside the sink*."));
282*9356374aSAndroid Build Coastguard Worker
283*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
284*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkOnly(&reentrant_sink) << "hello world";
285*9356374aSAndroid Build Coastguard Worker }
286*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyTest,RegisteredOnlyLogSinkThatLogsInSend)287*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyTest, RegisteredOnlyLogSinkThatLogsInSend) {
288*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
289*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink reentrant_sink(absl::LogSeverity::kInfo);
290*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
291*9356374aSAndroid Build Coastguard Worker Log(_, _, "The log is coming from *inside the sink*."));
292*9356374aSAndroid Build Coastguard Worker
293*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
294*9356374aSAndroid Build Coastguard Worker absl::AddLogSink(&reentrant_sink);
295*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkOnly(&reentrant_sink) << "hello world";
296*9356374aSAndroid Build Coastguard Worker absl::RemoveLogSink(&reentrant_sink);
297*9356374aSAndroid Build Coastguard Worker }
298*9356374aSAndroid Build Coastguard Worker
299*9356374aSAndroid Build Coastguard Worker using ReentrancyDeathTest = ReentrancyTest;
300*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyDeathTest,LogFunctionThatLogsFatal)301*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyDeathTest, LogFunctionThatLogsFatal) {
302*9356374aSAndroid Build Coastguard Worker EXPECT_EXIT(
303*9356374aSAndroid Build Coastguard Worker {
304*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink;
305*9356374aSAndroid Build Coastguard Worker
306*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log)
307*9356374aSAndroid Build Coastguard Worker .Times(AnyNumber())
308*9356374aSAndroid Build Coastguard Worker .WillRepeatedly(DeathTestUnexpectedLogging());
309*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(_, _, "hello"))
310*9356374aSAndroid Build Coastguard Worker .WillOnce(DeathTestExpectedLogging());
311*9356374aSAndroid Build Coastguard Worker
312*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
313*9356374aSAndroid Build Coastguard Worker LOG(INFO) << LogAndReturn(absl::LogSeverity::kFatal, "hello", "world");
314*9356374aSAndroid Build Coastguard Worker },
315*9356374aSAndroid Build Coastguard Worker DiedOfFatal, DeathTestValidateExpectations());
316*9356374aSAndroid Build Coastguard Worker }
317*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyDeathTest,RegisteredLogSinkThatLogsFatalInSend)318*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyDeathTest, RegisteredLogSinkThatLogsFatalInSend) {
319*9356374aSAndroid Build Coastguard Worker EXPECT_EXIT(
320*9356374aSAndroid Build Coastguard Worker {
321*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink;
322*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink reentrant_sink(absl::LogSeverity::kFatal);
323*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log)
324*9356374aSAndroid Build Coastguard Worker .Times(AnyNumber())
325*9356374aSAndroid Build Coastguard Worker .WillRepeatedly(DeathTestUnexpectedLogging());
326*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(_, _, "hello world"))
327*9356374aSAndroid Build Coastguard Worker .WillOnce(DeathTestExpectedLogging());
328*9356374aSAndroid Build Coastguard Worker
329*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
330*9356374aSAndroid Build Coastguard Worker absl::AddLogSink(&reentrant_sink);
331*9356374aSAndroid Build Coastguard Worker LOG(INFO) << "hello world";
332*9356374aSAndroid Build Coastguard Worker // No need to call RemoveLogSink - process is dead at this point.
333*9356374aSAndroid Build Coastguard Worker },
334*9356374aSAndroid Build Coastguard Worker DiedOfFatal, DeathTestValidateExpectations());
335*9356374aSAndroid Build Coastguard Worker }
336*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyDeathTest,AlsoLogSinkThatLogsFatalInSend)337*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyDeathTest, AlsoLogSinkThatLogsFatalInSend) {
338*9356374aSAndroid Build Coastguard Worker EXPECT_EXIT(
339*9356374aSAndroid Build Coastguard Worker {
340*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink;
341*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink reentrant_sink(absl::LogSeverity::kFatal);
342*9356374aSAndroid Build Coastguard Worker
343*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log)
344*9356374aSAndroid Build Coastguard Worker .Times(AnyNumber())
345*9356374aSAndroid Build Coastguard Worker .WillRepeatedly(DeathTestUnexpectedLogging());
346*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(_, _, "hello world"))
347*9356374aSAndroid Build Coastguard Worker .WillOnce(DeathTestExpectedLogging());
348*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
349*9356374aSAndroid Build Coastguard Worker Log(_, _, "The log is coming from *inside the sink*."))
350*9356374aSAndroid Build Coastguard Worker .WillOnce(DeathTestExpectedLogging());
351*9356374aSAndroid Build Coastguard Worker
352*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
353*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkAlso(&reentrant_sink) << "hello world";
354*9356374aSAndroid Build Coastguard Worker },
355*9356374aSAndroid Build Coastguard Worker DiedOfFatal, DeathTestValidateExpectations());
356*9356374aSAndroid Build Coastguard Worker }
357*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyDeathTest,RegisteredAlsoLogSinkThatLogsFatalInSend)358*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyDeathTest, RegisteredAlsoLogSinkThatLogsFatalInSend) {
359*9356374aSAndroid Build Coastguard Worker EXPECT_EXIT(
360*9356374aSAndroid Build Coastguard Worker {
361*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink;
362*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink reentrant_sink(absl::LogSeverity::kFatal);
363*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log)
364*9356374aSAndroid Build Coastguard Worker .Times(AnyNumber())
365*9356374aSAndroid Build Coastguard Worker .WillRepeatedly(DeathTestUnexpectedLogging());
366*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log(_, _, "hello world"))
367*9356374aSAndroid Build Coastguard Worker .WillOnce(DeathTestExpectedLogging());
368*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
369*9356374aSAndroid Build Coastguard Worker Log(_, _, "The log is coming from *inside the sink*."))
370*9356374aSAndroid Build Coastguard Worker .WillOnce(DeathTestExpectedLogging());
371*9356374aSAndroid Build Coastguard Worker
372*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
373*9356374aSAndroid Build Coastguard Worker absl::AddLogSink(&reentrant_sink);
374*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkAlso(&reentrant_sink) << "hello world";
375*9356374aSAndroid Build Coastguard Worker // No need to call RemoveLogSink - process is dead at this point.
376*9356374aSAndroid Build Coastguard Worker },
377*9356374aSAndroid Build Coastguard Worker DiedOfFatal, DeathTestValidateExpectations());
378*9356374aSAndroid Build Coastguard Worker }
379*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyDeathTest,OnlyLogSinkThatLogsFatalInSend)380*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyDeathTest, OnlyLogSinkThatLogsFatalInSend) {
381*9356374aSAndroid Build Coastguard Worker EXPECT_EXIT(
382*9356374aSAndroid Build Coastguard Worker {
383*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink;
384*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink reentrant_sink(absl::LogSeverity::kFatal);
385*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log)
386*9356374aSAndroid Build Coastguard Worker .Times(AnyNumber())
387*9356374aSAndroid Build Coastguard Worker .WillRepeatedly(DeathTestUnexpectedLogging());
388*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
389*9356374aSAndroid Build Coastguard Worker Log(_, _, "The log is coming from *inside the sink*."))
390*9356374aSAndroid Build Coastguard Worker .WillOnce(DeathTestExpectedLogging());
391*9356374aSAndroid Build Coastguard Worker
392*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
393*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkOnly(&reentrant_sink) << "hello world";
394*9356374aSAndroid Build Coastguard Worker },
395*9356374aSAndroid Build Coastguard Worker DiedOfFatal, DeathTestValidateExpectations());
396*9356374aSAndroid Build Coastguard Worker }
397*9356374aSAndroid Build Coastguard Worker
TEST_F(ReentrancyDeathTest,RegisteredOnlyLogSinkThatLogsFatalInSend)398*9356374aSAndroid Build Coastguard Worker TEST_F(ReentrancyDeathTest, RegisteredOnlyLogSinkThatLogsFatalInSend) {
399*9356374aSAndroid Build Coastguard Worker EXPECT_EXIT(
400*9356374aSAndroid Build Coastguard Worker {
401*9356374aSAndroid Build Coastguard Worker absl::ScopedMockLog test_sink;
402*9356374aSAndroid Build Coastguard Worker ReentrantSendLogSink reentrant_sink(absl::LogSeverity::kFatal);
403*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink, Log)
404*9356374aSAndroid Build Coastguard Worker .Times(AnyNumber())
405*9356374aSAndroid Build Coastguard Worker .WillRepeatedly(DeathTestUnexpectedLogging());
406*9356374aSAndroid Build Coastguard Worker EXPECT_CALL(test_sink,
407*9356374aSAndroid Build Coastguard Worker Log(_, _, "The log is coming from *inside the sink*."))
408*9356374aSAndroid Build Coastguard Worker .WillOnce(DeathTestExpectedLogging());
409*9356374aSAndroid Build Coastguard Worker
410*9356374aSAndroid Build Coastguard Worker test_sink.StartCapturingLogs();
411*9356374aSAndroid Build Coastguard Worker absl::AddLogSink(&reentrant_sink);
412*9356374aSAndroid Build Coastguard Worker LOG(INFO).ToSinkOnly(&reentrant_sink) << "hello world";
413*9356374aSAndroid Build Coastguard Worker // No need to call RemoveLogSink - process is dead at this point.
414*9356374aSAndroid Build Coastguard Worker },
415*9356374aSAndroid Build Coastguard Worker DiedOfFatal, DeathTestValidateExpectations());
416*9356374aSAndroid Build Coastguard Worker }
417*9356374aSAndroid Build Coastguard Worker
418*9356374aSAndroid Build Coastguard Worker } // namespace
419