Let the OS choose the port for tests

This commit is contained in:
jangko 2024-01-07 14:40:59 +07:00
parent 31b741720b
commit 20b4c9a0fb
No known key found for this signature in database
GPG Key ID: 31702AE10541E6B9
14 changed files with 73 additions and 46 deletions

View File

@ -78,6 +78,11 @@ proc connect*(client: RpcSocketClient, address: string, port: Port) {.async.} =
client.address = addresses[0] client.address = addresses[0]
client.loop = processData(client) client.loop = processData(client)
proc connect*(client: RpcSocketClient, address: TransportAddress) {.async.} =
client.transport = await connect(address)
client.address = address
client.loop = processData(client)
method close*(client: RpcSocketClient) {.async.} = method close*(client: RpcSocketClient) {.async.} =
await client.loop.cancelAndWait() await client.loop.cancelAndWait()
if not client.transport.isNil: if not client.transport.isNil:

View File

@ -127,4 +127,7 @@ proc stop*(proxy: RpcProxy) {.async.} =
proc closeWait*(proxy: RpcProxy) {.async.} = proc closeWait*(proxy: RpcProxy) {.async.} =
await proxy.rpcHttpServer.closeWait() await proxy.rpcHttpServer.closeWait()
func localAddress*(proxy: RpcProxy): seq[TransportAddress] =
proxy.rpcHttpServer.localAddress()
{.pop.} {.pop.}

View File

@ -291,3 +291,7 @@ proc closeWait*(server: RpcHttpServer) {.async.} =
## Cleanup resources of RPC server. ## Cleanup resources of RPC server.
for item in server.httpServers: for item in server.httpServers:
await item.closeWait() await item.closeWait()
proc localAddress*(server: RpcHttpServer): seq[TransportAddress] =
for item in server.httpServers:
result.add item.instance.localAddress()

View File

@ -174,3 +174,7 @@ proc closeWait*(server: RpcSocketServer) {.async.} =
## Cleanup resources of RPC server. ## Cleanup resources of RPC server.
for item in server.servers: for item in server.servers:
await item.closeWait() await item.closeWait()
proc localAddress*(server: RpcSocketServer): seq[TransportAddress] =
for x in server.servers:
result.add x.localAddress

View File

@ -206,3 +206,6 @@ proc close*(server: RpcWebSocketServer) =
proc closeWait*(server: RpcWebSocketServer) {.async.} = proc closeWait*(server: RpcWebSocketServer) {.async.} =
## Cleanup resources of RPC server. ## Cleanup resources of RPC server.
await server.server.closeWait() await server.server.closeWait()
proc localAddress*(server: RpcWebSocketServer): TransportAddress =
server.server.localAddress()

View File

@ -79,12 +79,12 @@ proc installHandlers(s: RpcServer) =
return "meow" return "meow"
suite "test callsigs": suite "test callsigs":
var server = newRpcSocketServer(["127.0.0.1:8545"]) var server = newRpcSocketServer(["127.0.0.1:0"])
server.installHandlers() server.installHandlers()
var client = newRpcSocketClient() var client = newRpcSocketClient()
server.start() server.start()
waitFor client.connect("127.0.0.1", Port(8545)) waitFor client.connect(server.localAddress()[0])
test "callsigs from file": test "callsigs from file":
let res = waitFor client.shh_uninstallFilter(123) let res = waitFor client.shh_uninstallFilter(123)

View File

@ -1,3 +1,12 @@
# json-rpc
# Copyright (c) 2023 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
# at your option.
# This file may not be copied, modified, or distributed except according to
# those terms.
import import
unittest2, unittest2,
../json_rpc/router, ../json_rpc/router,

View File

@ -21,7 +21,7 @@ from strutils import rsplit
template sourceDir: string = currentSourcePath.rsplit(DirSep, 1)[0] template sourceDir: string = currentSourcePath.rsplit(DirSep, 1)[0]
var var
server = newRpcSocketServer("localhost", Port(8545)) server = newRpcSocketServer("127.0.0.1", Port(0))
client = newRpcSocketClient() client = newRpcSocketClient()
## Generate Ethereum server RPCs ## Generate Ethereum server RPCs
@ -66,7 +66,7 @@ proc testSigCalls: Future[seq[string]] =
return all(version, sha3) return all(version, sha3)
server.start() server.start()
waitFor client.connect("localhost", Port(8545)) waitFor client.connect(server.localAddress()[0])
suite "Local calls": suite "Local calls":

