75 lines
2.8 KiB
JavaScript
75 lines
2.8 KiB
JavaScript
const assert = require('assert');
|
|
|
|
const {
|
|
setOpenBrowserConcurrency,
|
|
_private: { Semaphore, openBrowserSemaphore, collectBrowserPages, parseAccountProxy },
|
|
} = require('../src/core/bit_api');
|
|
|
|
(async () => {
|
|
const semaphore = new Semaphore(2);
|
|
await semaphore.acquire();
|
|
await semaphore.acquire();
|
|
|
|
let released = 0;
|
|
const waiters = Array.from({ length: 3 }, () => semaphore.acquire().then(() => { released++; }));
|
|
await new Promise(resolve => setImmediate(resolve));
|
|
assert.strictEqual(semaphore.getStats().queued, 3, '超过并发上限的请求应进入队列');
|
|
|
|
semaphore.setMax(5);
|
|
await Promise.all(waiters);
|
|
assert.strictEqual(released, 3, '提高并发上限后应立即释放新增名额');
|
|
assert.strictEqual(semaphore.getStats().max, 5);
|
|
|
|
const configured = setOpenBrowserConcurrency(50);
|
|
assert.strictEqual(configured, 50, '打开请求并发应跟随任务设置');
|
|
assert.strictEqual(openBrowserSemaphore.getStats().max, 50);
|
|
|
|
const pageCalls = [];
|
|
const pagedApi = {
|
|
async listBrowsers({ page, pageSize }) {
|
|
pageCalls.push({ page, pageSize });
|
|
const all = Array.from({ length: 186 }, (_, index) => ({ id: `browser-${index + 1}`, seq: index + 1 }));
|
|
const start = page * 100;
|
|
return {
|
|
success: true,
|
|
data: { page, pageSize, totalNum: all.length, list: all.slice(start, start + pageSize) },
|
|
};
|
|
},
|
|
};
|
|
const allBrowsers = await collectBrowserPages(pagedApi, { pageSize: 1000 });
|
|
assert.strictEqual(allBrowsers.length, 186, '比特窗口超过100个时必须自动读取后续页面');
|
|
assert.deepStrictEqual(pageCalls.map(call => call.page), [0, 1]);
|
|
|
|
const largePageCalls = [];
|
|
const largePagedApi = {
|
|
async listBrowsers({ page, pageSize }) {
|
|
largePageCalls.push({ page, pageSize });
|
|
const totalNum = 1250;
|
|
const start = page * 100;
|
|
const list = Array.from(
|
|
{ length: Math.max(0, Math.min(pageSize, totalNum - start)) },
|
|
(_, index) => ({ id: `large-browser-${start + index + 1}`, seq: start + index + 1 }),
|
|
);
|
|
return { success: true, data: { page, pageSize, totalNum, list } };
|
|
},
|
|
};
|
|
const largeBrowsers = await collectBrowserPages(largePagedApi, { maxItems: 10000 });
|
|
assert.strictEqual(largeBrowsers.length, 1250, '完整同步不能在1000个窗口处截断');
|
|
assert.strictEqual(largePageCalls.length, 13, '1250个窗口应按100个一页读取完成');
|
|
|
|
assert.deepStrictEqual(parseAccountProxy(''), { proxyMethod: 2, proxyType: 'noproxy' });
|
|
assert.deepStrictEqual(parseAccountProxy('127.0.0.1:1080:user:p:ass'), {
|
|
proxyMethod: 2,
|
|
proxyType: 'socks5',
|
|
host: '127.0.0.1',
|
|
port: '1080',
|
|
proxyUserName: 'user',
|
|
proxyPassword: 'p:ass',
|
|
});
|
|
|
|
console.log('bit_api_open_concurrency.test.js: PASS');
|
|
})().catch(error => {
|
|
console.error(error);
|
|
process.exitCode = 1;
|
|
});
|