diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index a90b40cad1..61d098e45c 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include diff --git a/src/test/app/WasmPerf_test.cpp b/src/test/app/WasmPerf_test.cpp new file mode 100644 index 0000000000..f51ef76f01 --- /dev/null +++ b/src/test/app/WasmPerf_test.cpp @@ -0,0 +1,97 @@ +#include +#include + +#include +#include +#include // IWYU pragma: keep +#include +#include + +#include + +#include +#include +#include +#include +#include +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +#endif + +#include + +namespace xrpl::test { + +namespace { + +std::vector +hexToBytes(std::string const& hex) +{ + auto const ws = boost::algorithm::unhex(hex); + return Bytes(ws.begin(), ws.end()); +} +} // namespace + +struct WasmPerf_test : public beast::unit_test::Suite +{ + template + void + perf(TestHostFunctions& hfs, size_t runs, Functor&& f) + { + for (auto i = size_t{}; i < runs; ++i) + { + auto result = f(); + BEAST_EXPECT(result); + } + BEAST_EXPECT(hfs.execTimeEvent->count == runs); + } + + void + perfEscrowFinish() + { + testcase("perf escrow finish"); + using namespace test::jtx; + + static constexpr auto kRuns = 1000; + + auto const wasm = hexToBytes(kAllHostFunctionsWasmHex); + + Env env{*this}; + auto hfns = TestHostFunctions{env, 0}; + hfns.execTimeEvent->printOnDestruction = true; + + perf(hfns, kRuns, [&] { + return runEscrowWasm(wasm, hfns, 1'000'000, escrowFunctionName, {}).has_value(); + }); + } + + void + perfEscrowCreate() + { + testcase("perf escrow create"); + using namespace test::jtx; + + static constexpr auto kRuns = 1000; + + auto const wasm = hexToBytes(kAllHostFunctionsWasmHex); + + Env env{*this}; + auto hfns = TestHostFunctions{env, 0}; + hfns.execTimeEvent->printOnDestruction = true; + + perf(hfns, kRuns, [&] { return !preflightEscrowWasm(wasm, hfns, escrowFunctionName); }); + } + + void + run() override + { + using namespace test::jtx; + + perfEscrowFinish(); + perfEscrowCreate(); + } +}; + +BEAST_DEFINE_TESTSUITE_MANUAL(WasmPerf, app, xrpl); + +} // namespace xrpl::test diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 24e5317f3f..5999fa634b 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -48,12 +48,14 @@ add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return nullptr; } +namespace { std::vector hexToBytes(std::string const& hex) { auto const ws = boost::algorithm::unhex(hex); return Bytes(ws.begin(), ws.end()); } +} // namespace template unsigned