Imported Upstream version 2.0.14
[platform/upstream/SDL.git] / test / testfile.c
1 /*
2   Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
3
4   This software is provided 'as-is', without any express or implied
5   warranty.  In no event will the authors be held liable for any damages
6   arising from the use of this software.
7
8   Permission is granted to anyone to use this software for any purpose,
9   including commercial applications, and to alter it and redistribute it
10   freely.
11 */
12
13 /* sanity tests on SDL_rwops.c (usefull for alternative implementations of stdio rwops) */
14
15 /* quiet windows compiler warnings */
16 #define _CRT_NONSTDC_NO_WARNINGS
17
18 #include <stdlib.h>
19
20 #ifndef _MSC_VER
21 #include <unistd.h>
22 #endif
23
24 #include "SDL.h"
25
26
27 #include <stdio.h>
28
29 /* WARNING ! those 2 files will be destroyed by this test program */
30
31 #ifdef __IPHONEOS__
32 #define FBASENAME1  "../Documents/sdldata1" /* this file will be created during tests */
33 #define FBASENAME2  "../Documents/sdldata2"     /* this file should not exist before starting test */
34 #else
35 #define FBASENAME1  "sdldata1"      /* this file will be created during tests */
36 #define FBASENAME2  "sdldata2"      /* this file should not exist before starting test */
37 #endif
38
39 #ifndef NULL
40 #define NULL ((void *)0)
41 #endif
42
43 static void
44 cleanup(void)
45 {
46     unlink(FBASENAME1);
47     unlink(FBASENAME2);
48 }
49
50 static void
51 rwops_error_quit(unsigned line, SDL_RWops * rwops)
52 {
53     SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "testfile.c(%d): failed\n", line);
54     if (rwops) {
55         rwops->close(rwops);    /* This calls SDL_FreeRW(rwops); */
56     }
57     cleanup();
58     exit(1);                    /* quit with rwops error (test failed) */
59 }
60
61 #define RWOP_ERR_QUIT(x)    rwops_error_quit( __LINE__, (x) )
62
63
64
65 int
66 main(int argc, char *argv[])
67 {
68     SDL_RWops *rwops = NULL;
69     char test_buf[30];
70
71     /* Enable standard application logging */
72     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
73
74     cleanup();
75
76 /* test 1 : basic argument test: all those calls to SDL_RWFromFile should fail */
77
78     rwops = SDL_RWFromFile(NULL, NULL);
79     if (rwops)
80         RWOP_ERR_QUIT(rwops);
81     rwops = SDL_RWFromFile(NULL, "ab+");
82     if (rwops)
83         RWOP_ERR_QUIT(rwops);
84     rwops = SDL_RWFromFile(NULL, "sldfkjsldkfj");
85     if (rwops)
86         RWOP_ERR_QUIT(rwops);
87     rwops = SDL_RWFromFile("something", "");
88     if (rwops)
89         RWOP_ERR_QUIT(rwops);
90     rwops = SDL_RWFromFile("something", NULL);
91     if (rwops)
92         RWOP_ERR_QUIT(rwops);
93     SDL_Log("test1 OK\n");
94
95 /* test 2 : check that inexistent file is not successfully opened/created when required */
96 /* modes : r, r+ imply that file MUST exist
97    modes : a, a+, w, w+ checks that it succeeds (file may not exists)
98
99  */
100     rwops = SDL_RWFromFile(FBASENAME2, "rb");   /* this file doesn't exist that call must fail */
101     if (rwops)
102         RWOP_ERR_QUIT(rwops);
103     rwops = SDL_RWFromFile(FBASENAME2, "rb+");  /* this file doesn't exist that call must fail */
104     if (rwops)
105         RWOP_ERR_QUIT(rwops);
106     rwops = SDL_RWFromFile(FBASENAME2, "wb");
107     if (!rwops)
108         RWOP_ERR_QUIT(rwops);
109     rwops->close(rwops);
110     unlink(FBASENAME2);
111     rwops = SDL_RWFromFile(FBASENAME2, "wb+");
112     if (!rwops)
113         RWOP_ERR_QUIT(rwops);
114     rwops->close(rwops);
115     unlink(FBASENAME2);
116     rwops = SDL_RWFromFile(FBASENAME2, "ab");
117     if (!rwops)
118         RWOP_ERR_QUIT(rwops);
119     rwops->close(rwops);
120     unlink(FBASENAME2);
121     rwops = SDL_RWFromFile(FBASENAME2, "ab+");
122     if (!rwops)
123         RWOP_ERR_QUIT(rwops);
124     rwops->close(rwops);
125     unlink(FBASENAME2);
126     SDL_Log("test2 OK\n");
127
128 /* test 3 : creation, writing , reading, seeking,
129             test : w mode, r mode, w+ mode
130  */
131     rwops = SDL_RWFromFile(FBASENAME1, "wb");   /* write only */
132     if (!rwops)
133         RWOP_ERR_QUIT(rwops);
134     if (1 != rwops->write(rwops, "1234567890", 10, 1))
135         RWOP_ERR_QUIT(rwops);
136     if (10 != rwops->write(rwops, "1234567890", 1, 10))
137         RWOP_ERR_QUIT(rwops);
138     if (7 != rwops->write(rwops, "1234567", 1, 7))
139         RWOP_ERR_QUIT(rwops);
140     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
141         RWOP_ERR_QUIT(rwops);
142     if (0 != rwops->read(rwops, test_buf, 1, 1))
143         RWOP_ERR_QUIT(rwops);   /* we are in write only mode */
144     rwops->close(rwops);
145
146     rwops = SDL_RWFromFile(FBASENAME1, "rb");   /* read mode, file must exists */
147     if (!rwops)
148         RWOP_ERR_QUIT(rwops);
149     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
150         RWOP_ERR_QUIT(rwops);
151     if (20 != rwops->seek(rwops, -7, RW_SEEK_END))
152         RWOP_ERR_QUIT(rwops);
153     if (7 != rwops->read(rwops, test_buf, 1, 7))
154         RWOP_ERR_QUIT(rwops);
155     if (SDL_memcmp(test_buf, "1234567", 7))
156         RWOP_ERR_QUIT(rwops);
157     if (0 != rwops->read(rwops, test_buf, 1, 1))
158         RWOP_ERR_QUIT(rwops);
159     if (0 != rwops->read(rwops, test_buf, 10, 100))
160         RWOP_ERR_QUIT(rwops);
161     if (0 != rwops->seek(rwops, -27, RW_SEEK_CUR))
162         RWOP_ERR_QUIT(rwops);
163     if (2 != rwops->read(rwops, test_buf, 10, 3))
164         RWOP_ERR_QUIT(rwops);
165     if (SDL_memcmp(test_buf, "12345678901234567890", 20))
166         RWOP_ERR_QUIT(rwops);
167     if (0 != rwops->write(rwops, test_buf, 1, 1))
168         RWOP_ERR_QUIT(rwops);   /* readonly mode */
169     rwops->close(rwops);
170
171 /* test 3: same with w+ mode */
172     rwops = SDL_RWFromFile(FBASENAME1, "wb+");  /* write + read + truncation */
173     if (!rwops)
174         RWOP_ERR_QUIT(rwops);
175     if (1 != rwops->write(rwops, "1234567890", 10, 1))
176         RWOP_ERR_QUIT(rwops);
177     if (10 != rwops->write(rwops, "1234567890", 1, 10))
178         RWOP_ERR_QUIT(rwops);
179     if (7 != rwops->write(rwops, "1234567", 1, 7))
180         RWOP_ERR_QUIT(rwops);
181     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
182         RWOP_ERR_QUIT(rwops);
183     if (1 != rwops->read(rwops, test_buf, 1, 1))
184         RWOP_ERR_QUIT(rwops);   /* we are in read/write mode */
185     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
186         RWOP_ERR_QUIT(rwops);
187     if (20 != rwops->seek(rwops, -7, RW_SEEK_END))
188         RWOP_ERR_QUIT(rwops);
189     if (7 != rwops->read(rwops, test_buf, 1, 7))
190         RWOP_ERR_QUIT(rwops);
191     if (SDL_memcmp(test_buf, "1234567", 7))
192         RWOP_ERR_QUIT(rwops);
193     if (0 != rwops->read(rwops, test_buf, 1, 1))
194         RWOP_ERR_QUIT(rwops);
195     if (0 != rwops->read(rwops, test_buf, 10, 100))
196         RWOP_ERR_QUIT(rwops);
197     if (0 != rwops->seek(rwops, -27, RW_SEEK_CUR))
198         RWOP_ERR_QUIT(rwops);
199     if (2 != rwops->read(rwops, test_buf, 10, 3))
200         RWOP_ERR_QUIT(rwops);
201     if (SDL_memcmp(test_buf, "12345678901234567890", 20))
202         RWOP_ERR_QUIT(rwops);
203     rwops->close(rwops);
204     SDL_Log("test3 OK\n");
205
206 /* test 4: same in r+ mode */
207     rwops = SDL_RWFromFile(FBASENAME1, "rb+");  /* write + read + file must exists, no truncation */
208     if (!rwops)
209         RWOP_ERR_QUIT(rwops);
210     if (1 != rwops->write(rwops, "1234567890", 10, 1))
211         RWOP_ERR_QUIT(rwops);
212     if (10 != rwops->write(rwops, "1234567890", 1, 10))
213         RWOP_ERR_QUIT(rwops);
214     if (7 != rwops->write(rwops, "1234567", 1, 7))
215         RWOP_ERR_QUIT(rwops);
216     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
217         RWOP_ERR_QUIT(rwops);
218     if (1 != rwops->read(rwops, test_buf, 1, 1))
219         RWOP_ERR_QUIT(rwops);   /* we are in read/write mode */
220     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
221         RWOP_ERR_QUIT(rwops);
222     if (20 != rwops->seek(rwops, -7, RW_SEEK_END))
223         RWOP_ERR_QUIT(rwops);
224     if (7 != rwops->read(rwops, test_buf, 1, 7))
225         RWOP_ERR_QUIT(rwops);
226     if (SDL_memcmp(test_buf, "1234567", 7))
227         RWOP_ERR_QUIT(rwops);
228     if (0 != rwops->read(rwops, test_buf, 1, 1))
229         RWOP_ERR_QUIT(rwops);
230     if (0 != rwops->read(rwops, test_buf, 10, 100))
231         RWOP_ERR_QUIT(rwops);
232     if (0 != rwops->seek(rwops, -27, RW_SEEK_CUR))
233         RWOP_ERR_QUIT(rwops);
234     if (2 != rwops->read(rwops, test_buf, 10, 3))
235         RWOP_ERR_QUIT(rwops);
236     if (SDL_memcmp(test_buf, "12345678901234567890", 20))
237         RWOP_ERR_QUIT(rwops);
238     rwops->close(rwops);
239     SDL_Log("test4 OK\n");
240
241 /* test5 : append mode */
242     rwops = SDL_RWFromFile(FBASENAME1, "ab+");  /* write + read + append */
243     if (!rwops)
244         RWOP_ERR_QUIT(rwops);
245     if (1 != rwops->write(rwops, "1234567890", 10, 1))
246         RWOP_ERR_QUIT(rwops);
247     if (10 != rwops->write(rwops, "1234567890", 1, 10))
248         RWOP_ERR_QUIT(rwops);
249     if (7 != rwops->write(rwops, "1234567", 1, 7))
250         RWOP_ERR_QUIT(rwops);
251     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
252         RWOP_ERR_QUIT(rwops);
253
254     if (1 != rwops->read(rwops, test_buf, 1, 1))
255         RWOP_ERR_QUIT(rwops);
256     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
257         RWOP_ERR_QUIT(rwops);
258
259     if (20 + 27 != rwops->seek(rwops, -7, RW_SEEK_END))
260         RWOP_ERR_QUIT(rwops);
261     if (7 != rwops->read(rwops, test_buf, 1, 7))
262         RWOP_ERR_QUIT(rwops);
263     if (SDL_memcmp(test_buf, "1234567", 7))
264         RWOP_ERR_QUIT(rwops);
265     if (0 != rwops->read(rwops, test_buf, 1, 1))
266         RWOP_ERR_QUIT(rwops);
267     if (0 != rwops->read(rwops, test_buf, 10, 100))
268         RWOP_ERR_QUIT(rwops);
269
270     if (27 != rwops->seek(rwops, -27, RW_SEEK_CUR))
271         RWOP_ERR_QUIT(rwops);
272
273     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
274         RWOP_ERR_QUIT(rwops);
275     if (3 != rwops->read(rwops, test_buf, 10, 3))
276         RWOP_ERR_QUIT(rwops);
277     if (SDL_memcmp(test_buf, "123456789012345678901234567123", 30))
278         RWOP_ERR_QUIT(rwops);
279     rwops->close(rwops);
280     SDL_Log("test5 OK\n");
281     cleanup();
282     return 0;                   /* all ok */
283 }