View File

@ -14,7 +14,7 @@ import
const const
serverHost = "127.0.0.1" serverHost = "127.0.0.1"
serverPort = 8547 serverPort = 0 # let the OS choose the port
serverAddress = serverHost & ":" & $serverPort serverAddress = serverHost & ":" & $serverPort
proc setupServer*(srv: RpcServer) = proc setupServer*(srv: RpcServer) =
@ -37,14 +37,14 @@ suite "HTTP server hook test":
test "no auth token": test "no auth token":
let client = newRpcHttpClient() let client = newRpcHttpClient()
waitFor client.connect(serverHost, Port(serverPort), false) waitFor client.connect("http://" & $srv.localAddress()[0])
expect ErrorResponse: expect ErrorResponse:
let r = waitFor client.call("testHook", %[%"abc"]) let r = waitFor client.call("testHook", %[%"abc"])
discard r discard r
test "good auth token": test "good auth token":
let client = newRpcHttpClient(getHeaders = authHeaders) let client = newRpcHttpClient(getHeaders = authHeaders)
waitFor client.connect(serverHost, Port(serverPort), false) waitFor client.connect("http://" & $srv.localAddress()[0])
let r = waitFor client.call("testHook", %[%"abc"]) let r = waitFor client.call("testHook", %[%"abc"])
check r.string == "\"Hello abc\"" check r.string == "\"Hello abc\""
@ -72,8 +72,8 @@ suite "Websocket server hook test":
return true return true
let srv = newRpcWebSocketServer( let srv = newRpcWebSocketServer(
"127.0.0.1", serverHost,
Port(8545), Port(serverPort),
authHooks = @[WsAuthHook(mockAuth)] authHooks = @[WsAuthHook(mockAuth)]
) )
srv.setupServer() srv.setupServer()
@ -82,13 +82,13 @@ suite "Websocket server hook test":
test "no auth token": test "no auth token":
try: try:
waitFor client.connect("ws://127.0.0.1:8545/") waitFor client.connect("ws://" & $srv.localAddress())
check false check false
except CatchableError as e: except CatchableError as e:
check e.msg == "Server did not reply with a websocket upgrade: Header code: 403 Header reason: Forbidden Address: 127.0.0.1:8545" check e.msg == "Server did not reply with a websocket upgrade: Header code: 403 Header reason: Forbidden Address: " & $srv.localAddress()
test "good auth token": test "good auth token":
waitFor client.connect("ws://127.0.0.1:8545/", hooks = @[hook]) waitFor client.connect("ws://" & $srv.localAddress(), hooks = @[hook])
let r = waitFor client.call("testHook", %[%"abc"]) let r = waitFor client.call("testHook", %[%"abc"])
check r.string == "\"Hello abc\"" check r.string == "\"Hello abc\""

View File

