#include <folly/gen/Base.h>
#include <folly/gen/File.h>
#include <folly/gen/String.h>
+#include <folly/experimental/TestUtil.h>
#include <folly/experimental/io/FsUtil.h>
using namespace folly;
EXPECT_THROW(proc.waitChecked(), CalledProcessError);
}
+TEST(SimpleSubprocessTest, DefaultConstructibleProcessReturnCode) {
+ ProcessReturnCode retcode;
+ EXPECT_TRUE(retcode.notStarted());
+}
+
+TEST(SimpleSubprocessTest, MoveSubprocess) {
+ Subprocess old_proc(std::vector<std::string>{ "/bin/true" });
+ EXPECT_TRUE(old_proc.returnCode().running());
+ auto new_proc = std::move(old_proc);
+ EXPECT_TRUE(old_proc.returnCode().notStarted());
+ EXPECT_TRUE(new_proc.returnCode().running());
+ EXPECT_EQ(0, new_proc.wait().exitStatus());
+ // Now old_proc is destroyed, but we don't crash.
+}
+
#define EXPECT_SPAWN_ERROR(err, errMsg, cmd, ...) \
do { \
try { \
TEST(ParentDeathSubprocessTest, ParentDeathSignal) {
// Find out where we are.
- static constexpr size_t pathLength = 2048;
- char buf[pathLength + 1];
- int r = readlink("/proc/self/exe", buf, pathLength);
- CHECK_ERR(r);
- buf[r] = '\0';
-
- fs::path helper(buf);
- helper.remove_filename();
- helper /= "subprocess_test_parent_death_helper";
+ const auto basename = "subprocess_test_parent_death_helper";
+ auto helper = fs::executable_path();
+ helper.remove_filename() /= basename;
+ if (!fs::exists(helper)) {
+ helper = helper.parent_path().parent_path() / basename / basename;
+ }
fs::path tempFile(fs::temp_directory_path() / fs::unique_path());
namespace {
bool readToString(int fd, std::string& buf, size_t maxSize) {
- size_t bytesRead = 0;
-
buf.resize(maxSize);
char* dest = &buf.front();
size_t remaining = maxSize;