Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wasi-common/tests/all/sync.rs
1692 views
1
use super::*;
2
use test_programs_artifacts::*;
3
use wasi_common::sync::{WasiCtxBuilder, add_to_linker};
4
5
foreach_preview1!(assert_test_exists);
6
7
fn run(path: &str, inherit_stdio: bool) -> Result<()> {
8
let path = Path::new(path);
9
let name = path.file_stem().unwrap().to_str().unwrap();
10
let workspace = prepare_workspace(name)?;
11
let stdout = WritePipe::new_in_memory();
12
let stderr = WritePipe::new_in_memory();
13
let r = {
14
let engine = test_programs_artifacts::engine(|_| {});
15
let mut linker = Linker::new(&engine);
16
add_to_linker(&mut linker, |cx| cx)?;
17
18
// Create our wasi context.
19
// Additionally register any preopened directories if we have them.
20
let mut builder = WasiCtxBuilder::new();
21
22
if inherit_stdio {
23
builder.inherit_stdio();
24
} else {
25
builder
26
.stdout(Box::new(stdout.clone()))
27
.stderr(Box::new(stderr.clone()));
28
}
29
builder.arg(name)?.arg(".")?;
30
println!("preopen: {workspace:?}");
31
let preopen_dir =
32
cap_std::fs::Dir::open_ambient_dir(workspace.path(), cap_std::ambient_authority())?;
33
builder.preopened_dir(preopen_dir, ".")?;
34
for (var, val) in test_programs_artifacts::wasi_tests_environment() {
35
builder.env(var, val)?;
36
}
37
38
let mut store = Store::new(&engine, builder.build());
39
let module = Module::from_file(&engine, path)?;
40
let instance = linker.instantiate(&mut store, &module)?;
41
let start = instance.get_typed_func::<(), ()>(&mut store, "_start")?;
42
start.call(&mut store, ())?;
43
Ok(())
44
};
45
46
r.map_err(move |trap: anyhow::Error| {
47
let stdout = stdout
48
.try_into_inner()
49
.expect("sole ref to stdout")
50
.into_inner();
51
if !stdout.is_empty() {
52
println!("guest stdout:\n{}\n===", String::from_utf8_lossy(&stdout));
53
}
54
let stderr = stderr
55
.try_into_inner()
56
.expect("sole ref to stderr")
57
.into_inner();
58
if !stderr.is_empty() {
59
println!("guest stderr:\n{}\n===", String::from_utf8_lossy(&stderr));
60
}
61
trap.context(format!(
62
"error while testing wasi-tests {name} with cap-std-sync"
63
))
64
})?;
65
Ok(())
66
}
67
68
// Below here is mechanical: there should be one test for every binary in
69
// wasi-tests.
70
#[test_log::test]
71
fn preview1_big_random_buf() {
72
run(PREVIEW1_BIG_RANDOM_BUF, true).unwrap()
73
}
74
#[test_log::test]
75
fn preview1_clock_time_get() {
76
run(PREVIEW1_CLOCK_TIME_GET, true).unwrap()
77
}
78
#[test_log::test]
79
fn preview1_close_preopen() {
80
run(PREVIEW1_CLOSE_PREOPEN, true).unwrap()
81
}
82
#[test_log::test]
83
fn preview1_dangling_fd() {
84
run(PREVIEW1_DANGLING_FD, true).unwrap()
85
}
86
#[test_log::test]
87
fn preview1_dangling_symlink() {
88
run(PREVIEW1_DANGLING_SYMLINK, true).unwrap()
89
}
90
#[test_log::test]
91
fn preview1_directory_seek() {
92
run(PREVIEW1_DIRECTORY_SEEK, true).unwrap()
93
}
94
#[test_log::test]
95
fn preview1_dir_fd_op_failures() {
96
run(PREVIEW1_DIR_FD_OP_FAILURES, true).unwrap()
97
}
98
#[test_log::test]
99
fn preview1_fd_advise() {
100
run(PREVIEW1_FD_ADVISE, true).unwrap()
101
}
102
#[test_log::test]
103
fn preview1_fd_filestat_get() {
104
run(PREVIEW1_FD_FILESTAT_GET, true).unwrap()
105
}
106
#[test_log::test]
107
fn preview1_fd_filestat_set() {
108
run(PREVIEW1_FD_FILESTAT_SET, true).unwrap()
109
}
110
#[test_log::test]
111
fn preview1_fd_flags_set() {
112
run(PREVIEW1_FD_FLAGS_SET, true).unwrap()
113
}
114
#[test_log::test]
115
fn preview1_fd_readdir() {
116
run(PREVIEW1_FD_READDIR, true).unwrap()
117
}
118
#[test_log::test]
119
fn preview1_file_allocate() {
120
run(PREVIEW1_FILE_ALLOCATE, true).unwrap()
121
}
122
// This test is outside of linux because the behavior of `pwrite`, which this
123
// test bottoms out into, differs across platforms. The wasi-common crate
124
// doesn't have the infrastructure in place to manually track the append-mode
125
// flag easily, but `wasmtime-wasi` has the "correct" behavior here.
126
#[test_log::test]
127
#[cfg_attr(not(target_os = "linux"), ignore)]
128
fn preview1_file_pread_pwrite() {
129
run(PREVIEW1_FILE_PREAD_PWRITE, true).unwrap()
130
}
131
#[test_log::test]
132
fn preview1_file_read_write() {
133
run(PREVIEW1_FILE_READ_WRITE, true).unwrap()
134
}
135
#[test_log::test]
136
fn preview1_file_seek_tell() {
137
run(PREVIEW1_FILE_SEEK_TELL, true).unwrap()
138
}
139
#[test_log::test]
140
fn preview1_file_truncation() {
141
run(PREVIEW1_FILE_TRUNCATION, true).unwrap()
142
}
143
#[test_log::test]
144
fn preview1_file_unbuffered_write() {
145
run(PREVIEW1_FILE_UNBUFFERED_WRITE, true).unwrap()
146
}
147
#[test_log::test]
148
fn preview1_interesting_paths() {
149
run(PREVIEW1_INTERESTING_PATHS, true).unwrap()
150
}
151
#[test_log::test]
152
fn preview1_regular_file_isatty() {
153
run(PREVIEW1_REGULAR_FILE_ISATTY, true).unwrap()
154
}
155
#[test_log::test]
156
fn preview1_nofollow_errors() {
157
run(PREVIEW1_NOFOLLOW_ERRORS, true).unwrap()
158
}
159
#[test_log::test]
160
fn preview1_overwrite_preopen() {
161
run(PREVIEW1_OVERWRITE_PREOPEN, true).unwrap()
162
}
163
#[test_log::test]
164
fn preview1_path_exists() {
165
run(PREVIEW1_PATH_EXISTS, true).unwrap()
166
}
167
#[test_log::test]
168
fn preview1_path_filestat() {
169
run(PREVIEW1_PATH_FILESTAT, true).unwrap()
170
}
171
#[test_log::test]
172
fn preview1_path_link() {
173
run(PREVIEW1_PATH_LINK, true).unwrap()
174
}
175
#[test_log::test]
176
fn preview1_path_open_create_existing() {
177
run(PREVIEW1_PATH_OPEN_CREATE_EXISTING, true).unwrap()
178
}
179
#[test_log::test]
180
fn preview1_path_open_read_write() {
181
run(PREVIEW1_PATH_OPEN_READ_WRITE, true).unwrap()
182
}
183
#[test_log::test]
184
fn preview1_path_open_dirfd_not_dir() {
185
run(PREVIEW1_PATH_OPEN_DIRFD_NOT_DIR, true).unwrap()
186
}
187
#[test_log::test]
188
fn preview1_path_open_missing() {
189
run(PREVIEW1_PATH_OPEN_MISSING, true).unwrap()
190
}
191
#[test_log::test]
192
fn preview1_path_open_nonblock() {
193
run(PREVIEW1_PATH_OPEN_NONBLOCK, true).unwrap()
194
}
195
#[test_log::test]
196
fn preview1_path_rename_dir_trailing_slashes() {
197
run(PREVIEW1_PATH_RENAME_DIR_TRAILING_SLASHES, true).unwrap()
198
}
199
#[test_log::test]
200
fn preview1_path_rename() {
201
run(PREVIEW1_PATH_RENAME, true).unwrap()
202
}
203
#[test_log::test]
204
fn preview1_path_symlink_trailing_slashes() {
205
run(PREVIEW1_PATH_SYMLINK_TRAILING_SLASHES, true).unwrap()
206
}
207
#[test_log::test]
208
fn preview1_poll_oneoff_files() {
209
run(PREVIEW1_POLL_ONEOFF_FILES, false).unwrap()
210
}
211
#[test_log::test]
212
fn preview1_poll_oneoff_stdio() {
213
run(PREVIEW1_POLL_ONEOFF_STDIO, true).unwrap()
214
}
215
#[test_log::test]
216
fn preview1_readlink() {
217
run(PREVIEW1_READLINK, true).unwrap()
218
}
219
#[test_log::test]
220
fn preview1_remove_directory() {
221
run(PREVIEW1_REMOVE_DIRECTORY, true).unwrap()
222
}
223
#[test_log::test]
224
fn preview1_remove_nonempty_directory() {
225
run(PREVIEW1_REMOVE_NONEMPTY_DIRECTORY, true).unwrap()
226
}
227
#[test_log::test]
228
fn preview1_renumber() {
229
run(PREVIEW1_RENUMBER, true).unwrap()
230
}
231
#[test_log::test]
232
fn preview1_sched_yield() {
233
run(PREVIEW1_SCHED_YIELD, true).unwrap()
234
}
235
#[test_log::test]
236
fn preview1_stdio() {
237
run(PREVIEW1_STDIO, true).unwrap()
238
}
239
#[test_log::test]
240
fn preview1_stdio_isatty() {
241
if test_programs_artifacts::stdio_is_terminal() {
242
// Inherit stdio, which is a terminal in the test runner's environment:
243
run(PREVIEW1_STDIO_ISATTY, true).unwrap()
244
}
245
}
246
#[test_log::test]
247
fn preview1_stdio_not_isatty() {
248
// Don't inherit stdio, test asserts each is not tty:
249
run(PREVIEW1_STDIO_NOT_ISATTY, false).unwrap()
250
}
251
252
#[test_log::test]
253
fn preview1_symlink_create() {
254
run(PREVIEW1_SYMLINK_CREATE, true).unwrap()
255
}
256
#[test_log::test]
257
fn preview1_symlink_filestat() {
258
run(PREVIEW1_SYMLINK_FILESTAT, true).unwrap()
259
}
260
#[test_log::test]
261
fn preview1_symlink_loop() {
262
run(PREVIEW1_SYMLINK_LOOP, true).unwrap()
263
}
264
#[test_log::test]
265
fn preview1_unlink_file_trailing_slashes() {
266
run(PREVIEW1_UNLINK_FILE_TRAILING_SLASHES, true).unwrap()
267
}
268
#[test_log::test]
269
fn preview1_path_open_preopen() {
270
run(PREVIEW1_PATH_OPEN_PREOPEN, true).unwrap()
271
}
272
#[test_log::test]
273
fn preview1_unicode_output() {
274
run(PREVIEW1_UNICODE_OUTPUT, true).unwrap()
275
}
276
#[test_log::test]
277
fn preview1_file_write() {
278
run(PREVIEW1_FILE_WRITE, true).unwrap()
279
}
280
#[test_log::test]
281
fn preview1_path_open_lots() {
282
run(PREVIEW1_PATH_OPEN_LOTS, true).unwrap()
283
}
284
285