@ -12,26 +12,26 @@ import ../json_rpc/[rpcserver, rpcclient]
const TestsCount = 100 const TestsCount = 100
proc simpleTest(address: string, port: Port): Future[bool] {.async.} = proc simpleTest(address: string): Future[bool] {.async.} =
var client = newRpcHttpClient() var client = newRpcHttpClient()
await client.connect(address, port, secure = false) await client.connect("http://" & address)
var r = await client.call("noParamsProc", %[]) var r = await client.call("noParamsProc", %[])
if r.string == "\"Hello world\"": if r.string == "\"Hello world\"":
result = true result = true
proc continuousTest(address: string, port: Port): Future[int] {.async.} = proc continuousTest(address: string): Future[int] {.async.} =
var client = newRpcHttpClient() var client = newRpcHttpClient()
result = 0 result = 0
for i in 0..<TestsCount: for i in 0..<TestsCount:
await client.connect(address, port, secure = false) await client.connect("http://" & address)
var r = await client.call("myProc", %[%"abc", %[1, 2, 3, i]]) var r = await client.call("myProc", %[%"abc", %[1, 2, 3, i]])
if r.string == "\"Hello abc data: [1, 2, 3, " & $i & "]\"": if r.string == "\"Hello abc data: [1, 2, 3, " & $i & "]\"":
result += 1 result += 1
await client.close() await client.close()
proc invalidTest(address: string, port: Port): Future[bool] {.async.} = proc invalidTest(address: string): Future[bool] {.async.} =
var client = newRpcHttpClient() var client = newRpcHttpClient()
await client.connect(address, port, secure = false) await client.connect("http://" & address)
var invalidA, invalidB: bool var invalidA, invalidB: bool
try: try:
var r = await client.call("invalidProcA", %[]) var r = await client.call("invalidProcA", %[])
@ -46,7 +46,7 @@ proc invalidTest(address: string, port: Port): Future[bool] {.async.} =
if invalidA and invalidB: if invalidA and invalidB:
result = true result = true
var httpsrv = newRpcHttpServer(["127.0.0.1:8545"]) var httpsrv = newRpcHttpServer(["127.0.0.1:0"])
# Create RPC on server # Create RPC on server
httpsrv.rpc("myProc") do(input: string, data: array[0..3, int]): httpsrv.rpc("myProc") do(input: string, data: array[0..3, int]):
@ -58,11 +58,11 @@ httpsrv.start()
suite "JSON-RPC test suite": suite "JSON-RPC test suite":
test "Simple RPC call": test "Simple RPC call":
check waitFor(simpleTest("127.0.0.1", Port(8545))) == true check waitFor(simpleTest($httpsrv.localAddress()[0])) == true
test "Continuous RPC calls (" & $TestsCount & " messages)": test "Continuous RPC calls (" & $TestsCount & " messages)":
check waitFor(continuousTest("127.0.0.1", Port(8545))) == TestsCount check waitFor(continuousTest($httpsrv.localAddress()[0])) == TestsCount
test "Invalid RPC calls": test "Invalid RPC calls":
check waitFor(invalidTest("127.0.0.1", Port(8545))) == true check waitFor(invalidTest($httpsrv.localAddress()[0])) == true
waitFor httpsrv.stop() waitFor httpsrv.stop()
waitFor httpsrv.closeWait() waitFor httpsrv.closeWait()

View File

