diff --git a/tests/testmultistreamselect.nim b/tests/testmultistreamselect.nim index 49f0271..f8f991f 100644 --- a/tests/testmultistreamselect.nim +++ b/tests/testmultistreamselect.nim @@ -1,9 +1,9 @@ -import unittest, strutils, sequtils +import unittest, strutils, sequtils, sugar import chronos import ../libp2p/connection, ../libp2p/multistreamselect, ../libp2p/readerwriter, ../libp2p/connection -## Stream for select test +## Mock stream for select test type TestSelectStream = ref object of ReadWrite step*: int @@ -34,7 +34,7 @@ proc newTestSelectStream(): TestSelectStream = new result result.step = 1 -## Stream for handles test +## Mock stream for handles test type TestHandlesStream = ref object of ReadWrite step*: int @@ -65,15 +65,54 @@ proc newTestHandlesStream(): TestHandlesStream = new result result.step = 1 -suite "Multistream select": - # test "test select custom proto": - # proc testSelect(): Future[bool] {.async.} = - # let ms = newMultistream() - # let conn = newConnection(newTestSelectStream()) - # result = await ms.select(conn, "/test/proto/1.0.0") +## Mock stream for handles test +type + LsHandler = proc(procs: seq[byte]): Future[void] - # check: - # waitFor(testSelect()) == true + TestLsStream = ref object of ReadWrite + step*: int + ls*: proc(procs: seq[byte]): Future[void] + +method readExactly*(s: TestLsStream, pbytes: pointer, nbytes: int): Future[void] {.async.} = + case s.step: + of 1: + var buf = newSeq[byte](1) + buf[0] = 19 + copyMem(cast[pointer](cast[uint](pbytes)), addr buf[0], buf.len()) + s.step = 2 + of 2: + var buf = "/multistream/1.0.0\n" + copyMem(cast[pointer](cast[uint](pbytes)), addr buf[0], buf.len()) + s.step = 3 + of 3: + var buf = newSeq[byte](1) + buf[0] = 3 + copyMem(cast[pointer](cast[uint](pbytes)), addr buf[0], buf.len()) + s.step = 4 + of 4: + var buf = "ls\n" + copyMem(cast[pointer](cast[uint](pbytes)), addr buf[0], buf.len()) + else: + copyMem(cast[pointer](cast[uint](pbytes)), cstring("\0x3na\n"), "\0x3na\n".len()) + +method write*(s: TestLsStream, msg: seq[byte], msglen = -1) {.async.} = + if s.step == 4: + await s.ls(msg) + +proc newTestLsStream(ls: LsHandler): TestLsStream = + new result + result.ls = ls + result.step = 1 + +suite "Multistream select": + test "test select custom proto": + proc testSelect(): Future[bool] {.async.} = + let ms = newMultistream() + let conn = newConnection(newTestSelectStream()) + result = await ms.select(conn, "/test/proto/1.0.0") + + check: + waitFor(testSelect()) == true test "test handle custom proto": proc testHandle(): Future[bool] {.async.} = @@ -88,4 +127,26 @@ suite "Multistream select": result = true check: - waitFor(testHandle()) == true \ No newline at end of file + waitFor(testHandle()) == true + + test "test handle `ls`": + proc testLs(): Future[bool] {.async.} = + let ms = newMultistream() + + proc testLs(proto: seq[byte]): Future[void] {.async.} + let conn = newConnection(newTestLsStream(testLs)) + + let protos: seq[string] = @["\x13/test/proto1/1.0.0\n", "\x13/test/proto2/1.0.0\n"] + proc testLs(proto: seq[byte]): Future[void] {.async.} = + var strProto: string = cast[string](proto) + check strProto in protos + await conn.close() + + proc testHandler(conn: Connection, proto: string): Future[void] {.async.} = discard + ms.addHandler("/test/proto1/1.0.0", testHandler) + ms.addHandler("/test/proto2/1.0.0", testHandler) + await ms.handle(conn) + result = true + + check: + waitFor(testLs()) == true