mirror of
https://github.com/chromium/crashpad.git
synced 2025-03-09 14:06:33 +00:00
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:
parent
3127026a95
commit
1a6ae8ce0b
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user