@ -73,26 +73,26 @@ N8r5CwGcIX/XPC3lKazzbZ8baA==
-----END CERTIFICATE----- -----END CERTIFICATE-----
""" """
proc simpleTest(address: string, port: Port): Future[bool] {.async.} = proc simpleTest(address: string): Future[bool] {.async.} =
var client = newRpcHttpClient(secure=true) var client = newRpcHttpClient(secure=true)
await client.connect(address, port, secure=true) await client.connect("https://" & address)
var r = await client.call("noParamsProc", %[]) var r = await client.call("noParamsProc", %[])
if r.string == "\"Hello world\"": if r.string == "\"Hello world\"":
result = true result = true
proc continuousTest(address: string, port: Port): Future[int] {.async.} = proc continuousTest(address: string): Future[int] {.async.} =
var client = newRpcHttpClient(secure=true) var client = newRpcHttpClient(secure=true)
result = 0 result = 0
for i in 0..<TestsCount: for i in 0..<TestsCount:
await client.connect(address, port, secure=true) await client.connect("https://" & address)
var r = await client.call("myProc", %[%"abc", %[1, 2, 3, i]]) var r = await client.call("myProc", %[%"abc", %[1, 2, 3, i]])
if r.string == "\"Hello abc data: [1, 2, 3, " & $i & "]\"": if r.string == "\"Hello abc data: [1, 2, 3, " & $i & "]\"":
result += 1 result += 1
await client.close() await client.close()
proc invalidTest(address: string, port: Port): Future[bool] {.async.} = proc invalidTest(address: string): Future[bool] {.async.} =
var client = newRpcHttpClient(secure=true) var client = newRpcHttpClient(secure=true)
await client.connect(address, port, secure=true) await client.connect("https://" & address)
var invalidA, invalidB: bool var invalidA, invalidB: bool
try: try:
var r = await client.call("invalidProcA", %[]) var r = await client.call("invalidProcA", %[])
@ -111,7 +111,7 @@ let secureKey = TLSPrivateKey.init(HttpsSelfSignedRsaKey)
let secureCert = TLSCertificate.init(HttpsSelfSignedRsaCert) let secureCert = TLSCertificate.init(HttpsSelfSignedRsaCert)
var secureHttpSrv = RpcHttpServer.new() var secureHttpSrv = RpcHttpServer.new()
secureHttpSrv.addSecureHttpServer("127.0.0.1:8545", secureKey, secureCert) secureHttpSrv.addSecureHttpServer("127.0.0.1:0", secureKey, secureCert)
# Create RPC on server # Create RPC on server
secureHttpSrv.rpc("myProc") do(input: string, data: array[0..3, int]): secureHttpSrv.rpc("myProc") do(input: string, data: array[0..3, int]):
@ -123,11 +123,11 @@ secureHttpSrv.start()
suite "JSON-RPC test suite": suite "JSON-RPC test suite":
test "Simple RPC call": test "Simple RPC call":
check waitFor(simpleTest("127.0.0.1", Port(8545))) == true check waitFor(simpleTest($secureHttpSrv.localAddress()[0])) == true
test "Continuous RPC calls (" & $TestsCount & " messages)": test "Continuous RPC calls (" & $TestsCount & " messages)":
check waitFor(continuousTest("127.0.0.1", Port(8545))) == TestsCount check waitFor(continuousTest($secureHttpSrv.localAddress()[0])) == TestsCount
test "Invalid RPC calls": test "Invalid RPC calls":
check waitFor(invalidTest("127.0.0.1", Port(8545))) == true check waitFor(invalidTest($secureHttpSrv.localAddress()[0])) == true
waitFor secureHttpSrv.stop() waitFor secureHttpSrv.stop()
waitFor secureHttpSrv.closeWait() waitFor secureHttpSrv.closeWait()

View File

@ -11,9 +11,8 @@ import
unittest2, chronicles, unittest2, chronicles,
../json_rpc/[rpcclient, rpcserver, rpcproxy] ../json_rpc/[rpcclient, rpcserver, rpcproxy]
let srvAddress = initTAddress("127.0.0.1", Port(8545)) let srvAddress = initTAddress("127.0.0.1", Port(0))
let proxySrvAddress = "127.0.0.1:8546" let proxySrvAddress = "127.0.0.1:0"
let proxySrvAddressForClient = "http://"&proxySrvAddress
template registerMethods(srv: RpcServer, proxy: RpcProxy) = template registerMethods(srv: RpcServer, proxy: RpcProxy) =
srv.rpc("myProc") do(input: string, data: array[0..3, int]): srv.rpc("myProc") do(input: string, data: array[0..3, int]):
@ -27,14 +26,14 @@ template registerMethods(srv: RpcServer, proxy: RpcProxy) =
suite "Proxy RPC through http": suite "Proxy RPC through http":
var srv = newRpcHttpServer([srvAddress]) var srv = newRpcHttpServer([srvAddress])
var proxy = RpcProxy.new([proxySrvAddress], getHttpClientConfig("http://127.0.0.1:8545")) var proxy = RpcProxy.new([proxySrvAddress], getHttpClientConfig("http://" & $srv.localAddress()[0]))
var client = newRpcHttpClient() var client = newRpcHttpClient()
registerMethods(srv, proxy) registerMethods(srv, proxy)
srv.start() srv.start()
waitFor proxy.start() waitFor proxy.start()
waitFor client.connect(proxySrvAddressForClient) waitFor client.connect("http://" & $proxy.localAddress()[0])
test "Successful RPC call thorugh proxy": test "Successful RPC call thorugh proxy":
let r = waitFor client.call("myProc", %[%"abc", %[1, 2, 3, 4]]) let r = waitFor client.call("myProc", %[%"abc", %[1, 2, 3, 4]])
@ -56,14 +55,14 @@ suite "Proxy RPC through http":
suite "Proxy RPC through websockets": suite "Proxy RPC through websockets":
var srv = newRpcWebSocketServer(srvAddress) var srv = newRpcWebSocketServer(srvAddress)
var proxy = RpcProxy.new([proxySrvAddress], getWebSocketClientConfig("ws://127.0.0.1:8545")) var proxy = RpcProxy.new([proxySrvAddress], getWebSocketClientConfig("ws://" & $srv.localAddress()))
var client = newRpcHttpClient() var client = newRpcHttpClient()
registerMethods(srv, proxy) registerMethods(srv, proxy)
srv.start() srv.start()
waitFor proxy.start() waitFor proxy.start()
waitFor client.connect(proxySrvAddressForClient) waitFor client.connect("http://" & $proxy.localAddress()[0])
test "Successful RPC call thorugh proxy": test "Successful RPC call thorugh proxy":
let r = waitFor client.call("myProc", %[%"abc", %[1, 2, 3, 4]]) let r = waitFor client.call("myProc", %[%"abc", %[1, 2, 3, 4]])

