nim-chronos/tests/testsignal.nim

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()