1 #[test]
brk()2 fn brk() {
3     unsafe {
4         let start = dbg!(crate::brk(0)).unwrap();
5         let end = start + 4 * 1024 * 1024;
6         assert_eq!(dbg!(crate::brk(end)), Ok(end));
7     }
8 }
9 
10 #[test]
chdir()11 fn chdir() {
12     //TODO: Verify CWD
13     assert_eq!(dbg!(crate::chdir("file:/")), Ok(0));
14     assert_eq!(dbg!(crate::chdir("file:/root")), Ok(0));
15 }
16 
17 //TODO: chmod
18 
19 #[test]
clone()20 fn clone() {
21     let expected_status = 42;
22     let pid_res = unsafe { crate::clone(0) };
23     if pid_res == Ok(0) {
24         crate::exit(expected_status).unwrap();
25         panic!("failed to exit");
26     } else {
27         let pid = dbg!(pid_res).unwrap();
28         let mut status = 0;
29         assert_eq!(dbg!(crate::waitpid(pid, &mut status, 0)), Ok(pid));
30         assert_eq!(dbg!(crate::wifexited(status)), true);
31         assert_eq!(dbg!(crate::wexitstatus(status)), expected_status);
32     }
33 }
34 
35 //TODO: close
36 
37 #[test]
clock_gettime()38 fn clock_gettime() {
39     let mut tp = crate::TimeSpec::default();
40     assert_eq!(dbg!(
41         crate::clock_gettime(crate::CLOCK_MONOTONIC, &mut tp)
42     ), Ok(0));
43     assert_ne!(dbg!(tp), crate::TimeSpec::default());
44 
45     tp = crate::TimeSpec::default();
46     assert_eq!(dbg!(
47         crate::clock_gettime(crate::CLOCK_REALTIME, &mut tp)
48     ), Ok(0));
49     assert_ne!(dbg!(tp), crate::TimeSpec::default());
50 }
51 
52 //TODO: dup
53 
54 //TODO: dup2
55 
56 //TODO: exit (handled by clone?)
57 
58 //TODO: fchmod
59 
60 //TODO: fcntl
61 
62 #[test]
fexec()63 fn fexec() {
64     let name = "/bin/ls";
65 
66     let fd = dbg!(
67         crate::open(name, crate::O_RDONLY | crate::O_CLOEXEC)
68     ).unwrap();
69 
70     let args = &[
71         [name.as_ptr() as usize, name.len()]
72     ];
73 
74     let vars = &[];
75 
76     let pid_res = unsafe { crate::clone(0) };
77     if pid_res == Ok(0) {
78         crate::fexec(fd, args, vars).unwrap();
79         panic!("failed to fexec");
80     } else {
81         assert_eq!(dbg!(crate::close(fd)), Ok(0));
82 
83         let pid = dbg!(pid_res).unwrap();
84         let mut status = 0;
85         assert_eq!(dbg!(crate::waitpid(pid, &mut status, 0)), Ok(pid));
86         assert_eq!(dbg!(crate::wifexited(status)), true);
87         assert_eq!(dbg!(crate::wexitstatus(status)), 0);
88     }
89 }
90 
91 #[test]
fmap()92 fn fmap() {
93     use std::slice;
94 
95     let fd = dbg!(
96         crate::open(
97             "/tmp/syscall-tests-fmap",
98             crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC
99         )
100     ).unwrap();
101 
102     let map = unsafe {
103         slice::from_raw_parts_mut(
104             dbg!(
105                 crate::fmap(fd, &crate::Map {
106                     offset: 0,
107                     size: 128,
108                     flags: crate::PROT_READ | crate::PROT_WRITE
109                 })
110             ).unwrap() as *mut u8,
111             128
112         )
113     };
114 
115     // Maps should be available after closing
116     assert_eq!(dbg!(crate::close(fd)), Ok(0));
117 
118     for i in 0..128 {
119         map[i as usize] = i;
120         assert_eq!(map[i as usize], i);
121     }
122 
123     //TODO: add msync
124     unsafe {
125         assert_eq!(dbg!(
126             crate::funmap(map.as_mut_ptr() as usize)
127         ), Ok(0));
128     }
129 }
130