/*
- * Copyright 2015 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.
*/
-#ifndef FOLLY_TESTUTIL_H_
-#define FOLLY_TESTUTIL_H_
+#pragma once
#include <map>
#include <string>
#include <folly/Range.h>
+#include <folly/ScopeGuard.h>
#include <folly/experimental/io/FsUtil.h>
namespace folly {
TemporaryDirectory(TemporaryDirectory&&) = default;
TemporaryDirectory& operator=(TemporaryDirectory&&) = default;
- const fs::path& path() const { return path_; }
+ const fs::path& path() const {
+ return *path_;
+ }
private:
Scope scope_;
- fs::path path_;
+ std::unique_ptr<fs::path> path_;
};
/**
TemporaryDirectory dir_;
};
+namespace detail {
+struct SavedState {
+ void* previousThreadLocalHandler;
+ int previousCrtReportMode;
+};
+SavedState disableInvalidParameters();
+void enableInvalidParameters(SavedState state);
+}
+
+// Ok, so fun fact: The CRT on windows will actually abort
+// on certain failed parameter validation checks in debug
+// mode rather than simply returning -1 as it does in release
+// mode. We can however, ensure consistent behavior by
+// registering our own thread-local invalid parameter handler
+// for the duration of the call, and just have that handler
+// immediately return. We also have to disable CRT asertion
+// alerts for the duration of the call, otherwise we get
+// the abort-retry-ignore window.
+template <typename Func>
+auto msvcSuppressAbortOnInvalidParams(Func func) -> decltype(func()) {
+ auto savedState = detail::disableInvalidParameters();
+ SCOPE_EXIT {
+ detail::enableInvalidParameters(savedState);
+ };
+ return func();
+}
+
/**
* Easy PCRE regex matching. Note that pattern must match the ENTIRE target,
* so use .* at the start and end of the pattern, as appropriate. See
off_t readOffset_; // for incremental reading
};
-class EnvVarSaver {
-public:
- EnvVarSaver();
- ~EnvVarSaver();
-private:
- std::map<std::string, std::string> saved_;
-};
-
} // namespace test
} // namespace folly
-
-#endif /* FOLLY_TESTUTIL_H_ */