// // Copyright 2022 The Abseil Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "gmock/gmock.h" #include "gtest/gtest.h" #include "absl/base/attributes.h" #include "absl/base/log_severity.h" #include "absl/log/globals.h" #include "absl/log/internal/test_helpers.h" #include "absl/log/log.h" namespace { using ::testing::AllOf; using ::testing::HasSubstr; auto* test_env ABSL_ATTRIBUTE_UNUSED = ::testing::AddGlobalTestEnvironment( new absl::log_internal::LogTestEnvironment); MATCHER_P2(HasSubstrTimes, substr, expected_count, "") { int count = 0; std::string::size_type pos = 0; std::string needle(substr); while ((pos = arg.find(needle, pos)) != std::string::npos) { ++count; pos += needle.size(); } return count == expected_count; } TEST(StderrLogSinkDeathTest, InfoMessagesInStderr) { EXPECT_DEATH_IF_SUPPORTED( { absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo); LOG(INFO) << "INFO message"; exit(1); }, "INFO message"); } TEST(StderrLogSinkDeathTest, WarningMessagesInStderr) { EXPECT_DEATH_IF_SUPPORTED( { absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo); LOG(WARNING) << "WARNING message"; exit(1); }, "WARNING message"); } TEST(StderrLogSinkDeathTest, ErrorMessagesInStderr) { EXPECT_DEATH_IF_SUPPORTED( { absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo); LOG(ERROR) << "ERROR message"; exit(1); }, "ERROR message"); } TEST(StderrLogSinkDeathTest, FatalMessagesInStderr) { char message[] = "FATAL message"; char stacktrace[] = "*** Check failure stack trace: ***"; int expected_count = 1; EXPECT_DEATH_IF_SUPPORTED( { absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo); LOG(FATAL) << message; }, AllOf(HasSubstrTimes(message, expected_count), HasSubstr(stacktrace))); } TEST(StderrLogSinkDeathTest, SecondaryFatalMessagesInStderr) { auto MessageGen = []() -> std::string { LOG(FATAL) << "Internal failure"; return "External failure"; }; EXPECT_DEATH_IF_SUPPORTED( { absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo); LOG(FATAL) << MessageGen(); }, "Internal failure"); } } // namespace