Skip to content

Commit

Permalink
fix: split listeners and dialers in transport interface tests (#2584)
Browse files Browse the repository at this point in the history
To support asymmetric transports, call `.listen` and `.dial` on separate
properties of the transport interface setup return value.

For symmetric transports these can be the same transport instance.
  • Loading branch information
achingbrain committed Jun 11, 2024
1 parent 2829da9 commit 863b3de
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 52 deletions.
29 changes: 15 additions & 14 deletions packages/interface-compliance-tests/src/transport/dial-test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AbortError, TypedEventEmitter } from '@libp2p/interface'
import { TypedEventEmitter } from '@libp2p/interface'
import { expect } from 'aegir/chai'
import all from 'it-all'
import drain from 'it-drain'
Expand All @@ -19,9 +19,10 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
let registrar: Registrar
let listenAddrs: Multiaddr[]
let dialAddrs: Multiaddr[]
let transport: Transport
let dialer: Transport
let listener: Transport
let connector: Connector
let listener: Listener
let listen: Listener

before(async () => {
registrar = mockRegistrar()
Expand All @@ -30,24 +31,24 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
events: new TypedEventEmitter()
});

({ listenAddrs, dialAddrs, transport, connector } = await common.setup())
({ listenAddrs, dialAddrs, dialer, listener, connector } = await common.setup())
})

after(async () => {
await common.teardown()
})

