示例#1
0
        public void ItHasSpecifiedEnvironment()
        {
            var env = new Dictionary <string, string>()
            {
                { "FOO", "BAR" },
                { "WASM", "IS" },
                { "VERY", "COOL" },
            };

            var wasi = new WasiBuilder()
                       .WithEnvironmentVariables(env.Select(kvp => (kvp.Key, kvp.Value)))
                       .Build(Fixture.Module.Store);

            using var instance = Fixture.Module.Instantiate(wasi);
            dynamic inst = instance;

            var memory = instance.Externs.Memories[0];

            Assert.Equal(0, inst.call_environ_sizes_get(0, 4));
            Assert.Equal(env.Count, memory.ReadInt32(0));
            Assert.Equal(env.Sum(kvp => kvp.Key.Length + kvp.Value.Length + 2), memory.ReadInt32(4));
            Assert.Equal(0, inst.call_environ_get(0, 4 * env.Count));

            for (int i = 0; i < env.Count; ++i)
            {
                var kvp = memory.ReadNullTerminatedString(memory.ReadInt32(i * 4)).Split("=");
                Assert.Equal(env[kvp[0]], kvp[1]);
            }
        }
示例#2
0
        public void ItHasSpecifiedArguments()
        {
            var args = new List <string>()
            {
                "WASM",
                "IS",
                "VERY",
                "COOL"
            };

            var wasi = new WasiBuilder()
                       .WithArgs(args)
                       .Build(Fixture.Module.Store);

            using var instance = Fixture.Module.Instantiate(wasi);
            dynamic inst = instance;

            var memory = instance.Externs.Memories[0];

            Assert.Equal(0, inst.call_args_sizes_get(0, 4));
            Assert.Equal(args.Count, memory.ReadInt32(0));
            Assert.Equal(args.Sum(a => a.Length + 1), memory.ReadInt32(4));
            Assert.Equal(0, inst.call_args_get(0, 4 * args.Count));

            for (int i = 0; i < args.Count; ++i)
            {
                var arg = memory.ReadNullTerminatedString(memory.ReadInt32(i * 4));
                Assert.Equal(args[i], arg);
            }
        }
示例#3
0
        public void ItSetsStdOutAndStdErr(int fd)
        {
            const string MESSAGE = "WASM IS VERY COOL";

            using var file = new TempFile();

            var builder = new WasiBuilder();

            if (fd == 1)
            {
                builder.WithStandardOutput(file.Path);
            }
            else if (fd == 2)
            {
                builder.WithStandardError(file.Path);
            }

            var wasi = builder.Build(Fixture.Module.Store);

            using var instance = Fixture.Module.Instantiate(wasi);
            dynamic inst = instance;

            var memory = instance.Externs.Memories[0];

            memory.WriteInt32(0, 8);
            memory.WriteInt32(4, MESSAGE.Length);
            memory.WriteString(8, MESSAGE);

            Assert.Equal(0, inst.call_fd_write(fd, 0, 1, 32));
            Assert.Equal(MESSAGE.Length, memory.ReadInt32(32));
            Assert.Equal(0, inst.call_fd_close(fd));
            Assert.Equal(MESSAGE, File.ReadAllText(file.Path));
        }
示例#4
0
        public void ItInheritsEnvironment()
        {
            var wasi = new WasiBuilder()
                       .WithInheritedEnvironment()
                       .Build(Fixture.Module.Store);

            using var instance = Fixture.Module.Instantiate(wasi);
            dynamic inst = instance;

            var memory = instance.Externs.Memories[0];

            Assert.Equal(0, inst.call_environ_sizes_get(0, 4));
            Assert.Equal(Environment.GetEnvironmentVariables().Keys.Count, memory.ReadInt32(0));
        }
示例#5
0
        public void ItInheritsArguments()
        {
            var wasi = new WasiBuilder()
                       .WithInheritedArgs()
                       .Build(Fixture.Module.Store);

            using var instance = Fixture.Module.Instantiate(wasi);
            dynamic inst = instance;

            var memory = instance.Externs.Memories[0];

            Assert.Equal(0, inst.call_args_sizes_get(0, 4));
            Assert.Equal(Environment.GetCommandLineArgs().Length, memory.ReadInt32(0));
        }
示例#6
0
        public void ItSetsPreopenDirectories()
        {
            const string MESSAGE = "WASM IS VERY COOL";

            using var file = new TempFile();

            var wasi = new WasiBuilder()
                       .WithPreopenedDirectory(Path.GetDirectoryName(file.Path), "/foo")
                       .Build(Fixture.Module.Store);

            using var instance = Fixture.Module.Instantiate(wasi);
            dynamic inst = instance;

            var memory   = instance.Externs.Memories[0];
            var fileName = Path.GetFileName(file.Path);

            memory.WriteString(0, fileName);

            Assert.Equal(0, inst.call_path_open(
                             3,
                             0,
                             0,
                             fileName.Length,
                             0,
                             0x40 /* RIGHTS_FD_WRITE */,
                             0,
                             0,
                             64
                             )
                         );

            var fileFd = (int)memory.ReadInt32(64);

            Assert.True(fileFd > 3);

            memory.WriteInt32(0, 8);
            memory.WriteInt32(4, MESSAGE.Length);
            memory.WriteString(8, MESSAGE);

            Assert.Equal(0, inst.call_fd_write(fileFd, 0, 1, 64));
            Assert.Equal(MESSAGE.Length, memory.ReadInt32(64));
            Assert.Equal(0, inst.call_fd_close(fileFd));
            Assert.Equal(MESSAGE, File.ReadAllText(file.Path));
        }
示例#7
0
        public void ItSetsStdIn()
        {
            const string MESSAGE = "WASM IS VERY COOL";

            using var file = new TempFile();
            File.WriteAllText(file.Path, MESSAGE);

            var wasi = new WasiBuilder()
                       .WithStandardInput(file.Path)
                       .Build(Fixture.Module.Store);

            using var instance = Fixture.Module.Instantiate(wasi);
            dynamic inst = instance;

            var memory = instance.Externs.Memories[0];

            memory.WriteInt32(0, 8);
            memory.WriteInt32(4, MESSAGE.Length);

            Assert.Equal(0, inst.call_fd_read(0, 0, 1, 32));
            Assert.Equal(MESSAGE.Length, memory.ReadInt32(32));
            Assert.Equal(MESSAGE, memory.ReadString(8, MESSAGE.Length));
        }