xref: /aosp_15_r20/external/abseil-cpp/absl/log/log_streamer_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
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_streamer.h"
17*9356374aSAndroid Build Coastguard Worker 
18*9356374aSAndroid Build Coastguard Worker #include <ios>
19*9356374aSAndroid Build Coastguard Worker #include <iostream>
20*9356374aSAndroid Build Coastguard Worker #include <utility>
21*9356374aSAndroid Build Coastguard Worker 
22*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
23*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
24*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
25*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/sysinfo.h"
26*9356374aSAndroid Build Coastguard Worker #include "absl/base/log_severity.h"
27*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/test_actions.h"
28*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/test_helpers.h"
29*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/test_matchers.h"
30*9356374aSAndroid Build Coastguard Worker #include "absl/log/log.h"
31*9356374aSAndroid Build Coastguard Worker #include "absl/log/scoped_mock_log.h"
32*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
33*9356374aSAndroid Build Coastguard Worker 
34*9356374aSAndroid Build Coastguard Worker namespace {
35*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::DeathTestExpectedLogging;
36*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::DeathTestUnexpectedLogging;
37*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::DeathTestValidateExpectations;
38*9356374aSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
39*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::DiedOfFatal;
40*9356374aSAndroid Build Coastguard Worker #endif
41*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::InMatchWindow;
42*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::LogSeverity;
43*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::Prefix;
44*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::SourceFilename;
45*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::SourceLine;
46*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::Stacktrace;
47*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::TextMessage;
48*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::ThreadID;
49*9356374aSAndroid Build Coastguard Worker using ::absl::log_internal::Timestamp;
50*9356374aSAndroid Build Coastguard Worker using ::testing::_;
51*9356374aSAndroid Build Coastguard Worker using ::testing::AnyNumber;
52*9356374aSAndroid Build Coastguard Worker using ::testing::Eq;
53*9356374aSAndroid Build Coastguard Worker using ::testing::HasSubstr;
54*9356374aSAndroid Build Coastguard Worker using ::testing::IsEmpty;
55*9356374aSAndroid Build Coastguard Worker using ::testing::IsTrue;
56*9356374aSAndroid Build Coastguard Worker 
57*9356374aSAndroid Build Coastguard Worker auto* test_env ABSL_ATTRIBUTE_UNUSED = ::testing::AddGlobalTestEnvironment(
58*9356374aSAndroid Build Coastguard Worker     new absl::log_internal::LogTestEnvironment);
59*9356374aSAndroid Build Coastguard Worker 
WriteToStream(absl::string_view data,std::ostream * os)60*9356374aSAndroid Build Coastguard Worker void WriteToStream(absl::string_view data, std::ostream* os) {
61*9356374aSAndroid Build Coastguard Worker   *os << "WriteToStream: " << data;
62*9356374aSAndroid Build Coastguard Worker }
WriteToStreamRef(absl::string_view data,std::ostream & os)63*9356374aSAndroid Build Coastguard Worker void WriteToStreamRef(absl::string_view data, std::ostream& os) {
64*9356374aSAndroid Build Coastguard Worker   os << "WriteToStreamRef: " << data;
65*9356374aSAndroid Build Coastguard Worker }
66*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,LogInfoStreamer)67*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, LogInfoStreamer) {
68*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
69*9356374aSAndroid Build Coastguard Worker 
70*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
71*9356374aSAndroid Build Coastguard Worker       test_sink,
72*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
73*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file.cc")), SourceLine(Eq(1234)),
74*9356374aSAndroid Build Coastguard Worker           Prefix(IsTrue()), LogSeverity(Eq(absl::LogSeverity::kInfo)),
75*9356374aSAndroid Build Coastguard Worker           Timestamp(InMatchWindow()),
76*9356374aSAndroid Build Coastguard Worker           ThreadID(Eq(absl::base_internal::GetTID())),
77*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("WriteToStream: foo")),
78*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
79*9356374aSAndroid Build Coastguard Worker               Eq("path/file.cc"), Eq(1234), InMatchWindow(),
80*9356374aSAndroid Build Coastguard Worker               Eq(logging::proto::INFO), Eq(absl::base_internal::GetTID()),
81*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(R"pb(str: "WriteToStream: foo")pb")))),
82*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
83*9356374aSAndroid Build Coastguard Worker 
84*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
85*9356374aSAndroid Build Coastguard Worker   WriteToStream("foo", &absl::LogInfoStreamer("path/file.cc", 1234).stream());
86*9356374aSAndroid Build Coastguard Worker }
87*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,LogWarningStreamer)88*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, LogWarningStreamer) {
89*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
90*9356374aSAndroid Build Coastguard Worker 
91*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
92*9356374aSAndroid Build Coastguard Worker       test_sink,
93*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
94*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file.cc")), SourceLine(Eq(1234)),
95*9356374aSAndroid Build Coastguard Worker           Prefix(IsTrue()), LogSeverity(Eq(absl::LogSeverity::kWarning)),
96*9356374aSAndroid Build Coastguard Worker           Timestamp(InMatchWindow()),
97*9356374aSAndroid Build Coastguard Worker           ThreadID(Eq(absl::base_internal::GetTID())),
98*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("WriteToStream: foo")),
99*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
100*9356374aSAndroid Build Coastguard Worker               Eq("path/file.cc"), Eq(1234), InMatchWindow(),
101*9356374aSAndroid Build Coastguard Worker               Eq(logging::proto::WARNING), Eq(absl::base_internal::GetTID()),
102*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(R"pb(str: "WriteToStream: foo")pb")))),
103*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
104*9356374aSAndroid Build Coastguard Worker 
105*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
106*9356374aSAndroid Build Coastguard Worker   WriteToStream("foo",
107*9356374aSAndroid Build Coastguard Worker                 &absl::LogWarningStreamer("path/file.cc", 1234).stream());
108*9356374aSAndroid Build Coastguard Worker }
109*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,LogErrorStreamer)110*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, LogErrorStreamer) {
111*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
112*9356374aSAndroid Build Coastguard Worker 
113*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
114*9356374aSAndroid Build Coastguard Worker       test_sink,
115*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
116*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file.cc")), SourceLine(Eq(1234)),
117*9356374aSAndroid Build Coastguard Worker           Prefix(IsTrue()), LogSeverity(Eq(absl::LogSeverity::kError)),
118*9356374aSAndroid Build Coastguard Worker           Timestamp(InMatchWindow()),
119*9356374aSAndroid Build Coastguard Worker           ThreadID(Eq(absl::base_internal::GetTID())),
120*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("WriteToStream: foo")),
121*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
122*9356374aSAndroid Build Coastguard Worker               Eq("path/file.cc"), Eq(1234), InMatchWindow(),
123*9356374aSAndroid Build Coastguard Worker               Eq(logging::proto::ERROR), Eq(absl::base_internal::GetTID()),
124*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(R"pb(str: "WriteToStream: foo")pb")))),
125*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
126*9356374aSAndroid Build Coastguard Worker 
127*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
128*9356374aSAndroid Build Coastguard Worker   WriteToStream("foo", &absl::LogErrorStreamer("path/file.cc", 1234).stream());
129*9356374aSAndroid Build Coastguard Worker }
130*9356374aSAndroid Build Coastguard Worker 
131*9356374aSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
TEST(LogStreamerDeathTest,LogFatalStreamer)132*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerDeathTest, LogFatalStreamer) {
133*9356374aSAndroid Build Coastguard Worker   EXPECT_EXIT(
134*9356374aSAndroid Build Coastguard Worker       {
135*9356374aSAndroid Build Coastguard Worker         absl::ScopedMockLog test_sink;
136*9356374aSAndroid Build Coastguard Worker 
137*9356374aSAndroid Build Coastguard Worker         EXPECT_CALL(test_sink, Send)
138*9356374aSAndroid Build Coastguard Worker             .Times(AnyNumber())
139*9356374aSAndroid Build Coastguard Worker             .WillRepeatedly(DeathTestUnexpectedLogging());
140*9356374aSAndroid Build Coastguard Worker 
141*9356374aSAndroid Build Coastguard Worker         EXPECT_CALL(test_sink,
142*9356374aSAndroid Build Coastguard Worker                     Send(AllOf(SourceFilename(Eq("path/file.cc")),
143*9356374aSAndroid Build Coastguard Worker                                SourceLine(Eq(1234)), Prefix(IsTrue()),
144*9356374aSAndroid Build Coastguard Worker                                LogSeverity(Eq(absl::LogSeverity::kFatal)),
145*9356374aSAndroid Build Coastguard Worker                                Timestamp(InMatchWindow()),
146*9356374aSAndroid Build Coastguard Worker                                ThreadID(Eq(absl::base_internal::GetTID())),
147*9356374aSAndroid Build Coastguard Worker                                TextMessage(Eq("WriteToStream: foo")),
148*9356374aSAndroid Build Coastguard Worker                                ENCODED_MESSAGE(MatchesEvent(
149*9356374aSAndroid Build Coastguard Worker                                    Eq("path/file.cc"), Eq(1234),
150*9356374aSAndroid Build Coastguard Worker                                    InMatchWindow(), Eq(logging::proto::FATAL),
151*9356374aSAndroid Build Coastguard Worker                                    Eq(absl::base_internal::GetTID()),
152*9356374aSAndroid Build Coastguard Worker                                    ElementsAre(EqualsProto(
153*9356374aSAndroid Build Coastguard Worker                                        R"pb(str: "WriteToStream: foo")pb")))))))
154*9356374aSAndroid Build Coastguard Worker             .WillOnce(DeathTestExpectedLogging());
155*9356374aSAndroid Build Coastguard Worker 
156*9356374aSAndroid Build Coastguard Worker         test_sink.StartCapturingLogs();
157*9356374aSAndroid Build Coastguard Worker         WriteToStream("foo",
158*9356374aSAndroid Build Coastguard Worker                       &absl::LogFatalStreamer("path/file.cc", 1234).stream());
159*9356374aSAndroid Build Coastguard Worker       },
160*9356374aSAndroid Build Coastguard Worker       DiedOfFatal, DeathTestValidateExpectations());
161*9356374aSAndroid Build Coastguard Worker }
162*9356374aSAndroid Build Coastguard Worker #endif
163*9356374aSAndroid Build Coastguard Worker 
164*9356374aSAndroid Build Coastguard Worker #ifdef NDEBUG
TEST(LogStreamerTest,LogDebugFatalStreamer)165*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, LogDebugFatalStreamer) {
166*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
167*9356374aSAndroid Build Coastguard Worker 
168*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
169*9356374aSAndroid Build Coastguard Worker       test_sink,
170*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
171*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file.cc")), SourceLine(Eq(1234)),
172*9356374aSAndroid Build Coastguard Worker           Prefix(IsTrue()), LogSeverity(Eq(absl::LogSeverity::kError)),
173*9356374aSAndroid Build Coastguard Worker           Timestamp(InMatchWindow()),
174*9356374aSAndroid Build Coastguard Worker           ThreadID(Eq(absl::base_internal::GetTID())),
175*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("WriteToStream: foo")),
176*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
177*9356374aSAndroid Build Coastguard Worker               Eq("path/file.cc"), Eq(1234), InMatchWindow(),
178*9356374aSAndroid Build Coastguard Worker               Eq(logging::proto::ERROR), Eq(absl::base_internal::GetTID()),
179*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(R"pb(str: "WriteToStream: foo")pb")))),
180*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
181*9356374aSAndroid Build Coastguard Worker 
182*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
183*9356374aSAndroid Build Coastguard Worker   WriteToStream("foo",
184*9356374aSAndroid Build Coastguard Worker                 &absl::LogDebugFatalStreamer("path/file.cc", 1234).stream());
185*9356374aSAndroid Build Coastguard Worker }
186*9356374aSAndroid Build Coastguard Worker #elif GTEST_HAS_DEATH_TEST
TEST(LogStreamerDeathTest,LogDebugFatalStreamer)187*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerDeathTest, LogDebugFatalStreamer) {
188*9356374aSAndroid Build Coastguard Worker   EXPECT_EXIT(
189*9356374aSAndroid Build Coastguard Worker       {
190*9356374aSAndroid Build Coastguard Worker         absl::ScopedMockLog test_sink;
191*9356374aSAndroid Build Coastguard Worker 
192*9356374aSAndroid Build Coastguard Worker         EXPECT_CALL(test_sink, Send)
193*9356374aSAndroid Build Coastguard Worker             .Times(AnyNumber())
194*9356374aSAndroid Build Coastguard Worker             .WillRepeatedly(DeathTestUnexpectedLogging());
195*9356374aSAndroid Build Coastguard Worker 
196*9356374aSAndroid Build Coastguard Worker         EXPECT_CALL(test_sink,
197*9356374aSAndroid Build Coastguard Worker                     Send(AllOf(SourceFilename(Eq("path/file.cc")),
198*9356374aSAndroid Build Coastguard Worker                                SourceLine(Eq(1234)), Prefix(IsTrue()),
199*9356374aSAndroid Build Coastguard Worker                                LogSeverity(Eq(absl::LogSeverity::kFatal)),
200*9356374aSAndroid Build Coastguard Worker                                Timestamp(InMatchWindow()),
201*9356374aSAndroid Build Coastguard Worker                                ThreadID(Eq(absl::base_internal::GetTID())),
202*9356374aSAndroid Build Coastguard Worker                                TextMessage(Eq("WriteToStream: foo")),
203*9356374aSAndroid Build Coastguard Worker                                ENCODED_MESSAGE(MatchesEvent(
204*9356374aSAndroid Build Coastguard Worker                                    Eq("path/file.cc"), Eq(1234),
205*9356374aSAndroid Build Coastguard Worker                                    InMatchWindow(), Eq(logging::proto::FATAL),
206*9356374aSAndroid Build Coastguard Worker                                    Eq(absl::base_internal::GetTID()),
207*9356374aSAndroid Build Coastguard Worker                                    ElementsAre(EqualsProto(
208*9356374aSAndroid Build Coastguard Worker                                        R"pb(str: "WriteToStream: foo")pb")))))))
209*9356374aSAndroid Build Coastguard Worker             .WillOnce(DeathTestExpectedLogging());
210*9356374aSAndroid Build Coastguard Worker 
211*9356374aSAndroid Build Coastguard Worker         test_sink.StartCapturingLogs();
212*9356374aSAndroid Build Coastguard Worker         WriteToStream(
213*9356374aSAndroid Build Coastguard Worker             "foo", &absl::LogDebugFatalStreamer("path/file.cc", 1234).stream());
214*9356374aSAndroid Build Coastguard Worker       },
215*9356374aSAndroid Build Coastguard Worker       DiedOfFatal, DeathTestValidateExpectations());
216*9356374aSAndroid Build Coastguard Worker }
217*9356374aSAndroid Build Coastguard Worker #endif
218*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,LogStreamer)219*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, LogStreamer) {
220*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
221*9356374aSAndroid Build Coastguard Worker 
222*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
223*9356374aSAndroid Build Coastguard Worker       test_sink,
224*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
225*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file.cc")), SourceLine(Eq(1234)),
226*9356374aSAndroid Build Coastguard Worker           Prefix(IsTrue()), LogSeverity(Eq(absl::LogSeverity::kError)),
227*9356374aSAndroid Build Coastguard Worker           Timestamp(InMatchWindow()),
228*9356374aSAndroid Build Coastguard Worker           ThreadID(Eq(absl::base_internal::GetTID())),
229*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("WriteToStream: foo")),
230*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
231*9356374aSAndroid Build Coastguard Worker               Eq("path/file.cc"), Eq(1234), InMatchWindow(),
232*9356374aSAndroid Build Coastguard Worker               Eq(logging::proto::ERROR), Eq(absl::base_internal::GetTID()),
233*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(R"pb(str: "WriteToStream: foo")pb")))),
234*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
235*9356374aSAndroid Build Coastguard Worker 
236*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
237*9356374aSAndroid Build Coastguard Worker   WriteToStream(
238*9356374aSAndroid Build Coastguard Worker       "foo", &absl::LogStreamer(absl::LogSeverity::kError, "path/file.cc", 1234)
239*9356374aSAndroid Build Coastguard Worker                   .stream());
240*9356374aSAndroid Build Coastguard Worker }
241*9356374aSAndroid Build Coastguard Worker 
242*9356374aSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
TEST(LogStreamerDeathTest,LogStreamer)243*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerDeathTest, LogStreamer) {
244*9356374aSAndroid Build Coastguard Worker   EXPECT_EXIT(
245*9356374aSAndroid Build Coastguard Worker       {
246*9356374aSAndroid Build Coastguard Worker         absl::ScopedMockLog test_sink;
247*9356374aSAndroid Build Coastguard Worker 
248*9356374aSAndroid Build Coastguard Worker         EXPECT_CALL(test_sink, Send)
249*9356374aSAndroid Build Coastguard Worker             .Times(AnyNumber())
250*9356374aSAndroid Build Coastguard Worker             .WillRepeatedly(DeathTestUnexpectedLogging());
251*9356374aSAndroid Build Coastguard Worker 
252*9356374aSAndroid Build Coastguard Worker         EXPECT_CALL(test_sink,
253*9356374aSAndroid Build Coastguard Worker                     Send(AllOf(SourceFilename(Eq("path/file.cc")),
254*9356374aSAndroid Build Coastguard Worker                                SourceLine(Eq(1234)), Prefix(IsTrue()),
255*9356374aSAndroid Build Coastguard Worker                                LogSeverity(Eq(absl::LogSeverity::kFatal)),
256*9356374aSAndroid Build Coastguard Worker                                Timestamp(InMatchWindow()),
257*9356374aSAndroid Build Coastguard Worker                                ThreadID(Eq(absl::base_internal::GetTID())),
258*9356374aSAndroid Build Coastguard Worker                                TextMessage(Eq("WriteToStream: foo")),
259*9356374aSAndroid Build Coastguard Worker                                ENCODED_MESSAGE(MatchesEvent(
260*9356374aSAndroid Build Coastguard Worker                                    Eq("path/file.cc"), Eq(1234),
261*9356374aSAndroid Build Coastguard Worker                                    InMatchWindow(), Eq(logging::proto::FATAL),
262*9356374aSAndroid Build Coastguard Worker                                    Eq(absl::base_internal::GetTID()),
263*9356374aSAndroid Build Coastguard Worker                                    ElementsAre(EqualsProto(
264*9356374aSAndroid Build Coastguard Worker                                        R"pb(str: "WriteToStream: foo")pb")))))))
265*9356374aSAndroid Build Coastguard Worker             .WillOnce(DeathTestExpectedLogging());
266*9356374aSAndroid Build Coastguard Worker 
267*9356374aSAndroid Build Coastguard Worker         test_sink.StartCapturingLogs();
268*9356374aSAndroid Build Coastguard Worker         WriteToStream("foo", &absl::LogStreamer(absl::LogSeverity::kFatal,
269*9356374aSAndroid Build Coastguard Worker                                                 "path/file.cc", 1234)
270*9356374aSAndroid Build Coastguard Worker                                   .stream());
271*9356374aSAndroid Build Coastguard Worker       },
272*9356374aSAndroid Build Coastguard Worker       DiedOfFatal, DeathTestValidateExpectations());
273*9356374aSAndroid Build Coastguard Worker }
274*9356374aSAndroid Build Coastguard Worker #endif
275*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,PassedByReference)276*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, PassedByReference) {
277*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
278*9356374aSAndroid Build Coastguard Worker 
279*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
280*9356374aSAndroid Build Coastguard Worker       test_sink,
281*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
282*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file.cc")), SourceLine(Eq(1234)),
283*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("WriteToStreamRef: foo")),
284*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
285*9356374aSAndroid Build Coastguard Worker               Eq("path/file.cc"), Eq(1234), _, _, _,
286*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(R"pb(str: "WriteToStreamRef: foo")pb")))),
287*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
288*9356374aSAndroid Build Coastguard Worker 
289*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
290*9356374aSAndroid Build Coastguard Worker   WriteToStreamRef("foo", absl::LogInfoStreamer("path/file.cc", 1234).stream());
291*9356374aSAndroid Build Coastguard Worker }
292*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,StoredAsLocal)293*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, StoredAsLocal) {
294*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
295*9356374aSAndroid Build Coastguard Worker 
296*9356374aSAndroid Build Coastguard Worker   auto streamer = absl::LogInfoStreamer("path/file.cc", 1234);
297*9356374aSAndroid Build Coastguard Worker   WriteToStream("foo", &streamer.stream());
298*9356374aSAndroid Build Coastguard Worker   streamer.stream() << " ";
299*9356374aSAndroid Build Coastguard Worker   WriteToStreamRef("bar", streamer.stream());
300*9356374aSAndroid Build Coastguard Worker 
301*9356374aSAndroid Build Coastguard Worker   // The call should happen when `streamer` goes out of scope; if it
302*9356374aSAndroid Build Coastguard Worker   // happened before this `EXPECT_CALL` the call would be unexpected and the
303*9356374aSAndroid Build Coastguard Worker   // test would fail.
304*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
305*9356374aSAndroid Build Coastguard Worker       test_sink,
306*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
307*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file.cc")), SourceLine(Eq(1234)),
308*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("WriteToStream: foo WriteToStreamRef: bar")),
309*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
310*9356374aSAndroid Build Coastguard Worker               Eq("path/file.cc"), Eq(1234), _, _, _,
311*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(
312*9356374aSAndroid Build Coastguard Worker                   R"pb(str: "WriteToStream: foo WriteToStreamRef: bar")pb")))),
313*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
314*9356374aSAndroid Build Coastguard Worker 
315*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
316*9356374aSAndroid Build Coastguard Worker }
317*9356374aSAndroid Build Coastguard Worker 
318*9356374aSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
TEST(LogStreamerDeathTest,StoredAsLocal)319*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerDeathTest, StoredAsLocal) {
320*9356374aSAndroid Build Coastguard Worker   EXPECT_EXIT(
321*9356374aSAndroid Build Coastguard Worker       {
322*9356374aSAndroid Build Coastguard Worker         // This is fatal when it goes out of scope, but not until then:
323*9356374aSAndroid Build Coastguard Worker         auto streamer = absl::LogFatalStreamer("path/file.cc", 1234);
324*9356374aSAndroid Build Coastguard Worker         std::cerr << "I'm still alive" << std::endl;
325*9356374aSAndroid Build Coastguard Worker         WriteToStream("foo", &streamer.stream());
326*9356374aSAndroid Build Coastguard Worker       },
327*9356374aSAndroid Build Coastguard Worker       DiedOfFatal, HasSubstr("I'm still alive"));
328*9356374aSAndroid Build Coastguard Worker }
329*9356374aSAndroid Build Coastguard Worker #endif
330*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,LogsEmptyLine)331*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, LogsEmptyLine) {
332*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
333*9356374aSAndroid Build Coastguard Worker 
334*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(test_sink,
335*9356374aSAndroid Build Coastguard Worker               Send(AllOf(SourceFilename(Eq("path/file.cc")),
336*9356374aSAndroid Build Coastguard Worker                          SourceLine(Eq(1234)), TextMessage(Eq("")),
337*9356374aSAndroid Build Coastguard Worker                          ENCODED_MESSAGE(MatchesEvent(
338*9356374aSAndroid Build Coastguard Worker                              Eq("path/file.cc"), Eq(1234), _, _, _,
339*9356374aSAndroid Build Coastguard Worker                              ElementsAre(EqualsProto(R"pb(str: "")pb")))),
340*9356374aSAndroid Build Coastguard Worker                          Stacktrace(IsEmpty()))));
341*9356374aSAndroid Build Coastguard Worker 
342*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
343*9356374aSAndroid Build Coastguard Worker   absl::LogInfoStreamer("path/file.cc", 1234);
344*9356374aSAndroid Build Coastguard Worker }
345*9356374aSAndroid Build Coastguard Worker 
346*9356374aSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
TEST(LogStreamerDeathTest,LogsEmptyLine)347*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerDeathTest, LogsEmptyLine) {
348*9356374aSAndroid Build Coastguard Worker   EXPECT_EXIT(
349*9356374aSAndroid Build Coastguard Worker       {
350*9356374aSAndroid Build Coastguard Worker         absl::ScopedMockLog test_sink;
351*9356374aSAndroid Build Coastguard Worker 
352*9356374aSAndroid Build Coastguard Worker         EXPECT_CALL(test_sink, Log)
353*9356374aSAndroid Build Coastguard Worker             .Times(AnyNumber())
354*9356374aSAndroid Build Coastguard Worker             .WillRepeatedly(DeathTestUnexpectedLogging());
355*9356374aSAndroid Build Coastguard Worker 
356*9356374aSAndroid Build Coastguard Worker         EXPECT_CALL(
357*9356374aSAndroid Build Coastguard Worker             test_sink,
358*9356374aSAndroid Build Coastguard Worker             Send(AllOf(SourceFilename(Eq("path/file.cc")), TextMessage(Eq("")),
359*9356374aSAndroid Build Coastguard Worker                        ENCODED_MESSAGE(MatchesEvent(
360*9356374aSAndroid Build Coastguard Worker                            Eq("path/file.cc"), _, _, _, _,
361*9356374aSAndroid Build Coastguard Worker                            ElementsAre(EqualsProto(R"pb(str: "")pb")))))))
362*9356374aSAndroid Build Coastguard Worker             .WillOnce(DeathTestExpectedLogging());
363*9356374aSAndroid Build Coastguard Worker 
364*9356374aSAndroid Build Coastguard Worker         test_sink.StartCapturingLogs();
365*9356374aSAndroid Build Coastguard Worker         // This is fatal even though it's never used:
366*9356374aSAndroid Build Coastguard Worker         auto streamer = absl::LogFatalStreamer("path/file.cc", 1234);
367*9356374aSAndroid Build Coastguard Worker       },
368*9356374aSAndroid Build Coastguard Worker       DiedOfFatal, DeathTestValidateExpectations());
369*9356374aSAndroid Build Coastguard Worker }
370*9356374aSAndroid Build Coastguard Worker #endif
371*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,MoveConstruction)372*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, MoveConstruction) {
373*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
374*9356374aSAndroid Build Coastguard Worker 
375*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
376*9356374aSAndroid Build Coastguard Worker       test_sink,
377*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
378*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file.cc")), SourceLine(Eq(1234)),
379*9356374aSAndroid Build Coastguard Worker           LogSeverity(Eq(absl::LogSeverity::kInfo)),
380*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("hello 0x10 world 0x10")),
381*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
382*9356374aSAndroid Build Coastguard Worker               Eq("path/file.cc"), Eq(1234), _, Eq(logging::proto::INFO), _,
383*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(R"pb(str: "hello 0x10 world 0x10")pb")))),
384*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
385*9356374aSAndroid Build Coastguard Worker 
386*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
387*9356374aSAndroid Build Coastguard Worker   auto streamer1 = absl::LogInfoStreamer("path/file.cc", 1234);
388*9356374aSAndroid Build Coastguard Worker   streamer1.stream() << "hello " << std::hex << 16;
389*9356374aSAndroid Build Coastguard Worker   absl::LogStreamer streamer2(std::move(streamer1));
390*9356374aSAndroid Build Coastguard Worker   streamer2.stream() << " world " << 16;
391*9356374aSAndroid Build Coastguard Worker }
392*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,MoveAssignment)393*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, MoveAssignment) {
394*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
395*9356374aSAndroid Build Coastguard Worker 
396*9356374aSAndroid Build Coastguard Worker   testing::InSequence seq;
397*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
398*9356374aSAndroid Build Coastguard Worker       test_sink,
399*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
400*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file2.cc")), SourceLine(Eq(5678)),
401*9356374aSAndroid Build Coastguard Worker           LogSeverity(Eq(absl::LogSeverity::kWarning)),
402*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("something else")),
403*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
404*9356374aSAndroid Build Coastguard Worker               Eq("path/file2.cc"), Eq(5678), _, Eq(logging::proto::WARNING), _,
405*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(R"pb(str: "something else")pb")))),
406*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
407*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(
408*9356374aSAndroid Build Coastguard Worker       test_sink,
409*9356374aSAndroid Build Coastguard Worker       Send(AllOf(
410*9356374aSAndroid Build Coastguard Worker           SourceFilename(Eq("path/file.cc")), SourceLine(Eq(1234)),
411*9356374aSAndroid Build Coastguard Worker           LogSeverity(Eq(absl::LogSeverity::kInfo)),
412*9356374aSAndroid Build Coastguard Worker           TextMessage(Eq("hello 0x10 world 0x10")),
413*9356374aSAndroid Build Coastguard Worker           ENCODED_MESSAGE(MatchesEvent(
414*9356374aSAndroid Build Coastguard Worker               Eq("path/file.cc"), Eq(1234), _, Eq(logging::proto::INFO), _,
415*9356374aSAndroid Build Coastguard Worker               ElementsAre(EqualsProto(R"pb(str: "hello 0x10 world 0x10")pb")))),
416*9356374aSAndroid Build Coastguard Worker           Stacktrace(IsEmpty()))));
417*9356374aSAndroid Build Coastguard Worker 
418*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
419*9356374aSAndroid Build Coastguard Worker   auto streamer1 = absl::LogInfoStreamer("path/file.cc", 1234);
420*9356374aSAndroid Build Coastguard Worker   streamer1.stream() << "hello " << std::hex << 16;
421*9356374aSAndroid Build Coastguard Worker   auto streamer2 = absl::LogWarningStreamer("path/file2.cc", 5678);
422*9356374aSAndroid Build Coastguard Worker   streamer2.stream() << "something else";
423*9356374aSAndroid Build Coastguard Worker   streamer2 = std::move(streamer1);
424*9356374aSAndroid Build Coastguard Worker   streamer2.stream() << " world " << 16;
425*9356374aSAndroid Build Coastguard Worker }
426*9356374aSAndroid Build Coastguard Worker 
TEST(LogStreamerTest,CorrectDefaultFlags)427*9356374aSAndroid Build Coastguard Worker TEST(LogStreamerTest, CorrectDefaultFlags) {
428*9356374aSAndroid Build Coastguard Worker   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
429*9356374aSAndroid Build Coastguard Worker 
430*9356374aSAndroid Build Coastguard Worker   // The `boolalpha` and `showbase` flags should be set by default, to match
431*9356374aSAndroid Build Coastguard Worker   // `LOG`.
432*9356374aSAndroid Build Coastguard Worker   EXPECT_CALL(test_sink, Send(AllOf(TextMessage(Eq("false0xdeadbeef")))))
433*9356374aSAndroid Build Coastguard Worker       .Times(2);
434*9356374aSAndroid Build Coastguard Worker 
435*9356374aSAndroid Build Coastguard Worker   test_sink.StartCapturingLogs();
436*9356374aSAndroid Build Coastguard Worker   absl::LogInfoStreamer("path/file.cc", 1234).stream()
437*9356374aSAndroid Build Coastguard Worker       << false << std::hex << 0xdeadbeef;
438*9356374aSAndroid Build Coastguard Worker   LOG(INFO) << false << std::hex << 0xdeadbeef;
439*9356374aSAndroid Build Coastguard Worker }
440*9356374aSAndroid Build Coastguard Worker 
441*9356374aSAndroid Build Coastguard Worker }  // namespace
442