| #[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)); |
| } |
| } |