1 | 'use strict'
|
2 |
|
3 |
|
4 | const _ = require('lodash')
|
5 | const { expect } = require('chai')
|
6 |
|
7 | const { cleanup, clientConnect, closeInstance,
|
8 | parallel, startService } = require('./testutils')
|
9 |
|
10 | const { cleanupTimeout, port, user1, user2, user3,
|
11 | roomName1, redisConfig } = require('./config')
|
12 |
|
13 | module.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 | }
|