tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

scoped_mock_log.cc (2850B)


      1 //
      2 // Copyright 2022 The Abseil Authors.
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      https://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 
     16 #include "absl/log/scoped_mock_log.h"
     17 
     18 #include <atomic>
     19 #include <string>
     20 
     21 #include "gmock/gmock.h"
     22 #include "absl/base/config.h"
     23 #include "absl/base/internal/raw_logging.h"
     24 #include "absl/log/log_entry.h"
     25 #include "absl/log/log_sink.h"
     26 #include "absl/log/log_sink_registry.h"
     27 #include "absl/strings/string_view.h"
     28 
     29 namespace absl {
     30 ABSL_NAMESPACE_BEGIN
     31 
     32 ScopedMockLog::ScopedMockLog(MockLogDefault default_exp)
     33    : sink_(this), is_capturing_logs_(false), is_triggered_(false) {
     34  if (default_exp == MockLogDefault::kIgnoreUnexpected) {
     35    // Ignore all calls to Log we did not set expectations for.
     36    EXPECT_CALL(*this, Log).Times(::testing::AnyNumber());
     37  } else {
     38    // Disallow all calls to Log we did not set expectations for.
     39    EXPECT_CALL(*this, Log).Times(0);
     40  }
     41  // By default Send mock forwards to Log mock.
     42  EXPECT_CALL(*this, Send)
     43      .Times(::testing::AnyNumber())
     44      .WillRepeatedly([this](const absl::LogEntry& entry) {
     45        is_triggered_.store(true, std::memory_order_relaxed);
     46        Log(entry.log_severity(), std::string(entry.source_filename()),
     47            std::string(entry.text_message()));
     48      });
     49 
     50  // By default We ignore all Flush calls.
     51  EXPECT_CALL(*this, Flush).Times(::testing::AnyNumber());
     52 }
     53 
     54 ScopedMockLog::~ScopedMockLog() {
     55  ABSL_RAW_CHECK(is_triggered_.load(std::memory_order_relaxed),
     56                 "Did you forget to call StartCapturingLogs()?");
     57 
     58  if (is_capturing_logs_) StopCapturingLogs();
     59 }
     60 
     61 void ScopedMockLog::StartCapturingLogs() {
     62  ABSL_RAW_CHECK(!is_capturing_logs_,
     63                 "StartCapturingLogs() can be called only when the "
     64                 "absl::ScopedMockLog object is not capturing logs.");
     65 
     66  is_capturing_logs_ = true;
     67  is_triggered_.store(true, std::memory_order_relaxed);
     68  absl::AddLogSink(&sink_);
     69 }
     70 
     71 void ScopedMockLog::StopCapturingLogs() {
     72  ABSL_RAW_CHECK(is_capturing_logs_,
     73                 "StopCapturingLogs() can be called only when the "
     74                 "absl::ScopedMockLog object is capturing logs.");
     75 
     76  is_capturing_logs_ = false;
     77  absl::RemoveLogSink(&sink_);
     78 }
     79 
     80 absl::LogSink& ScopedMockLog::UseAsLocalSink() {
     81  is_triggered_.store(true, std::memory_order_relaxed);
     82  return sink_;
     83 }
     84 
     85 ABSL_NAMESPACE_END
     86 }  // namespace absl