test/testfile.c
author Sam Lantinga <slouken@libsdl.org>
Sun, 01 Jan 2017 18:33:28 -0800
changeset 10737 3406a0f8b041
parent 9998 f67cf37e9cd4
child 11811 5d94cb6b24d3
permissions -rw-r--r--
Updated copyright for 2017
     1 /*
     2   Copyright (C) 1997-2017 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 }