95 lines
3.2 KiB
JavaScript
95 lines
3.2 KiB
JavaScript
const { describe, it, beforeEach, afterEach } = require('node:test');
|
|
const assert = require('node:assert');
|
|
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
|
|
// Test the module can be required and has the expected API
|
|
describe('RemoteServer', () => {
|
|
it('should export a class with start/stop methods', () => {
|
|
const RemoteServer = require('../lib/remote-server');
|
|
assert.strictEqual(typeof RemoteServer, 'function');
|
|
assert.strictEqual(typeof RemoteServer.prototype.start, 'function');
|
|
assert.strictEqual(typeof RemoteServer.prototype.stop, 'function');
|
|
assert.strictEqual(typeof RemoteServer.prototype.getClientCount, 'function');
|
|
});
|
|
|
|
it('should start and stop without errors', async () => {
|
|
const RemoteServer = require('../lib/remote-server');
|
|
const server = new RemoteServer();
|
|
|
|
// Mock mainWindow
|
|
const mockMainWindow = {
|
|
isDestroyed: () => false,
|
|
getTitle: () => 'Test Window',
|
|
getContentBounds: () => ({ x: 0, y: 0, width: 1920, height: 1080 }),
|
|
webContents: {
|
|
sendInputEvent: () => {}
|
|
}
|
|
};
|
|
|
|
await server.start({
|
|
port: 0, // random available port
|
|
host: '127.0.0.1',
|
|
token: 'test-token-123',
|
|
allowInput: true,
|
|
mainWindow: mockMainWindow,
|
|
onSignalingToCapture: () => {},
|
|
onCreateCaptureWindow: () => {},
|
|
onDestroyCaptureWindow: () => {}
|
|
});
|
|
|
|
assert.strictEqual(server.getClientCount(), 0);
|
|
server.stop();
|
|
});
|
|
|
|
it('binds to loopback when no host is supplied', async () => {
|
|
const RemoteServer = require('../lib/remote-server');
|
|
const server = new RemoteServer();
|
|
try {
|
|
await server.start({
|
|
port: 0,
|
|
token: 'test-token-123',
|
|
onSignalingToCapture: () => {},
|
|
onCreateCaptureWindow: () => {},
|
|
onDestroyCaptureWindow: () => {}
|
|
});
|
|
assert.strictEqual(server._wss.address().address, '127.0.0.1');
|
|
} finally {
|
|
server.stop();
|
|
}
|
|
});
|
|
|
|
it('keeps the application remote-control listener on loopback', () => {
|
|
const source = fs.readFileSync(path.join(__dirname, '..', 'main.js'), 'utf8');
|
|
const start = source.indexOf('async function startRemoteServer()');
|
|
const end = source.indexOf("ipcMain.on('remote:signaling-from-capture'", start);
|
|
assert.notStrictEqual(start, -1);
|
|
assert.notStrictEqual(end, -1);
|
|
assert.match(source.slice(start, end), /host:\s*'127\.0\.0\.1'/);
|
|
});
|
|
|
|
it('rejects non-object JSON before authentication without throwing', () => {
|
|
const { EventEmitter } = require('node:events');
|
|
const RemoteServer = require('../lib/remote-server');
|
|
const server = new RemoteServer();
|
|
const socket = new EventEmitter();
|
|
socket.close = (code) => {
|
|
socket.closeCode = code;
|
|
};
|
|
socket.send = () => {};
|
|
server._config = {
|
|
token: 'test-token-123',
|
|
allowlist: [],
|
|
diagnosticMode: false,
|
|
onCreateCaptureWindow: () => {},
|
|
onDestroyCaptureWindow: () => {},
|
|
onSignalingToCapture: () => {}
|
|
};
|
|
|
|
server._handleConnection(socket, { socket: { remoteAddress: '127.0.0.1' } });
|
|
assert.doesNotThrow(() => socket.emit('message', Buffer.from('null')));
|
|
assert.strictEqual(socket.closeCode, 4002);
|
|
socket.emit('close');
|
|
});
|
|
});
|