discard """ file: "tioselectors.nim" output: "All tests passed!" """ import ioselectors const hasThreadSupport = compileOption("threads") template processTest(t, x: untyped) = #stdout.write(t) #stdout.flushFile() if not x: echo(t & " FAILED\r\n") when not defined(windows): import os, posix, osproc, nativesockets, times const supportedPlatform = defined(macosx) or defined(freebsd) or defined(netbsd) or defined(openbsd) or defined(linux) proc socket_notification_test(): bool = proc create_test_socket(): SocketHandle = var sock = posix.socket(posix.AF_INET, posix.SOCK_STREAM, posix.IPPROTO_TCP) var x: int = fcntl(sock, F_GETFL, 0) if x == -1: raiseOSError(osLastError()) else: var mode = x or O_NONBLOCK if fcntl(sock, F_SETFL, mode) == -1: raiseOSError(osLastError()) result = sock var client_message = "SERVER HELLO =>" var server_message = "CLIENT HELLO" var buffer : array[128, char] var selector = newSelector[int]() var client_socket = create_test_socket() var server_socket = create_test_socket() registerHandle(selector, server_socket, {Event.Read}, 0) registerHandle(selector, client_socket, {Event.Write}, 0) var option : int32 = 1 if setsockopt(server_socket, cint(SOL_SOCKET), cint(SO_REUSEADDR), addr(option), sizeof(option).SockLen) < 0: raiseOSError(osLastError()) var aiList = getAddrInfo("0.0.0.0", Port(13337)) if bindAddr(server_socket, aiList.ai_addr, aiList.ai_addrlen.Socklen) < 0'i32: dealloc(aiList) raiseOSError(osLastError()) discard server_socket.listen() dealloc(aiList) aiList = getAddrInfo("127.0.0.1", Port(13337)) discard posix.connect(client_socket, aiList.ai_addr, aiList.ai_addrlen.Socklen) dealloc(aiList) discard selector.select(100) var rc1 = selector.select(100) assert(len(rc1) == 2) var sockAddress: SockAddr var addrLen = sizeof(sockAddress).Socklen var server2_socket = accept(server_socket, cast[ptr SockAddr](addr(sockAddress)), addr(addrLen)) assert(server2_socket != osInvalidSocket) selector.registerHandle(server2_socket, {Event.Read}, 0) if posix.send(client_socket, addr(client_message[0]), len(client_message), 0) == -1: raiseOSError(osLastError()) selector.updateHandle(client_socket, {Event.Read}) var rc2 = selector.select(100) assert(len(rc2) == 1) var read_count = posix.recv(server2_socket, addr (buffer[0]), 128, 0) if read_count == -1: raiseOSError(osLastError()) assert(read_count == len(client_message)) var test1 = true for i in 0..