From 5e427ad98b7ec18f577118ed4bfc76a4d4735858 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Mon, 28 Oct 2024 08:23:48 +0100 Subject: [PATCH 1/6] test: rename signal tests (simple_signal and simple_signal_re_order) --- test/regress.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/regress.c b/test/regress.c index 3f9027f4..56e2ec10 100644 --- a/test/regress.c +++ b/test/regress.c @@ -1045,7 +1045,7 @@ signal_cb(evutil_socket_t fd, short event, void *arg) } static void -test_simplesignal_impl(int find_reorder) +test_simple_signal_impl(int find_reorder) { struct event ev; struct itimerval itv; @@ -1073,17 +1073,17 @@ test_simplesignal_impl(int find_reorder) } static void -test_simplestsignal(void) +test_simple_signal(void) { setup_test("Simplest one signal: "); - test_simplesignal_impl(0); + test_simple_signal_impl(0); } static void -test_simplesignal(void) +test_simple_signal_re_order(void) { setup_test("Simple signal: "); - test_simplesignal_impl(1); + test_simple_signal_impl(1); } /* signal_free_in_callback */ @@ -3782,8 +3782,8 @@ struct testcase_t evtag_testcases[] = { struct testcase_t signal_testcases[] = { #ifndef _WIN32 - LEGACY(simplestsignal, TT_ISOLATED|RETRY_ON_DARWIN), - LEGACY(simplesignal, TT_ISOLATED|RETRY_ON_DARWIN), + LEGACY(simple_signal, TT_ISOLATED|RETRY_ON_DARWIN), + LEGACY(simple_signal_re_order, TT_ISOLATED|RETRY_ON_DARWIN), LEGACY(multiplesignal, TT_ISOLATED|RETRY_ON_DARWIN), LEGACY(immediatesignal, TT_ISOLATED), LEGACY(signal_dealloc, TT_ISOLATED), From ca163ff1e172bcc6eccb9092a30c59ea437973fe Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Mon, 28 Oct 2024 08:34:12 +0100 Subject: [PATCH 2/6] test: fix retries of signal tests on apple --- test/regress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/regress.c b/test/regress.c index 56e2ec10..098a1ae5 100644 --- a/test/regress.c +++ b/test/regress.c @@ -3774,7 +3774,7 @@ struct testcase_t evtag_testcases[] = { END_OF_TESTCASES }; -#if defined(__darwin__) +#if defined(__APPLE__) #define RETRY_ON_DARWIN TT_RETRIABLE #else #define RETRY_ON_DARWIN 0 From c94b382577b80b414a36b045a5759f4d2ad7e979 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Mon, 28 Oct 2024 10:03:17 +0100 Subject: [PATCH 3/6] test: do not ignore setitimer() failures --- test/regress.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/regress.c b/test/regress.c index 098a1ae5..aad3eb28 100644 --- a/test/regress.c +++ b/test/regress.c @@ -1061,11 +1061,10 @@ test_simple_signal_impl(int find_reorder) memset(&itv, 0, sizeof(itv)); itv.it_value.tv_sec = 0; itv.it_value.tv_usec = 100000; - if (setitimer(ITIMER_REAL, &itv, NULL) == -1) - goto skip_simplesignal; + tt_int_op(setitimer(ITIMER_REAL, &itv, NULL), ==, 0); event_dispatch(); - skip_simplesignal: +end: if (evsignal_del(&ev) == -1) test_ok = 0; @@ -1134,12 +1133,11 @@ test_multiplesignal(void) memset(&itv, 0, sizeof(itv)); itv.it_value.tv_sec = 0; itv.it_value.tv_usec = 100000; - if (setitimer(ITIMER_REAL, &itv, NULL) == -1) - goto skip_simplesignal; + tt_int_op(setitimer(ITIMER_REAL, &itv, NULL), ==, 0); event_dispatch(); - skip_simplesignal: +end: if (evsignal_del(&ev_one) == -1) test_ok = 0; if (evsignal_del(&ev_two) == -1) From 7b14bc16f2cb5c203e0f84c8b1272d97ee01ce4d Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Mon, 28 Oct 2024 10:06:45 +0100 Subject: [PATCH 4/6] test: add fallback for SIGALRM --- test/regress.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/regress.c b/test/regress.c index aad3eb28..58c9fb12 100644 --- a/test/regress.c +++ b/test/regress.c @@ -1044,12 +1044,22 @@ signal_cb(evutil_socket_t fd, short event, void *arg) test_ok = 1; } +static void +signal_alarm_fallback(int sig) +{ + TT_DIE(("ALRM received not from event loop!")); +end: + ; +} + static void test_simple_signal_impl(int find_reorder) { struct event ev; struct itimerval itv; + signal(SIGALRM, signal_alarm_fallback); + evsignal_set(&ev, SIGALRM, signal_cb, &ev); evsignal_add(&ev, NULL); /* find bugs in which operations are re-ordered */ @@ -1124,6 +1134,8 @@ test_multiplesignal(void) setup_test("Multiple signal: "); + signal(SIGALRM, signal_alarm_fallback); + evsignal_set(&ev_one, SIGALRM, signal_cb, &ev_one); evsignal_add(&ev_one, NULL); From 29a3eee5cafb3b2be002090ddcc1da3199f6abf5 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Mon, 28 Oct 2024 22:06:29 +0100 Subject: [PATCH 5/6] test: add --repeat option into tinytest --- test/tinytest.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/test/tinytest.c b/test/tinytest.c index 8f3b53dc..8d088edd 100644 --- a/test/tinytest.c +++ b/test/tinytest.c @@ -74,6 +74,7 @@ static int opt_verbosity = 1; /**< -==quiet,0==terse,1==normal,2==verbose */ static unsigned int opt_timeout = DEFAULT_TESTCASE_TIMEOUT; /**< Timeout for every test (using alarm()) */ static unsigned int opt_retries = 3; /**< How much test with TT_RETRIABLE should be retried */ static unsigned int opt_retries_delay = 1; /**< How much seconds to delay before retrying */ +static unsigned int opt_repeat = 0; /**< How much times to repeat the test */ const char *verbosity_flag = ""; const struct testlist_alias_t *cfg_aliases=NULL; @@ -409,6 +410,7 @@ usage(struct testgroup_t *groups, int list_groups) puts(" --timeout "); puts(" --retries "); puts(" --retries-delay "); + puts(" --repeat "); puts(""); puts(" Specify tests by name, or using a prefix ending with '..'"); puts(" To skip a test, prefix its name with a colon."); @@ -527,6 +529,13 @@ tinytest_main(int c, const char **v, struct testgroup_t *groups) return -1; } opt_retries_delay = (unsigned)atoi(v[i]); + } else if (!strcmp(v[i], "--repeat")) { + ++i; + if (i >= c) { + fprintf(stderr, "--repeat requires argument\n"); + return -1; + } + opt_repeat = (unsigned)atoi(v[i]); } else { fprintf(stderr, "Unknown option %s. Try --help\n", v[i]); return -1; @@ -552,24 +561,26 @@ tinytest_main(int c, const char **v, struct testgroup_t *groups) struct testcase_t *testcase = &group->cases[j]; int retriable = testcase->flags & TT_RETRIABLE; int attempts = retriable ? opt_retries : 0; - int test_ret_err; + int test_ret_err = FAIL; if (!(testcase->flags & TT_ENABLED_)) continue; - for (;;) { - test_ret_err = testcase_run_one(group, testcase, attempts); + for (unsigned k = 0; k < opt_repeat + 1; ++k) { + for (;;) { + test_ret_err = testcase_run_one(group, testcase, attempts); - if (test_ret_err == OK) - break; - if (!attempts--) - break; - printf("\n [RETRYING %s%s (attempts left %i, delay %i sec)]\n", group->prefix, testcase->name, attempts, opt_retries_delay); + if (test_ret_err == OK) + break; + if (!attempts--) + break; + printf("\n [RETRYING %s%s (attempts left %i, delay %i sec)]\n", group->prefix, testcase->name, attempts, opt_retries_delay); #ifdef _WIN32 - Sleep(opt_retries_delay * 1000); + Sleep(opt_retries_delay * 1000); #else - sleep(opt_retries_delay); + sleep(opt_retries_delay); #endif + } } switch (test_ret_err) { From 25fa9c7732b8a2c0ab0ae786eb8f288a7909e8de Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Mon, 28 Oct 2024 22:20:10 +0100 Subject: [PATCH 6/6] test: retry signal tests with SIGALRM no OSX By some reason even after first ALRM signal received and event loop returned it is possible to recieve an ALRM one more time (at least one): % yes signal/simple_signal.. | head -n 1000 | xargs -I{} -P10 sh -c 'EVENT_DEBUG_LOGGING_ALL= bin/regress --timeout 0 --verbose {} >& /tmp/test.$SECONDS.$RANDOM.log' % cat /tmp/test.0.18384.log signal/simple_signal: [forking] [debug] event_add: event: 0x16d70f368 (fd 14), call 0x102704ae8 [debug] evsig_ensure_saved_: evsignal (14) >= sh_old_max (0), resizing OK /Users/ec2-user/libevent/test/regress.c:1086: assert(setitimer(ITIMER_REAL, &itv, NULL) == 0): 0 vs 0[debug] kq_dispatch: kevent reports 1 [debug] event_active: 0x16d70f368 (fd 14), res 8, callback 0x102704ae8 [debug] event_process_active: event: 0x16d70f368, call 0x102704ae8 [debug] event_del: 0x16d70f368 (fd 14), callback 0x102704ae8 [debug] event_base_loop: no events registered. FAIL /Users/ec2-user/libevent/test/regress.c:1062: ALRM received not from event loop![debug] event_del: 0x16d70f368 (fd 14), callback 0x102704ae8 [debug] event_base_free_: 0 events freed signal/simple_signal: exited with 0 (0) [FAILED signal/simple_signal (0 retries)] signal/simple_signal_re_order: [forking] [debug] event_add: event: 0x16d70f368 (fd 14), call 0x102704ae8 [debug] evsig_ensure_saved_: evsignal (14) >= sh_old_max (0), resizing [debug] event_del: 0x16d70f368 (fd 14), callback 0x102704ae8 [debug] event_add: event: 0x16d70f368 (fd 14), call 0x102704ae8 OK /Users/ec2-user/libevent/test/regress.c:1086: assert(setitimer(ITIMER_REAL, &itv, NULL) == 0): 0 vs 0[debug] kq_dispatch: kevent reports 1 [debug] event_active: 0x16d70f368 (fd 14), res 8, callback 0x102704ae8 [debug] event_process_active: event: 0x16d70f368, call 0x102704ae8 [debug] event_del: 0x16d70f368 (fd 14), callback 0x102704ae8 [debug] event_base_loop: no events registered. [debug] event_del: 0x16d70f368 (fd 14), callback 0x102704ae8 [debug] event_base_free_: 0 events freed signal/simple_signal_re_order: exited with 0 (0) 1/2 TESTS FAILED. (0 skipped) Also note, that the problem not only when I run two tests, but only one as well: % bin/regress --timeout 0 --repeat 1000 --verbose --no-fork signal/simple_signal >/tmp/test2.log 2>&1 signal/simple_signal: OK /Users/ec2-user/libevent/test/regress.c:1086: assert(setitimer(ITIMER_REAL, &itv, NULL) == 0): 0 vs 0 signal/simple_signal: OK /Users/ec2-user/libevent/test/regress.c:1086: assert(setitimer(ITIMER_REAL, &itv, NULL) == 0): 0 vs 0 FAIL /Users/ec2-user/libevent/test/regress.c:1062: ALRM received not from event loop! I've tried to run under "ktrace trace -Ss -f C4,S0x010c -c" but of course it does not fails under it (dtruss by some reason did not work for me). P.S. Also remove one TT_RETRIABLE for one test, since only setitimer() causes this. --- test/regress.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/regress.c b/test/regress.c index 58c9fb12..c8077f1f 100644 --- a/test/regress.c +++ b/test/regress.c @@ -3784,6 +3784,8 @@ struct testcase_t evtag_testcases[] = { END_OF_TESTCASES }; +/* Apparently there is a bug in OSX that leads to subsequent ALRM signal + * delievered even though it_interval is set to 0, so let's retry the tests */ #if defined(__APPLE__) #define RETRY_ON_DARWIN TT_RETRIABLE #else @@ -3803,7 +3805,7 @@ struct testcase_t signal_testcases[] = { LEGACY(signal_restore, TT_ISOLATED), LEGACY(signal_assert, TT_ISOLATED), LEGACY(signal_while_processing, TT_ISOLATED), - BASIC(signal_free_in_callback, TT_FORK|TT_NEED_BASE|RETRY_ON_DARWIN), + BASIC(signal_free_in_callback, TT_FORK|TT_NEED_BASE), #endif END_OF_TESTCASES };