diff options
author | Stefan Metzmacher <metze@samba.org> | 2022-07-25 14:13:34 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2022-07-25 17:34:33 +0000 |
commit | 673a8551d8af3d832c5b8c0f76ea6db662e71a14 (patch) | |
tree | 72c9d3c2977a8f2b57212262dcffe6b67f3d915e /lib | |
parent | 087b1b0efda81c89493a42debcaa9013ce60cfaf (diff) | |
download | samba-673a8551d8af3d832c5b8c0f76ea6db662e71a14.tar.gz |
tevent: tevent_cached_getpid() tests
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/tevent/testsuite.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/lib/tevent/testsuite.c b/lib/tevent/testsuite.c index 3bf4bd7a574..8894e445203 100644 --- a/lib/tevent/testsuite.c +++ b/lib/tevent/testsuite.c @@ -1761,8 +1761,75 @@ static bool test_multi_tevent_threaded_2(struct torture_context *test, talloc_free(ev); return true; } + +struct test_cached_pid_thread_state { + pid_t thread_cached_pid; + pid_t thread_pid; +}; + +static void *test_cached_pid_thread(void *private_data) +{ + struct test_cached_pid_thread_state *state = + (struct test_cached_pid_thread_state *)private_data; + + state->thread_cached_pid = tevent_cached_getpid(); + state->thread_pid = getpid(); + + return NULL; +} #endif +static bool test_cached_pid(struct torture_context *test, + const void *test_data) +{ + pid_t parent_pid = getpid(); + pid_t child_pid; + pid_t finished_pid; + int child_status; + + torture_assert(test, tevent_cached_getpid() == parent_pid, "tevent_cached_getpid()"); + +#ifdef HAVE_PTHREAD + { + struct test_cached_pid_thread_state state = { .thread_cached_pid = -1, }; + pthread_t thread; + void *retval = NULL; + int ret; + + ret = pthread_create(&thread, NULL, test_cached_pid_thread, &state); + torture_assert(test, ret == 0, "pthread_create failed"); + + ret = pthread_join(thread, &retval); + torture_assert(test, ret == 0, "pthread_join failed"); + + torture_assert(test, state.thread_pid == parent_pid, "getpid() in thread"); + torture_assert(test, state.thread_cached_pid == parent_pid, "tevent_cached_getpid() in thread"); + } +#endif /* HAVE_PTHREAD */ + + child_pid = fork(); + if (child_pid == 0) { + /* child */ + pid_t pid = getpid(); + pid_t cached_pid = tevent_cached_getpid(); + + if (parent_pid == pid) { + exit(1); + } + if (pid != cached_pid) { + exit(2); + } + exit(0); + } + torture_assert(test, child_pid > 0, "fork failed"); + + finished_pid = waitpid(child_pid, &child_status, 0); + torture_assert(test, finished_pid == child_pid, "wrong child"); + torture_assert(test, child_status == 0, "child_status"); + + return true; +} + struct torture_suite *torture_local_event(TALLOC_CTX *mem_ctx) { struct torture_suite *suite = torture_suite_create(mem_ctx, "event"); @@ -1817,5 +1884,9 @@ struct torture_suite *torture_local_event(TALLOC_CTX *mem_ctx) #endif + torture_suite_add_simple_tcase_const(suite, "tevent_cached_getpid", + test_cached_pid, + NULL); + return suite; } |