up
This commit is contained in:
@@ -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))
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user