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:
| M | src/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);