This commit is contained in:
2026-10-18 03:11:10 +07:00
parent 8610f45a29
commit 3e2608eae3
23 changed files with 1460 additions and 302 deletions
+68
View File
@@ -398,3 +398,71 @@ test('превышение времени бездействия повторя
assert.equal(f.calls.length, 3)
assert.deepEqual(f.store.list(), [])
})
test('инкрементальный кеш: завершённый файл доступен до полного пакета, повторно не скачивается и переживает перезапуск', async (t) => {
const f = await fixture(t)
await f.store.remember(f.pkg)
const first = f.pkg.assets[0]!
const second = f.pkg.assets[1]!
await f.store.ensureAsset(f.pkg, first.id, new AbortController().signal)
assert.equal(f.calls.length, 1)
await assert.rejects(f.store.localFile(f.key, second.id))
const range = await packageMediaResponse(
f.store,
new Request(`screen-app://app/packages/${f.key}/${first.id}`, {
headers: { Range: 'bytes=2-5' },
}),
)
assert.equal(range.status, 206)
assert.deepEqual(Buffer.from(await range.arrayBuffer()), body.subarray(2, 6))
await f.store.ensureAsset(f.pkg, first.id, new AbortController().signal)
assert.equal(f.calls.length, 1)
const restored = new PackageStore(f.root, f.dependencies)
await restored.initialize()
assert.equal(restored.description(f.key)?.package.metadataVersion, f.pkg.metadataVersion)
await restored.ensureAsset(f.pkg, first.id, new AbortController().signal)
assert.equal(f.calls.length, 1)
assert.deepEqual(await readFile((await restored.localFile(f.key, first.id)).path), body)
})
test('инкрементальный кеш: повреждённый файл восстанавливается независимо от остальных, параллельные запросы объединяются', async (t) => {
const f = await fixture(t)
await f.store.download(f.pkg)
const first = f.pkg.assets[0]!
const second = f.pkg.assets[1]!
const path = (await f.store.localFile(f.key, first.id)).path
await writeFile(path, Buffer.alloc(body.length))
const before = f.calls.length
await Promise.all(
[0, 1].map(() => f.store.ensureAsset(f.pkg, first.id, new AbortController().signal)),
)
assert.equal(f.calls.length, before + 1)
assert.deepEqual(await readFile((await f.store.localFile(f.key, first.id)).path), body)
assert.deepEqual(await readFile((await f.store.localFile(f.key, second.id)).path), body)
const restored = new PackageStore(f.root, f.dependencies)
await restored.initialize()
assert.ok(restored.description(f.key), 'описание восстановленного пакета переживает перезапуск')
assert.deepEqual(await readFile((await restored.localFile(f.key, first.id)).path), body)
})
test('инкрементальный кеш: ошибка и отмена не публикуют незавершённый файл и сохраняют готовый', async (t) => {
const f = await fixture(t)
await f.store.remember(f.pkg)
const [first, second] = f.pkg.assets
await f.store.ensureAsset(f.pkg, first!.id, new AbortController().signal)
f.state.free = 0n
await assert.rejects(
f.store.ensureAsset(f.pkg, second!.id, new AbortController().signal),
/места/,
)
await assert.rejects(f.store.localFile(f.key, second!.id))
assert.deepEqual(await readFile((await f.store.localFile(f.key, first!.id)).path), body)
f.state.free = highSpace
const abort = new AbortController()
f.state.handler = async () => {
abort.abort()
return mediaResponse()
}
await assert.rejects(f.store.ensureAsset(f.pkg, second!.id, abort.signal))
await assert.rejects(f.store.localFile(f.key, second!.id))
})