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