test(artifacts): fit the buffered member case to Windows stream buffers

The shared reader lifecycle case waits for a member's writable side to
finish before it reads anything. That only happens while the member fits
below the readable high-water mark. Node's default is 16 KiB on Windows and
64 KiB elsewhere, and the ESP flash fixture's first member is a 32 KiB
bootloader region, so both cases hung until the 30 s timeout on Windows.

Pick the first nonempty member that fits the default buffer and assert
that it fits the opened stream before waiting.
This commit is contained in:
RRFZ authored and Ysopwnable committed 2026-11-14 04:50:06 +01:00
1 parent bddbd80afb
commit 3986bf9f8e
1 file changed
+15 -3
+15 -3
View File
@@ -1,5 +1,6 @@
import { writeFile } from "node:fs/promises";
import { join } from "node:path";
import { getDefaultHighWaterMark } from "node:stream";
import { buffer } from "node:stream/consumers";
import { finished } from "node:stream/promises";
import { setImmediate } from "node:timers/promises";
@@ -60,8 +61,18 @@ const consumptionCases = ({ image, createReader }: LifecycleFixture): void => {
const controller = new AbortController();
const reason = new Error("cancel buffered member");
try {
const [entry] = await entries(reader);
const stream = await reader.open(entry!, controller.signal);
// Unread bytes buffer fully only below the readable high-water mark.
// Node's default is 16 KiB on Windows and 64 KiB elsewhere.
const entry = (await entries(reader)).find(
({ declaredSize }) =>
declaredSize !== null &&
declaredSize > 0 &&
declaredSize < getDefaultHighWaterMark(false),
);
if (entry === undefined)
throw new Error("fixture has no member that fits one stream buffer");
const stream = await reader.open(entry, controller.signal);
expect(entry.declaredSize).toBeLessThan(stream.readableHighWaterMark);
await finished(stream, { readable: false, cleanup: true });
await setImmediate();
expect(stream.readableLength).toBeGreaterThan(0);
@@ -243,7 +254,8 @@ const validationCases = ({ image, createReader }: LifecycleFixture): void => {
};
/** Stored-member readers share ownership and native I/O regression oracles.
* The fixture must have a nonempty first entry with a physical byte range.
* The fixture must have a nonempty first entry with a physical byte range,
* and a nonempty entry smaller than Node's default stream buffer.
*/
export const artifactReaderLifecycleCases = (setup: LifecycleFixture): void => {
describe("stored member lifecycle", () => {