46 lines
1.4 KiB
JavaScript
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;
|
|
});
|