mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 18:38:55 +00:00
156 lines
4.3 KiB
TypeScript
156 lines
4.3 KiB
TypeScript
// test functions that use DOMJIT
|
|
|
|
import { describe, expect, test } from "bun:test";
|
|
|
|
import { ptr, read } from "bun:ffi";
|
|
import crypto from "crypto";
|
|
import { statSync } from "fs";
|
|
import vm from "node:vm";
|
|
|
|
const dirStats = statSync(import.meta.dir);
|
|
const buffer = new BigInt64Array(16);
|
|
|
|
describe("DOMJIT", () => {
|
|
const buf = new Uint8Array(4);
|
|
for (let iter of [1000, 10000, 100000, 1000000]) {
|
|
test("Buffer.alloc", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
Buffer.alloc(1);
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("Buffer.allocUnsafe", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
Buffer.allocUnsafe(1);
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("Buffer.allocUnsafeSlow", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
Buffer.allocUnsafeSlow(1);
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("Performance.now", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
performance.now();
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("TextEncoder.encode", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
new TextEncoder().encode("test");
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("TextEncoder.encodeInto", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
new TextEncoder().encodeInto("test", buf);
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("Crypto.timingSafeEqual", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
crypto.timingSafeEqual(buf, buf);
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("Crypto.randomUUID", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
crypto.randomUUID();
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("Crypto.getRandomValues", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
crypto.getRandomValues(buf);
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("TextDecoder.decode", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
new TextDecoder().decode(buf);
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test("Stats", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
dirStats.isSymbolicLink();
|
|
dirStats.isSocket();
|
|
dirStats.isFile();
|
|
dirStats.isFIFO();
|
|
dirStats.isDirectory();
|
|
dirStats.isCharacterDevice();
|
|
dirStats.isBlockDevice();
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
test.todo("FFI ptr and read", () => {
|
|
for (let i = 0; i < iter; i++) {
|
|
read.intptr(ptr(buffer), 8);
|
|
read.ptr(ptr(buffer), 8);
|
|
read.f64(ptr(buffer), 8);
|
|
read.i64(ptr(buffer), 8);
|
|
read.u64(ptr(buffer), 8);
|
|
read.i8(ptr(buffer), 8);
|
|
read.i16(ptr(buffer), 8);
|
|
read.i32(ptr(buffer), 8);
|
|
read.u8(ptr(buffer), 8);
|
|
read.u16(ptr(buffer), 8);
|
|
read.u32(ptr(buffer), 8);
|
|
}
|
|
expect(true).toBe(true);
|
|
});
|
|
}
|
|
|
|
describe("in NodeVM", () => {
|
|
const code = `
|
|
const buf = new Uint8Array(4);
|
|
const encoder = new TextEncoder();
|
|
for (let iter of [100000]) {
|
|
for (let i = 0; i < iter; i++) {
|
|
performance.now();
|
|
}
|
|
for (let i = 0; i < iter; i++) {
|
|
new TextEncoder().encode("test");
|
|
}
|
|
const str = "a".repeat(1030);
|
|
for (let i = 0; i < 1000000; i++) {
|
|
const result = encoder.encode(str);
|
|
}
|
|
for (let i = 0; i < iter; i++) {
|
|
new TextEncoder().encodeInto("test", buf);
|
|
}
|
|
for (let i = 0; i < iter; i++) {
|
|
crypto.timingSafeEqual(buf, buf);
|
|
}
|
|
for (let i = 0; i < iter; i++) {
|
|
crypto.randomUUID();
|
|
}
|
|
for (let i = 0; i < iter; i++) {
|
|
crypto.getRandomValues(buf);
|
|
}
|
|
for (let i = 0; i < iter; i++) {
|
|
new TextDecoder().decode(buf);
|
|
}
|
|
for (let i = 0; i < iter; i++) {
|
|
dirStats.isSymbolicLink();
|
|
dirStats.isSocket();
|
|
dirStats.isFile();
|
|
dirStats.isFIFO();
|
|
dirStats.isDirectory();
|
|
dirStats.isCharacterDevice();
|
|
dirStats.isBlockDevice();
|
|
}
|
|
}
|
|
"success";`;
|
|
test("Script.runInNewContext", () => {
|
|
const script = new vm.Script(code);
|
|
expect(script.runInNewContext({ crypto, performance, TextEncoder, TextDecoder, dirStats })).toBe("success");
|
|
}, 20_000);
|
|
test("vm.runInNewContext", () => {
|
|
expect(vm.runInNewContext(code, { crypto, performance, TextEncoder, TextDecoder, dirStats })).toBe("success");
|
|
}, 20_000);
|
|
});
|
|
});
|