posix: Don’t accumulate zombies in ProcessInfo.Forked test

Use test::Multiprocess, which ensures that waitpid() is called to reap
child processes.

Previously, after a several thousand iterations (using --gtest_repeat),
fork() would begin failing with EAGAIN:

[ RUN      ] ProcessInfo.Forked
../../util/posix/process_info_test.cc:165: Failure
Expected: (pid) >= (0), actual: -1 vs 0
fork: Resource temporarily unavailable (35)
[  FAILED  ] ProcessInfo.Forked (0 ms)

Bug: crashpad:30
Test: crashpad_util_test ProcessInfo.Forked
Change-Id: Ia95c9297d5eeb02894f58844ced1b50981870cbc
Reviewed-on: https://chromium-review.googlesource.com/461482
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
This commit is contained in:
Mark Mentovai 2017-03-28 17:55:19 -04:00
Родитель 3127026a95
Коммит 1a6ae8ce0b
1 изменённых файлов: 28 добавлений и 14 удалений

Просмотреть файл

@ -14,9 +14,7 @@
#include "util/posix/process_info.h"
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <algorithm>
#include <set>
@ -28,6 +26,8 @@
#include "gtest/gtest.h"
#include "test/errors.h"
#include "test/main_arguments.h"
#include "test/multiprocess.h"
#include "util/file/file_io.h"
#include "util/misc/implicit_cast.h"
namespace crashpad {
@ -156,22 +156,36 @@ TEST(ProcessInfo, Pid1) {
EXPECT_FALSE(process_info.AllGroups().empty());
}
TEST(ProcessInfo, Forked) {
pid_t pid = fork();
if (pid == 0) {
raise(SIGSTOP);
_exit(0);
class ProcessInfoForkedTest : public Multiprocess {
public:
ProcessInfoForkedTest() : Multiprocess() {}
~ProcessInfoForkedTest() {}
// Multiprocess:
void MultiprocessParent() override {
const pid_t pid = ChildPID();
ProcessInfo process_info;
ASSERT_TRUE(process_info.Initialize(pid));
EXPECT_EQ(pid, process_info.ProcessID());
EXPECT_EQ(getpid(), process_info.ParentProcessID());
TestProcessSelfOrClone(process_info);
}
ASSERT_GE(pid, 0) << ErrnoMessage("fork");
ProcessInfo process_info;
ASSERT_TRUE(process_info.Initialize(pid));
void MultiprocessChild() override {
// Hang around until the parent is done.
CheckedReadFileAtEOF(ReadPipeHandle());
}
EXPECT_EQ(pid, process_info.ProcessID());
EXPECT_EQ(getpid(), process_info.ParentProcessID());
private:
DISALLOW_COPY_AND_ASSIGN(ProcessInfoForkedTest);
};
TestProcessSelfOrClone(process_info);
kill(pid, SIGKILL);
TEST(ProcessInfo, Forked) {
ProcessInfoForkedTest test;
test.Run();
}
} // namespace