testfile.c (9473B)
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 }