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.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.} =
await client.loop.cancelAndWait()
if not client.transport.isNil:

View File

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

View File

@ -291,3 +291,7 @@ proc closeWait*(server: RpcHttpServer) {.async.} =
## Cleanup resources of RPC server.
for item in server.httpServers:
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.
for item in server.servers:
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.} =
## Cleanup resources of RPC server.
await server.server.closeWait()
proc localAddress*(server: RpcWebSocketServer): TransportAddress =
server.server.localAddress()

View File

@ -79,12 +79,12 @@ proc installHandlers(s: RpcServer) =
return "meow"
suite "test callsigs":
var server = newRpcSocketServer(["127.0.0.1:8545"])
var server = newRpcSocketServer(["127.0.0.1:0"])
server.installHandlers()
var client = newRpcSocketClient()
server.start()
waitFor client.connect("127.0.0.1", Port(8545))
waitFor client.connect(server.localAddress()[0])
test "callsigs from file":
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
unittest2,
../json_rpc/router,

View File

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

View File

@ -14,7 +14,7 @@ import
const
serverHost = "127.0.0.1"
serverPort = 8547
serverPort = 0 # let the OS choose the port
serverAddress = serverHost & ":" & $serverPort
proc setupServer*(srv: RpcServer) =
@ -37,14 +37,14 @@ suite "HTTP server hook test":
test "no auth token":
let client = newRpcHttpClient()
waitFor client.connect(serverHost, Port(serverPort), false)
waitFor client.connect("http://" & $srv.localAddress()[0])
expect ErrorResponse:
let r = waitFor client.call("testHook", %[%"abc"])
discard r
test "good auth token":
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"])
check r.string == "\"Hello abc\""
@ -72,8 +72,8 @@ suite "Websocket server hook test":
return true
let srv = newRpcWebSocketServer(
"127.0.0.1",
Port(8545),
serverHost,
Port(serverPort),
authHooks = @[WsAuthHook(mockAuth)]
)
srv.setupServer()
@ -82,13 +82,13 @@ suite "Websocket server hook test":
test "no auth token":
try:
waitFor client.connect("ws://127.0.0.1:8545/")
waitFor client.connect("ws://" & $srv.localAddress())
check false
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":
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"])
check r.string == "\"Hello abc\""

View File

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

View File

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

View File

@ -11,9 +11,8 @@ import
unittest2, chronicles,
../json_rpc/[rpcclient, rpcserver, rpcproxy]
let srvAddress = initTAddress("127.0.0.1", Port(8545))
let proxySrvAddress = "127.0.0.1:8546"
let proxySrvAddressForClient = "http://"&proxySrvAddress
let srvAddress = initTAddress("127.0.0.1", Port(0))
let proxySrvAddress = "127.0.0.1:0"
template registerMethods(srv: RpcServer, proxy: RpcProxy) =
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":
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()
registerMethods(srv, proxy)
srv.start()
waitFor proxy.start()
waitFor client.connect(proxySrvAddressForClient)
waitFor client.connect("http://" & $proxy.localAddress()[0])
test "Successful RPC call thorugh proxy":
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":
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()
registerMethods(srv, proxy)
srv.start()
waitFor proxy.start()
waitFor client.connect(proxySrvAddressForClient)
waitFor client.connect("http://" & $proxy.localAddress()[0])
test "Successful RPC call thorugh proxy":
let r = waitFor client.call("myProc", %[%"abc", %[1, 2, 3, 4]])

View File

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

View File

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