Rust · 3438 bytes Raw Blame History
1 #[allow(dead_code)]
2 #[path = "common/corpus.rs"]
3 mod common;
4
5 use std::fs;
6 use std::path::PathBuf;
7 use std::process::{Command, Stdio};
8 use std::sync::atomic::{AtomicU64, Ordering};
9
10 static COUNTER: AtomicU64 = AtomicU64::new(0);
11
12 fn temp_root(prefix: &str) -> PathBuf {
13 let id = COUNTER.fetch_add(1, Ordering::Relaxed);
14 let root = std::env::temp_dir().join(format!("{}_{}_{}", prefix, std::process::id(), id));
15 fs::create_dir_all(&root).expect("create temp root");
16 root
17 }
18
19 fn readme_example_source() -> &'static str {
20 ".text\n\
21 .build_version macos, 11, 0 sdk_version 15, 5\n\
22 .globl _main\n\
23 .p2align 2\n\
24 _main:\n\
25 mov w0, #0\n\
26 ret\n\
27 .subsections_via_symbols\n"
28 }
29
30 #[test]
31 fn readme_file_examples_assemble_link_and_run() {
32 let root = temp_root("afs_readme_file");
33 let input = root.join("hello.s");
34 let explicit_obj = root.join("hello-explicit.o");
35 let derived_obj = root.join("hello.o");
36 let explicit_bin = root.join("hello-explicit");
37 let derived_bin = root.join("hello-derived");
38
39 fs::write(&input, readme_example_source()).expect("write input");
40
41 let output = Command::new(env!("CARGO_BIN_EXE_afs-as"))
42 .arg(&input)
43 .arg("-o")
44 .arg(&explicit_obj)
45 .output()
46 .expect("run afs-as explicit");
47 assert!(
48 output.status.success(),
49 "explicit assemble failed\nstdout:\n{}\nstderr:\n{}",
50 String::from_utf8_lossy(&output.stdout),
51 String::from_utf8_lossy(&output.stderr)
52 );
53
54 let output = Command::new(env!("CARGO_BIN_EXE_afs-as"))
55 .arg(&input)
56 .output()
57 .expect("run afs-as derived");
58 assert!(
59 output.status.success(),
60 "derived assemble failed\nstdout:\n{}\nstderr:\n{}",
61 String::from_utf8_lossy(&output.stdout),
62 String::from_utf8_lossy(&output.stderr)
63 );
64 assert!(derived_obj.exists(), "derived output was not created");
65
66 common::link_with_system(&explicit_obj, &explicit_bin, "_main");
67 let (code, _, stderr) = common::run_binary(&explicit_bin);
68 assert_eq!(code, 0, "stderr:\n{}", stderr);
69
70 common::link_with_system(&derived_obj, &derived_bin, "_main");
71 let (code, _, stderr) = common::run_binary(&derived_bin);
72 assert_eq!(code, 0, "stderr:\n{}", stderr);
73 }
74
75 #[test]
76 fn readme_stdin_stdout_example_assembles_links_and_runs() {
77 let root = temp_root("afs_readme_stdio");
78 let obj = root.join("hello.o");
79 let bin = root.join("hello");
80
81 let mut child = Command::new(env!("CARGO_BIN_EXE_afs-as"))
82 .arg("-")
83 .arg("-o")
84 .arg("-")
85 .stdin(Stdio::piped())
86 .stdout(Stdio::piped())
87 .spawn()
88 .expect("spawn afs-as stdin/stdout");
89
90 use std::io::Write;
91 child
92 .stdin
93 .take()
94 .expect("stdin handle")
95 .write_all(readme_example_source().as_bytes())
96 .expect("write source to stdin");
97
98 let output = child.wait_with_output().expect("wait for afs-as");
99 assert!(
100 output.status.success(),
101 "stdin/stdout assemble failed\nstdout bytes: {}\nstderr:\n{}",
102 output.stdout.len(),
103 String::from_utf8_lossy(&output.stderr)
104 );
105
106 fs::write(&obj, &output.stdout).expect("write stdout object");
107 common::link_with_system(&obj, &bin, "_main");
108 let (code, _, stderr) = common::run_binary(&bin);
109 assert_eq!(code, 0, "stderr:\n{}", stderr);
110 }
111