1*133a0ef4SChris Fallin #![cfg(not(miri))]
2*133a0ef4SChris Fallin
3*133a0ef4SChris Fallin use crate::cli_tests::get_wasmtime_command;
4*133a0ef4SChris Fallin use test_programs_artifacts::*;
5*133a0ef4SChris Fallin use wasmtime::Result;
6*133a0ef4SChris Fallin
run_debugger_test(debugger_component: &str, debuggee: &str, test_mode: &str) -> Result<()>7*133a0ef4SChris Fallin fn run_debugger_test(debugger_component: &str, debuggee: &str, test_mode: &str) -> Result<()> {
8*133a0ef4SChris Fallin let mut cmd = get_wasmtime_command()?;
9*133a0ef4SChris Fallin cmd.args(&[
10*133a0ef4SChris Fallin "run",
11*133a0ef4SChris Fallin "-Ccache=n",
12*133a0ef4SChris Fallin &format!("-Ddebugger={debugger_component}"),
13*133a0ef4SChris Fallin &format!("-Darg={test_mode}"),
14*133a0ef4SChris Fallin "-Dinherit-stderr=y",
15*133a0ef4SChris Fallin debuggee,
16*133a0ef4SChris Fallin ]);
17*133a0ef4SChris Fallin let output = cmd.output()?;
18*133a0ef4SChris Fallin let stderr = String::from_utf8_lossy(&output.stderr);
19*133a0ef4SChris Fallin if !output.status.success() {
20*133a0ef4SChris Fallin wasmtime::bail!(
21*133a0ef4SChris Fallin "wasmtime failed with status {}\nstderr:\n{stderr}",
22*133a0ef4SChris Fallin output.status,
23*133a0ef4SChris Fallin );
24*133a0ef4SChris Fallin }
25*133a0ef4SChris Fallin assert!(
26*133a0ef4SChris Fallin stderr.contains("OK"),
27*133a0ef4SChris Fallin "expected 'OK' in stderr, got:\n{stderr}"
28*133a0ef4SChris Fallin );
29*133a0ef4SChris Fallin Ok(())
30*133a0ef4SChris Fallin }
31*133a0ef4SChris Fallin
32*133a0ef4SChris Fallin #[test]
debugger_debuggee_simple() -> Result<()>33*133a0ef4SChris Fallin fn debugger_debuggee_simple() -> Result<()> {
34*133a0ef4SChris Fallin run_debugger_test(
35*133a0ef4SChris Fallin DEBUGGER_COMPONENT_COMPONENT,
36*133a0ef4SChris Fallin DEBUGGER_DEBUGGEE_SIMPLE_COMPONENT,
37*133a0ef4SChris Fallin "simple",
38*133a0ef4SChris Fallin )
39*133a0ef4SChris Fallin }
40*133a0ef4SChris Fallin
41*133a0ef4SChris Fallin #[test]
debugger_debuggee_loop() -> Result<()>42*133a0ef4SChris Fallin fn debugger_debuggee_loop() -> Result<()> {
43*133a0ef4SChris Fallin run_debugger_test(
44*133a0ef4SChris Fallin DEBUGGER_COMPONENT_COMPONENT,
45*133a0ef4SChris Fallin DEBUGGER_DEBUGGEE_LOOP_COMPONENT,
46*133a0ef4SChris Fallin "loop",
47*133a0ef4SChris Fallin )
48*133a0ef4SChris Fallin }
49*133a0ef4SChris Fallin
50*133a0ef4SChris Fallin #[test]
debugger_component() -> Result<()>51*133a0ef4SChris Fallin fn debugger_component() -> Result<()> {
52*133a0ef4SChris Fallin // This is present so that `assert_test_exists` can assert presence of unit-tests for all
53*133a0ef4SChris Fallin // components. The debugger component itself exists in this list alongside all the debuggees;
54*133a0ef4SChris Fallin // we only test the debuggees (with the debugger implicitly used for each).
55*133a0ef4SChris Fallin Ok(())
56*133a0ef4SChris Fallin }
57*133a0ef4SChris Fallin
58*133a0ef4SChris Fallin macro_rules! assert_test_exists {
59*133a0ef4SChris Fallin ($name:ident) => {
60*133a0ef4SChris Fallin #[expect(unused_imports, reason = "here to assert the test exists")]
61*133a0ef4SChris Fallin use self::$name as _;
62*133a0ef4SChris Fallin };
63*133a0ef4SChris Fallin }
64*133a0ef4SChris Fallin foreach_debugger!(assert_test_exists);
65