Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/misc/component-async-tests/tests/scenario/borrowing.rs
3089 views
1
use std::env;
2
use std::time::Duration;
3
4
use super::util::{config, make_component};
5
use futures::stream::{FuturesUnordered, TryStreamExt};
6
use wasmtime::Result;
7
use wasmtime::component::{Linker, ResourceTable};
8
use wasmtime::{Engine, Store};
9
use wasmtime_wasi::WasiCtxBuilder;
10
11
#[tokio::test]
12
pub async fn async_borrowing_caller() -> Result<()> {
13
test_run_bool(
14
&[
15
test_programs_artifacts::ASYNC_BORROWING_CALLER_COMPONENT,
16
test_programs_artifacts::ASYNC_BORROWING_CALLEE_COMPONENT,
17
],
18
false,
19
)
20
.await
21
}
22
23
#[tokio::test]
24
async fn async_borrowing_caller_misbehave() -> Result<()> {
25
let error = format!(
26
"{:?}",
27
test_run_bool(
28
&[
29
test_programs_artifacts::ASYNC_BORROWING_CALLER_COMPONENT,
30
test_programs_artifacts::ASYNC_BORROWING_CALLEE_COMPONENT
31
],
32
true
33
)
34
.await
35
.unwrap_err()
36
);
37
assert!(error.contains("unknown handle index"), "{error}");
38
Ok(())
39
}
40
41
#[tokio::test]
42
async fn async_borrowing_callee_misbehave() -> Result<()> {
43
let error = format!(
44
"{:?}",
45
test_run_bool(
46
&[test_programs_artifacts::ASYNC_BORROWING_CALLEE_COMPONENT],
47
true
48
)
49
.await
50
.unwrap_err()
51
);
52
assert!(error.contains("unknown handle index"), "{error}");
53
Ok(())
54
}
55
56
#[tokio::test]
57
pub async fn async_borrowing_callee() -> Result<()> {
58
test_run_bool(
59
&[test_programs_artifacts::ASYNC_BORROWING_CALLEE_COMPONENT],
60
false,
61
)
62
.await
63
}
64
65
pub async fn test_run_bool(components: &[&str], v: bool) -> Result<()> {
66
let mut config = config();
67
// As of this writing, miri/pulley/epochs is a problematic combination, so
68
// we don't test it.
69
if env::var_os("MIRI_TEST_CWASM_DIR").is_none() {
70
config.epoch_interruption(true);
71
}
72
73
let engine = Engine::new(&config)?;
74
75
let component = make_component(&engine, components).await?;
76
77
let mut linker = Linker::new(&engine);
78
79
wasmtime_wasi::p2::add_to_linker_async(&mut linker)?;
80
component_async_tests::borrowing_host::bindings::local::local::borrowing_types::add_to_linker::<
81
_,
82
component_async_tests::Ctx,
83
>(&mut linker, |ctx| ctx)?;
84
85
let mut store = Store::new(
86
&engine,
87
component_async_tests::Ctx {
88
wasi: WasiCtxBuilder::new().inherit_stdio().build(),
89
table: ResourceTable::default(),
90
continue_: false,
91
},
92
);
93
94
if env::var_os("MIRI_TEST_CWASM_DIR").is_none() {
95
store.set_epoch_deadline(1);
96
97
std::thread::spawn(move || {
98
std::thread::sleep(Duration::from_secs(10));
99
engine.increment_epoch();
100
});
101
}
102
103
let borrowing_host =
104
component_async_tests::borrowing_host::bindings::BorrowingHost::instantiate_async(
105
&mut store, &component, &linker,
106
)
107
.await?;
108
109
store
110
.run_concurrent(async move |accessor| {
111
// Start three concurrent calls and then join them all:
112
let mut futures = FuturesUnordered::new();
113
for _ in 0..3 {
114
futures.push(borrowing_host.local_local_run_bool().call_run(accessor, v));
115
}
116
117
while let Some(()) = futures.try_next().await? {
118
// continue
119
}
120
121
wasmtime::error::Ok(())
122
})
123
.await?
124
}
125
126