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