tests: Remove threads from mock-resolver/network-address test
mock-resolver.c
is a mock implementation of GResolver
used in the
network-address
tests. It returns resolver results, and implements
timeouts, as directed by the test calling it.
In particular, it allows the IPv4 and IPv6 resolver results to be returned using independent delays. This allows code paths which deal with IPv4 and IPv6 results being returned at different times to be tested, as the ‘Happy Eyeballs’ spec mandates various hard-coded timeouts for returning the best results it can in a reasonable timeframe.
Previously, mock-resolver.c
implemented the timeouts by handling
lookup_by_name()
in a GTask
worker thread, and calling g_usleep()
for the timeout. This seemed to cause occasional CI failures, such as
https://gitlab.gnome.org/GNOME/glib/-/jobs/1843454, where a resolver
error would be returned rather than the expected results:
ok 52 /network-address/happy-eyeballs/ipv4-error-ipv6-first
\# GLib-GIO-DEBUG: IPv4 DNS error: IPv4 Broken
(/var/tmp/gitlab_runner/builds/Ff4WDDRj/0/GNOME/glib/_build/gio/tests/network-address:18428): GLib-GIO-DEBUG: 09:03:08.587: IPv4 DNS error: IPv4 Broken
Bail out! GLib-GIO:ERROR:../gio/tests/network-address.c:586:got_addr: assertion failed (error == NULL): IPv4 Broken (g-io-error-quark, 24)
stderr:
**
GLib-GIO:ERROR:../gio/tests/network-address.c:586:got_addr: assertion failed (error == NULL): IPv4 Broken (g-io-error-quark, 24)
While I’ve been unable to reproduce these failures locally, I suspect they might be down to thread spawning occasionally taking long enough on a CI runner to change the ordering of the timeouts, such that the ‘Happy Eyeballs’ algorithm returns a different set of results from what the test expects.
So, this commit rewrites part of mock-resolver.c
to implement timeouts
in the main thread, rather than in a worker thread. That should
eliminate the delays in spawning threads, and should mean that the
timeout sources in mock-resolver.c
are attached to the same
GMainContext
as those from the ‘Happy Eyeballs’ algorithm which are
monitoring them, so a total order over the timeouts can be guaranteed.
Of course, I might be completely wrong since this is just a guess and I can’t properly test it since I can’t reproduce the failure. Worth a try.
Signed-off-by: Philip Withnall pwithnall@endlessos.org