mirror of
https://github.com/status-im/nim-chronos.git
synced 2025-01-21 00:39:32 +00:00
02fda01bf2
* 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.
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()
|