52 lines
1.5 KiB
TypeScript
52 lines
1.5 KiB
TypeScript
import {createServer} from 'node:net';
|
|
import {describe, expect, it} from 'vitest';
|
|
import {
|
|
findAvailablePort,
|
|
resolveDevStackPorts,
|
|
} from './dev-stack-port-utils.mjs';
|
|
|
|
function reservePort(port) {
|
|
return new Promise((resolve, reject) => {
|
|
const server = createServer();
|
|
|
|
server.once('error', reject);
|
|
server.listen(port, '127.0.0.1', () => {
|
|
server.off('error', reject);
|
|
resolve(server);
|
|
});
|
|
});
|
|
}
|
|
|
|
describe('dev stack port utils', () => {
|
|
it('使用端口可用性检查为被占用端口寻找后续可用端口', async () => {
|
|
const firstServer = await reservePort(0);
|
|
const firstPort = firstServer.address().port;
|
|
const secondServer = await reservePort(firstPort + 1);
|
|
|
|
try {
|
|
const availablePort = await findAvailablePort({
|
|
host: '127.0.0.1',
|
|
preferredPort: firstPort,
|
|
});
|
|
|
|
expect(availablePort).toBeGreaterThan(firstPort + 1);
|
|
} finally {
|
|
await Promise.all([
|
|
new Promise((resolve) => firstServer.close(resolve)),
|
|
new Promise((resolve) => secondServer.close(resolve)),
|
|
]);
|
|
}
|
|
});
|
|
|
|
it('为 npm run dev 的所有后续流程解析互不冲突的端口', async () => {
|
|
const resolvedPorts = await resolveDevStackPorts({
|
|
spacetime: {host: '127.0.0.1', preferredPort: 0},
|
|
api: {host: '127.0.0.1', preferredPort: 0},
|
|
web: {host: '127.0.0.1', preferredPort: 0},
|
|
adminWeb: {host: '127.0.0.1', preferredPort: 0},
|
|
});
|
|
|
|
expect(new Set(Object.values(resolvedPorts)).size).toBe(4);
|
|
});
|
|
});
|