X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Ftest%2FScopeGuardTest.cpp;h=7095df5f2044f967d014e4b2b36bb6864fa744e7;hb=136c9fba2f6b520946edb2556e1acb14d59ac660;hp=35b1e3a905e8328f86b75935b8a947dadd6d1752;hpb=aea0f7108838a5a9ff9d30f82638ed9e4a077601;p=folly.git diff --git a/folly/test/ScopeGuardTest.cpp b/folly/test/ScopeGuardTest.cpp index 35b1e3a9..7095df5f 100644 --- a/folly/test/ScopeGuardTest.cpp +++ b/folly/test/ScopeGuardTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013 Facebook, Inc. + * Copyright 2017 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,15 +14,15 @@ * limitations under the License. */ -#include "folly/ScopeGuard.h" +#include -#include -#include #include #include #include +#include + using folly::ScopeGuard; using folly::makeGuard; using std::vector; @@ -126,7 +126,8 @@ TEST(ScopeGuard, GuardException) { throw std::runtime_error("destructors should never throw!"); }); }, - "destructors should never throw"); + "destructors should never throw!" + ); } /** @@ -252,8 +253,59 @@ TEST(ScopeGuard, TEST_SCOPE_FAILURE2) { } } -int main(int argc, char** argv) { - testing::InitGoogleTest(&argc, argv); - google::ParseCommandLineFlags(&argc, &argv, true); - return RUN_ALL_TESTS(); +void testScopeFailAndScopeSuccess(ErrorBehavior error, bool expectFail) { + bool scopeFailExecuted = false; + bool scopeSuccessExecuted = false; + + try { + SCOPE_FAIL { scopeFailExecuted = true; }; + SCOPE_SUCCESS { scopeSuccessExecuted = true; }; + + try { + if (error == ErrorBehavior::HANDLED_ERROR) { + throw std::runtime_error("throwing an expected error"); + } else if (error == ErrorBehavior::UNHANDLED_ERROR) { + throw "never throw raw strings"; + } + } catch (const std::runtime_error&) { + } + } catch (...) { + // Outer catch to swallow the error for the UNHANDLED_ERROR behavior + } + + EXPECT_EQ(expectFail, scopeFailExecuted); + EXPECT_EQ(!expectFail, scopeSuccessExecuted); +} + +TEST(ScopeGuard, TEST_SCOPE_FAIL_AND_SCOPE_SUCCESS) { + testScopeFailAndScopeSuccess(ErrorBehavior::SUCCESS, false); + testScopeFailAndScopeSuccess(ErrorBehavior::HANDLED_ERROR, false); + testScopeFailAndScopeSuccess(ErrorBehavior::UNHANDLED_ERROR, true); +} + +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) {} + [[noreturn]] + 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); }