2020-05-08 20:10:06 +00:00
|
|
|
{.used.}
|
|
|
|
|
2020-09-15 20:19:22 +00:00
|
|
|
import unittest, options
|
2019-12-04 04:44:54 +00:00
|
|
|
import chronos
|
2020-05-23 19:26:25 +00:00
|
|
|
import stew/byteutils
|
2020-03-26 06:06:47 +00:00
|
|
|
import nimcrypto/sysrand
|
2020-04-21 01:24:42 +00:00
|
|
|
import ../libp2p/[errors,
|
|
|
|
switch,
|
2019-09-30 15:48:40 +00:00
|
|
|
multistream,
|
2020-05-23 19:26:25 +00:00
|
|
|
standard_setup,
|
2020-04-21 01:24:42 +00:00
|
|
|
stream/bufferstream,
|
2020-06-19 17:29:43 +00:00
|
|
|
stream/connection,
|
2019-10-29 18:51:48 +00:00
|
|
|
multiaddress,
|
2019-09-30 15:48:40 +00:00
|
|
|
peerinfo,
|
2019-10-29 18:51:48 +00:00
|
|
|
crypto/crypto,
|
|
|
|
protocols/protocol,
|
2019-09-30 15:48:40 +00:00
|
|
|
muxers/muxer,
|
2020-03-27 14:25:52 +00:00
|
|
|
stream/lpstream]
|
2020-05-08 20:10:06 +00:00
|
|
|
import ./helpers
|
2019-10-29 18:51:48 +00:00
|
|
|
|
2020-04-21 01:24:42 +00:00
|
|
|
const
|
|
|
|
TestCodec = "/test/proto/1.0.0"
|
2019-08-31 17:58:49 +00:00
|
|
|
|
|
|
|
type
|
|
|
|
TestProto = ref object of LPProtocol
|
|
|
|
|
2019-12-23 18:44:51 +00:00
|
|
|
suite "Switch":
|
2020-04-21 01:24:42 +00:00
|
|
|
teardown:
|
2020-09-21 17:48:19 +00:00
|
|
|
checkTrackers()
|
2020-04-21 01:24:42 +00:00
|
|
|
|
2019-12-23 18:44:51 +00:00
|
|
|
test "e2e use switch dial proto string":
|
2020-05-25 14:40:39 +00:00
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
let done = newFuture[void]()
|
|
|
|
proc handle(conn: Connection, proto: string) {.async, gcsafe.} =
|
|
|
|
try:
|
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
|
|
|
check "Hello!" == msg
|
|
|
|
await conn.writeLp("Hello!")
|
|
|
|
finally:
|
|
|
|
await conn.close()
|
|
|
|
done.complete()
|
|
|
|
|
|
|
|
let testProto = new TestProto
|
|
|
|
testProto.codec = TestCodec
|
|
|
|
testProto.handler = handle
|
|
|
|
|
2020-06-20 10:56:55 +00:00
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
2020-05-25 14:40:39 +00:00
|
|
|
switch1.mount(testProto)
|
|
|
|
|
2020-06-20 10:56:55 +00:00
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
2020-05-25 14:40:39 +00:00
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
|
|
|
|
|
|
|
let conn = await switch2.dial(switch1.peerInfo, TestCodec)
|
2020-07-17 15:36:48 +00:00
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-25 14:40:39 +00:00
|
|
|
await conn.writeLp("Hello!")
|
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
|
|
|
check "Hello!" == msg
|
|
|
|
await conn.close()
|
|
|
|
|
2020-06-02 23:53:38 +00:00
|
|
|
await allFuturesThrowing(
|
|
|
|
done.wait(5.seconds),
|
2020-05-25 14:40:39 +00:00
|
|
|
switch1.stop(),
|
2020-06-02 23:53:38 +00:00
|
|
|
switch2.stop())
|
2020-05-25 14:40:39 +00:00
|
|
|
|
|
|
|
# this needs to go at end
|
2020-06-02 23:53:38 +00:00
|
|
|
await allFuturesThrowing(awaiters)
|
2020-05-25 14:40:39 +00:00
|
|
|
|
2020-07-17 15:36:48 +00:00
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
2020-10-02 14:59:15 +00:00
|
|
|
|
|
|
|
waitFor(testSwitch())
|
|
|
|
|
|
|
|
test "e2e use switch dial proto string with custom matcher":
|
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
let done = newFuture[void]()
|
|
|
|
proc handle(conn: Connection, proto: string) {.async, gcsafe.} =
|
|
|
|
try:
|
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
|
|
|
check "Hello!" == msg
|
|
|
|
await conn.writeLp("Hello!")
|
|
|
|
finally:
|
|
|
|
await conn.close()
|
|
|
|
done.complete()
|
|
|
|
|
|
|
|
let testProto = new TestProto
|
|
|
|
testProto.codec = TestCodec
|
|
|
|
testProto.handler = handle
|
|
|
|
|
|
|
|
let callProto = TestCodec & "/pew"
|
|
|
|
|
|
|
|
proc match(proto: string): bool {.gcsafe.} =
|
|
|
|
return proto == callProto
|
|
|
|
|
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
|
|
|
switch1.mount(testProto, match)
|
|
|
|
|
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
|
|
|
|
|
|
|
let conn = await switch2.dial(switch1.peerInfo, callProto)
|
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
await conn.writeLp("Hello!")
|
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
|
|
|
check "Hello!" == msg
|
|
|
|
await conn.close()
|
|
|
|
|
|
|
|
await allFuturesThrowing(
|
|
|
|
done.wait(5.seconds),
|
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop())
|
|
|
|
|
|
|
|
# this needs to go at end
|
|
|
|
await allFuturesThrowing(awaiters)
|
|
|
|
|
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
2020-07-17 15:36:48 +00:00
|
|
|
|
2020-05-25 14:40:39 +00:00
|
|
|
waitFor(testSwitch())
|
|
|
|
|
|
|
|
test "e2e should not leak bufferstreams and connections on channel close":
|
2020-05-20 00:14:15 +00:00
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
2020-04-21 01:24:42 +00:00
|
|
|
let done = newFuture[void]()
|
2020-03-27 14:25:52 +00:00
|
|
|
proc handle(conn: Connection, proto: string) {.async, gcsafe.} =
|
2020-05-23 19:26:25 +00:00
|
|
|
try:
|
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
|
|
|
check "Hello!" == msg
|
|
|
|
await conn.writeLp("Hello!")
|
|
|
|
finally:
|
|
|
|
await conn.close()
|
|
|
|
done.complete()
|
2020-03-27 14:25:52 +00:00
|
|
|
|
2019-09-04 22:00:39 +00:00
|
|
|
let testProto = new TestProto
|
|
|
|
testProto.codec = TestCodec
|
2020-03-27 14:25:52 +00:00
|
|
|
testProto.handler = handle
|
2020-05-23 19:26:25 +00:00
|
|
|
|
2020-06-20 10:56:55 +00:00
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
2019-08-31 17:58:49 +00:00
|
|
|
switch1.mount(testProto)
|
2020-03-27 14:25:52 +00:00
|
|
|
|
2020-06-20 10:56:55 +00:00
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
2020-05-23 19:26:25 +00:00
|
|
|
var awaiters: seq[Future[void]]
|
2020-02-12 14:43:42 +00:00
|
|
|
awaiters.add(await switch1.start())
|
2020-01-07 08:06:27 +00:00
|
|
|
awaiters.add(await switch2.start())
|
2020-03-27 14:25:52 +00:00
|
|
|
|
2019-09-30 15:48:40 +00:00
|
|
|
let conn = await switch2.dial(switch1.peerInfo, TestCodec)
|
2020-07-17 15:36:48 +00:00
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-20 00:14:15 +00:00
|
|
|
await conn.writeLp("Hello!")
|
2020-05-23 19:26:25 +00:00
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
2020-05-20 00:14:15 +00:00
|
|
|
check "Hello!" == msg
|
2020-05-23 19:26:25 +00:00
|
|
|
await conn.close()
|
|
|
|
|
2020-06-02 23:53:38 +00:00
|
|
|
await allFuturesThrowing(
|
|
|
|
done.wait(5.seconds),
|
2020-04-21 01:24:42 +00:00
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop(),
|
|
|
|
)
|
|
|
|
|
|
|
|
# this needs to go at end
|
2020-06-02 23:53:38 +00:00
|
|
|
await allFuturesThrowing(awaiters)
|
2019-08-31 17:58:49 +00:00
|
|
|
|
2020-07-17 15:36:48 +00:00
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-20 00:14:15 +00:00
|
|
|
waitFor(testSwitch())
|
2019-12-23 18:44:51 +00:00
|
|
|
|
2020-05-23 19:26:25 +00:00
|
|
|
test "e2e use connect then dial":
|
2020-05-14 15:19:03 +00:00
|
|
|
proc testSwitch(): Future[bool] {.async, gcsafe.} =
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
|
|
|
|
proc handle(conn: Connection, proto: string) {.async, gcsafe.} =
|
2020-05-23 19:26:25 +00:00
|
|
|
try:
|
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
|
|
|
check "Hello!" == msg
|
|
|
|
finally:
|
|
|
|
await conn.writeLp("Hello!")
|
|
|
|
await conn.close()
|
2020-05-14 15:19:03 +00:00
|
|
|
|
|
|
|
let testProto = new TestProto
|
|
|
|
testProto.codec = TestCodec
|
|
|
|
testProto.handler = handle
|
2020-05-23 19:26:25 +00:00
|
|
|
|
2020-06-20 10:56:55 +00:00
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
2020-05-14 15:19:03 +00:00
|
|
|
switch1.mount(testProto)
|
|
|
|
|
2020-06-20 10:56:55 +00:00
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
2020-05-14 15:19:03 +00:00
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
2020-05-23 19:26:25 +00:00
|
|
|
|
2020-05-14 15:19:03 +00:00
|
|
|
await switch2.connect(switch1.peerInfo)
|
|
|
|
let conn = await switch2.dial(switch1.peerInfo, TestCodec)
|
|
|
|
|
2020-07-17 15:36:48 +00:00
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-14 15:19:03 +00:00
|
|
|
try:
|
|
|
|
await conn.writeLp("Hello!")
|
2020-05-23 19:26:25 +00:00
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
2020-05-14 15:19:03 +00:00
|
|
|
check "Hello!" == msg
|
|
|
|
result = true
|
|
|
|
except LPStreamError:
|
|
|
|
result = false
|
|
|
|
|
2020-06-02 23:53:38 +00:00
|
|
|
await allFuturesThrowing(
|
2020-05-14 15:19:03 +00:00
|
|
|
conn.close(),
|
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop()
|
|
|
|
)
|
2020-06-02 23:53:38 +00:00
|
|
|
await allFuturesThrowing(awaiters)
|
2020-05-14 15:19:03 +00:00
|
|
|
|
2020-07-17 15:36:48 +00:00
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-14 15:19:03 +00:00
|
|
|
check:
|
|
|
|
waitFor(testSwitch()) == true
|
2020-03-26 06:06:47 +00:00
|
|
|
|
2020-05-23 19:26:25 +00:00
|
|
|
test "e2e should not leak on peer disconnect":
|
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
|
2020-06-20 10:56:55 +00:00
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
2020-05-23 19:26:25 +00:00
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
2020-06-19 17:29:43 +00:00
|
|
|
|
2020-05-23 19:26:25 +00:00
|
|
|
await switch2.connect(switch1.peerInfo)
|
|
|
|
|
2020-07-17 15:36:48 +00:00
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
2020-06-02 17:32:42 +00:00
|
|
|
|
2020-05-23 19:26:25 +00:00
|
|
|
await sleepAsync(100.millis)
|
|
|
|
await switch2.disconnect(switch1.peerInfo)
|
|
|
|
await sleepAsync(2.seconds)
|
2020-07-17 15:36:48 +00:00
|
|
|
|
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-23 19:26:25 +00:00
|
|
|
var bufferTracker = getTracker(BufferStreamTrackerName)
|
|
|
|
# echo bufferTracker.dump()
|
|
|
|
check bufferTracker.isLeaked() == false
|
|
|
|
|
2020-07-17 15:36:48 +00:00
|
|
|
var connTracker = getTracker(ConnectionTrackerName)
|
2020-05-23 19:26:25 +00:00
|
|
|
# echo connTracker.dump()
|
2020-07-17 15:36:48 +00:00
|
|
|
check connTracker.isLeaked() == false
|
2020-06-02 17:32:42 +00:00
|
|
|
|
2020-06-02 23:53:38 +00:00
|
|
|
await allFuturesThrowing(
|
2020-05-23 19:26:25 +00:00
|
|
|
switch1.stop(),
|
2020-06-02 23:53:38 +00:00
|
|
|
switch2.stop())
|
|
|
|
await allFuturesThrowing(awaiters)
|
2020-05-23 19:26:25 +00:00
|
|
|
|
|
|
|
waitFor(testSwitch())
|
2020-07-24 19:24:31 +00:00
|
|
|
|
2020-09-15 20:19:22 +00:00
|
|
|
test "e2e should trigger connection events (remote)":
|
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
|
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
|
|
|
|
var step = 0
|
|
|
|
var kinds: set[ConnEventKind]
|
|
|
|
proc hook(peerId: PeerID, event: ConnEvent) {.async, gcsafe.} =
|
|
|
|
kinds = kinds + {event.kind}
|
|
|
|
case step:
|
|
|
|
of 0:
|
|
|
|
check:
|
|
|
|
event.kind == ConnEventKind.Connected
|
|
|
|
peerId == switch1.peerInfo.peerId
|
|
|
|
of 1:
|
|
|
|
check:
|
|
|
|
event.kind == ConnEventKind.Disconnected
|
|
|
|
|
|
|
|
check peerId == switch1.peerInfo.peerId
|
|
|
|
else:
|
|
|
|
check false
|
|
|
|
|
|
|
|
step.inc()
|
|
|
|
|
|
|
|
switch2.addConnEventHandler(hook, ConnEventKind.Connected)
|
|
|
|
switch2.addConnEventHandler(hook, ConnEventKind.Disconnected)
|
|
|
|
|
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
|
|
|
|
|
|
|
await switch2.connect(switch1.peerInfo)
|
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
await sleepAsync(100.millis)
|
|
|
|
await switch2.disconnect(switch1.peerInfo)
|
|
|
|
await sleepAsync(2.seconds)
|
|
|
|
|
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
var bufferTracker = getTracker(BufferStreamTrackerName)
|
|
|
|
# echo bufferTracker.dump()
|
|
|
|
check bufferTracker.isLeaked() == false
|
|
|
|
|
|
|
|
var connTracker = getTracker(ConnectionTrackerName)
|
|
|
|
# echo connTracker.dump()
|
|
|
|
check connTracker.isLeaked() == false
|
|
|
|
|
|
|
|
check:
|
|
|
|
kinds == {
|
|
|
|
ConnEventKind.Connected,
|
|
|
|
ConnEventKind.Disconnected
|
|
|
|
}
|
|
|
|
|
|
|
|
await allFuturesThrowing(
|
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop())
|
|
|
|
await allFuturesThrowing(awaiters)
|
|
|
|
|
|
|
|
waitFor(testSwitch())
|
|
|
|
|
|
|
|
test "e2e should trigger connection events (local)":
|
2020-07-24 19:24:31 +00:00
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
|
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
|
|
|
|
var step = 0
|
2020-08-08 06:52:20 +00:00
|
|
|
var kinds: set[ConnEventKind]
|
|
|
|
proc hook(peerId: PeerID, event: ConnEvent) {.async, gcsafe.} =
|
|
|
|
kinds = kinds + {event.kind}
|
2020-07-24 19:24:31 +00:00
|
|
|
case step:
|
|
|
|
of 0:
|
|
|
|
check:
|
2020-08-08 06:52:20 +00:00
|
|
|
event.kind == ConnEventKind.Connected
|
|
|
|
peerId == switch2.peerInfo.peerId
|
|
|
|
of 1:
|
2020-07-24 19:24:31 +00:00
|
|
|
check:
|
2020-08-08 06:52:20 +00:00
|
|
|
event.kind == ConnEventKind.Disconnected
|
2020-07-24 19:24:31 +00:00
|
|
|
|
2020-08-08 06:52:20 +00:00
|
|
|
check peerId == switch2.peerInfo.peerId
|
2020-07-24 19:24:31 +00:00
|
|
|
else:
|
|
|
|
check false
|
|
|
|
|
|
|
|
step.inc()
|
|
|
|
|
2020-08-08 06:52:20 +00:00
|
|
|
switch1.addConnEventHandler(hook, ConnEventKind.Connected)
|
|
|
|
switch1.addConnEventHandler(hook, ConnEventKind.Disconnected)
|
2020-07-24 19:24:31 +00:00
|
|
|
|
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
|
|
|
|
|
|
|
await switch2.connect(switch1.peerInfo)
|
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
await sleepAsync(100.millis)
|
|
|
|
await switch2.disconnect(switch1.peerInfo)
|
|
|
|
await sleepAsync(2.seconds)
|
|
|
|
|
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
var bufferTracker = getTracker(BufferStreamTrackerName)
|
|
|
|
# echo bufferTracker.dump()
|
|
|
|
check bufferTracker.isLeaked() == false
|
|
|
|
|
|
|
|
var connTracker = getTracker(ConnectionTrackerName)
|
|
|
|
# echo connTracker.dump()
|
|
|
|
check connTracker.isLeaked() == false
|
|
|
|
|
|
|
|
check:
|
2020-08-08 06:52:20 +00:00
|
|
|
kinds == {
|
|
|
|
ConnEventKind.Connected,
|
|
|
|
ConnEventKind.Disconnected
|
2020-07-24 19:24:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
await allFuturesThrowing(
|
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop())
|
|
|
|
await allFuturesThrowing(awaiters)
|
|
|
|
|
|
|
|
waitFor(testSwitch())
|
2020-09-15 20:19:22 +00:00
|
|
|
|
|
|
|
test "e2e should trigger peer events (remote)":
|
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
|
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
|
|
|
|
var step = 0
|
|
|
|
var kinds: set[PeerEvent]
|
|
|
|
proc handler(peerId: PeerID, event: PeerEvent) {.async, gcsafe.} =
|
|
|
|
kinds = kinds + {event}
|
|
|
|
case step:
|
|
|
|
of 0:
|
|
|
|
check:
|
|
|
|
event == PeerEvent.Joined
|
|
|
|
peerId == switch2.peerInfo.peerId
|
|
|
|
of 1:
|
|
|
|
check:
|
|
|
|
event == PeerEvent.Left
|
|
|
|
peerId == switch2.peerInfo.peerId
|
|
|
|
else:
|
|
|
|
check false
|
|
|
|
|
|
|
|
step.inc()
|
|
|
|
|
|
|
|
switch1.addPeerEventHandler(handler, PeerEvent.Joined)
|
|
|
|
switch1.addPeerEventHandler(handler, PeerEvent.Left)
|
|
|
|
|
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
|
|
|
|
|
|
|
await switch2.connect(switch1.peerInfo)
|
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
await sleepAsync(100.millis)
|
|
|
|
await switch2.disconnect(switch1.peerInfo)
|
|
|
|
await sleepAsync(2.seconds)
|
|
|
|
|
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
var bufferTracker = getTracker(BufferStreamTrackerName)
|
|
|
|
# echo bufferTracker.dump()
|
|
|
|
check bufferTracker.isLeaked() == false
|
|
|
|
|
|
|
|
var connTracker = getTracker(ConnectionTrackerName)
|
|
|
|
# echo connTracker.dump()
|
|
|
|
check connTracker.isLeaked() == false
|
|
|
|
|
|
|
|
check:
|
|
|
|
kinds == {
|
|
|
|
PeerEvent.Joined,
|
|
|
|
PeerEvent.Left
|
|
|
|
}
|
|
|
|
|
|
|
|
await allFuturesThrowing(
|
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop())
|
|
|
|
await allFuturesThrowing(awaiters)
|
|
|
|
|
|
|
|
waitFor(testSwitch())
|
|
|
|
|
|
|
|
test "e2e should trigger peer events (local)":
|
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
|
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
|
|
|
|
var step = 0
|
|
|
|
var kinds: set[PeerEvent]
|
|
|
|
proc handler(peerId: PeerID, event: PeerEvent) {.async, gcsafe.} =
|
|
|
|
kinds = kinds + {event}
|
|
|
|
case step:
|
|
|
|
of 0:
|
|
|
|
check:
|
|
|
|
event == PeerEvent.Joined
|
|
|
|
peerId == switch1.peerInfo.peerId
|
|
|
|
of 1:
|
|
|
|
check:
|
|
|
|
event == PeerEvent.Left
|
|
|
|
peerId == switch1.peerInfo.peerId
|
|
|
|
else:
|
|
|
|
check false
|
|
|
|
|
|
|
|
step.inc()
|
|
|
|
|
|
|
|
switch2.addPeerEventHandler(handler, PeerEvent.Joined)
|
|
|
|
switch2.addPeerEventHandler(handler, PeerEvent.Left)
|
|
|
|
|
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
|
|
|
|
|
|
|
await switch2.connect(switch1.peerInfo)
|
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
await sleepAsync(100.millis)
|
|
|
|
await switch2.disconnect(switch1.peerInfo)
|
|
|
|
await sleepAsync(2.seconds)
|
|
|
|
|
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
var bufferTracker = getTracker(BufferStreamTrackerName)
|
|
|
|
# echo bufferTracker.dump()
|
|
|
|
check bufferTracker.isLeaked() == false
|
|
|
|
|
|
|
|
var connTracker = getTracker(ConnectionTrackerName)
|
|
|
|
# echo connTracker.dump()
|
|
|
|
check connTracker.isLeaked() == false
|
|
|
|
|
|
|
|
check:
|
|
|
|
kinds == {
|
|
|
|
PeerEvent.Joined,
|
|
|
|
PeerEvent.Left
|
|
|
|
}
|
|
|
|
|
|
|
|
await allFuturesThrowing(
|
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop())
|
|
|
|
await allFuturesThrowing(awaiters)
|
|
|
|
|
|
|
|
waitFor(testSwitch())
|
|
|
|
|
|
|
|
test "e2e should trigger peer events only once per peer":
|
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
|
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
|
|
|
|
let rng = newRng()
|
|
|
|
# use same private keys to emulate two connection from same peer
|
|
|
|
let privKey = PrivateKey.random(rng[]).tryGet()
|
|
|
|
let switch2 = newStandardSwitch(
|
|
|
|
privKey = some(privKey),
|
|
|
|
rng = rng,
|
|
|
|
secureManagers = [SecureProtocol.Secio])
|
|
|
|
|
|
|
|
let switch3 = newStandardSwitch(
|
|
|
|
privKey = some(privKey),
|
|
|
|
rng = rng,
|
|
|
|
secureManagers = [SecureProtocol.Secio])
|
|
|
|
|
|
|
|
var step = 0
|
|
|
|
var kinds: set[PeerEvent]
|
|
|
|
proc handler(peerId: PeerID, event: PeerEvent) {.async, gcsafe.} =
|
|
|
|
kinds = kinds + {event}
|
|
|
|
case step:
|
|
|
|
of 0:
|
|
|
|
check:
|
|
|
|
event == PeerEvent.Joined
|
|
|
|
of 1:
|
|
|
|
check:
|
|
|
|
event == PeerEvent.Left
|
|
|
|
else:
|
|
|
|
check false # should not trigger this
|
|
|
|
|
|
|
|
step.inc()
|
|
|
|
|
|
|
|
switch1.addPeerEventHandler(handler, PeerEvent.Joined)
|
|
|
|
switch1.addPeerEventHandler(handler, PeerEvent.Left)
|
|
|
|
|
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
|
|
|
awaiters.add(await switch3.start())
|
|
|
|
|
|
|
|
await switch2.connect(switch1.peerInfo) # should trigger 1st Join event
|
|
|
|
await switch3.connect(switch1.peerInfo) # should trigger 2nd Join event
|
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
check switch3.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
await sleepAsync(100.millis)
|
|
|
|
await switch2.disconnect(switch1.peerInfo) # should trigger 1st Left event
|
|
|
|
await switch3.disconnect(switch1.peerInfo) # should trigger 2nd Left event
|
|
|
|
await sleepAsync(2.seconds)
|
|
|
|
|
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
check not switch3.isConnected(switch1.peerInfo)
|
|
|
|
|
|
|
|
var bufferTracker = getTracker(BufferStreamTrackerName)
|
|
|
|
# echo bufferTracker.dump()
|
|
|
|
check bufferTracker.isLeaked() == false
|
|
|
|
|
|
|
|
var connTracker = getTracker(ConnectionTrackerName)
|
|
|
|
# echo connTracker.dump()
|
|
|
|
check connTracker.isLeaked() == false
|
|
|
|
|
|
|
|
check:
|
|
|
|
kinds == {
|
|
|
|
PeerEvent.Joined,
|
|
|
|
PeerEvent.Left
|
|
|
|
}
|
|
|
|
|
|
|
|
await allFuturesThrowing(
|
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop(),
|
|
|
|
switch3.stop())
|
|
|
|
await allFuturesThrowing(awaiters)
|
|
|
|
|
|
|
|
waitFor(testSwitch())
|
2020-11-04 14:24:41 +00:00
|
|
|
|
|
|
|
test "connect to inexistent peer":
|
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
|
|
|
let sfut = await switch2.start()
|
|
|
|
let someAddr = MultiAddress.init("/ip4/127.128.0.99").get()
|
|
|
|
let seckey = PrivateKey.random(ECDSA, rng[]).get()
|
|
|
|
let somePeer = PeerInfo.init(secKey, [someAddr])
|
|
|
|
expect(DialFailedError):
|
|
|
|
let conn = await switch2.dial(somePeer, TestCodec)
|
|
|
|
await switch2.stop()
|
|
|
|
|
|
|
|
waitFor(testSwitch())
|