UNPKG

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