mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-04-14 05:26:30 -05:00
* Sockets: fix Sockets.killWorker not disconnecting connections * Sockets: fix unit tests - Fix crash when constructing mock sockets in certain cases - Properly prevent workers from writing to stdout - Fix race conditions in workers-related tests that were causing false positives * Tests: mock workers now more closely imitate sockets' workers This helps catch cases where messages are being sent in the wrong order to the workers, e.g. messages sent to sockets that no longer exist.
145 lines
4.3 KiB
JavaScript
145 lines
4.3 KiB
JavaScript
'use strict';
|
|
|
|
const assert = require('assert');
|
|
|
|
let userUtils = require('./../../dev-tools/users-utils');
|
|
let Connection = userUtils.Connection;
|
|
let User = userUtils.User;
|
|
|
|
describe('Users features', function () {
|
|
describe('Users', function () {
|
|
describe('get', function () {
|
|
it('should be a function', function () {
|
|
assert.strictEqual(typeof Users.get, 'function');
|
|
});
|
|
|
|
it('should be equal to `Users`', function () {
|
|
assert.strictEqual(Users.get, Users);
|
|
});
|
|
});
|
|
describe('connections', function () {
|
|
it('should be a Map', function () {
|
|
assert.ok(Users.connections instanceof Map);
|
|
});
|
|
});
|
|
describe('users', function () {
|
|
it('should be a Map', function () {
|
|
assert.ok(Users.users instanceof Map);
|
|
});
|
|
});
|
|
describe('Connection', function () {
|
|
describe('#onDisconnect', function () {
|
|
beforeEach(function () {
|
|
this.connection = new Connection('127.0.0.1');
|
|
});
|
|
|
|
it('should remove the connection from Users.connections', function () {
|
|
let connectionid = this.connection.id;
|
|
this.connection.destroy();
|
|
assert.strictEqual(Users.connections.has(connectionid), false);
|
|
});
|
|
|
|
it('should destroy any user on the connection as well', function () {
|
|
let user = new User(this.connection);
|
|
let {userid} = user;
|
|
user.disconnectAll();
|
|
user.destroy();
|
|
assert.strictEqual(Users.users.has(userid), false);
|
|
});
|
|
});
|
|
|
|
describe('#joinRoom', function () {
|
|
beforeEach(function () {
|
|
this.connection = new Connection('127.0.0.1');
|
|
});
|
|
|
|
afterEach(function () {
|
|
this.connection.destroy();
|
|
});
|
|
|
|
it('should join a room if not already present', function () {
|
|
this.connection.joinRoom(Rooms.lobby);
|
|
assert.ok(this.connection.inRooms.has('lobby'));
|
|
});
|
|
});
|
|
|
|
describe('#leaveRoom', function () {
|
|
it('should leave a room that is present', function () {
|
|
this.connection = new Connection('127.0.0.1');
|
|
this.connection.joinRoom(Rooms.lobby);
|
|
this.connection.leaveRoom(Rooms.lobby);
|
|
assert.ok(!this.connection.inRooms.has('lobby'));
|
|
});
|
|
});
|
|
});
|
|
describe('User', function () {
|
|
describe('#disconnectAll', function () {
|
|
for (let totalConnections of [1, 2]) {
|
|
it('should drop all ' + totalConnections + ' connection(s) and mark as inactive', function () {
|
|
let user = new User();
|
|
let iterations = totalConnections;
|
|
while (--iterations) user.mergeConnection(new Connection());
|
|
|
|
user.disconnectAll();
|
|
assert.strictEqual(user.connections.length, 0);
|
|
assert.strictEqual(user.connected, false);
|
|
});
|
|
|
|
it('should unref all ' + totalConnections + ' connection(s)', function () {
|
|
let user = new User();
|
|
let iterations = totalConnections;
|
|
while (--iterations) user.mergeConnection(new Connection());
|
|
|
|
let connections = user.connections.slice();
|
|
|
|
user.disconnectAll();
|
|
for (let i = 0; i < totalConnections; i++) {
|
|
assert.ok(!Users.connections.has(connections[i].id));
|
|
}
|
|
});
|
|
|
|
it('should clear `user` property for all ' + totalConnections + ' connection(s)', function () {
|
|
let user = new User();
|
|
let iterations = totalConnections;
|
|
while (--iterations) user.mergeConnection(new Connection());
|
|
let connections = user.connections.slice();
|
|
|
|
user.disconnectAll();
|
|
for (let i = 0; i < totalConnections; i++) {
|
|
assert.strictEqual(connections[i].user, null);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
describe('#ban', function () {
|
|
afterEach(function () {
|
|
for (let ip in Users.bannedIps) {
|
|
delete Users.bannedIps[ip];
|
|
}
|
|
});
|
|
|
|
it('should disconnect every user at that IP', function () {
|
|
let users = ['127.0.0.1', '127.0.0.1'].map(ip => new User(new Connection(ip)));
|
|
Punishments.ban(users[0]);
|
|
assert.strictEqual(users[0].connected, false);
|
|
assert.strictEqual(users[1].connected, false);
|
|
});
|
|
|
|
it('should not disconnect users at other IPs', function () {
|
|
let users = ['127.0.0.1', '127.0.0.2'].map(ip => new User(new Connection(ip)));
|
|
Punishments.ban(users[0]);
|
|
assert.strictEqual(users[1].connected, true);
|
|
});
|
|
|
|
it('should update IP count properly', function () {
|
|
let user = new User();
|
|
Punishments.ban(user);
|
|
for (let ip in user.ips) {
|
|
assert.strictEqual(user.ips[ip], 0);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|