Files
Clipboard/test/keyhelper-reconnect.test.js
2026-09-12 13:59:12 +08:00

67 lines
2.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
const assert = require('node:assert');
const events = require('node:events');
let spawnedCount = 0;
class MockChild extends events.EventEmitter {
constructor() {
super();
this.stdin = { write: (s) => { this._lastWrite = s; }, end: () => {} };
this.stdout = new events.EventEmitter();
this.stderr = new events.EventEmitter();
spawnedCount++;
}
}
const cp = require('node:child_process');
const origSpawn = cp.spawn;
cp.spawn = () => new MockChild();
const KeyHelper = require('../keyhelper.js');
let passed = 0;
function check(name, fn) {
return Promise.resolve()
.then(fn)
.then(() => { console.log(' ok -', name); passed++; })
.catch((e) => { console.error(' FAIL -', name, e.message); process.exitCode = 1; });
}
(async () => {
await check('spawn is invoked when KeyHelper is constructed', () => {
const kh = new KeyHelper();
assert.strictEqual(spawnedCount >= 1, true);
kh.dispose();
});
await check('sendCtrlV returns a promise (no immediate throw)', () => {
const kh = new KeyHelper();
const p = kh.sendCtrlV();
assert.ok(p instanceof Promise);
kh.dispose();
// dispose() 必须把挂起的请求结掉。否则 10 秒后的超时会变成一个
// 没人接的 rejection并且那个 timer 会一直吊着事件循环。
return assert.rejects(p, /disposed/);
});
await check('dispose() clears pending map and does not leave timers', () => {
const kh = new KeyHelper();
const p = kh.sendCtrlV();
assert.strictEqual(kh.pending.size, 1);
kh.dispose();
assert.strictEqual(kh.pending.size, 0);
return p.catch(() => {});
});
await check('dispose() stops the reconnect loop', () => {
const kh = new KeyHelper();
const before = spawnedCount;
kh.dispose();
kh.ps.emit('exit', 1); // 已 dispose不应再重连
return new Promise((r) => setTimeout(r, 700))
.then(() => assert.strictEqual(spawnedCount, before));
});
cp.spawn = origSpawn;
console.log(`\n${passed} checks passed`);
})();