star-buffer

Load 1D arrays in binary format
git clone git://git.meso-star.fr/star-buffer.git
Log | Files | Refs | README | LICENSE

commit 8aba0a6dceffac82633c6540c83443817c02cb4d
parent 7a2d89cb161bae7d05bc96139bc77f69a1aa77ec
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 30 Mar 2022 12:31:47 +0200

Test loading failures

Diffstat:
Msrc/test_sbuf_load.c | 135+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 109 insertions(+), 26 deletions(-)

diff --git a/src/test_sbuf_load.c b/src/test_sbuf_load.c @@ -25,6 +25,13 @@ struct type_desc { uint64_t alignment; }; +struct header { + uint64_t pagesize; + uint64_t size; + uint64_t szitem; + uint64_t alitem; +}; + /******************************************************************************* * i16_f32 type ******************************************************************************/ @@ -125,7 +132,7 @@ f32_eq(const void* a, const void* b) static void check_sbuf_desc (const struct sbuf_desc* desc, - const uint64_t count, + const uint64_t size, const struct type_desc* type) { char ALIGN(512) mem[512] = {0}; @@ -135,23 +142,22 @@ check_sbuf_desc CHK(type->alignment <= ALIGNOF(mem)); CHK(desc->buffer != NULL); - CHK(desc->count == count); - CHK(desc->szelmt == type->size); - CHK(desc->alelmt == type->alignment); + CHK(desc->size == size); + CHK(desc->szitem == type->size); + CHK(desc->alitem == type->alignment); CHK(desc->pitch == ALIGN_SIZE(type->size, type->alignment)); - FOR_EACH(i, 0, count) { - const void* elmt = sbuf_desc_at(desc, i); + FOR_EACH(i, 0, size) { + const void* item = sbuf_desc_at(desc, i); type->set(mem, i); - CHK(type->eq(mem, elmt)); + CHK(type->eq(mem, item)); } } static void write_buffer (FILE* fp, - const uint64_t pagesize, - const uint64_t count, + const struct header* header, const struct type_desc* type) { char ALIGN(512) mem[512] = {0}; @@ -160,27 +166,28 @@ write_buffer CHK(type); CHK(type->size <= sizeof(mem)); - CHK(type->alignment <= ALIGNOF(mem)); /* Write file header */ - CHK(fwrite(&pagesize, sizeof(pagesize), 1, fp) == 1); - CHK(fwrite(&count, sizeof(count), 1, fp) == 1); - CHK(fwrite(&type->size, sizeof(type->size), 1, fp) == 1); - CHK(fwrite(&type->alignment, sizeof(type->size), 1, fp) == 1); + CHK(fwrite(&header->pagesize, sizeof(header->pagesize), 1, fp) == 1); + CHK(fwrite(&header->size, sizeof(header->size), 1, fp) == 1); + CHK(fwrite(&header->szitem, sizeof(header->szitem), 1, fp) == 1); + CHK(fwrite(&header->alitem, sizeof(header->alitem), 1, fp) == 1); /* Padding */ - CHK(fseek(fp, (long)ALIGN_SIZE((size_t)ftell(fp), pagesize), SEEK_SET) == 0); + CHK(fseek(fp, + (long)ALIGN_SIZE((size_t)ftell(fp), header->pagesize), SEEK_SET) == 0); /* Write the buffer data */ - FOR_EACH(i, 0, count) { + FOR_EACH(i, 0, header->size) { type->set(mem, i); CHK(fwrite(mem, type->size, 1, fp) == 1); - CHK(fseek - (fp, (long)ALIGN_SIZE((size_t)ftell(fp), type->alignment), SEEK_SET) == 0); + CHK(fseek(fp, + (long)ALIGN_SIZE((size_t)ftell(fp), type->alignment), SEEK_SET) == 0); } /* Padding. Write one char to position the EOF indicator */ - CHK(fseek(fp, (long)ALIGN_SIZE((size_t)ftell(fp), pagesize)-1, SEEK_SET) == 0); + CHK(fseek(fp, + (long)ALIGN_SIZE((size_t)ftell(fp), header->pagesize)-1, SEEK_SET) == 0); CHK(fwrite(&byte, sizeof(byte), 1, fp) == 1); CHK(fflush(fp) == 0); } @@ -189,17 +196,20 @@ static void test_load(struct sbuf* buf, const struct type_desc* type) { struct sbuf_desc desc = SBUF_DESC_NULL; + struct header header; FILE* fp = NULL; const char* filename = "test_file.sbuf"; - const uint64_t pagesize = 16384; - const uint64_t count = 287; CHK(buf && type); fp = fopen(filename, "w+"); CHK(fp); - write_buffer(fp, pagesize, count, type); + header.pagesize = 16384; + header.size = 287; + header.szitem = type->size; + header.alitem = type->alignment; + write_buffer(fp, &header, type); rewind(fp); CHK(sbuf_load_stream(NULL, fp, filename) == RES_BAD_ARG); @@ -208,9 +218,82 @@ test_load(struct sbuf* buf, const struct type_desc* type) CHK(sbuf_get_desc(NULL, &desc) == RES_BAD_ARG); CHK(sbuf_get_desc(buf, NULL) == RES_BAD_ARG); CHK(sbuf_get_desc(buf, &desc) == RES_OK); - check_sbuf_desc(&desc, count, type); + check_sbuf_desc(&desc, header.size, type); + + CHK(fclose(fp) == 0); +} + +static void +test_buffer + (struct sbuf* buf, + const struct header* header, + const struct type_desc* type, + const res_T res) +{ + FILE* fp = NULL; + CHK(fp = tmpfile()); + write_buffer(fp, header, type); + rewind(fp); + CHK(sbuf_load_stream(buf, fp, NULL) == res); + CHK(fclose(fp) == 0); +} - fclose(fp); +static void +test_load_fail(struct sbuf* buf) +{ + struct type_desc type; + struct header header; + uint64_t size = 0; + FILE* fp = NULL; + + type.set = f32_set; + type.eq = f32_eq; + type.size = sizeof(float); + type.alignment = 32; + + header.pagesize = 4096; + header.size = 100; + header.szitem = type.size; + header.alitem = type.alignment; + + /* Check the a priori validity of the current parameters */ + test_buffer(buf, &header, &type, RES_OK); + + /* Invalid page size */ + header.pagesize = 2048; + test_buffer(buf, &header, &type, RES_BAD_ARG); + header.pagesize = 4098; + test_buffer(buf, &header, &type, RES_BAD_ARG); + + /* Invalid size */ + header.pagesize = 4096; + header.size = 0; + test_buffer(buf, &header, &type, RES_BAD_ARG); + + /* Invalid item size */ + header.size = 100; + header.szitem = 0; + test_buffer(buf, &header, &type, RES_BAD_ARG); + + /* Invalid type alignment */ + header.szitem = type.size; + header.alitem = 0; + test_buffer(buf, &header, &type, RES_BAD_ARG); + header.alitem = 33; + test_buffer(buf, &header, &type, RES_BAD_ARG); + header.alitem = 8192; + test_buffer(buf, &header, &type, RES_BAD_ARG); + + /* Invalid file size */ + header.alitem = type.alignment; + CHK(fp = tmpfile()); + write_buffer(fp, &header, &type); + CHK(fseek(fp, 8, SEEK_SET) == 0); /* Overwrite the size */ + size = 5000; + CHK(fwrite(&size, sizeof(size), 1, fp) == 1); + rewind(fp); + CHK(sbuf_load_stream(buf, fp, NULL) == RES_IO_ERR); + CHK(fclose(fp) == 0); } /******************************************************************************* @@ -254,8 +337,8 @@ main(int argc, char** argv) type.alignment = ALIGNOF(float); test_load(buf, &type); - /*test_load_fail(smsh); - test_load_files(smsh, argc, argv);*/ + test_load_fail(buf); + /*test_load_files(smsh, argc, argv);*/ CHK(sbuf_ref_put(buf) == RES_OK); CHK(mem_allocated_size() == 0);