9374b9f15034713aec86405dab36fa9f4601bb3c
[pcsx_rearmed.git] / deps / mman / test.c
1
2 #include "mman.h"
3
4 #include <errno.h>
5 #include <fcntl.h>
6 #include <sys/stat.h>
7
8 #ifndef NULL
9 #define NULL    (void*)0
10 #endif
11
12 const char* map_file_name = "map_file.dat";
13
14 int test_anon_map_readwrite()
15 {    
16     void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE,
17                       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
18     if (map == MAP_FAILED)
19     {
20         printf("mmap (MAP_ANONYMOUS, PROT_READ | PROT_WRITE) returned unexpected error: %d\n", errno);
21         return -1;
22     }
23         
24     *((unsigned char*)map) = 1;
25     
26     int result = munmap(map, 1024);
27     
28     if (result != 0)
29         printf("munmap (MAP_ANONYMOUS, PROT_READ | PROT_WRITE) returned unexpected error: %d\n", errno);
30         
31     return result;
32 }
33
34 int test_anon_map_readonly()
35 {    
36     void* map = mmap(NULL, 1024, PROT_READ,
37                       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
38     if (map == MAP_FAILED)
39     {
40         printf("mmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
41         return -1;
42     }
43         
44     *((unsigned char*)map) = 1;
45     
46     int result = munmap(map, 1024);
47     
48     if (result != 0)
49         printf("munmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
50         
51     return result;
52 }
53
54 int test_anon_map_writeonly()
55 {    
56     void* map = mmap(NULL, 1024, PROT_WRITE,
57                       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
58     if (map == MAP_FAILED)
59     {
60         printf("mmap (MAP_ANONYMOUS, PROT_WRITE) returned unexpected error: %d\n", errno);
61         return -1;
62     }
63         
64     *((unsigned char*)map) = 1;
65     
66     int result = munmap(map, 1024);
67     
68     if (result != 0)
69         printf("munmap (MAP_ANONYMOUS, PROT_WRITE) returned unexpected error: %d\n", errno);
70         
71     return result;
72 }
73
74 int test_anon_map_readonly_nowrite()
75 {    
76     void* map = mmap(NULL, 1024, PROT_READ,
77                       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
78     if (map == MAP_FAILED)
79     {
80         printf("mmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
81         return -1;
82     }
83     
84     if (*((unsigned char*)map) != 0)
85         printf("test_anon_map_readonly_nowrite (MAP_ANONYMOUS, PROT_READ) returned unexpected value: %d\n", 
86                 (int)*((unsigned char*)map));
87         
88     int result = munmap(map, 1024);
89     
90     if (result != 0)
91         printf("munmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
92         
93     return result;
94 }
95
96 int test_file_map_readwrite()
97 {
98     mode_t mode = S_IRUSR | S_IWUSR;
99     int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode);
100
101     void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0);
102     if (map == MAP_FAILED)
103     {
104         printf("mmap returned unexpected error: %d\n", errno);
105         return -1;
106     }
107
108     *((unsigned char*)map) = 1;
109     
110     int result = munmap(map, 1024);
111     
112     if (result != 0)
113         printf("munmap returned unexpected error: %d\n", errno);
114     
115     close(o);
116     
117     /*TODO: get file info and content and compare it with the sources conditions */
118     unlink(map_file_name);
119     
120     return result;
121 }
122
123 int test_file_map_mlock_munlock()
124 {
125     const size_t map_size = 1024;
126     
127     int result = 0;
128     mode_t mode = S_IRUSR | S_IWUSR;
129     int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode);
130     if (o == -1)
131     {
132         printf("unable to create file %s: %d\n", map_file_name, errno);
133         return -1;
134     }
135
136     void* map = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0);
137     if (map == MAP_FAILED)
138     {
139         printf("mmap returned unexpected error: %d\n", errno);
140         result = -1;
141         goto done_close;
142     }
143      
144     if (mlock(map, map_size) != 0)
145     {
146         printf("mlock returned unexpected error: %d\n", errno);
147         result = -1;
148         goto done_munmap;        
149     }
150     
151     *((unsigned char*)map) = 1;
152     
153     if (munlock(map, map_size) != 0)
154     {
155         printf("munlock returned unexpected error: %d\n", errno);
156         result = -1;
157     }
158     
159 done_munmap:
160     result = munmap(map, map_size);
161     
162     if (result != 0)
163         printf("munmap returned unexpected error: %d\n", errno);
164         
165 done_close:
166     close(o);
167     
168     unlink(map_file_name);
169 done:
170     return result;
171 }
172
173 int test_file_map_msync()
174 {
175     const size_t map_size = 1024;
176     
177     int result = 0;
178     mode_t mode = S_IRUSR | S_IWUSR;
179     int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode);
180     if (o == -1)
181     {
182         printf("unable to create file %s: %d\n", map_file_name, errno);
183         return -1;
184     }
185
186     void* map = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0);
187     if (map == MAP_FAILED)
188     {
189         printf("mmap returned unexpected error: %d\n", errno);
190         result = -1;
191         goto done_close;
192     }
193      
194     *((unsigned char*)map) = 1;
195
196     if (msync(map, map_size, MS_SYNC) != 0)
197     {
198         printf("msync returned unexpected error: %d\n", errno);
199         result = -1;
200     }
201     
202     result = munmap(map, map_size);
203     
204     if (result != 0)
205         printf("munmap returned unexpected error: %d\n", errno);
206         
207 done_close:
208     close(o);
209     
210     unlink(map_file_name);
211 done:
212     return result;
213 }
214
215 #define EXEC_TEST(name) \
216     if (name() != 0) { result = -1; printf( #name ": fail\n"); } \
217     else { printf(#name ": pass\n"); }
218
219 int main()
220 {
221     int result = 0;
222     
223     EXEC_TEST(test_anon_map_readwrite);
224     //NOTE: this test must cause an access violation exception
225     //EXEC_TEST(test_anon_map_readonly);
226     EXEC_TEST(test_anon_map_readonly_nowrite);
227     EXEC_TEST(test_anon_map_writeonly);
228     
229     EXEC_TEST(test_file_map_readwrite);
230     EXEC_TEST(test_file_map_mlock_munlock);
231     EXEC_TEST(test_file_map_msync);
232     //TODO: EXEC_TEST(test_file_map_mprotect);
233     
234     return result;
235 }