summaryrefslogtreecommitdiff
path: root/libc/ci/docker/x86_64-rumprun-netbsd
diff options
context:
space:
mode:
Diffstat (limited to 'libc/ci/docker/x86_64-rumprun-netbsd')
-rw-r--r--libc/ci/docker/x86_64-rumprun-netbsd/Dockerfile6
-rw-r--r--libc/ci/docker/x86_64-rumprun-netbsd/runtest.rs54
2 files changed, 59 insertions, 1 deletions
diff --git a/libc/ci/docker/x86_64-rumprun-netbsd/Dockerfile b/libc/ci/docker/x86_64-rumprun-netbsd/Dockerfile
index 129771e..a486d05 100644
--- a/libc/ci/docker/x86_64-rumprun-netbsd/Dockerfile
+++ b/libc/ci/docker/x86_64-rumprun-netbsd/Dockerfile
@@ -3,4 +3,8 @@ USER root
RUN apt-get update
RUN apt-get install -y --no-install-recommends \
qemu
-ENV PATH=$PATH:/rust/bin
+ENV PATH=$PATH:/rust/bin \
+ CARGO_TARGET_X86_64_RUMPRUN_NETBSD_RUNNER=/tmp/runtest
+
+ADD docker/x86_64-rumprun-netbsd/runtest.rs /tmp/
+ENTRYPOINT ["sh", "-c", "rustc /tmp/runtest.rs -o /tmp/runtest && exec \"$@\"", "--"]
diff --git a/libc/ci/docker/x86_64-rumprun-netbsd/runtest.rs b/libc/ci/docker/x86_64-rumprun-netbsd/runtest.rs
new file mode 100644
index 0000000..94b5946
--- /dev/null
+++ b/libc/ci/docker/x86_64-rumprun-netbsd/runtest.rs
@@ -0,0 +1,54 @@
+use std::env;
+use std::process::{Command, Stdio};
+use std::sync::mpsc;
+use std::thread;
+use std::time::Duration;
+use std::io::{BufRead, BufReader, Read};
+
+fn main() {
+ assert_eq!(env::args().len(), 2);
+
+ let status = Command::new("rumprun-bake")
+ .arg("hw_virtio")
+ .arg("/tmp/libc-test.img")
+ .arg(env::args().nth(1).unwrap())
+ .status()
+ .expect("failed to run rumprun-bake");
+ assert!(status.success());
+
+ let mut child = Command::new("qemu-system-x86_64")
+ .arg("-nographic")
+ .arg("-vga").arg("none")
+ .arg("-m").arg("64")
+ .arg("-kernel").arg("/tmp/libc-test.img")
+ .stdout(Stdio::piped())
+ .stderr(Stdio::piped())
+ .spawn()
+ .expect("failed to spawn qemu");
+
+ let mut stdout = child.stdout.take().unwrap();
+ let mut stderr = child.stderr.take().unwrap();
+ let (tx, rx) = mpsc::channel();
+ let tx2 = tx.clone();
+ let t1 = thread::spawn(move || find_ok(&mut stdout, tx));
+ let t2 = thread::spawn(move || find_ok(&mut stderr, tx2));
+
+ let res = rx.recv_timeout(Duration::new(5, 0));
+ child.kill().unwrap();
+ t1.join().unwrap();
+ t2.join().unwrap();
+
+ if res.is_err() {
+ panic!("didn't find success");
+ }
+}
+
+fn find_ok(input: &mut Read, tx: mpsc::Sender<()>) {
+ for line in BufReader::new(input).lines() {
+ let line = line.unwrap();
+ println!("{}", line);
+ if line.starts_with("PASSED ") && line.contains(" tests") {
+ tx.send(()).unwrap();
+ }
+ }
+}