初始化提交:go比特版本精简
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
const assert = require('assert');
|
||||
|
||||
const {
|
||||
setOpenBrowserConcurrency,
|
||||
_private: { Semaphore, openBrowserSemaphore, collectBrowserPages },
|
||||
} = 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个一页读取完成');
|
||||
|
||||
console.log('bit_api_open_concurrency.test.js: PASS');
|
||||
})().catch(error => {
|
||||
console.error(error);
|
||||
process.exitCode = 1;
|
||||
});
|
||||
Reference in New Issue
Block a user