diff options
Diffstat (limited to 'test/core/event_engine/forkable_test.cc')
-rw-r--r-- | test/core/event_engine/forkable_test.cc | 53 |
1 files changed, 39 insertions, 14 deletions
diff --git a/test/core/event_engine/forkable_test.cc b/test/core/event_engine/forkable_test.cc index 15d702c7fa..d299a447fd 100644 --- a/test/core/event_engine/forkable_test.cc +++ b/test/core/event_engine/forkable_test.cc @@ -23,16 +23,28 @@ #include <unistd.h> #endif // GPR_POSIX_SUBPROCESS +#include <memory> + #include "absl/types/optional.h" #include "gtest/gtest.h" #include <grpc/support/log.h> #include "src/core/lib/config/config_vars.h" +#include "src/core/lib/gprpp/no_destruct.h" namespace { using ::grpc_event_engine::experimental::Forkable; -using ::grpc_event_engine::experimental::RegisterForkHandlers; +using ::grpc_event_engine::experimental::ObjectGroupForkHandler; + +grpc_core::NoDestruct<ObjectGroupForkHandler> g_forkable_manager; + +class ForkCallbackMethods { + public: + static void Prefork() { g_forkable_manager->Prefork(); } + static void PostforkParent() { g_forkable_manager->PostforkParent(); } + static void PostforkChild() { g_forkable_manager->PostforkChild(); } +}; } // namespace class ForkableTest : public testing::Test {}; @@ -75,16 +87,19 @@ TEST_F(ForkableTest, BasicPthreadAtForkOperations) { bool child_called_ = false; }; - SomeForkable forkable; + auto forkable = std::make_shared<SomeForkable>(); + g_forkable_manager->RegisterForkable(forkable, ForkCallbackMethods::Prefork, + ForkCallbackMethods::PostforkParent, + ForkCallbackMethods::PostforkChild); int child_pid = fork(); ASSERT_NE(child_pid, -1); if (child_pid == 0) { gpr_log(GPR_DEBUG, "I am child pid: %d", getpid()); - forkable.CheckChild(); + forkable->CheckChild(); exit(testing::Test::HasFailure()); } else { gpr_log(GPR_DEBUG, "I am parent pid: %d", getpid()); - forkable.CheckParent(); + forkable->CheckParent(); int status; gpr_log(GPR_DEBUG, "Waiting for child pid: %d", child_pid); do { @@ -106,7 +121,7 @@ TEST_F(ForkableTest, NonPthreadManualForkOperations) { // Manually simulates a fork event for non-pthread-enabled environments #ifdef GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK // This platform does not need to exercise fork support manually. - GTEST_SKIP("Unnecessary test, this platform supports pthreads."); + GTEST_SKIP() << "Unnecessary test, this platform supports pthreads."; #endif class SomeForkable : public Forkable { @@ -127,14 +142,25 @@ TEST_F(ForkableTest, NonPthreadManualForkOperations) { bool child_called_ = false; }; - SomeForkable forkable; - forkable.AssertStates(/*prepare=*/false, /*parent=*/false, /*child=*/false); - grpc_event_engine::experimental::PrepareFork(); - forkable.AssertStates(/*prepare=*/true, /*parent=*/false, /*child=*/false); - grpc_event_engine::experimental::PostforkParent(); - forkable.AssertStates(/*prepare=*/true, /*parent=*/true, /*child=*/false); - grpc_event_engine::experimental::PostforkChild(); - forkable.AssertStates(/*prepare=*/true, /*parent=*/true, /*child=*/true); + ObjectGroupForkHandler forkable_manager; + class NoopForkCallbackMethods { + public: + static void Prefork() {} + static void PostforkParent() {} + static void PostforkChild() {} + }; + auto forkable = std::make_shared<SomeForkable>(); + forkable_manager.RegisterForkable(forkable, NoopForkCallbackMethods::Prefork, + NoopForkCallbackMethods::PostforkParent, + NoopForkCallbackMethods::PostforkChild); + forkable->AssertStates(/*prepare=*/false, /*parent=*/false, /*child=*/false); + forkable_manager.Prefork(); + forkable->AssertStates(/*prepare=*/true, /*parent=*/false, /*child=*/false); + forkable_manager.PostforkParent(); + forkable->AssertStates(/*prepare=*/true, /*parent=*/true, /*child=*/false); + forkable_manager.Prefork(); + forkable_manager.PostforkChild(); + forkable->AssertStates(/*prepare=*/true, /*parent=*/true, /*child=*/true); } int main(int argc, char** argv) { @@ -143,7 +169,6 @@ int main(int argc, char** argv) { grpc_core::ConfigVars::Overrides config_overrides; config_overrides.enable_fork_support = true; grpc_core::ConfigVars::SetOverrides(config_overrides); - RegisterForkHandlers(); auto result = RUN_ALL_TESTS(); return result; } |