Files
go_bt/tests/bit_api_open_concurrency.test.js
T

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;
});