/*
- * Copyright 2013 Facebook, Inc.
+ * Copyright 2014 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/ScopeGuard.h>
+#include <folly/Portability.h>
#include <gflags/gflags.h>
#include <gtest/gtest.h>
throw std::runtime_error("destructors should never throw!");
});
},
- "destructors should never throw");
+ "destructors should never throw!"
+ );
}
/**
}
}
+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);
+}
+
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
- google::ParseCommandLineFlags(&argc, &argv, true);
+ gflags::ParseCommandLineFlags(&argc, &argv, true);
return RUN_ALL_TESTS();
}