UNPKG

8.09 kBJavaScriptView Raw
1'use strict'
2/* eslint-env mocha */
3
4const _ = require('lodash')
5const { expect } = require('chai')
6
7const { cleanup, clientConnect, closeInstance,
8 parallel, startService } = require('./testutils')
9
10const { cleanupTimeout, port, user1, user2, user3,
11 roomName1, redisConfig } = require('./config')
12
13module.exports = function () {
14 let instance1, instance2, socket1, socket2, socket3, socket4, socket5
15
16 afterEach(function (cb) {
17 this.timeout(cleanupTimeout)
18 cleanup([instance1, instance2], [socket1, socket2, socket3], cb)
19 instance1 = instance2 = null
20 socket1 = socket2 = socket3 = socket4 = socket5 = null
21 })
22
23 it('should be able to send custom messages via a bus', function (done) {
24 let event = 'someEvent'
25 let data = { key: 'value' }
26 instance1 = startService(_.assign({port}, redisConfig))
27 instance2 = startService(_.assign({port: port + 1}, redisConfig))
28 parallel([
29 cb => instance1.on('ready', cb),
30 cb => instance2.on('ready', cb)
31 ], error => {
32 expect(error).not.ok
33 parallel([
34 cb => instance2.clusterBus.on(event, (uid, d) => {
35 expect(uid).equal(instance1.instanceUID)
36 expect(d).deep.equal(data)
37 cb()
38 }),
39 cb => instance1.clusterBus.on(event, (uid, d) => {
40 expect(uid).equal(instance1.instanceUID)
41 expect(d).deep.equal(data)
42 cb()
43 }),
44 cb => {
45 instance1.clusterBus.emit(event, instance1.instanceUID, data)
46 cb()
47 }
48 ], done)
49 })
50 })
51
52 it('should remove other instances\' sockets from a channel', function (done) {
53 this.timeout(4000)
54 this.slow(2000)
55 instance1 = startService(_.assign({port}, redisConfig))
56 instance2 = startService(_.assign({port: port + 1}, redisConfig))
57 instance1.addRoom(roomName1, { owner: user2 }, () => parallel([
58 cb => {
59 socket1 = clientConnect(user1, port)
60 socket1.on('roomMessage',
61 () => done(new Error('Not removed from channel')))
62 socket1.on('loginConfirmed',
63 () => socket1.emit('roomJoin', roomName1, cb))
64 },
65 cb => {
66 socket2 = clientConnect(user1, port + 1)
67 socket2.on('roomMessage',
68 () => done(new Error('Not removed from channel')))
69 socket2.on('loginConfirmed',
70 () => socket2.emit('roomJoin', roomName1, cb))
71 },
72 cb => {
73 socket3 = clientConnect(user2, port)
74 socket3.on('loginConfirmed',
75 () => socket3.emit('roomJoin', roomName1, cb))
76 }
77 ], error => {
78 expect(error).not.ok
79 socket3.emit('roomAddToList', roomName1, 'blacklist', [user1], () => {
80 socket3.emit('roomMessage', roomName1, {textMessage: 'hello'})
81 setTimeout(done, 1000)
82 })
83 }))
84 })
85
86 it('should disconnect users sockets across all instances', function (done) {
87 instance1 = startService(_.assign({port}, redisConfig))
88 instance2 = startService(_.assign({port: port + 1}, redisConfig))
89 parallel([
90 cb => {
91 socket1 = clientConnect(user1, port)
92 socket1.on('loginConfirmed', () => cb())
93 },
94 cb => {
95 socket2 = clientConnect(user1, port + 1)
96 socket2.on('loginConfirmed', () => cb())
97 }
98 ], error => {
99 expect(error).not.ok
100 parallel([
101 cb => socket1.on('disconnect', () => cb()),
102 cb => socket2.on('disconnect', () => cb()),
103 cb => {
104 instance1.disconnectUserSockets(user1)
105 cb()
106 }
107 ], done)
108 })
109 })
110
111 it('should correctly update a presence info on a shutdown', function (done) {
112 let enableUserlistUpdates = true
113 instance1 = startService(_.assign({port, enableUserlistUpdates},
114 redisConfig))
115 instance2 = startService(_.assign({port: port + 1, enableUserlistUpdates},
116 redisConfig))
117 let ids = {}
118 instance1.addRoom(roomName1, null, () => parallel([
119 cb => {
120 socket1 = clientConnect(user1, port)
121 socket1.on('loginConfirmed',
122 () => socket1.emit('roomJoin', roomName1, cb))
123 },
124 cb => {
125 socket2 = clientConnect(user2, port)
126 socket2.on('loginConfirmed',
127 () => socket2.emit('roomJoin', roomName1, cb))
128 },
129 cb => {
130 socket3 = clientConnect(user2, port + 1)
131 socket3.on('loginConfirmed', (u, d) => {
132 ids[d.id] = d.id
133 socket3.emit('roomJoin', roomName1, cb)
134 })
135 },
136 cb => {
137 socket4 = clientConnect(user2, port + 1)
138 socket4.on('loginConfirmed', (u, d) => {
139 ids[d.id] = d.id
140 socket4.emit('roomJoin', roomName1, cb)
141 })
142 },
143 cb => {
144 socket5 = clientConnect(user3, port + 1)
145 socket5.on('loginConfirmed',
146 () => socket5.emit('roomJoin', roomName1, cb))
147 }
148 ], error => {
149 expect(error).not.ok
150 parallel([
151 cb => socket2.on('roomLeftEcho', (roomName, id, njoined) => {
152 expect(roomName).equal(roomName1)
153 delete ids[id]
154 if (_.isEmpty(ids)) {
155 expect(njoined).equal(1)
156 cb()
157 }
158 }),
159 cb => socket1.on('roomUserLeft', (roomName, userName) => {
160 expect(roomName).equal(roomName1)
161 expect(userName).equal(user3)
162 cb()
163 }),
164 cb => socket2.on('roomUserLeft', (roomName, userName) => {
165 expect(roomName).equal(roomName1)
166 expect(userName).equal(user3)
167 cb()
168 }),
169 cb => closeInstance(instance2).asCallback(cb)
170 ], error => {
171 expect(error).not.ok
172 parallel([
173 cb => instance1.execUserCommand(
174 user2, 'listOwnSockets', (error, sockets) => {
175 expect(error).not.ok
176 expect(_.size(sockets)).equal(1)
177 cb()
178 }),
179 cb => instance1.execUserCommand(
180 user3, 'listOwnSockets', (error, sockets) => {
181 expect(error).not.ok
182 expect(_.size(sockets)).equal(0)
183 cb()
184 }),
185 cb => socket1.emit(
186 'roomGetAccessList', roomName1, 'userlist', (error, list) => {
187 expect(error).not.ok
188 expect(list).lengthOf(2)
189 expect(list).include(user1)
190 expect(list).include(user2)
191 cb()
192 })
193 ], done)
194 })
195 }))
196 })
197
198 it('should be able to cleanup an instance data', function (done) {
199 instance1 = startService(redisConfig)
200 instance2 = startService(_.assign({port: port + 1}, redisConfig))
201 let uid = instance1.instanceUID
202 instance1.addRoom(roomName1, null, () => {
203 socket1 = clientConnect(user1)
204 socket1.on('loginConfirmed', () => {
205 socket1.emit('roomJoin', roomName1, () => {
206 socket2 = clientConnect(user2)
207 socket2.on('loginConfirmed', () => {
208 instance1.redis.disconnect()
209 instance1.io.httpServer.close()
210 clearInterval(instance1.hbtimer)
211 instance1 = null
212 instance2.instanceRecovery(uid, error => {
213 expect(error).not.ok
214 parallel([
215 cb => instance2.execUserCommand(
216 user1, 'listOwnSockets', (error, data) => {
217 expect(error).not.ok
218 expect(data).empty
219 cb()
220 }),
221 cb => instance2.execUserCommand(
222 user2, 'listOwnSockets', (error, data) => {
223 expect(error).not.ok
224 expect(data).empty
225 cb()
226 }),
227 cb => instance2.execUserCommand(
228 true, 'roomGetAccessList', roomName1, 'userlist',
229 (error, data) => {
230 expect(error).not.ok
231 cb()
232 })
233 ], done)
234 })
235 })
236 })
237 })
238 })
239 })
240}