2020-05-08 22:10:06 +02:00
|
|
|
{.used.}
|
|
|
|
|
2020-09-15 14:19:22 -06:00
|
|
|
import unittest, options
|
2019-12-03 22:44:54 -06:00
|
|
|
import chronos
|
2020-05-23 13:26:25 -06:00
|
|
|
import stew/byteutils
|
2020-03-26 15:06:47 +09:00
|
|
|
import nimcrypto/sysrand
|
2020-04-21 10:24:42 +09:00
|
|
|
import ../libp2p/[errors,
|
|
|
|
switch,
|
2019-09-30 09:48:40 -06:00
|
|
|
multistream,
|
2020-05-23 13:26:25 -06:00
|
|
|
standard_setup,
|
2020-04-21 10:24:42 +09:00
|
|
|
stream/bufferstream,
|
2020-06-19 11:29:43 -06:00
|
|
|
stream/connection,
|
2019-10-29 20:51:48 +02:00
|
|
|
multiaddress,
|
2019-09-30 09:48:40 -06:00
|
|
|
peerinfo,
|
2019-10-29 20:51:48 +02:00
|
|
|
crypto/crypto,
|
|
|
|
protocols/protocol,
|
2019-09-30 09:48:40 -06:00
|
|
|
muxers/muxer,
|
2020-03-27 08:25:52 -06:00
|
|
|
stream/lpstream]
|
2020-05-08 22:10:06 +02:00
|
|
|
import ./helpers
|
2019-10-29 20:51:48 +02:00
|
|
|
|
2020-04-21 10:24:42 +09:00
|
|
|
const
|
|
|
|
TestCodec = "/test/proto/1.0.0"
|
2019-08-31 11:58:49 -06:00
|
|
|
|
|
|
|
type
|
|
|
|
TestProto = ref object of LPProtocol
|
|
|
|
|
2019-12-23 12:44:51 -06:00
|
|
|
suite "Switch":
|
2020-04-21 10:24:42 +09:00
|
|
|
teardown:
|
2020-09-21 19:48:19 +02:00
|
|
|
checkTrackers()
|
2020-04-21 10:24:42 +09:00
|
|
|
|
2019-12-23 12:44:51 -06:00
|
|
|
test "e2e use switch dial proto string":
|
2020-05-25 08:40:39 -06: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 19:56:55 +09:00
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
2020-05-25 08:40:39 -06:00
|
|
|
switch1.mount(testProto)
|
|
|
|
|
2020-06-20 19:56:55 +09:00
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
2020-05-25 08:40:39 -06: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 09:36:48 -06:00
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-25 08:40:39 -06:00
|
|
|
await conn.writeLp("Hello!")
|
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
|
|
|
check "Hello!" == msg
|
|
|
|
await conn.close()
|
|
|
|
|
2020-06-02 17:53:38 -06:00
|
|
|
await allFuturesThrowing(
|
|
|
|
done.wait(5.seconds),
|
2020-05-25 08:40:39 -06:00
|
|
|
switch1.stop(),
|
2020-06-02 17:53:38 -06:00
|
|
|
switch2.stop())
|
2020-05-25 08:40:39 -06:00
|
|
|
|
|
|
|
# this needs to go at end
|
2020-06-02 17:53:38 -06:00
|
|
|
await allFuturesThrowing(awaiters)
|
2020-05-25 08:40:39 -06:00
|
|
|
|
2020-07-17 09:36:48 -06:00
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-25 08:40:39 -06:00
|
|
|
waitFor(testSwitch())
|
|
|
|
|
|
|
|
test "e2e should not leak bufferstreams and connections on channel close":
|
2020-05-19 18:14:15 -06:00
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
2020-04-21 10:24:42 +09:00
|
|
|
let done = newFuture[void]()
|
2020-03-27 08:25:52 -06:00
|
|
|
proc handle(conn: Connection, proto: string) {.async, gcsafe.} =
|
2020-05-23 13:26:25 -06: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 08:25:52 -06:00
|
|
|
|
2019-09-04 16:00:39 -06:00
|
|
|
let testProto = new TestProto
|
|
|
|
testProto.codec = TestCodec
|
2020-03-27 08:25:52 -06:00
|
|
|
testProto.handler = handle
|
2020-05-23 13:26:25 -06:00
|
|
|
|
2020-06-20 19:56:55 +09:00
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
2019-08-31 11:58:49 -06:00
|
|
|
switch1.mount(testProto)
|
2020-03-27 08:25:52 -06:00
|
|
|
|
2020-06-20 19:56:55 +09:00
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
2020-05-23 13:26:25 -06:00
|
|
|
var awaiters: seq[Future[void]]
|
2020-02-12 09:43:42 -05:00
|
|
|
awaiters.add(await switch1.start())
|
2020-01-07 02:06:27 -06:00
|
|
|
awaiters.add(await switch2.start())
|
2020-03-27 08:25:52 -06:00
|
|
|
|
2019-09-30 09:48:40 -06:00
|
|
|
let conn = await switch2.dial(switch1.peerInfo, TestCodec)
|
2020-07-17 09:36:48 -06:00
|
|
|
|
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-19 18:14:15 -06:00
|
|
|
await conn.writeLp("Hello!")
|
2020-05-23 13:26:25 -06:00
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
2020-05-19 18:14:15 -06:00
|
|
|
check "Hello!" == msg
|
2020-05-23 13:26:25 -06:00
|
|
|
await conn.close()
|
|
|
|
|
2020-06-02 17:53:38 -06:00
|
|
|
await allFuturesThrowing(
|
|
|
|
done.wait(5.seconds),
|
2020-04-21 10:24:42 +09:00
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop(),
|
|
|
|
)
|
|
|
|
|
|
|
|
# this needs to go at end
|
2020-06-02 17:53:38 -06:00
|
|
|
await allFuturesThrowing(awaiters)
|
2019-08-31 11:58:49 -06:00
|
|
|
|
2020-07-17 09:36:48 -06:00
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-19 18:14:15 -06:00
|
|
|
waitFor(testSwitch())
|
2019-12-23 12:44:51 -06:00
|
|
|
|
2020-05-23 13:26:25 -06:00
|
|
|
test "e2e use connect then dial":
|
2020-05-14 09:19:03 -06:00
|
|
|
proc testSwitch(): Future[bool] {.async, gcsafe.} =
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
|
|
|
|
proc handle(conn: Connection, proto: string) {.async, gcsafe.} =
|
2020-05-23 13:26:25 -06:00
|
|
|
try:
|
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
|
|
|
check "Hello!" == msg
|
|
|
|
finally:
|
|
|
|
await conn.writeLp("Hello!")
|
|
|
|
await conn.close()
|
2020-05-14 09:19:03 -06:00
|
|
|
|
|
|
|
let testProto = new TestProto
|
|
|
|
testProto.codec = TestCodec
|
|
|
|
testProto.handler = handle
|
2020-05-23 13:26:25 -06:00
|
|
|
|
2020-06-20 19:56:55 +09:00
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
2020-05-14 09:19:03 -06:00
|
|
|
switch1.mount(testProto)
|
|
|
|
|
2020-06-20 19:56:55 +09:00
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Noise])
|
2020-05-14 09:19:03 -06:00
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
2020-05-23 13:26:25 -06:00
|
|
|
|
2020-05-14 09:19:03 -06:00
|
|
|
await switch2.connect(switch1.peerInfo)
|
|
|
|
let conn = await switch2.dial(switch1.peerInfo, TestCodec)
|
|
|
|
|
2020-07-17 09:36:48 -06:00
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-14 09:19:03 -06:00
|
|
|
try:
|
|
|
|
await conn.writeLp("Hello!")
|
2020-05-23 13:26:25 -06:00
|
|
|
let msg = string.fromBytes(await conn.readLp(1024))
|
2020-05-14 09:19:03 -06:00
|
|
|
check "Hello!" == msg
|
|
|
|
result = true
|
|
|
|
except LPStreamError:
|
|
|
|
result = false
|
|
|
|
|
2020-06-02 17:53:38 -06:00
|
|
|
await allFuturesThrowing(
|
2020-05-14 09:19:03 -06:00
|
|
|
conn.close(),
|
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop()
|
|
|
|
)
|
2020-06-02 17:53:38 -06:00
|
|
|
await allFuturesThrowing(awaiters)
|
2020-05-14 09:19:03 -06:00
|
|
|
|
2020-07-17 09:36:48 -06:00
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-14 09:19:03 -06:00
|
|
|
check:
|
|
|
|
waitFor(testSwitch()) == true
|
2020-03-26 15:06:47 +09:00
|
|
|
|
2020-05-23 13:26:25 -06:00
|
|
|
test "e2e should not leak on peer disconnect":
|
|
|
|
proc testSwitch() {.async, gcsafe.} =
|
|
|
|
var awaiters: seq[Future[void]]
|
|
|
|
|
2020-06-20 19:56:55 +09:00
|
|
|
let switch1 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
|
|
|
let switch2 = newStandardSwitch(secureManagers = [SecureProtocol.Secio])
|
2020-05-23 13:26:25 -06:00
|
|
|
awaiters.add(await switch1.start())
|
|
|
|
awaiters.add(await switch2.start())
|
2020-06-19 11:29:43 -06:00
|
|
|
|
2020-05-23 13:26:25 -06:00
|
|
|
await switch2.connect(switch1.peerInfo)
|
|
|
|
|
2020-07-17 09:36:48 -06:00
|
|
|
check switch1.isConnected(switch2.peerInfo)
|
|
|
|
check switch2.isConnected(switch1.peerInfo)
|
2020-06-02 11:32:42 -06:00
|
|
|
|
2020-05-23 13:26:25 -06:00
|
|
|
await sleepAsync(100.millis)
|
|
|
|
await switch2.disconnect(switch1.peerInfo)
|
|
|
|
await sleepAsync(2.seconds)
|
2020-07-17 09:36:48 -06:00
|
|
|
|
|
|
|
check not switch1.isConnected(switch2.peerInfo)
|
|
|
|
check not switch2.isConnected(switch1.peerInfo)
|
|
|
|
|
2020-05-23 13:26:25 -06:00
|
|
|
var bufferTracker = getTracker(BufferStreamTrackerName)
|
|
|
|
# echo bufferTracker.dump()
|
|
|
|
check bufferTracker.isLeaked() == false
|
|
|
|
|
2020-07-17 09:36:48 -06:00
|
|
|
var connTracker = getTracker(ConnectionTrackerName)
|
2020-05-23 13:26:25 -06:00
|
|
|
# echo connTracker.dump()
|
2020-07-17 09:36:48 -06:00
|
|
|
check connTracker.isLeaked() == false
|
2020-06-02 11:32:42 -06:00
|
|
|
|
2020-06-02 17:53:38 -06:00
|
|
|
await allFuturesThrowing(
|
2020-05-23 13:26:25 -06:00
|
|
|
switch1.stop(),
|
2020-06-02 17:53:38 -06:00
|
|
|
switch2.stop())
|
|
|
|
await allFuturesThrowing(awaiters)
|
2020-05-23 13:26:25 -06:00
|
|
|
|
|
|
|
waitFor(testSwitch())
|
2020-07-24 13:24:31 -06:00
|
|
|
|
2020-09-15 14:19:22 -06: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 13:24:31 -06: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 08:52:20 +02:00
|
|
|
var kinds: set[ConnEventKind]
|
|
|
|
proc hook(peerId: PeerID, event: ConnEvent) {.async, gcsafe.} =
|
|
|
|
kinds = kinds + {event.kind}
|
2020-07-24 13:24:31 -06:00
|
|
|
case step:
|
|
|
|
of 0:
|
|
|
|
check:
|
2020-08-08 08:52:20 +02:00
|
|
|
event.kind == ConnEventKind.Connected
|
|
|
|
peerId == switch2.peerInfo.peerId
|
|
|
|
of 1:
|
2020-07-24 13:24:31 -06:00
|
|
|
check:
|
2020-08-08 08:52:20 +02:00
|
|
|
event.kind == ConnEventKind.Disconnected
|
2020-07-24 13:24:31 -06:00
|
|
|
|
2020-08-08 08:52:20 +02:00
|
|
|
check peerId == switch2.peerInfo.peerId
|
2020-07-24 13:24:31 -06:00
|
|
|
else:
|
|
|
|
check false
|
|
|
|
|
|
|
|
step.inc()
|
|
|
|
|
2020-08-08 08:52:20 +02:00
|
|
|
switch1.addConnEventHandler(hook, ConnEventKind.Connected)
|
|
|
|
switch1.addConnEventHandler(hook, ConnEventKind.Disconnected)
|
2020-07-24 13:24:31 -06: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 08:52:20 +02:00
|
|
|
kinds == {
|
|
|
|
ConnEventKind.Connected,
|
|
|
|
ConnEventKind.Disconnected
|
2020-07-24 13:24:31 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
await allFuturesThrowing(
|
|
|
|
switch1.stop(),
|
|
|
|
switch2.stop())
|
|
|
|
await allFuturesThrowing(awaiters)
|
|
|
|
|
|
|
|
waitFor(testSwitch())
|
2020-09-15 14:19:22 -06: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())
|