|
1 | 1 | import * as path from "path"; |
2 | 2 | import * as fs from "fs/promises"; |
| 3 | +import * as os from "os"; |
3 | 4 | import { WASI } from "wasi"; |
4 | 5 | import { RubyVM } from "../src/index"; |
5 | 6 | import { DefaultRubyVM } from "../src/node"; |
@@ -59,6 +60,52 @@ describe("Packaging validation", () => { |
59 | 60 | vm.eval(`require "stringio"`); |
60 | 61 | }); |
61 | 62 |
|
| 63 | + test("DefaultRubyVM WASI preopens with require_relative", async () => { |
| 64 | + const mod = await loadWasmModule(`ruby+stdlib.wasm`); |
| 65 | + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "ruby-wasm-preopen-")); |
| 66 | + const nestedDir = path.join(tempDir, "nested"); |
| 67 | + const entryFile = path.join(tempDir, "entry.rb"); |
| 68 | + const helperFile = path.join(nestedDir, "helper.rb"); |
| 69 | + |
| 70 | + try { |
| 71 | + await fs.mkdir(nestedDir); |
| 72 | + await fs.writeFile(entryFile, [ |
| 73 | + "PREOPEN_ENTRY_FILE = __FILE__", |
| 74 | + "require_relative './nested/helper'", |
| 75 | + ].join("\n")); |
| 76 | + await fs.writeFile(helperFile, "PREOPEN_HELPER_FILE = __FILE__\n"); |
| 77 | + |
| 78 | + const { vm } = await DefaultRubyVM(mod, { |
| 79 | + preopens: { "/app": tempDir }, |
| 80 | + }); |
| 81 | + expect(vm.eval(`require "/app/entry"`).toString()).toBe("true"); |
| 82 | + expect(vm.eval(`require "/app/entry"`).toString()).toBe("false"); |
| 83 | + |
| 84 | + expect(vm.eval("PREOPEN_ENTRY_FILE").toString()).toBe("/app/entry.rb"); |
| 85 | + expect(vm.eval("PREOPEN_HELPER_FILE").toString()).toBe( |
| 86 | + "/app/nested/helper.rb", |
| 87 | + ); |
| 88 | + expect( |
| 89 | + vm.eval('$LOADED_FEATURES.include?("/app/entry.rb")').toString(), |
| 90 | + ).toBe("true"); |
| 91 | + expect( |
| 92 | + vm |
| 93 | + .eval('$LOADED_FEATURES.include?("/app/nested/helper.rb")') |
| 94 | + .toString(), |
| 95 | + ).toBe("true"); |
| 96 | + expect( |
| 97 | + vm |
| 98 | + .eval(`$LOADED_FEATURES.include?(${JSON.stringify(entryFile)})`) |
| 99 | + .toString(), |
| 100 | + ).toBe("false"); |
| 101 | + expect(vm.eval(`File.file?(${JSON.stringify(entryFile)})`).toString()).toBe( |
| 102 | + "false", |
| 103 | + ); |
| 104 | + } finally { |
| 105 | + await fs.rm(tempDir, { recursive: true, force: true }); |
| 106 | + } |
| 107 | + }); |
| 108 | + |
62 | 109 | test.each([ |
63 | 110 | { file: "ruby+stdlib.wasm", stdlib: true }, |
64 | 111 | { file: "ruby.debug+stdlib.wasm", stdlib: true }, |
|
0 commit comments