View File

@ -64,7 +64,7 @@ let
}, },
"c": %1.0} "c": %1.0}
var s = newRpcSocketServer(["127.0.0.1:8545"]) var s = newRpcSocketServer(["127.0.0.1:0"])
# RPC definitions # RPC definitions
s.rpc("rpc.simplePath"): s.rpc("rpc.simplePath"):

View File

@ -23,12 +23,12 @@ proc setupServer*(srv: RpcServer) =
raise (ref InvalidRequest)(code: -32001, msg: "Unknown payload") raise (ref InvalidRequest)(code: -32001, msg: "Unknown payload")
suite "Socket Server/Client RPC": suite "Socket Server/Client RPC":
var srv = newRpcSocketServer(["127.0.0.1:8545"]) var srv = newRpcSocketServer(["127.0.0.1:0"])
var client = newRpcSocketClient() var client = newRpcSocketClient()
srv.setupServer() srv.setupServer()
srv.start() srv.start()
waitFor client.connect("127.0.0.1", Port(8545)) waitFor client.connect(srv.localAddress()[0])
test "Successful RPC call": test "Successful RPC call":
let r = waitFor client.call("myProc", %[%"abc", %[1, 2, 3, 4]]) let r = waitFor client.call("myProc", %[%"abc", %[1, 2, 3, 4]])
@ -53,12 +53,12 @@ suite "Socket Server/Client RPC":
waitFor srv.closeWait() waitFor srv.closeWait()
suite "Websocket Server/Client RPC": suite "Websocket Server/Client RPC":
var srv = newRpcWebSocketServer("127.0.0.1", Port(8545)) var srv = newRpcWebSocketServer("127.0.0.1", Port(0))
var client = newRpcWebSocketClient() var client = newRpcWebSocketClient()
srv.setupServer() srv.setupServer()
srv.start() srv.start()
waitFor client.connect("ws://127.0.0.1:8545/") waitFor client.connect("ws://" & $srv.localAddress())
test "Successful RPC call": test "Successful RPC call":
let r = waitFor client.call("myProc", %[%"abc", %[1, 2, 3, 4]]) let r = waitFor client.call("myProc", %[%"abc", %[1, 2, 3, 4]])
@ -83,13 +83,13 @@ suite "Websocket Server/Client RPC":
waitFor srv.closeWait() waitFor srv.closeWait()
suite "Websocket Server/Client RPC with Compression": suite "Websocket Server/Client RPC with Compression":
var srv = newRpcWebSocketServer("127.0.0.1", Port(8545), var srv = newRpcWebSocketServer("127.0.0.1", Port(0),
compression = true) compression = true)
var client = newRpcWebSocketClient() var client = newRpcWebSocketClient()
srv.setupServer() srv.setupServer()
srv.start() srv.start()
waitFor client.connect("ws://127.0.0.1:8545/", waitFor client.connect("ws://" & $srv.localAddress(),
compression = true) compression = true)
test "Successful RPC call": test "Successful RPC call":