| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/test/bind.h" |
| |
| #include <string> |
| |
| #include "base/functional/bind.h" |
| #include "base/functional/callback.h" |
| #include "base/location.h" |
| #include "base/strings/string_piece.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| namespace { |
| |
| // A helper class for MakeExpectedRunClosure() that fails if it is |
| // destroyed without Run() having been called. This class may be used |
| // from multiple threads as long as Run() is called at most once |
| // before destruction. |
| class RunChecker { |
| public: |
| explicit RunChecker(const Location& location, |
| StringPiece message, |
| bool is_repeating) |
| : location_(location), message_(message), is_repeating_(is_repeating) {} |
| |
| ~RunChecker() { |
| if (!called_) { |
| ADD_FAILURE_AT(location_.file_name(), location_.line_number()) |
| << message_; |
| } |
| } |
| |
| void Run() { |
| DCHECK(is_repeating_ || !called_); |
| called_ = true; |
| } |
| |
| private: |
| const Location location_; |
| const std::string message_; |
| const bool is_repeating_; |
| bool called_ = false; |
| }; |
| |
| } // namespace |
| |
| OnceClosure MakeExpectedRunClosure(const Location& location, |
| StringPiece message) { |
| return BindOnce(&RunChecker::Run, |
| Owned(new RunChecker(location, message, false))); |
| } |
| |
| RepeatingClosure MakeExpectedRunAtLeastOnceClosure(const Location& location, |
| StringPiece message) { |
| return BindRepeating(&RunChecker::Run, |
| Owned(new RunChecker(location, message, true))); |
| } |
| |
| RepeatingClosure MakeExpectedNotRunClosure(const Location& location, |
| StringPiece message) { |
| return BindRepeating( |
| [](const Location& location, StringPiece message) { |
| ADD_FAILURE_AT(location.file_name(), location.line_number()) << message; |
| }, |
| location, std::string(message)); |
| } |
| |
| } // namespace base |