summaryrefslogtreecommitdiffstats
path: root/third_party/rust/redox_syscall/src/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/redox_syscall/src/tests.rs')
-rw-r--r--third_party/rust/redox_syscall/src/tests.rs129
1 files changed, 129 insertions, 0 deletions
diff --git a/third_party/rust/redox_syscall/src/tests.rs b/third_party/rust/redox_syscall/src/tests.rs
new file mode 100644
index 0000000000..cf89ec96ae
--- /dev/null
+++ b/third_party/rust/redox_syscall/src/tests.rs
@@ -0,0 +1,129 @@
+#[test]
+fn brk() {
+ unsafe {
+ let start = dbg!(crate::brk(0)).unwrap();
+ let end = start + 4 * 1024 * 1024;
+ assert_eq!(dbg!(crate::brk(end)), Ok(end));
+ }
+}
+
+#[test]
+fn chdir() {
+ //TODO: Verify CWD
+ assert_eq!(dbg!(crate::chdir("file:/")), Ok(0));
+ assert_eq!(dbg!(crate::chdir("file:/root")), Ok(0));
+}
+
+//TODO: chmod
+
+#[test]
+fn clone() {
+ let expected_status = 42;
+ let pid_res = unsafe { crate::clone(0) };
+ if pid_res == Ok(0) {
+ crate::exit(expected_status).unwrap();
+ panic!("failed to exit");
+ } else {
+ let pid = dbg!(pid_res).unwrap();
+ let mut status = 0;
+ assert_eq!(dbg!(crate::waitpid(pid, &mut status, 0)), Ok(pid));
+ assert_eq!(dbg!(crate::wifexited(status)), true);
+ assert_eq!(dbg!(crate::wexitstatus(status)), expected_status);
+ }
+}
+
+//TODO: close
+
+#[test]
+fn clock_gettime() {
+ let mut tp = crate::TimeSpec::default();
+ assert_eq!(dbg!(
+ crate::clock_gettime(crate::CLOCK_MONOTONIC, &mut tp)
+ ), Ok(0));
+ assert_ne!(dbg!(tp), crate::TimeSpec::default());
+
+ tp = crate::TimeSpec::default();
+ assert_eq!(dbg!(
+ crate::clock_gettime(crate::CLOCK_REALTIME, &mut tp)
+ ), Ok(0));
+ assert_ne!(dbg!(tp), crate::TimeSpec::default());
+}
+
+//TODO: dup
+
+//TODO: dup2
+
+//TODO: exit (handled by clone?)
+
+//TODO: fchmod
+
+//TODO: fcntl
+
+#[test]
+fn fexec() {
+ let name = "/bin/ls";
+
+ let fd = dbg!(
+ crate::open(name, crate::O_RDONLY | crate::O_CLOEXEC)
+ ).unwrap();
+
+ let args = &[
+ [name.as_ptr() as usize, name.len()]
+ ];
+
+ let vars = &[];
+
+ let pid_res = unsafe { crate::clone(0) };
+ if pid_res == Ok(0) {
+ crate::fexec(fd, args, vars).unwrap();
+ panic!("failed to fexec");
+ } else {
+ assert_eq!(dbg!(crate::close(fd)), Ok(0));
+
+ let pid = dbg!(pid_res).unwrap();
+ let mut status = 0;
+ assert_eq!(dbg!(crate::waitpid(pid, &mut status, 0)), Ok(pid));
+ assert_eq!(dbg!(crate::wifexited(status)), true);
+ assert_eq!(dbg!(crate::wexitstatus(status)), 0);
+ }
+}
+
+#[test]
+fn fmap() {
+ use std::slice;
+
+ let fd = dbg!(
+ crate::open(
+ "/tmp/syscall-tests-fmap",
+ crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC
+ )
+ ).unwrap();
+
+ let map = unsafe {
+ slice::from_raw_parts_mut(
+ dbg!(
+ crate::fmap(fd, &crate::Map {
+ offset: 0,
+ size: 128,
+ flags: crate::PROT_READ | crate::PROT_WRITE
+ })
+ ).unwrap() as *mut u8,
+ 128
+ )
+ };
+
+ // Maps should be available after closing
+ assert_eq!(dbg!(crate::close(fd)), Ok(0));
+
+ for i in 0..128 {
+ map[i as usize] = i;
+ assert_eq!(map[i as usize], i);
+ }
+
+ //TODO: add msync
+ unsafe {
+ assert_eq!(dbg!(
+ crate::funmap(map.as_mut_ptr() as usize)
+ ), Ok(0));
+ }
+}