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