Files
go_bt/tests/os_mouse_concurrency_lock.test.js

46 lines
1.4 KiB
JavaScript

'use strict';
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const { _private } = require('../src/utils/os_mouse');
(async () => {
let active = 0;
let maxActive = 0;
const timeline = [];
const logs = [];
const results = await Promise.all([0, 1, 2, 3].map(index => (
_private.withOsMouseLock(async () => {
active++;
maxActive = Math.max(maxActive, active);
timeline.push(`start-${index}`);
await new Promise(resolve => setTimeout(resolve, 5));
timeline.push(`end-${index}`);
active--;
return index;
}, message => logs.push(message))
)));
assert.deepStrictEqual(results, [0, 1, 2, 3]);
assert.strictEqual(maxActive, 1, '真实鼠标临界区不得并行执行');
assert.deepStrictEqual(timeline, [
'start-0', 'end-0',
'start-1', 'end-1',
'start-2', 'end-2',
'start-3', 'end-3',
], '真实鼠标操作应按进入顺序串行执行');
assert(logs.some(message => message.includes('等待其它窗口')),
'出现并发等待时应写入可观测日志');
const source = fs.readFileSync(path.join(__dirname, '..', 'src', 'utils', 'os_mouse.js'), 'utf8');
assert(source.includes('[WKeyboard]::keybd_event(0x1B'),
'必须用系统级 Escape 关闭网页 DOM 无法控制的浏览器保存密码弹窗');
console.log('os_mouse_concurrency_lock.test.js: PASS');
})().catch(error => {
console.error(error);
process.exitCode = 1;
});