main
1#define NOTLIBC_NOMAIN
2#include "notlibc.c"
3
4void test_existing_open_missing_create(void);
5void test_existing_truncate_missing_create(void);
6void test_existing_fail_missing_create(void);
7
8void test_existing_open_missing_fail(void);
9void test_existing_truncate_missing_fail(void);
10void test_existing_fail_missing_fail(void);
11void test_invalid_combinations(void);
12
13void test_file_access(void);
14
15File f = {0};
16const STRING( filename, "test.txt" );
17const STRING( msg, "hello there!" );
18u8 buffer[sizeof(msg.data) - 1] = {0};
19usize read_amount = 0;
20usize written_amount = 0;
21
22void reset_state(void) {
23 mem_set( &f, sizeof(f), 0 );
24 mem_set( &buffer, sizeof(buffer), 0 );
25 read_amount = 0;
26 written_amount = 0;
27}
28
29void PRESERVE_WITH_LTO entry(void) {
30 test_existing_open_missing_create();
31 reset_state();
32 test_existing_truncate_missing_create();
33 reset_state();
34 test_existing_fail_missing_create();
35 reset_state();
36
37 test_existing_open_missing_fail();
38 reset_state();
39 test_existing_truncate_missing_fail();
40 reset_state();
41
42 test_file_access();
43 reset_state();
44
45 RELEASE(
46 test_existing_fail_missing_fail();
47 reset_state();
48 test_invalid_combinations();
49 reset_state();
50 )
51
52 terminate(0);
53}
54
55
56void test_existing_open_missing_create(void) {
57 usize flags =
58 FILE_EXISTING_OPEN |
59 FILE_MISSING_CREATE |
60 FILE_LINK_FAIL |
61 FILE_ACCESS_READ | FILE_ACCESS_WRITE;
62
63 Status s = S_SUCCESS;
64
65 /* Create */
66 f = File_open( &s, (Str*)&filename, flags );
67 assert( S_SUCCESSFUL(s) );
68
69 written_amount = File_write( &s, &f, msg.len, (const u8*)&msg.data );
70 assert( S_SUCCESSFUL(s) );
71 assert( written_amount == msg.len );
72
73 File_seek( &s, &f, 0 );
74 assert( S_SUCCESSFUL(s) );
75
76 read_amount = File_read( &s, &f, msg.len, (u8*)&buffer );
77 assert( S_SUCCESSFUL(s) );
78
79 for( usize i = 0; i < msg.len; ++i ) {
80 assert( buffer[i] == msg.data[i] );
81 }
82
83 File_close( &s, &f );
84 assert( S_SUCCESSFUL(s) );
85
86 /* Open */
87 f = File_open( &s, (Str*)&filename, flags );
88 assert( S_SUCCESSFUL(s) );
89
90 read_amount = File_read( &s, &f, msg.len, (u8*)&buffer );
91 assert( S_SUCCESSFUL(s) );
92
93 File_close( &s, &f );
94 assert( S_SUCCESSFUL(s) );
95
96 File_delete( &s, (Str*)&filename );
97 assert( S_SUCCESSFUL(s) );
98}
99
100
101void test_existing_truncate_missing_create(void) {
102 usize flags =
103 FILE_EXISTING_TRUNCATE |
104 FILE_MISSING_CREATE |
105 FILE_LINK_FAIL |
106 FILE_ACCESS_READ | FILE_ACCESS_WRITE;
107
108 Status s = S_SUCCESS;
109
110 /* Create */
111 f = File_open( &s, (Str*)&filename, flags ); assert( S_SUCCESSFUL(s) );
112
113 written_amount = File_write( &s, &f, msg.len, (const u8*)&msg.data );
114 assert( S_SUCCESSFUL(s) );
115 assert( written_amount == msg.len );
116
117 File_close( &s, &f );
118 assert( S_SUCCESSFUL(s) );
119
120 /* Open (truncate) */
121 f = File_open( &s, (Str*)&filename, flags );
122 assert( S_SUCCESSFUL(s) );
123
124 read_amount = File_read( &s, &f, msg.len, (u8*)&buffer );
125 assert( S_SUCCESSFUL(s) );
126 assert( read_amount == 0 );
127
128 File_close( &s, &f );
129 assert( S_SUCCESSFUL(s) );
130
131 File_delete( &s, (Str*)&filename );
132 assert( S_SUCCESSFUL(s) );
133}
134
135void test_existing_fail_missing_create(void) {
136 usize flags =
137 FILE_EXISTING_FAIL |
138 FILE_MISSING_CREATE |
139 FILE_LINK_FAIL |
140 FILE_ACCESS_READ | FILE_ACCESS_WRITE;
141
142 Status s = S_SUCCESS;
143 /* Create */
144 f = File_open( &s, (Str*)&filename, flags );
145 assert( S_SUCCESSFUL(s) );
146
147 written_amount = File_write( &s, &f, msg.len, (const u8*)&msg.data ); assert( S_SUCCESSFUL(s) );
148 assert( written_amount == msg.len );
149
150 File_close( &s, &f );
151 assert( S_SUCCESSFUL(s) );
152
153 /* Open (fail) */
154 f = File_open( &s, (Str*)&filename, flags );
155 assert( S_FAILED(s) ); s = S_SUCCESS;
156
157 File_delete( &s, (Str*)&filename );
158 assert( S_SUCCESSFUL(s) );
159}
160
161void test_existing_open_missing_fail(void) {
162 usize flags =
163 FILE_EXISTING_OPEN |
164 FILE_MISSING_FAIL |
165 FILE_LINK_FAIL |
166 FILE_ACCESS_READ | FILE_ACCESS_WRITE;
167
168 Status s = S_SUCCESS;
169
170 /* Create */
171 f = File_open( &s, (Str*)&filename, flags);
172 assert( S_FAILED(s) ); s = S_SUCCESS;
173
174 /* actually create for open */
175 f = File_open( &s, (Str*)&filename,
176 FILE_EXISTING_FAIL |
177 FILE_MISSING_CREATE |
178 FILE_LINK_FAIL |
179 FILE_ACCESS_READ | FILE_ACCESS_WRITE
180 );
181 assert( S_SUCCESSFUL(s) );
182
183 File_close( &s, &f );
184 assert( S_SUCCESSFUL(s) );
185
186 /* Open */
187 File_open( &s, (Str*)&filename, flags);
188 assert( S_SUCCESSFUL(s) );
189
190 File_close( &s, &f );
191 assert( S_SUCCESSFUL(s) );
192 File_delete( &s, (Str*)&filename );
193 assert( S_SUCCESSFUL(s) );
194}
195
196void test_existing_truncate_missing_fail(void) {
197 usize flags =
198 FILE_EXISTING_TRUNCATE |
199 FILE_MISSING_FAIL |
200 FILE_LINK_FAIL |
201 FILE_ACCESS_READ | FILE_ACCESS_WRITE;
202
203
204 Status s = S_SUCCESS;
205
206 /* Create */
207 f = File_open( &s, (Str*)&filename, flags);
208 assert( S_FAILED(s) ); s = S_SUCCESS;
209
210 /* actually create for open */
211 f = File_open( &s, (Str*)&filename,
212 FILE_EXISTING_FAIL |
213 FILE_MISSING_CREATE |
214 FILE_LINK_FAIL |
215 FILE_ACCESS_READ | FILE_ACCESS_WRITE
216 );
217 assert( S_SUCCESSFUL(s) );
218
219 written_amount = File_write( &s, &f, msg.len, (const u8*)&msg.data );
220 assert( S_SUCCESSFUL(s) );
221 assert( written_amount == msg.len );
222
223 File_close( &s, &f );
224 assert( S_SUCCESSFUL(s) );
225
226 /* Open (truncate) */
227 f = File_open( &s, (Str*)&filename, flags );
228 assert( S_SUCCESSFUL(s) );
229
230 read_amount = File_read( &s, &f, msg.len, (u8*)&buffer );
231 assert( S_SUCCESSFUL(s) );
232 assert( read_amount == 0 );
233
234 File_close( &s, &f ); assert( S_SUCCESSFUL(s) );
235 File_delete( &s, (Str*)&filename ); assert( S_SUCCESSFUL(s) );
236}
237
238void test_file_access(void) {
239 usize flags = FILE_EXISTING_OPEN | FILE_MISSING_CREATE | FILE_LINK_FAIL;
240
241 Status s = S_SUCCESS;
242 f = File_open( &s, (Str*)&filename, flags | FILE_ACCESS_READ );
243 assert( S_SUCCESSFUL(s) );
244
245 written_amount = File_write( &s, &f, msg.len, (const u8*)&msg.data );
246 assert( S_FAILED(s) ); s = S_SUCCESS;
247
248 File_close( &s, &f );
249 assert( S_SUCCESSFUL(s) );
250
251 f = File_open( &s, (Str*)&filename, flags | FILE_ACCESS_WRITE );
252 assert( S_SUCCESSFUL(s) );
253
254 File_read( &s, &f, msg.len, (u8*)&buffer );
255 assert( S_FAILED(s) ); s = S_SUCCESS;
256
257 File_close( &s, &f );
258 assert( S_SUCCESSFUL(s) );
259
260 f = File_open( &s, (Str*)&filename, flags | FILE_ACCESS_APPEND ); assert( S_SUCCESSFUL(s) );
261 File_read( &s, &f, msg.len, (u8*)&buffer );
262 assert( S_FAILED(s) ); s = S_SUCCESS;
263 File_close( &s, &f ); assert( S_SUCCESSFUL(s) );
264}
265
266void test_existing_fail_missing_fail(void) {
267 usize flags =
268 FILE_EXISTING_FAIL |
269 FILE_MISSING_FAIL |
270 FILE_LINK_FAIL |
271 FILE_ACCESS_READ | FILE_ACCESS_WRITE;
272
273 Status s = S_SUCCESS;
274
275 f = File_open( &s, (Str*)&filename, flags);
276 assert( S_FAILED(s) ); s = S_SUCCESS;
277}
278
279void test_invalid_combinations(void) {
280
281 usize flags = FILE_EXISTING_OPEN | FILE_MISSING_CREATE | FILE_LINK_FAIL | FILE_ACCESS_READ;
282
283 Status s = S_SUCCESS;
284 f = File_open( &s, (Str*)&filename, flags | FILE_ACCESS_APPEND | FILE_ACCESS_WRITE );
285 assert( S_FAILED(s) ); s = S_SUCCESS;
286
287 f = File_open( &s, (Str*)&filename, flags | FILE_EXISTING_FAIL );
288 assert( S_FAILED(s) ); s = S_SUCCESS;
289
290 f = File_open( &s, (Str*)&filename, flags | FILE_EXISTING_TRUNCATE );
291 assert( S_FAILED(s) ); s = S_SUCCESS;
292
293 f = File_open( &s, (Str*)&filename, flags | FILE_EXISTING_TRUNCATE | FILE_EXISTING_FAIL );
294 assert( S_FAILED(s) ); s = S_SUCCESS;
295
296 f = File_open( &s, (Str*)&filename, flags | FILE_MISSING_FAIL );
297 assert( S_FAILED(s) ); s = S_SUCCESS;
298
299 f = File_open( &s, (Str*)&filename, flags | FILE_LINK_FOLLOW );
300 assert( S_FAILED(s) ); s = S_SUCCESS;
301}
302