90 lines
2.4 KiB
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()
|