diff --git a/tests/testtorpush.nim b/tests/testtorpush.nim new file mode 100644 index 000000000..f004ab890 --- /dev/null +++ b/tests/testtorpush.nim @@ -0,0 +1,114 @@ +import chronos +import stew/byteutils +import libp2p +import ../libp2p/[stream/connection, + transports/tcptransport, + transports/tortransport, + upgrademngrs/upgrade, + multiaddress, + builders] + +import ./helpers, ./stubs/torstub, ./commontransport + + +## This module tests sending Torpush message over Tor as per following format +#[ + message TorPushMessage { + optional string from = 1; + optional bytes data = 2; + optional bytes seqno = 3; + required string topic = 4; + optional bytes signature = 5; + optional bytes key = 6; +} +]# + + +type + Torpush* = object + frm: string + data: seq[byte] + seqno: seq[byte] + topic: string + signature: seq[byte] + key: seq[byte] + +{.push raises: [].} +proc encode(m: Torpush): ProtoBuffer = + ## encodes the Torpush message into bytes + result = initProtoBuffer() + result.write(1, m.frm) + result.write(2, m.data) + result.write(3, m.seqno) + result.write(4, m.topic) + result.write(5, m.signature) + result.write(6, m.key) + result.finish() + +proc decode(_: type Torpush, buf: seq[byte]): Result[Torpush, ProtoError] = + ## decodes the bytes into Torpush message + var res: Torpush + let pb = initProtoBuffer(buf) + discard ? pb.getField(1, res.frm) + discard ? pb.getField(2, res.data) + discard ? pb.getField(3, res.seqno) + discard ? pb.getField(4, res.topic) + discard ? pb.getField(5, res.signature) + discard ? pb.getField(6, res.key) + ok(res) + +type + TorpushProto = ref object of LPProtocol + +proc new(_: typedesc[TorpushProto]): TorpushProto = + var res: TorpushProto + proc handle(conn: Connection, proto: string) {.async, gcsafe.} = + echo "handling" + var tp: Torpush + tp.topic = "mytor" + let tpbuf = tp.encode() + await conn.writeLp(tpbuf.buffer) + #echo Torpush.decode(await conn.readLp(1024)).value + + await conn.close() + + res = TorpushProto.new(@["/meshsub/1.1.0"], handle) + return res + + +const torServer = initTAddress("127.0.0.1", 9050.Port) + +proc main() {.async, gcsafe.} = + let rng = newRng() + let + torpushProto1 = TorpushProto.new() + torpushProto2 = TorpushProto.new() + torswitch1 = newStandardSwitch(rng=rng) + switch2 = newStandardSwitch(rng=rng) + + #let torclient = TorTransport.new(transportAddress = torServer, upgrade = Upgrade()) + #let torswitch1 = TorSwitch.new(torServer = torServer, rng= rng, flags = {ReuseAddr}) + echo "hi" + torswitch1.mount(torpushProto1) + switch2.mount(torpushProto2) + await switch2.start() + await torswitch1.start() + + #echo torclient.transportAddress, "\n" + #let conn = await torclient.dial("", switch2.peerInfo.addrs[0]) + + let conn = await torswitch1.dial(switch2.peerInfo.peerId, switch2.peerInfo.addrs, torpushProto2.codecs) + + var res = Torpush.decode(await conn.readLp(1024)) + echo res.isOk + echo res.value + #[ + res.value.topic = "yourtor" + let p = res.value.encode() + await conn.writeLp(p.buffer) + #await conn.readLp(1024) + ]# + await conn.close() + await allFutures(torswitch1.stop(), switch2.stop()) # close connections and shutdown all transports + +waitFor(main())