Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wasi/tests/all/p1.rs
3114 views
1
use crate::store::Ctx;
2
use std::path::Path;
3
use test_programs_artifacts::*;
4
use wasmtime::Result;
5
use wasmtime::{Linker, Module};
6
use wasmtime_wasi::p1::{WasiP1Ctx, add_to_linker_async};
7
8
async fn run(path: &str, inherit_stdio: bool) -> Result<()> {
9
let path = Path::new(path);
10
let name = path.file_stem().unwrap().to_str().unwrap();
11
let engine = test_programs_artifacts::engine(|_config| {});
12
let mut linker = Linker::<Ctx<WasiP1Ctx>>::new(&engine);
13
add_to_linker_async(&mut linker, |t| &mut t.wasi)?;
14
15
let module = Module::from_file(&engine, path)?;
16
let (mut store, _td) = Ctx::new(&engine, name, |builder| {
17
if inherit_stdio {
18
builder.inherit_stdio();
19
}
20
builder.build_p1()
21
})?;
22
let instance = linker.instantiate_async(&mut store, &module).await?;
23
let start = instance.get_typed_func::<(), ()>(&mut store, "_start")?;
24
start.call_async(&mut store, ()).await?;
25
Ok(())
26
}
27
28
foreach_p1!(assert_test_exists);
29
30
// Below here is mechanical: there should be one test for every binary in
31
// wasi-tests.
32
#[test_log::test(tokio::test(flavor = "multi_thread"))]
33
async fn p1_big_random_buf() {
34
run(P1_BIG_RANDOM_BUF, false).await.unwrap()
35
}
36
#[test_log::test(tokio::test(flavor = "multi_thread"))]
37
async fn p1_clock_time_get() {
38
run(P1_CLOCK_TIME_GET, false).await.unwrap()
39
}
40
#[test_log::test(tokio::test(flavor = "multi_thread"))]
41
async fn p1_close_preopen() {
42
run(P1_CLOSE_PREOPEN, false).await.unwrap()
43
}
44
#[test_log::test(tokio::test(flavor = "multi_thread"))]
45
async fn p1_dangling_fd() {
46
run(P1_DANGLING_FD, false).await.unwrap()
47
}
48
#[test_log::test(tokio::test(flavor = "multi_thread"))]
49
async fn p1_dangling_symlink() {
50
run(P1_DANGLING_SYMLINK, false).await.unwrap()
51
}
52
#[test_log::test(tokio::test(flavor = "multi_thread"))]
53
async fn p1_directory_seek() {
54
run(P1_DIRECTORY_SEEK, false).await.unwrap()
55
}
56
#[test_log::test(tokio::test(flavor = "multi_thread"))]
57
async fn p1_dir_fd_op_failures() {
58
run(P1_DIR_FD_OP_FAILURES, false).await.unwrap()
59
}
60
#[test_log::test(tokio::test(flavor = "multi_thread"))]
61
async fn p1_fd_advise() {
62
run(P1_FD_ADVISE, false).await.unwrap()
63
}
64
#[test_log::test(tokio::test(flavor = "multi_thread"))]
65
async fn p1_fd_filestat_get() {
66
run(P1_FD_FILESTAT_GET, false).await.unwrap()
67
}
68
#[test_log::test(tokio::test(flavor = "multi_thread"))]
69
async fn p1_fd_filestat_set() {
70
run(P1_FD_FILESTAT_SET, false).await.unwrap()
71
}
72
#[test_log::test(tokio::test(flavor = "multi_thread"))]
73
async fn p1_fd_flags_set() {
74
run(P1_FD_FLAGS_SET, false).await.unwrap()
75
}
76
#[test_log::test(tokio::test(flavor = "multi_thread"))]
77
async fn p1_fd_readdir() {
78
run(P1_FD_READDIR, false).await.unwrap()
79
}
80
#[test_log::test(tokio::test(flavor = "multi_thread"))]
81
async fn p1_file_allocate() {
82
run(P1_FILE_ALLOCATE, false).await.unwrap()
83
}
84
#[test_log::test(tokio::test(flavor = "multi_thread"))]
85
async fn p1_file_pread_pwrite() {
86
run(P1_FILE_PREAD_PWRITE, false).await.unwrap()
87
}
88
#[test_log::test(tokio::test(flavor = "multi_thread"))]
89
async fn p1_file_read_write() {
90
run(P1_FILE_READ_WRITE, false).await.unwrap()
91
}
92
#[test_log::test(tokio::test(flavor = "multi_thread"))]
93
async fn p1_file_seek_tell() {
94
run(P1_FILE_SEEK_TELL, false).await.unwrap()
95
}
96
#[test_log::test(tokio::test(flavor = "multi_thread"))]
97
async fn p1_file_truncation() {
98
run(P1_FILE_TRUNCATION, false).await.unwrap()
99
}
100
#[test_log::test(tokio::test(flavor = "multi_thread"))]
101
async fn p1_file_unbuffered_write() {
102
run(P1_FILE_UNBUFFERED_WRITE, false).await.unwrap()
103
}
104
#[test_log::test(tokio::test(flavor = "multi_thread"))]
105
async fn p1_interesting_paths() {
106
run(P1_INTERESTING_PATHS, true).await.unwrap()
107
}
108
#[test_log::test(tokio::test(flavor = "multi_thread"))]
109
async fn p1_regular_file_isatty() {
110
run(P1_REGULAR_FILE_ISATTY, false).await.unwrap()
111
}
112
#[test_log::test(tokio::test(flavor = "multi_thread"))]
113
async fn p1_nofollow_errors() {
114
run(P1_NOFOLLOW_ERRORS, false).await.unwrap()
115
}
116
#[test_log::test(tokio::test(flavor = "multi_thread"))]
117
async fn p1_overwrite_preopen() {
118
run(P1_OVERWRITE_PREOPEN, false).await.unwrap()
119
}
120
#[test_log::test(tokio::test(flavor = "multi_thread"))]
121
async fn p1_path_exists() {
122
run(P1_PATH_EXISTS, false).await.unwrap()
123
}
124
#[test_log::test(tokio::test(flavor = "multi_thread"))]
125
async fn p1_path_filestat() {
126
run(P1_PATH_FILESTAT, false).await.unwrap()
127
}
128
#[test_log::test(tokio::test(flavor = "multi_thread"))]
129
async fn p1_path_link() {
130
run(P1_PATH_LINK, false).await.unwrap()
131
}
132
#[test_log::test(tokio::test(flavor = "multi_thread"))]
133
async fn p1_path_open_create_existing() {
134
run(P1_PATH_OPEN_CREATE_EXISTING, false).await.unwrap()
135
}
136
#[test_log::test(tokio::test(flavor = "multi_thread"))]
137
async fn p1_path_open_read_write() {
138
run(P1_PATH_OPEN_READ_WRITE, false).await.unwrap()
139
}
140
#[test_log::test(tokio::test(flavor = "multi_thread"))]
141
async fn p1_path_open_dirfd_not_dir() {
142
run(P1_PATH_OPEN_DIRFD_NOT_DIR, false).await.unwrap()
143
}
144
#[test_log::test(tokio::test(flavor = "multi_thread"))]
145
async fn p1_path_open_missing() {
146
run(P1_PATH_OPEN_MISSING, false).await.unwrap()
147
}
148
#[test_log::test(tokio::test(flavor = "multi_thread"))]
149
async fn p1_path_open_nonblock() {
150
run(P1_PATH_OPEN_NONBLOCK, false).await.unwrap()
151
}
152
#[test_log::test(tokio::test(flavor = "multi_thread"))]
153
async fn p1_path_rename_dir_trailing_slashes() {
154
run(P1_PATH_RENAME_DIR_TRAILING_SLASHES, false)
155
.await
156
.unwrap()
157
}
158
#[test_log::test(tokio::test(flavor = "multi_thread"))]
159
async fn p1_path_rename() {
160
run(P1_PATH_RENAME, false).await.unwrap()
161
}
162
#[test_log::test(tokio::test(flavor = "multi_thread"))]
163
async fn p1_path_symlink_trailing_slashes() {
164
run(P1_PATH_SYMLINK_TRAILING_SLASHES, false).await.unwrap()
165
}
166
#[test_log::test(tokio::test(flavor = "multi_thread"))]
167
async fn p1_poll_oneoff_files() {
168
run(P1_POLL_ONEOFF_FILES, false).await.unwrap()
169
}
170
171
#[test_log::test(tokio::test(flavor = "multi_thread"))]
172
async fn p1_poll_oneoff_stdio() {
173
run(P1_POLL_ONEOFF_STDIO, true).await.unwrap()
174
}
175
#[test_log::test(tokio::test(flavor = "multi_thread"))]
176
async fn p1_readlink() {
177
run(P1_READLINK, false).await.unwrap()
178
}
179
#[test_log::test(tokio::test(flavor = "multi_thread"))]
180
async fn p1_remove_directory() {
181
run(P1_REMOVE_DIRECTORY, false).await.unwrap()
182
}
183
#[test_log::test(tokio::test(flavor = "multi_thread"))]
184
async fn p1_remove_nonempty_directory() {
185
run(P1_REMOVE_NONEMPTY_DIRECTORY, false).await.unwrap()
186
}
187
#[test_log::test(tokio::test(flavor = "multi_thread"))]
188
async fn p1_renumber() {
189
run(P1_RENUMBER, false).await.unwrap()
190
}
191
#[test_log::test(tokio::test(flavor = "multi_thread"))]
192
async fn p1_sched_yield() {
193
run(P1_SCHED_YIELD, false).await.unwrap()
194
}
195
#[test_log::test(tokio::test(flavor = "multi_thread"))]
196
async fn p1_stdio() {
197
run(P1_STDIO, false).await.unwrap()
198
}
199
#[test_log::test(tokio::test(flavor = "multi_thread"))]
200
async fn p1_stdio_isatty() {
201
// If the test process is setup such that stdio is a terminal:
202
if test_programs_artifacts::stdio_is_terminal() {
203
// Inherit stdio, test asserts each is not tty:
204
run(P1_STDIO_ISATTY, true).await.unwrap()
205
}
206
}
207
#[test_log::test(tokio::test(flavor = "multi_thread"))]
208
async fn p1_stdio_not_isatty() {
209
// Don't inherit stdio, test asserts each is not tty:
210
run(P1_STDIO_NOT_ISATTY, false).await.unwrap()
211
}
212
#[test_log::test(tokio::test(flavor = "multi_thread"))]
213
async fn p1_symlink_create() {
214
run(P1_SYMLINK_CREATE, false).await.unwrap()
215
}
216
#[test_log::test(tokio::test(flavor = "multi_thread"))]
217
async fn p1_symlink_filestat() {
218
run(P1_SYMLINK_FILESTAT, false).await.unwrap()
219
}
220
#[test_log::test(tokio::test(flavor = "multi_thread"))]
221
async fn p1_symlink_loop() {
222
run(P1_SYMLINK_LOOP, false).await.unwrap()
223
}
224
#[test_log::test(tokio::test(flavor = "multi_thread"))]
225
async fn p1_unlink_file_trailing_slashes() {
226
run(P1_UNLINK_FILE_TRAILING_SLASHES, false).await.unwrap()
227
}
228
#[test_log::test(tokio::test(flavor = "multi_thread"))]
229
async fn p1_path_open_preopen() {
230
run(P1_PATH_OPEN_PREOPEN, false).await.unwrap()
231
}
232
#[test_log::test(tokio::test(flavor = "multi_thread"))]
233
async fn p1_unicode_output() {
234
run(P1_UNICODE_OUTPUT, true).await.unwrap()
235
}
236
#[test_log::test(tokio::test(flavor = "multi_thread"))]
237
async fn p1_file_write() {
238
run(P1_FILE_WRITE, true).await.unwrap()
239
}
240
#[test_log::test(tokio::test(flavor = "multi_thread"))]
241
async fn p1_path_open_lots() {
242
run(P1_PATH_OPEN_LOTS, true).await.unwrap()
243
}
244
245
#[expect(
246
dead_code,
247
reason = "tested in the wasi-cli crate, satisfying foreach_api! macro"
248
)]
249
fn p1_cli_much_stdout() {}
250
251