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