exception_safety_testing.cc (2237B)
1 // Copyright 2017 The Abseil Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "absl/base/internal/exception_safety_testing.h" 16 17 #ifdef ABSL_HAVE_EXCEPTIONS 18 19 #include "gtest/gtest.h" 20 #include "absl/meta/type_traits.h" 21 22 namespace testing { 23 24 exceptions_internal::NoThrowTag nothrow_ctor; 25 26 exceptions_internal::StrongGuaranteeTagType strong_guarantee; 27 28 exceptions_internal::ExceptionSafetyTestBuilder<> MakeExceptionSafetyTester() { 29 return {}; 30 } 31 32 namespace exceptions_internal { 33 34 int countdown = -1; 35 36 ConstructorTracker* ConstructorTracker::current_tracker_instance_ = nullptr; 37 38 void MaybeThrow(absl::string_view msg, bool throw_bad_alloc) { 39 if (countdown-- == 0) { 40 if (throw_bad_alloc) throw TestBadAllocException(msg); 41 throw TestException(msg); 42 } 43 } 44 45 testing::AssertionResult FailureMessage(const TestException& e, 46 int countdown) noexcept { 47 return testing::AssertionFailure() << "Exception thrown from " << e.what(); 48 } 49 50 std::string GetSpecString(TypeSpec spec) { 51 std::string out; 52 absl::string_view sep; 53 const auto append = [&](absl::string_view s) { 54 absl::StrAppend(&out, sep, s); 55 sep = " | "; 56 }; 57 if (static_cast<bool>(TypeSpec::kNoThrowCopy & spec)) { 58 append("kNoThrowCopy"); 59 } 60 if (static_cast<bool>(TypeSpec::kNoThrowMove & spec)) { 61 append("kNoThrowMove"); 62 } 63 if (static_cast<bool>(TypeSpec::kNoThrowNew & spec)) { 64 append("kNoThrowNew"); 65 } 66 return out; 67 } 68 69 std::string GetSpecString(AllocSpec spec) { 70 return static_cast<bool>(AllocSpec::kNoThrowAllocate & spec) 71 ? "kNoThrowAllocate" 72 : ""; 73 } 74 75 } // namespace exceptions_internal 76 77 } // namespace testing 78 79 #endif // ABSL_HAVE_EXCEPTIONS