Refactor server picker and limit ping requests
This commit is contained in:
26
test/server/server-health.test.js
Normal file
26
test/server/server-health.test.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
|
||||
import { checkServerHealth } from '../../src/server/serverHealth.js';
|
||||
|
||||
test('server health checks cap count and concurrency', async () => {
|
||||
const servers = Array.from({ length: 300 }, (_, index) => ({
|
||||
id: `srv-${index}`,
|
||||
label: `Server ${index}`,
|
||||
host: `server-${index}.example`,
|
||||
port: 443,
|
||||
}));
|
||||
let active = 0;
|
||||
let peak = 0;
|
||||
const results = await checkServerHealth(servers, async () => {
|
||||
active += 1;
|
||||
peak = Math.max(peak, active);
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
active -= 1;
|
||||
return { ok: true, latency: 1 };
|
||||
});
|
||||
|
||||
assert.equal(results.length, 30);
|
||||
assert.equal(peak, 4);
|
||||
assert.deepEqual(results.map(({ id }) => id), servers.slice(0, 30).map(({ id }) => id));
|
||||
});
|
||||
49
test/web/server-picker.test.js
Normal file
49
test/web/server-picker.test.js
Normal file
@@ -0,0 +1,49 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import test from 'node:test';
|
||||
|
||||
import {
|
||||
autoServer,
|
||||
filterServers,
|
||||
groupServers,
|
||||
SERVER_RESULT_WINDOW,
|
||||
} from '../../src/web/utils/serverPicker.js';
|
||||
|
||||
const root = path.resolve(import.meta.dirname, '../..');
|
||||
const picker = fs.readFileSync(path.join(root, 'src/web/components/ServerPicker.jsx'), 'utf8');
|
||||
const overview = fs.readFileSync(path.join(root, 'src/web/components/ClientOverviewPage.jsx'), 'utf8');
|
||||
|
||||
const fixtures = (count) => Array.from({ length: count }, (_, index) => ({
|
||||
id: `srv-${String(count - index).padStart(3, '0')}`,
|
||||
label: index < 2 ? 'Duplicate' : `Server ${index}`,
|
||||
host: `node-${index}.example`,
|
||||
country: index % 2 ? 'NL' : 'DE',
|
||||
provider: index % 3 ? 'Harbor' : 'Other',
|
||||
protocol: index % 2 ? 'vless' : 'trojan',
|
||||
}));
|
||||
|
||||
test('server picker handles 1, 30 and 300 stable-ID servers with duplicate labels', () => {
|
||||
for (const count of [1, 30, 300]) {
|
||||
const servers = fixtures(count);
|
||||
assert.equal(filterServers(servers, '').length, count);
|
||||
assert.equal(new Set(servers.map(({ id }) => id)).size, count);
|
||||
}
|
||||
assert.equal(filterServers(fixtures(30), 'node-12.example')[0].id, 'srv-018');
|
||||
assert.equal(filterServers(fixtures(30), 'trojan').length, 15);
|
||||
assert.equal(groupServers(fixtures(30)).length, 2);
|
||||
assert.equal(autoServer(fixtures(30)).id, 'srv-001');
|
||||
assert.equal(SERVER_RESULT_WINDOW, 60);
|
||||
});
|
||||
|
||||
test('server picker keeps health manual and the rendered result window bounded', () => {
|
||||
assert.doesNotMatch(overview, /pingAll|servers\.ping/);
|
||||
assert.match(picker, /onClick={checkVisible}/);
|
||||
assert.match(picker, /\.slice\(page \* SERVER_RESULT_WINDOW, \(page \+ 1\) \* SERVER_RESULT_WINDOW\)/);
|
||||
assert.match(picker, /\.slice\(0, 30\)/);
|
||||
assert.match(picker, /Math\.min\(index, 7\)/);
|
||||
assert.match(picker, /type="search"/);
|
||||
assert.match(picker, /harbor-server-favorites/);
|
||||
assert.match(picker, /harbor-server-recent/);
|
||||
assert.match(picker, /aria-expanded={!isCollapsed}/);
|
||||
});
|
||||
Reference in New Issue
Block a user