Go to file T
Code
clang_probe test: add vector shuffle 2d probe
common Capture assembler parser updates and formatting
corpus Support __DATA,__const sections
workbench test: add vector shuffle 2d probe
clang_probe_dashboard.rs test: add vector shuffle 2d probe
cli_smoke.rs Capture assembler parser updates and formatting
corpus_compat.rs Capture assembler parser updates and formatting
cross_section_reloc_stress_corpus.rs test: add cross-section relocation stress
diagnostic_snapshots.rs Support __DATA,__const sections
differential_fuzz.rs Capture assembler parser updates and formatting
differential_harness.rs Capture assembler parser updates and formatting
directive_inventory_corpus.rs test: add directive inventory coverage
generated_stress.rs Capture assembler parser updates and formatting
grouped_negative_stress.rs test: add grouped negative stress
grouped_seed_stress.rs Capture assembler parser updates and formatting
hello_world.rs Capture assembler parser updates and formatting
malformed_mutation.rs Capture assembler parser updates and formatting
metadata_stress_mix_corpus.rs test: add metadata stress fixture
metadata_tls_zerofill_corpus.rs test: add metadata tls inventory
mixed_link_runtime.rs Capture assembler parser updates and formatting
perf_sanity.rs Capture assembler parser updates and formatting
readme_smoke.rs test: smoke readme examples
roundtrip.rs asm: add vector shuffle 2d ops
section_attr_surface.rs Support __DATA,__const sections
section_inventory_corpus.rs Support __DATA,__const sections
symbol_attr_inventory_corpus.rs test: add symbol attr inventory
trusted_api_boundary.rs test: add trusted api boundary coverage
verify_against_system_as.rs Fix standalone operand aliases
#[allow(dead_code)]
#[path = "common/corpus.rs"]
mod common;

use std::fs;
use std::path::PathBuf;
use std::process::{Command, Stdio};
use std::sync::atomic::{AtomicU64, Ordering};

static COUNTER: AtomicU64 = AtomicU64::new(0);

fn temp_root(prefix: &str) -> PathBuf {
    let id = COUNTER.fetch_add(1, Ordering::Relaxed);
    let root = std::env::temp_dir().join(format!("{}_{}_{}", prefix, std::process::id(), id));
    fs::create_dir_all(&root).expect("create temp root");
    root
}

fn readme_example_source() -> &'static str {
    ".text\n\
     .build_version macos, 11, 0 sdk_version 15, 5\n\
     .globl _main\n\
     .p2align 2\n\
     _main:\n\
       mov w0, #0\n\
       ret\n\
     .subsections_via_symbols\n"
}

#[test]
fn readme_file_examples_assemble_link_and_run() {
    let root = temp_root("afs_readme_file");
    let input = root.join("hello.s");
    let explicit_obj = root.join("hello-explicit.o");
    let derived_obj = root.join("hello.o");
    let explicit_bin = root.join("hello-explicit");
    let derived_bin = root.join("hello-derived");

    fs::write(&input, readme_example_source()).expect("write input");

    let output = Command::new(env!("CARGO_BIN_EXE_afs-as"))
        .arg(&input)
        .arg("-o")
        .arg(&explicit_obj)
        .output()
        .expect("run afs-as explicit");
    assert!(
        output.status.success(),
        "explicit assemble failed\nstdout:\n{}\nstderr:\n{}",
        String::from_utf8_lossy(&output.stdout),
        String::from_utf8_lossy(&output.stderr)
    );

    let output = Command::new(env!("CARGO_BIN_EXE_afs-as"))
        .arg(&input)
        .output()
        .expect("run afs-as derived");
    assert!(
        output.status.success(),
        "derived assemble failed\nstdout:\n{}\nstderr:\n{}",
        String::from_utf8_lossy(&output.stdout),
        String::from_utf8_lossy(&output.stderr)
    );
    assert!(derived_obj.exists(), "derived output was not created");

    common::link_with_system(&explicit_obj, &explicit_bin, "_main");
    let (code, _, stderr) = common::run_binary(&explicit_bin);
    assert_eq!(code, 0, "stderr:\n{}", stderr);

    common::link_with_system(&derived_obj, &derived_bin, "_main");
    let (code, _, stderr) = common::run_binary(&derived_bin);
    assert_eq!(code, 0, "stderr:\n{}", stderr);
}

#[test]
fn readme_stdin_stdout_example_assembles_links_and_runs() {
    let root = temp_root("afs_readme_stdio");
    let obj = root.join("hello.o");
    let bin = root.join("hello");

    let mut child = Command::new(env!("CARGO_BIN_EXE_afs-as"))
        .arg("-")
        .arg("-o")
        .arg("-")
        .stdin(Stdio::piped())
        .stdout(Stdio::piped())
        .spawn()
        .expect("spawn afs-as stdin/stdout");

    use std::io::Write;
    child
        .stdin
        .take()
        .expect("stdin handle")
        .write_all(readme_example_source().as_bytes())
        .expect("write source to stdin");

    let output = child.wait_with_output().expect("wait for afs-as");
    assert!(
        output.status.success(),
        "stdin/stdout assemble failed\nstdout bytes: {}\nstderr:\n{}",
        output.stdout.len(),
        String::from_utf8_lossy(&output.stderr)
    );

    fs::write(&obj, &output.stdout).expect("write stdout object");
    common::link_with_system(&obj, &bin, "_main");
    let (code, _, stderr) = common::run_binary(&bin);
    assert_eq!(code, 0, "stderr:\n{}", stderr);
}