11#include < wasmtime/store.hh>
22
33#include < gtest/gtest.h>
4+ #include < wasmtime/config.hh>
5+ #include < wasmtime/error.hh>
6+ #include < wasmtime/func.hh>
7+ #include < wasmtime/instance.hh>
8+ #include < wasmtime/module.hh>
49
510using namespace wasmtime ;
611
12+ template <typename T, typename E> T unwrap (Result<T, E> result) {
13+ if (result) {
14+ return result.ok ();
15+ }
16+ std::cerr << " error: " << result.err ().message () << " \n " ;
17+ std::abort ();
18+ }
19+
720TEST (Store, Smoke) {
821 Engine engine;
922 Store store (engine);
@@ -17,3 +30,54 @@ TEST(Store, Smoke) {
1730 store.context ().set_fuel (1 ).err ();
1831 store.context ().set_epoch_deadline (1 );
1932}
33+
34+ TEST (Store, EpochDeadlineCallback) {
35+ Config config;
36+ config.epoch_interruption (true );
37+ Engine engine (std::move (config));
38+
39+ size_t num_calls = 0 ;
40+ Store store (engine);
41+ store.epoch_deadline_callback (
42+ [&num_calls](wasmtime::Store::Context /* context */ ,
43+ uint64_t &epoch_deadline_delta)
44+ -> wasmtime::Result<wasmtime::DeadlineKind> {
45+ epoch_deadline_delta += 1 ;
46+ num_calls += 1 ;
47+ return wasmtime::DeadlineKind::Continue;
48+ });
49+
50+ store.context ().set_epoch_deadline (1 );
51+
52+ Module m = unwrap (Module::compile (engine, " (module (func (export \" f\" )))" ));
53+ Instance i = unwrap (Instance::create (store, m, {}));
54+
55+ auto f = std::get<Func>(*i.get (store, " f" ));
56+
57+ unwrap (f.call (store, {}));
58+ ASSERT_EQ (num_calls, 0 );
59+
60+ engine.increment_epoch ();
61+ unwrap (f.call (store, {}));
62+ ASSERT_EQ (num_calls, 1 );
63+
64+ // / epoch_deadline_delta increased by 1 in the callback
65+ unwrap (f.call (store, {}));
66+ ASSERT_EQ (num_calls, 1 );
67+
68+ engine.increment_epoch ();
69+ unwrap (f.call (store, {}));
70+ ASSERT_EQ (num_calls, 2 );
71+
72+ store.epoch_deadline_callback (
73+ [](wasmtime::Store::Context /* context */ , uint64_t &epoch_deadline_delta)
74+ -> wasmtime::Result<wasmtime::DeadlineKind> {
75+ return Error (" error from callback" );
76+ });
77+
78+ engine.increment_epoch ();
79+ auto result = f.call (store, {});
80+ EXPECT_FALSE (result);
81+ EXPECT_TRUE (result.err ().message ().find (" error from callback" ) !=
82+ std::string::npos);
83+ }
0 commit comments