/*
- * 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.
* limitations under the License.
*/
-#include "folly/ScopeGuard.h"
-#include "folly/Portability.h"
+#include <folly/ScopeGuard.h>
-#include <gflags/gflags.h>
-#include <gtest/gtest.h>
#include <glog/logging.h>
#include <functional>
#include <stdexcept>
+#include <folly/portability/GTest.h>
+
using folly::ScopeGuard;
using folly::makeGuard;
using std::vector;
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!"
);
}
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) {}
+ [[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);
}