mirror of
https://github.com/denoland/deno.git
synced 2024-12-17 21:03:01 -05:00
85 lines
1.8 KiB
TypeScript
85 lines
1.8 KiB
TypeScript
|
// Copyright Node.js contributors. All rights reserved. MIT License.
|
||
|
import { Buffer } from "../buffer.ts";
|
||
|
import Readable from "./readable.ts";
|
||
|
import Writable from "./writable.ts";
|
||
|
import { pipeline } from "./promises.ts";
|
||
|
import { deferred } from "../../async/mod.ts";
|
||
|
import {
|
||
|
assert,
|
||
|
assertEquals,
|
||
|
assertThrowsAsync,
|
||
|
} from "../../testing/asserts.ts";
|
||
|
|
||
|
Deno.test("Promise pipeline works correctly", async () => {
|
||
|
let pipelineExecuted = 0;
|
||
|
const pipelineExecutedExpected = 1;
|
||
|
const pipelineExpectedExecutions = deferred();
|
||
|
|
||
|
let finished = false;
|
||
|
// deno-lint-ignore no-explicit-any
|
||
|
const processed: any[] = [];
|
||
|
const expected = [
|
||
|
Buffer.from("a"),
|
||
|
Buffer.from("b"),
|
||
|
Buffer.from("c"),
|
||
|
];
|
||
|
|
||
|
const read = new Readable({
|
||
|
read() {},
|
||
|
});
|
||
|
|
||
|
const write = new Writable({
|
||
|
write(data, _enc, cb) {
|
||
|
processed.push(data);
|
||
|
cb();
|
||
|
},
|
||
|
});
|
||
|
|
||
|
write.on("finish", () => {
|
||
|
finished = true;
|
||
|
});
|
||
|
|
||
|
for (let i = 0; i < expected.length; i++) {
|
||
|
read.push(expected[i]);
|
||
|
}
|
||
|
read.push(null);
|
||
|
|
||
|
pipeline(read, write).then(() => {
|
||
|
pipelineExecuted++;
|
||
|
if (pipelineExecuted == pipelineExecutedExpected) {
|
||
|
pipelineExpectedExecutions.resolve();
|
||
|
}
|
||
|
assert(finished);
|
||
|
assertEquals(processed, expected);
|
||
|
});
|
||
|
|
||
|
const pipelineTimeout = setTimeout(
|
||
|
() => pipelineExpectedExecutions.reject(),
|
||
|
1000,
|
||
|
);
|
||
|
await pipelineExpectedExecutions;
|
||
|
clearTimeout(pipelineTimeout);
|
||
|
assertEquals(pipelineExecuted, pipelineExecutedExpected);
|
||
|
});
|
||
|
|
||
|
Deno.test("Promise pipeline throws on readable destroyed", async () => {
|
||
|
const read = new Readable({
|
||
|
read() {},
|
||
|
});
|
||
|
|
||
|
const write = new Writable({
|
||
|
write(_data, _enc, cb) {
|
||
|
cb();
|
||
|
},
|
||
|
});
|
||
|
|
||
|
read.push("data");
|
||
|
read.destroy();
|
||
|
|
||
|
await assertThrowsAsync(
|
||
|
() => pipeline(read, write),
|
||
|
Error,
|
||
|
"Premature close",
|
||
|
);
|
||
|
});
|