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