From 57b81eacf20423c70a19d325bffee861d8b3a882 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 26 Jun 2020 17:10:12 +0200 Subject: Testcases für erfolgreiches Fehlermanagement... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- csv-test.c | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/csv-test.c b/csv-test.c index 5fd0e15..ecf55cd 100644 --- a/csv-test.c +++ b/csv-test.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "csv.h" @@ -411,6 +412,157 @@ test6(void) FMEMCLOSE(f); } +static void +cb_error(csv_err_t err, void *cb_arg) +{ + longjmp(*((jmp_buf *) cb_arg), err); +} + +void +error1(void) +{ + jmp_buf env; + csv_options_t csv_options = csv_default_options; + csv_options.cb_error = cb_error; + csv_options.cb_error_arg = &env; + + csv_t csv; + csv_init_opt(&csv, &csv_options); + + FILE *f; + char data[] = ","; + + FMEMOPEN(f, data); + + switch ( setjmp(env) ) { + case CSV_ERR_OK: + assert( csv_read(&csv, f) == 2 ); + assert( csv_nfields(&csv) == 2 ); + + // force an "out of range"-Exception! + assert( strcmp(csv_field(&csv, 2), "will fail") == 0 ); + break; + + case CSV_ERR_OUT_OF_RANGE: + csv_cleanup(&csv); + break; + + default: + assert(!"this should not be happen!"); + } + + FMEMCLOSE(f); +} + +void +error2(void) +{ + jmp_buf env; + csv_options_t csv_options = csv_default_options; + csv_options.cb_error = cb_error; + csv_options.cb_error_arg = &env; + + csv_t csv; + csv_init_opt(&csv, &csv_options); + + FILE *f = fopen("/dev/null", "r"); + assert(f != NULL); + fputc('T', f); // Set Error-Flag! + + switch ( setjmp(env) ) { + case CSV_ERR_OK: + assert( csv_read(&csv, f) == -1 ); + break; + + case CSV_ERR_IO_READ: + csv_cleanup(&csv); + break; + + default: + assert(!"this should not be happen!"); + } + + fclose(f); +} + +void * +my_allocate(size_t n, size_t sz, void *cb_arg) +{ + (void) cb_arg; + + void *ptr = calloc(n, sz); + return ptr; +} + +void * +my_allocate_null(size_t n, size_t sz, void *cb_arg) +{ + (void) n; + (void) sz; + (void) cb_arg; + + return NULL; +} + +void * +my_reallocate(void *ptr, size_t n, size_t sz, void *cb_arg) +{ + (void) ptr; + (void) n; + (void) sz; + (void) cb_arg; + + return NULL; +} + +void +my_free(void *ptr, size_t n, size_t sz, void *cb_arg) +{ + (void) n; + (void) sz; + (void) cb_arg; + + free(ptr); +} + +void +memory_fail1(void) +{ + jmp_buf env; + + csv_options_t csv_options = csv_default_options; + csv_options.cb_error = cb_error; + csv_options.cb_error_arg = &env; + csv_options.cb_allocate = my_allocate; + csv_options.cb_reallocate = my_reallocate; + csv_options.cb_free = my_free; + + csv_t csv; + csv_init_opt(&csv, &csv_options); + + char data[] = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T"; + + FILE *f; + FMEMOPEN(f, data); + assert(f != NULL); + + switch ( setjmp(env) ) { + case CSV_ERR_OK: + assert( csv_read(&csv, f) == 20 ); + assert(!"this should not be happen!"); + break; + + case CSV_ERR_OUT_OF_MEMORY: + csv_cleanup(&csv); + break; + + default: + assert(!"this should not be happen!"); + } + + FMEMCLOSE(f); +} + int main(void) { @@ -421,5 +573,10 @@ main(void) test5(); test6(); + error1(); + error2(); + + memory_fail1(); + return EXIT_SUCCESS; } -- cgit v1.3