Currently expanding libkqueue tests. libkqueue implements kqueue for Linux, Solaris and Windows as a userland library.
One test - test_kevent_timer_dispatch - appears to fail on both macOS 11.5.2 and FreeBSD 13 but for different reasons.
Test steps are below:
- Add a new timer, EV_SET(kq, 4, EVFILT_TIMER, EV_ADD, EV_DISPATCH, 0, 200, NULL)
- Call kevent, wait for timer to fire.
- Verify one kevent was returned the the correct flags and data field set to 1.
- Wait 500ms.
- Verify no more kevents are available.
- Re-enable timer, EV_SET(kq, 4, EVFILT_TIMER, EV_ENABLE | EV_DISPATCH, 0, 200, NULL)
- Verify no events are generated instantaneously.
The above step fails on FreeBSD 13, we get one event with the data field set to 1.
- Wait 1s
- Check that exactly 1 event has fired.
The above step fails on macOS, we get one event with the data field set to 5.
Adding EV_ADD to the call re-enabling the timer does nothing, as does only passing EV_ENABLE.
To run the test suite containing the failing test:
git clone https://github.com/mheily/libkqueue.git
cmake . test/CMakeLists.txt -DWITH_NATIVE_KQUEUE_BUGS=1
make -C test/
You'll need the cmake, git, and gcc or llvm pkgs installed. There are no other dependencies.
The actual test is available here: https://github.com/mheily/libkqueue/blob/935ebc39f78d2e06ce0d20f6c297e4b2b7e4c1bc/test/timer.c#L122
I believe FreeBSD pulled in libkqueue's test suite at some point in the distant past. The test framework hasn't changed much in the past 10 years so you may be able to just drop the updated test in.
After investigating further macOS seems to be behaving correctly, as the event is only disabled when it is retrieved which is after sleeping for 1s. It would make sense then for the data field to contain 5.
The FreeBSD behaviour still seems erroneous however.