diff --git a/libp2p/connection.nim b/libp2p/connection.nim index 740fa7bc0..69ce8f559 100644 --- a/libp2p/connection.nim +++ b/libp2p/connection.nim @@ -22,7 +22,7 @@ proc newConnection*(reader: AsyncStreamReader, writter: AsyncStreamWriter): Conn result.reader = reader result.writter = writter -method read* (c: Connection, size: int = DefaultReadSize): Future[seq[byte]] {.base, async.} = +method read* (c: Connection, size: int = DefaultReadSize): Future[seq[byte]] {.base, async, gcsafe.} = ## read DefaultReadSize (1024) bytes or `size` bytes if specified result = await c.reader.read(size) diff --git a/libp2p/tcptransport.nim b/libp2p/tcptransport.nim index 6e062f96e..93fbbf65a 100644 --- a/libp2p/tcptransport.nim +++ b/libp2p/tcptransport.nim @@ -39,21 +39,22 @@ method listen*(t: TcpTransport): Future[void] {.async.} = let listenFuture: Future[void] = newFuture[void]() result = listenFuture - ## listen on the transport - discard createStreamServer(t.ma, - connCb, - {}, - t, - asyncInvalidSocket, - 100, - DefaultStreamBufferSize, - nil, - proc (server: StreamServer, - fd: AsyncFD): StreamTransport {.gcsafe.} = + proc initTransport(server: StreamServer, fd: AsyncFD): StreamTransport {.gcsafe.} = t.server = server t.fd = fd listenFuture.complete() - ) + + ## listen on the transport + let server = createStreamServer(t.ma, + connCb, + {}, + t, + asyncInvalidSocket, + 100, + DefaultStreamBufferSize, + nil, + initTransport) + server.start() method dial*(t: TcpTransport, address: MultiAddress): Future[Connection] {.async.} = diff --git a/libp2p/transport.nim b/libp2p/transport.nim index 94d8cc8cc..14d95a12c 100644 --- a/libp2p/transport.nim +++ b/libp2p/transport.nim @@ -27,7 +27,7 @@ method init*(t: Transport) {.base.} = ## perform protocol initialization discard -proc new*(t: typedesc[Transport], +proc newTransport*(t: typedesc[Transport], ma: MultiAddress, handler: ConnHandler): t = new result diff --git a/tests/testmultiaddress.nim b/tests/testmultiaddress.nim index b75676720..78724e80b 100644 --- a/tests/testmultiaddress.nim +++ b/tests/testmultiaddress.nim @@ -361,3 +361,7 @@ suite "MultiAddress test suite": for bitem in item.bad: var a = MultiAddress.init(bitem) check item.pattern.match(a) == false + + test "MultiAddress port": + var maStr = "/ip4/127.0.0.1/tcp/55555" + var ma = MultiAddress.init(maStr) diff --git a/tests/testtransport b/tests/testtransport new file mode 100755 index 000000000..f5ef3782c Binary files /dev/null and b/tests/testtransport differ diff --git a/tests/testtransport.nim b/tests/testtransport.nim new file mode 100644 index 000000000..0b4ad0bed --- /dev/null +++ b/tests/testtransport.nim @@ -0,0 +1,22 @@ +import unittest +import chronos +import ../libp2p/connection, ../libp2p/transport, ../libp2p/tcptransport, + ../libp2p/multiaddress, ../libp2p/wire + +suite "TCP transport suite": + test "test listener": + proc testListener(): Future[bool] {.async.} = + let ma: MultiAddress = Multiaddress.init("/ip4/127.0.0.1/tcp/53335") + proc connHandler(conn: Connection): Future[void] {.gcsafe.} = + let msg = "Hello" + conn.write(msg.cstring, 6) + + let transport: TcpTransport = newTransport(TcpTransport, ma, connHandler) + await transport.listen() + let streamTransport: StreamTransport = await connect(ma) + let msg = await streamTransport.read() + echo "HERE!!!!" + result = cast[string](msg) == "Hello!" + + check: + waitFor(testListener()) == true