nim-chronos/tests/testsignal.nim
Eugene Kabanov 02fda01bf2
Add facility to emulate signals on Windows. (#357)
* Initial Windows asyncproc part.
Deprecate usage of net/nativesockets in handles, asyncloop.
Introduce primitives with inheritable flag.

* Some posix fixes.

* More duplicate fixes.

* Fix AsyncProcessOption.EchoCommand option.
Remove isMainModule code.
Fix execCommand to use AsyncProcessOption.EvalCommand.

* Initial asyncproc tests commit.

* Some Posix fixes.

* Fix Posix crash.

* Add testsuite.
Fix osnet.nim to use proper declarations.
Fix timer.nim to use proper declarations.
Add Windows environment handling procedures.
Fix createAsyncPipe.
Add leaks tracking for AsyncProcessRef.

* Fix O_CLOEXEC constant value.

* Add file descriptors leak test.

* Remove commented code.
Refactor exceptions.
Fix compilation warnings.

* No exception ioselectors_kqueue initial commit.

* Some BSD fixes.
Linux refactoring of selectors.nim.

* Some fixes to move further.

* Last Linux fixes.

* Fixes for asyncloop to use 2nd version of selectors api.

* Add osutils.nim.

* Some fixes.

* Hardening resumeRead(), resumeWrite() and consumers.
Add ESRCH handling.
Introduce no-exception fromPipe2.

* Make Windows part exception-free and fix zombie race issue.

* createStreamServer() fixes.

* Upgrade asyncproc to use non-exception primitives.
Fix ioselectors_kqueue to use closeFd().

* Refactor accept() and acceptLoop() to be exception free.

* Deprecated some `result` usage.
Last fixes to make stream.nim exception free.
Use closeFd().
Refactor some loops to use handleEintr().

* Fix connect() forgot to unregister socket on error.

* All createAsyncSocket() sockets should be closed with unregisterAndCloseFd().

* Attempt to fix posix bug with incomplete output.

* Change number of runs in big test.

* Refactoring pipes creation. Attempt to fix "write error: Resource temporarily unavailable".

* Fix waitForExit(duration) code.
Fix test exit code.

* Fix Windows missing SIGTERM.

* Fix mistype.

* Fix compilation error.

* Attempt to fix Nim 1.6 issue.

* Eliminate Nim's WideCString usage to avoid any problems in future.

* Deprecate posix usage in osnet.

* Eliminate unused imports.

* Some debugging statements for investigation.

* Remove all the debugging statements.

* Remove testhelpers in favor of unittest2/asynctests.

* Fix flaky test.

* Make test more resilient to timings.

* Add memory size dump to CI.

* Refactor some blocks to use valueOr.
Make waitForExit to use kill() instead of terminate().

* Remove memory dumps.

* Fix peekProcessExitCode() blocks issue.

* Fix Windows issue.

* Add some debugging echoes.

* Fix compilation error.

* Add some debugging echoes.

* Add more helpers.

* Fix compilation error.

* waitForExit() is primary suspect.

* Remove fast-path for waitForExit.
Remove loop for reading signal events.

* Remove all debugging echoes.

* Return one debugging echo.

* Fix futures tests.

* Add test for multiple processes waiting to attempt stress test.

* Refactor ioselectors_epoll for better signalfd and process monitoring.
Add more race condition fixes to waitForExit.
Fix some Nim 1.6 warnings.

* Fix after rebase issues and warnings.

* Fix style issues.
Fix different Nim versions issues.
Workaround `signalfd` style issues.

* Add one more Linux signals workaround.
Add one more multiple processes test.

* Windows fixes.

* Remove unixPlatform define.
Fix WSAECONNABORTED for devel.

* Temporarily disable rate limit tests.
Fix more devel issues.

* Deprecate `hasThreadSupport` for ioselectors_kqueue.
Fix verifySelectParams issue.
Add exit codes test for multiple processes.
Fix osnet PtrToCstringConv warning.

* ioselectors_kqueue refactoring.

* Initial commit.

* Fix 1.2-1.4 compilation issue.

* Fix unused warning for testCtrlC() test.

* Post-rebase fixes.

* Restore master files.

* More fixes.

* Remove duplicates.

* Fix style mistake.

* Add more flexible pragmas.
2023-06-02 01:53:20 +03:00

90 lines
2.4 KiB
Nim

# Chronos Test Suite
# (c) Copyright 2018-Present
# Status Research & Development GmbH
#
# Licensed under either of
# Apache License, version 2.0, (LICENSE-APACHEv2)
# MIT license (LICENSE-MIT)
import unittest2
import ../chronos, ../chronos/oserrno
{.used.}
when not defined(windows):
import posix
suite "Signal handling test suite":
proc testSignal(signal, value: int): Future[bool] {.async.} =
var
signalCounter = 0
sigFd: SignalHandle
handlerFut = newFuture[void]("signal.handler")
proc signalHandler(udata: pointer) {.gcsafe.} =
signalCounter = cast[int](udata)
let res = removeSignal2(sigFd)
if res.isErr():
handlerFut.fail(newException(ValueError, osErrorMsg(res.error())))
else:
handlerFut.complete()
sigFd =
block:
let res = addSignal2(signal, signalHandler, cast[pointer](value))
if res.isErr():
raiseAssert osErrorMsg(res.error())
res.get()
when defined(windows):
discard raiseSignal(cint(signal))
else:
discard posix.kill(posix.getpid(), cint(signal))
await handlerFut.wait(5.seconds)
return signalCounter == value
proc testWait(signal: int): Future[bool] {.async.} =
var fut = waitSignal(signal)
when defined(windows):
discard raiseSignal(cint(signal))
else:
discard posix.kill(posix.getpid(), cint(signal))
await fut.wait(5.seconds)
return true
when defined(windows):
proc testCtrlC(): Future[bool] {.async, used.} =
var fut = waitSignal(SIGINT)
let res = raiseConsoleCtrlSignal()
if res.isErr():
raiseAssert osErrorMsg(res.error())
await fut.wait(5.seconds)
return true
test "SIGINT test":
let res = waitFor testSignal(SIGINT, 31337)
check res == true
test "SIGTERM test":
let res = waitFor testSignal(SIGTERM, 65537)
check res == true
test "waitSignal(SIGINT) test":
let res = waitFor testWait(SIGINT)
check res == true
test "waitSignal(SIGTERM) test":
let res = waitFor testWait(SIGTERM)
check res == true
# This test doesn't work well in test suite, because it generates CTRL+C
# event in Windows console, parent process receives this signal and stops
# test suite execution.
# test "Windows [CTRL+C] test":
# when defined(windows):
# let res = waitFor testCtrlC()
# check res == true
# else:
# skip()