From 5de5b7773970f92f140e6de7da1987bab4cfac04 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 1 Dec 2023 02:07:04 +0000 Subject: tests: note kevent+tmpfs failures on DragonFly <= 6.4 I forgot to set TMPDIR=/path/to/non-tmpfs again. --- lib/PublicInbox/TestCommon.pm | 23 ++++++++++++++++++++++- t/dir_idle.t | 7 +++++-- t/kqnotify.t | 2 +- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm index 8e7eb950..f2914d09 100644 --- a/lib/PublicInbox/TestCommon.pm +++ b/lib/PublicInbox/TestCommon.pm @@ -24,7 +24,7 @@ BEGIN { @EXPORT = qw(tmpdir tcp_server tcp_connect require_git require_mods run_script start_script key2sub xsys xsys_e xqx eml_load tick have_xapian_compact json_utf8 setup_public_inboxes create_inbox - create_coderepo require_bsd + create_coderepo require_bsd kernel_version check_broken_tmpfs quit_waiter_pipe wait_for_eof tcp_host_port test_lei lei lei_ok $lei_out $lei_err $lei_opt test_httpd xbail require_cmd is_xdeeply tail_f @@ -37,6 +37,27 @@ BEGIN { push @EXPORT, @methods; } +sub kernel_version () { + state $version = do { + require POSIX; + my @u = POSIX::uname(); + if ($u[2] =~ /\A([0-9]+(?:\.[0-9]+)+)/) { + eval "v$1"; + } else { + local $" = "', `"; + diag "Unable to get kernel version from: `@u'"; + undef; + } + }; +} + +sub check_broken_tmpfs () { + return if $^O ne 'dragonfly' || kernel_version ge v6.5; + diag 'EVFILT_VNODE + tmpfs is broken on dragonfly <= 6.4 (have: '. + sprintf('%vd', kernel_version).')'; + 1; +} + sub require_bsd (;$) { state $ok = ($^O =~ m!\A(?:free|net|open)bsd\z! || $^O eq 'dragonfly'); diff --git a/t/dir_idle.t b/t/dir_idle.t index 14aad7a1..8d085d6e 100644 --- a/t/dir_idle.t +++ b/t/dir_idle.t @@ -16,10 +16,12 @@ my $end = 3 + now; local @PublicInbox::DS::post_loop_do = (sub { scalar(@x) == 0 && now < $end }); rmdir("$tmpdir/a/b") or xbail "rmdir $!"; PublicInbox::DS::event_loop(); -is(scalar(@x), 1, 'got an rmdir event') or xbail explain(\@x); -if (@x) { +if (is(scalar(@x), 1, 'got an rmdir event')) { is($x[0]->[0]->fullname, "$tmpdir/a/b", 'got expected fullname') and ok($x[0]->[0]->IN_DELETE, 'IN_DELETE set'); +} else { + check_broken_tmpfs; + xbail explain(\@x); } rmdir("$tmpdir/a") or xbail "rmdir $!"; @@ -30,6 +32,7 @@ if (is(scalar(@x), 1, 'got an event after rmdir')) { is($x[0]->[0]->fullname, "$tmpdir/a", 'got expected fullname') and ok($x[0]->[0]->IN_DELETE_SELF, 'IN_DELETE_SELF set'); } else { + check_broken_tmpfs; diag explain(\@x); } rename("$tmpdir/c", "$tmpdir/j") or xbail "rmdir $!"; diff --git a/t/kqnotify.t b/t/kqnotify.t index cf32b633..add477a4 100644 --- a/t/kqnotify.t +++ b/t/kqnotify.t @@ -62,6 +62,6 @@ is_xdeeply($hit, \@unlink, 'unlinked files match'); # this is unreliable on Dragonfly tmpfs (fixed post-6.4) rmdir "$tmpdir/new"; $hit = [ sort(map { $_->fullname } $kqn->read) ]; -is(scalar(@$hit), 1, 'detected self removal'); +is(scalar(@$hit), 1, 'detected self removal') or check_broken_tmpfs; done_testing; -- cgit v1.2.3-24-ge0c7