Skip to content
This repository was archived by the owner on Jun 26, 2023. It is now read-only.

Commit 96c15c9

Browse files
authored
fix: test PubSub interface and not PubSubBaseProtocol (#198)
Convert the PubSub interface compliance tests to only test the methods in the PubSub interface instead of the abstract subclass since it may not be used.
1 parent 8691381 commit 96c15c9

File tree

12 files changed

+160
-152
lines changed

12 files changed

+160
-152
lines changed

packages/libp2p-interface-compliance-tests/src/pubsub/api.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,12 @@ import type { TestSetup } from '../index.js'
1010
import type { PubSub } from '@libp2p/interfaces/pubsub'
1111
import type { PubSubArgs } from './index.js'
1212
import type { Registrar } from '@libp2p/interfaces/registrar'
13-
import type { PubSubBaseProtocol } from '@libp2p/pubsub'
1413
import { Components } from '@libp2p/interfaces/components'
1514

1615
const topic = 'foo'
1716
const data = uint8ArrayFromString('bar')
1817

19-
export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
18+
export default (common: TestSetup<PubSub, PubSubArgs>) => {
2019
describe('pubsub api', () => {
2120
let pubsub: PubSub
2221
let registrar: Registrar

packages/libp2p-interface-compliance-tests/src/pubsub/connection-handlers.ts

+10-11
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,17 @@ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
77
import { createEd25519PeerId } from '@libp2p/peer-id-factory'
88
import { connectPeers, mockRegistrar } from '../mocks/registrar.js'
99
import type { TestSetup } from '../index.js'
10-
import type { Message } from '@libp2p/interfaces/pubsub'
10+
import type { Message, PubSub } from '@libp2p/interfaces/pubsub'
1111
import type { PubSubArgs } from './index.js'
1212
import type { PeerId } from '@libp2p/interfaces/peer-id'
1313
import type { Registrar } from '@libp2p/interfaces/registrar'
14-
import type { PubSubBaseProtocol } from '@libp2p/pubsub'
1514
import { Components } from '@libp2p/interfaces/components'
1615
import { start, stop } from '../index.js'
1716

18-
export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
17+
export default (common: TestSetup<PubSub, PubSubArgs>) => {
1918
describe('pubsub connection handlers', () => {
20-
let psA: PubSubBaseProtocol
21-
let psB: PubSubBaseProtocol
19+
let psA: PubSub
20+
let psB: PubSub
2221
let peerA: PeerId
2322
let peerB: PeerId
2423
let registrarA: Registrar
@@ -103,8 +102,8 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
103102
})
104103

105104
describe('pubsub started before connect', () => {
106-
let psA: PubSubBaseProtocol
107-
let psB: PubSubBaseProtocol
105+
let psA: PubSub
106+
let psB: PubSub
108107
let peerA: PeerId
109108
let peerB: PeerId
110109
let registrarA: Registrar
@@ -198,8 +197,8 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
198197
})
199198

200199
describe('pubsub started after connect', () => {
201-
let psA: PubSubBaseProtocol
202-
let psB: PubSubBaseProtocol
200+
let psA: PubSub
201+
let psB: PubSub
203202
let peerA: PeerId
204203
let peerB: PeerId
205204
let registrarA: Registrar
@@ -302,8 +301,8 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
302301
})
303302

304303
describe('pubsub with intermittent connections', () => {
305-
let psA: PubSubBaseProtocol
306-
let psB: PubSubBaseProtocol
304+
let psA: PubSub
305+
let psB: PubSub
307306
let peerA: PeerId
308307
let peerB: PeerId
309308
let registrarA: Registrar

packages/libp2p-interface-compliance-tests/src/pubsub/emit-self.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ import { createEd25519PeerId } from '@libp2p/peer-id-factory'
55
import { mockRegistrar } from '../mocks/registrar.js'
66
import type { TestSetup } from '../index.js'
77
import type { PubSubArgs } from './index.js'
8-
import type { PubSubBaseProtocol } from '@libp2p/pubsub'
98
import { Components } from '@libp2p/interfaces/components'
109
import { start, stop } from '../index.js'
10+
import type { PubSub } from '@libp2p/interfaces/pubsub'
1111

1212
const topic = 'foo'
1313
const data = uint8ArrayFromString('bar')
1414
const shouldNotHappen = () => expect.fail()
1515

16-
export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
16+
export default (common: TestSetup<PubSub, PubSubArgs>) => {
1717
describe('emit self', () => {
18-
let pubsub: PubSubBaseProtocol
18+
let pubsub: PubSub
1919

2020
describe('enabled', () => {
2121
before(async () => {

packages/libp2p-interface-compliance-tests/src/pubsub/index.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@ import connectionHandlersTest from './connection-handlers.js'
55
import twoNodesTest from './two-nodes.js'
66
import multipleNodesTest from './multiple-nodes.js'
77
import type { TestSetup } from '../index.js'
8-
import type { PubSubInit } from '@libp2p/interfaces/pubsub'
9-
import type { PubSubBaseProtocol } from '@libp2p/pubsub'
8+
import type { PubSub, PubSubInit } from '@libp2p/interfaces/pubsub'
109
import type { Components } from '@libp2p/interfaces/components'
1110

1211
export interface PubSubArgs {
1312
components: Components
1413
init: PubSubInit
1514
}
1615

17-
export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
16+
export default (common: TestSetup<PubSub, PubSubArgs>) => {
1817
describe('interface-pubsub compliance tests', () => {
1918
apiTest(common)
2019
emitSelfTest(common)

packages/libp2p-interface-compliance-tests/src/pubsub/messages.ts

+11-91
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,22 @@ import { expect } from 'aegir/chai'
22
import sinon from 'sinon'
33
import { createEd25519PeerId } from '@libp2p/peer-id-factory'
44
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
5-
import { noSignMsgId } from '@libp2p/pubsub/utils'
6-
import { PeerStreams } from '@libp2p/pubsub/peer-streams'
75
import { mockRegistrar } from '../mocks/registrar.js'
8-
import pDefer from 'p-defer'
9-
import delay from 'delay'
10-
import pWaitFor from 'p-wait-for'
116
import type { TestSetup } from '../index.js'
12-
import type { PubSubRPC } from '@libp2p/interfaces/pubsub'
7+
import type { Message, PubSub } from '@libp2p/interfaces/pubsub'
138
import type { PubSubArgs } from './index.js'
14-
import type { PubSubBaseProtocol } from '@libp2p/pubsub'
159
import { Components } from '@libp2p/interfaces/components'
1610
import type { PeerId } from '@libp2p/interfaces/peer-id'
1711
import { start, stop } from '../index.js'
12+
import { pEvent } from 'p-event'
1813

1914
const topic = 'foo'
2015
const data = uint8ArrayFromString('bar')
2116

22-
export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
17+
export default (common: TestSetup<PubSub, PubSubArgs>) => {
2318
describe('messages', () => {
2419
let peerId: PeerId
25-
let pubsub: PubSubBaseProtocol
20+
let pubsub: PubSub
2621

2722
// Create pubsub router
2823
beforeEach(async () => {
@@ -48,90 +43,15 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
4843

4944
it('should emit normalized signed messages on publish', async () => {
5045
pubsub.globalSignaturePolicy = 'StrictSign'
46+
pubsub.publish(topic, data)
5147

52-
const spy = sinon.spy(pubsub, 'publishMessage')
48+
const event = await pEvent<'message', CustomEvent<Message>>(pubsub, 'message')
49+
const message = event.detail
5350

54-
await pubsub.publish(topic, data)
55-
56-
await pWaitFor(async () => {
57-
return spy.callCount === 1
58-
})
59-
60-
expect(spy).to.have.property('callCount', 1)
61-
62-
const [from, messageToEmit] = spy.getCall(0).args
63-
64-
expect(from.toString()).to.equal(peerId.toString())
65-
expect(messageToEmit.sequenceNumber).to.not.eql(undefined)
66-
expect(messageToEmit.key).to.not.eql(undefined)
67-
expect(messageToEmit.signature).to.not.eql(undefined)
68-
})
69-
70-
it('should drop unsigned messages', async () => {
71-
const publishSpy = sinon.spy(pubsub, 'publishMessage')
72-
sinon.spy(pubsub, 'validate')
73-
74-
const peerStream = new PeerStreams({
75-
id: await createEd25519PeerId(),
76-
protocol: 'test'
77-
})
78-
const rpc: PubSubRPC = {
79-
subscriptions: [],
80-
messages: [{
81-
from: peerStream.id.toBytes(),
82-
data,
83-
sequenceNumber: await noSignMsgId(data),
84-
topic: topic
85-
}]
86-
}
87-
88-
pubsub.subscribe(topic)
89-
90-
await pubsub.processRpc(peerStream.id, peerStream, rpc)
91-
92-
// message should not be delivered
93-
await delay(1000)
94-
95-
expect(publishSpy).to.have.property('called', false)
96-
})
97-
98-
it('should not drop unsigned messages if strict signing is disabled', async () => {
99-
pubsub.globalSignaturePolicy = 'StrictNoSign'
100-
101-
const publishSpy = sinon.spy(pubsub, 'publishMessage')
102-
sinon.spy(pubsub, 'validate')
103-
104-
const peerStream = new PeerStreams({
105-
id: await createEd25519PeerId(),
106-
protocol: 'test'
107-
})
108-
109-
const rpc: PubSubRPC = {
110-
subscriptions: [],
111-
messages: [{
112-
from: peerStream.id.toBytes(),
113-
data,
114-
topic
115-
}]
116-
}
117-
118-
pubsub.subscribe(topic)
119-
120-
const deferred = pDefer()
121-
122-
pubsub.addEventListener('message', (evt) => {
123-
if (evt.detail.topic === topic) {
124-
deferred.resolve()
125-
}
126-
})
127-
128-
await pubsub.processRpc(peerStream.id, peerStream, rpc)
129-
130-
// await message delivery
131-
await deferred.promise
132-
133-
expect(pubsub.validate).to.have.property('callCount', 1)
134-
expect(publishSpy).to.have.property('callCount', 1)
51+
expect(message.from.toString()).to.equal(peerId.toString())
52+
expect(message.sequenceNumber).to.not.eql(undefined)
53+
expect(message.key).to.not.eql(undefined)
54+
expect(message.signature).to.not.eql(undefined)
13555
})
13656
})
13757
}

packages/libp2p-interface-compliance-tests/src/pubsub/multiple-nodes.ts

+24-25
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,23 @@ import { createEd25519PeerId } from '@libp2p/peer-id-factory'
99
import { connectPeers, mockRegistrar } from '../mocks/registrar.js'
1010
import { waitForSubscriptionUpdate } from './utils.js'
1111
import type { TestSetup } from '../index.js'
12-
import type { Message } from '@libp2p/interfaces/pubsub'
12+
import type { Message, PubSub } from '@libp2p/interfaces/pubsub'
1313
import type { PubSubArgs } from './index.js'
1414
import type { PeerId } from '@libp2p/interfaces/peer-id'
1515
import type { Registrar } from '@libp2p/interfaces/registrar'
16-
import type { PubSubBaseProtocol } from '@libp2p/pubsub'
1716
import { Components } from '@libp2p/interfaces/components'
1817
import { start, stop } from '../index.js'
1918

20-
export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
19+
export default (common: TestSetup<PubSub, PubSubArgs>) => {
2120
describe('pubsub with multiple nodes', function () {
2221
describe('every peer subscribes to the topic', () => {
2322
describe('line', () => {
2423
// line
2524
// ◉────◉────◉
2625
// a b c
27-
let psA: PubSubBaseProtocol
28-
let psB: PubSubBaseProtocol
29-
let psC: PubSubBaseProtocol
26+
let psA: PubSub
27+
let psB: PubSub
28+
let psC: PubSub
3029
let peerIdA: PeerId
3130
let peerIdB: PeerId
3231
let peerIdC: PeerId
@@ -115,7 +114,7 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
115114
psA.subscribe(topic)
116115
expect(psA.getTopics()).to.deep.equal([topic])
117116

118-
await waitForSubscriptionUpdate(psB, psA)
117+
await waitForSubscriptionUpdate(psB, peerIdA)
119118

120119
expect(psB.getPeers().length).to.equal(2)
121120
expect(psB.getSubscribers(topic).map(p => p.toString())).to.deep.equal([peerIdA.toString()])
@@ -130,8 +129,8 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
130129
expect(psB.getTopics()).to.deep.equal([topic])
131130

132131
await Promise.all([
133-
waitForSubscriptionUpdate(psA, psB),
134-
waitForSubscriptionUpdate(psC, psB)
132+
waitForSubscriptionUpdate(psA, peerIdB),
133+
waitForSubscriptionUpdate(psC, peerIdB)
135134
])
136135

137136
expect(psA.getPeers().length).to.equal(1)
@@ -188,9 +187,9 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
188187
})
189188

190189
await Promise.all([
191-
waitForSubscriptionUpdate(psA, psB),
192-
waitForSubscriptionUpdate(psB, psA),
193-
waitForSubscriptionUpdate(psC, psB)
190+
waitForSubscriptionUpdate(psA, peerIdB),
191+
waitForSubscriptionUpdate(psB, peerIdA),
192+
waitForSubscriptionUpdate(psC, peerIdB)
194193
])
195194

196195
psA.publish(topic, uint8ArrayFromString('hey'))
@@ -260,9 +259,9 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
260259
psC.subscribe(topic)
261260

262261
await Promise.all([
263-
waitForSubscriptionUpdate(psA, psB),
264-
waitForSubscriptionUpdate(psB, psA),
265-
waitForSubscriptionUpdate(psC, psB)
262+
waitForSubscriptionUpdate(psA, peerIdB),
263+
waitForSubscriptionUpdate(psB, peerIdA),
264+
waitForSubscriptionUpdate(psC, peerIdB)
266265
])
267266

268267
psB.publish(topic, uint8ArrayFromString('hey'))
@@ -307,11 +306,11 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
307306
// │b d│
308307
// ◉─┘ └─◉
309308
// a
310-
let psA: PubSubBaseProtocol
311-
let psB: PubSubBaseProtocol
312-
let psC: PubSubBaseProtocol
313-
let psD: PubSubBaseProtocol
314-
let psE: PubSubBaseProtocol
309+
let psA: PubSub
310+
let psB: PubSub
311+
let psC: PubSub
312+
let psD: PubSub
313+
let psE: PubSub
315314
let peerIdA: PeerId
316315
let peerIdB: PeerId
317316
let peerIdC: PeerId
@@ -483,11 +482,11 @@ export default (common: TestSetup<PubSubBaseProtocol, PubSubArgs>) => {
483482
})
484483

485484
await Promise.all([
486-
waitForSubscriptionUpdate(psA, psB),
487-
waitForSubscriptionUpdate(psB, psA),
488-
waitForSubscriptionUpdate(psC, psB),
489-
waitForSubscriptionUpdate(psD, psC),
490-
waitForSubscriptionUpdate(psE, psD)
485+
waitForSubscriptionUpdate(psA, peerIdB),
486+
waitForSubscriptionUpdate(psB, peerIdA),
487+
waitForSubscriptionUpdate(psC, peerIdB),
488+
waitForSubscriptionUpdate(psD, peerIdC),
489+
waitForSubscriptionUpdate(psE, peerIdD)
491490
])
492491

493492
psC.publish('Z', uint8ArrayFromString('hey from c'))

0 commit comments

Comments
 (0)