X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Ftest%2FScopeGuardTest.cpp;h=93507da2d55aa5fb9873bbe3853eeacf0699e153;hb=8cf0c3e0f10e74e89f0b868e4168ec019ed9b998;hp=71a86e901403406ad54da9bec8fc9fe2fe2a487a;hpb=a57c72d7c5d712b95aa1bad48a507f026437a1f8;p=folly.git diff --git a/folly/test/ScopeGuardTest.cpp b/folly/test/ScopeGuardTest.cpp index 71a86e90..93507da2 100644 --- a/folly/test/ScopeGuardTest.cpp +++ b/folly/test/ScopeGuardTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013 Facebook, Inc. + * Copyright 2016 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,10 +14,9 @@ * limitations under the License. */ -#include "folly/ScopeGuard.h" -#include "folly/Portability.h" +#include +#include -#include #include #include @@ -127,11 +126,7 @@ TEST(ScopeGuard, GuardException) { throw std::runtime_error("destructors should never throw!"); }); }, -#if FOLLY_USE_LIBCPP - "terminate called throwing an exception" -#else - "destructors should never throw" -#endif + "destructors should never throw!" ); } @@ -288,8 +283,28 @@ TEST(ScopeGuard, TEST_SCOPE_FAIL_AND_SCOPE_SUCCESS) { testScopeFailAndScopeSuccess(ErrorBehavior::UNHANDLED_ERROR, true); } -int main(int argc, char** argv) { - testing::InitGoogleTest(&argc, argv); - google::ParseCommandLineFlags(&argc, &argv, true); - return RUN_ALL_TESTS(); +TEST(ScopeGuard, TEST_SCOPE_SUCCESS_THROW) { + auto lambda = []() { + SCOPE_SUCCESS { throw std::runtime_error("ehm"); }; + }; + EXPECT_THROW(lambda(), std::runtime_error); +} + +TEST(ScopeGuard, TEST_THROWING_CLEANUP_ACTION) { + struct ThrowingCleanupAction { + explicit ThrowingCleanupAction(int& scopeExitExecuted) + : scopeExitExecuted_(scopeExitExecuted) {} + ThrowingCleanupAction(const ThrowingCleanupAction& other) + : scopeExitExecuted_(other.scopeExitExecuted_) { + throw std::runtime_error("whoa"); + } + void operator()() { ++scopeExitExecuted_; } + + private: + int& scopeExitExecuted_; + }; + int scopeExitExecuted = 0; + ThrowingCleanupAction onExit(scopeExitExecuted); + EXPECT_THROW(makeGuard(onExit), std::runtime_error); + EXPECT_EQ(scopeExitExecuted, 1); }