beforeEach(async () => {
listener = transport.createListener({
listen = listener.createListener({
upgrader
})
await listener.listen(listenAddrs[0])
await listen.listen(listenAddrs[0])
})

afterEach(async () => {
sinon.restore()
connector.restore()
await listener.close()
await listen.close()
})

it('simple', async () => {
Expand All @@ -62,7 +63,7 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
})

const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
const conn = await transport.dial(dialAddrs[0], {
const conn = await dialer.dial(dialAddrs[0], {
upgrader
})

Expand All @@ -78,7 +79,7 @@ export default (common: TestSetup<TransportTestFixtures>): void => {

it('can close connections', async () => {
const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
const conn = await transport.dial(dialAddrs[0], {
const conn = await dialer.dial(dialAddrs[0], {
upgrader
})

Expand All @@ -91,7 +92,7 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
it('to non existent listener', async () => {
const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')

await expect(transport.dial(dialAddrs[1], {
await expect(dialer.dial(dialAddrs[1], {
upgrader
})).to.eventually.be.rejected()
expect(upgradeSpy.callCount).to.equal(0)
Expand All @@ -101,9 +102,9 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
const controller = new AbortController()
controller.abort()
const conn = transport.dial(dialAddrs[0], { signal: controller.signal, upgrader })
const conn = dialer.dial(dialAddrs[0], { signal: controller.signal, upgrader })

await expect(conn).to.eventually.be.rejected().with.property('code', AbortError.code)
await expect(conn).to.eventually.be.rejected().with.property('name', 'AbortError')
expect(upgradeSpy.callCount).to.equal(0)
})

Expand All @@ -114,10 +115,10 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
connector.delay(100)

const controller = new AbortController()
const conn = transport.dial(dialAddrs[0], { signal: controller.signal, upgrader })
const conn = dialer.dial(dialAddrs[0], { signal: controller.signal, upgrader })
setTimeout(() => { controller.abort() }, 50)

await expect(conn).to.eventually.be.rejected().with.property('code', AbortError.code)
await expect(conn).to.eventually.be.rejected().with.property('name', 'AbortError')
expect(upgradeSpy.callCount).to.equal(0)
})
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,24 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
describe('filter', () => {
let listenAddrs: Multiaddr[]
let dialAddrs: Multiaddr[]
let transport: Transport
let dialer: Transport
let listener: Transport

before(async () => {
({ listenAddrs, dialAddrs, transport } = await common.setup())
({ listenAddrs, dialAddrs, dialer, listener } = await common.setup())
})

after(async () => {
await common.teardown()
})

it('filters listen addresses', () => {
const filteredAddrs = transport.listenFilter(listenAddrs)
const filteredAddrs = listener.listenFilter(listenAddrs)
expect(filteredAddrs).to.eql(listenAddrs)
})

it('filters dial addresses', () => {
const filteredAddrs = transport.dialFilter(dialAddrs)
const filteredAddrs = dialer.dialFilter(dialAddrs)
expect(filteredAddrs).to.eql(dialAddrs)
})
})
Expand Down
3 changes: 2 additions & 1 deletion packages/interface-compliance-tests/src/transport/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ export interface Connector {
export interface TransportTestFixtures {
listenAddrs: Multiaddr[]
dialAddrs: Multiaddr[]
transport: Transport
dialer: Transport
listener: Transport
connector: Connector
}

Expand Down
63 changes: 32 additions & 31 deletions packages/interface-compliance-tests/src/transport/listen-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
let upgrader: Upgrader
let listenAddrs: Multiaddr[]
let dialAddrs: Multiaddr[]
let transport: Transport
let dialer: Transport
let listener: Transport
let registrar: Registrar

before(async () => {
Expand All @@ -30,7 +31,7 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
events: new TypedEventEmitter()
});

({ transport, listenAddrs, dialAddrs } = await common.setup())
({ dialer, listener, listenAddrs, dialAddrs } = await common.setup())
})

after(async () => {
Expand All @@ -42,11 +43,11 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
})

it('simple', async () => {
const listener = transport.createListener({
const listen = listener.createListener({
upgrader
})
await listener.listen(listenAddrs[0])
await listener.close()
await listen.listen(listenAddrs[0])
await listen.close()
})

it('close listener with connections, through timeout', async () => {
Expand All @@ -58,22 +59,22 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
void drain(data.stream.source)
})

const listener = transport.createListener({
const listen = listener.createListener({
upgrader,
handler: (conn) => {
listenerConns.push(conn)
}
})

// Listen
await listener.listen(listenAddrs[0])
await listen.listen(listenAddrs[0])

// Create two connections to the listener
const [conn1] = await Promise.all([
transport.dial(dialAddrs[0], {
dialer.dial(dialAddrs[0], {
upgrader
}),
transport.dial(dialAddrs[0], {
dialer.dial(dialAddrs[0], {
upgrader
})
])
Expand All @@ -90,7 +91,7 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
stream1
),
// Closer the listener (will take a couple of seconds to time out)
listener.close()
listen.close()
])

await stream1.close()
Expand All @@ -108,39 +109,39 @@ export default (common: TestSetup<TransportTestFixtures>): void => {
it('should not handle connection if upgradeInbound throws', async () => {
sinon.stub(upgrader, 'upgradeInbound').throws()

const listener = transport.createListener({
const listen = listener.createListener({
upgrader
})

// Listen
await listener.listen(listenAddrs[0])
await listen.listen(listenAddrs[0])

// Create a connection to the listener
const conn = await transport.dial(dialAddrs[0], {
const conn = await dialer.dial(dialAddrs[0], {
upgrader
})

await pWaitFor(() => typeof conn.timeline.close === 'number')
await listener.close()
await listen.close()
})

describe('events', () => {
it('connection', async () => {
const upgradeSpy = sinon.spy(upgrader, 'upgradeInbound')
const listener = transport.createListener({
const listen = listener.createListener({
upgrader
})
const deferred = defer()
let conn

listener.addEventListener('connection', (evt) => {
listen.addEventListener('connection', (evt) => {
conn = evt.detail
deferred.resolve()
})

void (async () => {
await listener.listen(listenAddrs[0])
await transport.dial(dialAddrs[0], {
await listen.listen(listenAddrs[0])
await dialer.dial(dialAddrs[0], {
upgrader
})
})()
Expand All @@ -149,41 +150,41 @@ export default (common: TestSetup<TransportTestFixtures>): void => {

await expect(upgradeSpy.getCall(0).returnValue).to.eventually.equal(conn)
expect(upgradeSpy.callCount).to.equal(1)
await listener.close()
await listen.close()
})

it('listening', (done) => {
const listener = transport.createListener({
const listen = listener.createListener({
upgrader
})
listener.addEventListener('listening', () => {
listener.close().then(done, done)
listen.addEventListener('listening', () => {
listen.close().then(done, done)
})
void listener.listen(listenAddrs[0])
void listen.listen(listenAddrs[0])
})

it('error', (done) => {
const listener = transport.createListener({
const listen = listener.createListener({
upgrader
})
listener.addEventListener('error', (evt) => {
listen.addEventListener('error', (evt) => {
expect(evt.detail).to.be.an.instanceOf(Error)
listener.close().then(done, done)
listen.close().then(done, done)
})
listener.dispatchEvent(new CustomEvent('error', {
listen.dispatchEvent(new CustomEvent('error', {
detail: new Error('my err')
}))
})

it('close', (done) => {
const listener = transport.createListener({
const listen = listener.createListener({
upgrader
})
listener.addEventListener('close', () => { done() })
listen.addEventListener('close', () => { done() })

void (async () => {
await listener.listen(listenAddrs[0])
await listener.close()
await listen.listen(listenAddrs[0])
await listen.close()
})()
})
})
Expand Down
2 changes: 1 addition & 1 deletion packages/transport-tcp/test/compliance.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ describe('interface-transport compliance', () => {
}
}

return { transport, listenAddrs: addrs, dialAddrs: addrs, connector }
return { dialer: transport, listener: transport, listenAddrs: addrs, dialAddrs: addrs, connector }
},
async teardown () {}
})
Expand Down
2 changes: 1 addition & 1 deletion packages/transport-websockets/test/compliance.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ describe('interface-transport compliance', () => {
restore () { delayMs = 0 }
}

return { transport: wsProxy, listenAddrs: addrs, dialAddrs: addrs, connector }
return { dialer: wsProxy, listener: wsProxy, listenAddrs: addrs, dialAddrs: addrs, connector }
},
async teardown () {}
})
Expand Down

0 comments on commit 863b3de

Please sign in to comment.