PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@wasmer/wasi/tests

Просмотр файла: index.spec.js

const fs = require('fs');
const { init, WASI, MemFS } = require('../dist/Library.cjs.js');


async function initWasi(moduleBytes, config, imports = {}) {
  let wasi = new WASI(config);
  const module = await WebAssembly.compile(moduleBytes);
  await wasi.instantiate(module, imports);
  return wasi;
}

beforeAll(async () => {
  await init();
});

test('envvar works', async () => {
  let wasi = await initWasi(fs.readFileSync(__dirname + '/envvar.wasm'), {
    env: {
      DOG: "X",
      TEST: "VALUE",
      TEST2: "VALUE2"
    }
  });
  let code = wasi.start();
  expect(wasi.getStdoutString()).toBe(`Env vars:
DOG=X
TEST2=VALUE2
TEST=VALUE
DOG Ok("X")
DOG_TYPE Err(NotPresent)
SET VAR Ok("HELLO")
`);
});

test('demo works', async () => {
  let contents = fs.readFileSync(__dirname + '/demo.wasm');
  let wasi = await initWasi(contents, {});
  let code = wasi.start();
  expect(wasi.getStdoutString()).toBe("hello world\n");
});

test('piping works', async () => {
  let contents = fs.readFileSync(__dirname + '/pipe_reverse.wasm');
  let wasi = await initWasi(contents, {});
  wasi.setStdinString("Hello World!");
  let code = wasi.start();
  expect(wasi.getStdoutString()).toBe("!dlroW olleH\n");
});

test('mapdir works', async () => {
  let contents = fs.readFileSync(__dirname + '/mapdir.wasm');
  let wasi = await initWasi(contents, {});
  wasi.fs.createDir("/a");
  wasi.fs.createDir("/b");
  let file = wasi.fs.open("/file", {read: true, write: true, create: true});
  file.writeString("fileContents");
  file.seek(0);
  // console.log(file.readString());
  // console.log(wasi.fs.readDir("/"));
  let code = wasi.start();
  expect(wasi.getStdoutString()).toBe(`"./a"\n"./b"\n"./file"\n`);
});

test('testing wasm', async() => {

  let contents = fs.readFileSync(__dirname + '/test.wasm');
  let wasi = await initWasi(contents, {}, {
    'module': {
        'external': function() { console.log("external: hello world!") }
    }});

  // Run the start function
  let exitCode = wasi.start();
  let stdout = wasi.getStdoutString();

  // This should print "hello world (exit code: 0)"
  console.log(`${stdout}(exit code: ${exitCode})`);
})

test('wasi initialize with JS imports', async() => {
  let moduleBytes = fs.readFileSync(__dirname + '/test.wasm');
  let wasi = new WASI({});
  const module = await WebAssembly.compile(moduleBytes);
  let imports = wasi.getImports(module);
  let instance = await WebAssembly.instantiate(module, {
    ...imports,
    'module': {
      'external': function() { console.log("external: hello world!") }
    }
  });
  let code = wasi.start(instance);
  expect(code).toBe(0);
});

test('wasi initialize with JS imports with empty start', async() => {
  let moduleBytes = fs.readFileSync(__dirname + '/test.wasm');
  let wasi = new WASI({});
  const module = await WebAssembly.compile(moduleBytes);
  let imports = wasi.getImports(module);
  let instance = await WebAssembly.instantiate(module, {
    ...imports,
    'module': {
      'external': function() { console.log("external: hello world!") }
    }
  });
  expect(() => wasi.start()).toThrow("You need to provide an instance as argument to `start`, or call `wasi.instantiate` with the `WebAssembly.Instance` manually");
});

test('wasi fs config works', async() => {
  let fs = new MemFS();
  fs.createDir('/magic');
  let wasi = new WASI({fs});
  expect(wasi.fs.readDir('/').map(e => e.path)).toEqual(['/magic']);
});

test('mapdir with fs config works', async () => {
  let wfs = new MemFS();
  wfs.createDir('/magic');
  let contents = fs.readFileSync(__dirname + '/mapdir.wasm');
  let wasi = await initWasi(contents, {fs: wfs});
  let code = wasi.start();
  expect(wasi.getStdoutString()).toBe(`"./magic"\n`);
});

test('get imports', async() => {
  let moduleBytes = fs.readFileSync(__dirname + '/test.wasm');
  let wasi = new WASI({});
  const module = await WebAssembly.compile(moduleBytes);
  let imports = wasi.getImports(module);
  // console.log(imports);
  let instance = await WebAssembly.instantiate(module, {
    ...imports,
    'module': {
      'external': function() { console.log("external: hello world!") }
    }
  });
  wasi.instantiate(instance);
  let exitCode = wasi.start();
  let stdout = wasi.getStdoutString();

  expect(exitCode).toBe(0);

  // This should print "hello world (exit code: 0)"
  console.log(`${stdout}(exit code: ${exitCode})`);

  // expect(Object.keys(imports["wasi_snapshot_preview1"])).toStrictEqual([
  //   "fd_datasync",
  //   "fd_write",
  //   "poll_oneoff",
  //   "fd_advise",
  //   "sock_shutdown",
  //   "fd_prestat_dir_name",
  //   "path_readlink",
  //   "args_sizes_get",
  //   "fd_sync",
  //   "path_symlink",
  //   "path_rename",
  //   "clock_res_get",
  //   "path_unlink_file",
  //   "path_link",
  //   "path_remove_directory",
  //   "fd_allocate",
  //   "path_create_directory",
  //   "environ_sizes_get",
  //   "proc_exit",
  //   "random_get",
  //   "fd_fdstat_set_flags",
  //   "fd_close",
  //   "environ_get",
  //   "fd_readdir",
  //   "fd_read",
  //   "fd_seek",
  //   "fd_filestat_get",
  //   "path_open",
  //   "proc_raise",
  //   "fd_tell",
  //   "fd_fdstat_get",
  //   "sched_yield",
  //   "fd_pread",
  //   "fd_renumber",
  //   "fd_pwrite",
  //   "path_filestat_set_times",
  //   "sock_recv",
  //   "fd_fdstat_set_rights",
  //   "fd_prestat_get",
  //   "path_filestat_get",
  //   "fd_filestat_set_times",
  //   "fd_filestat_set_size",
  //   "sock_send",
  //   "args_get",
  //   "clock_time_get"
  // ]);
})

Выполнить команду


Для локальной разработки. Не используйте в интернете!