From dcc0fbc31fc89e6a07e01a444f21a76ba08fda4f Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Sat, 4 Nov 2023 13:48:55 +0100 Subject: [PATCH] The tests/test_radio_dish test implements is_multicast_available() to verify that multicast is working on the system before running tests that relies on this, or skipping those test otherwise. In some circumstances this check itself hangs due to the recvfrom() call being blocking waiting for data. The test is eventually killed with a SIGALARM signal. ./config/test-driver: line 112: 1227308 Alarm clock "$@" >> "$log_file" 2>&1 FAIL: tests/test_radio_dish FAIL: tests/test_radio_dish =========================== FAIL tests/test_radio_dish (exit status: 142) $ tests/test_radio_dish tests/test_radio_dish.cpp:511:test_leave_unjoined_fails:PASS tests/test_radio_dish.cpp:512:test_join_too_long_fails:PASS tests/test_radio_dish.cpp:513:test_long_group:PASS tests/test_radio_dish.cpp:514:test_join_twice_fails:PASS tests/test_radio_dish.cpp:515:test_radio_bind_fails_ipv4:PASS tests/test_radio_dish.cpp:516:test_radio_bind_fails_ipv6:PASS tests/test_radio_dish.cpp:517:test_dish_connect_fails_ipv4:PASS tests/test_radio_dish.cpp:518:test_dish_connect_fails_ipv6:PASS tests/test_radio_dish.cpp:519:test_radio_dish_tcp_poll_ipv4:PASS tests/test_radio_dish.cpp:520:test_radio_dish_tcp_poll_ipv6:PASS tests/test_radio_dish.cpp:521:test_radio_dish_udp_ipv4:PASS tests/test_radio_dish.cpp:522:test_radio_dish_udp_ipv6:PASS Alarm clock With this commit, making the recvfrom() call non-blocking. The test does noy hang, and the non-available multicast is detected and the tests needing it are skipped: PASS: tests/test_radio_dish $ tests/test_radio_dish tests/test_radio_dish.cpp:510:test_leave_unjoined_fails:PASS tests/test_radio_dish.cpp:511:test_join_too_long_fails:PASS tests/test_radio_dish.cpp:512:test_long_group:PASS tests/test_radio_dish.cpp:513:test_join_twice_fails:PASS tests/test_radio_dish.cpp:514:test_radio_bind_fails_ipv4:PASS tests/test_radio_dish.cpp:515:test_radio_bind_fails_ipv6:PASS tests/test_radio_dish.cpp:516:test_dish_connect_fails_ipv4:PASS tests/test_radio_dish.cpp:517:test_dish_connect_fails_ipv6:PASS tests/test_radio_dish.cpp:518:test_radio_dish_tcp_poll_ipv4:PASS tests/test_radio_dish.cpp:519:test_radio_dish_tcp_poll_ipv6:PASS tests/test_radio_dish.cpp:520:test_radio_dish_udp_ipv4:PASS tests/test_radio_dish.cpp:521:test_radio_dish_udp_ipv6:PASS tests/test_radio_dish.cpp:431:test_radio_dish_mcast_ipv4:IGNORE: No multicast available tests/test_radio_dish.cpp:431:test_radio_dish_no_loop_ipv4:IGNORE: No multicast available tests/test_radio_dish.cpp:431:test_radio_dish_mcast_ipv6:IGNORE: No multicast available tests/test_radio_dish.cpp:431:test_radio_dish_no_loop_ipv6:IGNORE: No multicast available ----------------------- 16 Tests 0 Failures 4 Ignored OK --- tests/test_radio_dish.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_radio_dish.cpp b/tests/test_radio_dish.cpp index 7bfa722d6f..9c8174aa0e 100644 --- a/tests/test_radio_dish.cpp +++ b/tests/test_radio_dish.cpp @@ -321,7 +321,7 @@ static bool is_multicast_available (int ipv6_) struct sockaddr_in *mcast_ipv4 = &mcast.ipv4; any_ipv4->sin_family = AF_INET; - any_ipv4->sin_port = htons (5555); + any_ipv4->sin_port = htons (port); rc = test_inet_pton (AF_INET, "0.0.0.0", &any_ipv4->sin_addr); if (rc == 0) { @@ -395,15 +395,19 @@ static bool is_multicast_available (int ipv6_) msleep (SETTLE_TIME); - rc = sendto (send_sock, msg, static_cast (strlen (msg)), 0, +#ifdef ZMQ_HAVE_WINDOWS + rc = sendto (send_sock, msg, static_cast (strlen (msg)), 0, &mcast.generic, sl); +#else + rc = sendto (send_sock, msg, strlen (msg), 0, &mcast.generic, sl); +#endif if (rc < 0) { goto out; } msleep (SETTLE_TIME); - rc = recvfrom (bind_sock, buf, sizeof (buf) - 1, 0, NULL, 0); + rc = recvfrom (bind_sock, buf, sizeof (buf) - 1, MSG_DONTWAIT, NULL, 0); if (rc < 0) { goto out; }