1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-01 09:24:20 -04:00
denoland-deno/std/mime/multipart_test.ts
Bartek Iwańczuk 6e2df8c64f
feat: Deno.test() sanitizes ops and resources (#4399)
This PR brings assertOps and assertResources sanitizers to Deno.test() API.

assertOps checks that test doesn't leak async ops, ie. there are no unresolved
promises originating from Deno APIs. Enabled by default, can be disabled using 
Deno.TestDefinition.disableOpSanitizer.

assertResources checks that test doesn't leak resources, ie. all resources used
in test are closed. For example; if a file is opened during a test case it must be
explicitly closed before test case finishes. It's most useful for asynchronous
generators. Enabled by default, can be disabled using 
Deno.TestDefinition.disableResourceSanitizer.

We've used those sanitizers in internal runtime tests and it proved very useful in
surfacing incorrect tests which resulted in interference between the tests.

All tests have been sanitized.

Closes #4208
2020-03-18 19:25:55 -04:00

218 lines
5.2 KiB
TypeScript

// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
const { Buffer, copy, open, remove } = Deno;
import {
assert,
assertEquals,
assertThrows,
assertThrowsAsync
} from "../testing/asserts.ts";
const { test } = Deno;
import * as path from "../path/mod.ts";
import {
FormFile,
MultipartReader,
MultipartWriter,
isFormFile,
matchAfterPrefix,
scanUntilBoundary
} from "./multipart.ts";
import { StringWriter } from "../io/writers.ts";
const e = new TextEncoder();
const boundary = "--abcde";
const dashBoundary = e.encode("--" + boundary);
const nlDashBoundary = e.encode("\r\n--" + boundary);
test(function multipartScanUntilBoundary1(): void {
const data = `--${boundary}`;
const n = scanUntilBoundary(
e.encode(data),
dashBoundary,
nlDashBoundary,
0,
true
);
assertEquals(n, Deno.EOF);
});
test(function multipartScanUntilBoundary2(): void {
const data = `foo\r\n--${boundary}`;
const n = scanUntilBoundary(
e.encode(data),
dashBoundary,
nlDashBoundary,
0,
true
);
assertEquals(n, 3);
});
test(function multipartScanUntilBoundary3(): void {
const data = `foobar`;
const n = scanUntilBoundary(
e.encode(data),
dashBoundary,
nlDashBoundary,
0,
false
);
assertEquals(n, data.length);
});
test(function multipartScanUntilBoundary4(): void {
const data = `foo\r\n--`;
const n = scanUntilBoundary(
e.encode(data),
dashBoundary,
nlDashBoundary,
0,
false
);
assertEquals(n, 3);
});
test(function multipartMatchAfterPrefix1(): void {
const data = `${boundary}\r`;
const v = matchAfterPrefix(e.encode(data), e.encode(boundary), false);
assertEquals(v, 1);
});
test(function multipartMatchAfterPrefix2(): void {
const data = `${boundary}hoge`;
const v = matchAfterPrefix(e.encode(data), e.encode(boundary), false);
assertEquals(v, -1);
});
test(function multipartMatchAfterPrefix3(): void {
const data = `${boundary}`;
const v = matchAfterPrefix(e.encode(data), e.encode(boundary), false);
assertEquals(v, 0);
});
test(async function multipartMultipartWriter(): Promise<void> {
const buf = new Buffer();
const mw = new MultipartWriter(buf);
await mw.writeField("foo", "foo");
await mw.writeField("bar", "bar");
const f = await open(path.resolve("./mime/testdata/sample.txt"), "r");
await mw.writeFile("file", "sample.txt", f);
await mw.close();
f.close();
});
test(function multipartMultipartWriter2(): void {
const w = new StringWriter();
assertThrows(
(): MultipartWriter => new MultipartWriter(w, ""),
Error,
"invalid boundary length"
);
assertThrows(
(): MultipartWriter =>
new MultipartWriter(
w,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
"aaaaaaaa"
),
Error,
"invalid boundary length"
);
assertThrows(
(): MultipartWriter => new MultipartWriter(w, "aaa aaa"),
Error,
"invalid boundary character"
);
assertThrows(
(): MultipartWriter => new MultipartWriter(w, "boundary¥¥"),
Error,
"invalid boundary character"
);
});
test(async function multipartMultipartWriter3(): Promise<void> {
const w = new StringWriter();
const mw = new MultipartWriter(w);
await mw.writeField("foo", "foo");
await mw.close();
await assertThrowsAsync(
async (): Promise<void> => {
await mw.close();
},
Error,
"closed"
);
await assertThrowsAsync(
async (): Promise<void> => {
// @ts-ignore
await mw.writeFile("bar", "file", null);
},
Error,
"closed"
);
await assertThrowsAsync(
async (): Promise<void> => {
await mw.writeField("bar", "bar");
},
Error,
"closed"
);
assertThrows(
(): void => {
mw.createFormField("bar");
},
Error,
"closed"
);
assertThrows(
(): void => {
mw.createFormFile("bar", "file");
},
Error,
"closed"
);
});
test(async function multipartMultipartReader(): Promise<void> {
// FIXME: path resolution
const o = await open(path.resolve("./mime/testdata/sample.txt"));
const mr = new MultipartReader(
o,
"--------------------------434049563556637648550474"
);
const form = await mr.readForm(10 << 20);
assertEquals(form["foo"], "foo");
assertEquals(form["bar"], "bar");
const file = form["file"] as FormFile;
assertEquals(isFormFile(file), true);
assert(file.content !== void 0);
o.close();
});
test(async function multipartMultipartReader2(): Promise<void> {
const o = await open(path.resolve("./mime/testdata/sample.txt"));
const mr = new MultipartReader(
o,
"--------------------------434049563556637648550474"
);
const form = await mr.readForm(20); //
try {
assertEquals(form["foo"], "foo");
assertEquals(form["bar"], "bar");
const file = form["file"] as FormFile;
assertEquals(file.type, "application/octet-stream");
assert(file.tempfile != null);
const f = await open(file.tempfile);
const w = new StringWriter();
await copy(w, f);
const json = JSON.parse(w.toString());
assertEquals(json["compilerOptions"]["target"], "es2018");
f.close();
} finally {
const file = form["file"] as FormFile;
if (file.tempfile) {
await remove(file.tempfile);
}
o.close();
}
});