miden-debug 0.17.0

An interactive debugger for Miden VM programs
Documentation
use alloc::string::ToString;
use std::{
    net::{TcpListener, TcpStream},
    sync::mpsc,
    thread,
    time::Duration,
};

use miden_assembly::Assembler;

use super::*;

#[test]
fn standalone_server_runs_with_remote_state_client() {
    let directory = tempfile::tempdir().unwrap();
    let package_path = directory.path().join("standalone.masp");
    let source_manager = Arc::new(DefaultSourceManager::default());
    let package = Assembler::new(source_manager)
        .assemble_program("standalone", "begin push.3 push.4 add add end")
        .unwrap();
    package.write_to_file(&package_path).unwrap();

    let listener = TcpListener::bind("127.0.0.1:0").unwrap();
    let address = listener.local_addr().unwrap();
    let timeout = Duration::from_secs(5);

    let config = Box::new(DebuggerConfig {
        input: Some(crate::InputFile::from_path(&package_path)),
        start_debug_adapter: Some(address.to_string()),
        ..Default::default()
    });
    let (completed, completion) = mpsc::channel();
    let server = thread::spawn(move || {
        completed.send(run_on_listener(config, listener)).unwrap();
    });

    let stream = TcpStream::connect_timeout(&address, timeout).unwrap();
    stream.set_read_timeout(Some(timeout)).unwrap();
    stream.set_write_timeout(Some(timeout)).unwrap();
    let client = crate::exec::DapClient::from_stream(stream).unwrap();
    let mut state = crate::State::from_dap_client(&address.to_string(), client).unwrap();
    assert_eq!(state.debug_mode, crate::DebugMode::Remote);
    assert_eq!(state.executor().cycle, 0);
    assert!(matches!(state.step_remote().unwrap(), crate::exec::DapStopReason::Terminated));
    drop(state);
    completion.recv_timeout(timeout).expect("DAP server did not finish").unwrap();
    server.join().unwrap();
}