diff options
Diffstat (limited to 'test/load_test/load_test.c')
-rw-r--r-- | test/load_test/load_test.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/test/load_test/load_test.c b/test/load_test/load_test.c new file mode 100644 index 0000000..466f5cc --- /dev/null +++ b/test/load_test/load_test.c @@ -0,0 +1,164 @@ +#include <stdio.h> +#include "monster_test_builder.h" +#include "flatcc/support/elapsed.h" + +#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(MyGame_Example, x) +#define nsc(x) FLATBUFFERS_WRAP_NAMESPACE(flatbuffers, x) +#define c_vec_len(V) (sizeof(V)/sizeof((V)[0])) + +#define MEASURE_DECODE 1 +#define MONSTER_REP 1000 +#define NAME_REP 100 +#define INVENTORY_REP 100 + +static uint8_t invdata[1000]; + +static ns(Monster_ref_t) create_monster(flatcc_builder_t *B) +{ + size_t i; + + ns(Monster_start(B)); + ns(Monster_name_start(B)); + for (i = 0; i < NAME_REP; ++i) { + nsc(string_append(B, "Monster", 7)); + } + ns(Monster_name_end(B)); + ns(Monster_inventory_start(B)); + for (i = 0; i < INVENTORY_REP; ++i) { + nsc(uint8_vec_append(B, invdata, c_vec_len(invdata))); + } + ns(Monster_inventory_end(B)); + return ns(Monster_end(B)); +} + +static ns(Monster_vec_ref_t) create_monsters(flatcc_builder_t *B) +{ + size_t i; + ns(Monster_ref_t) m; + + ns(Monster_vec_start(B)); + for (i = 0; i < MONSTER_REP; ++i) { + m = create_monster(B); + assert(m); + ns(Monster_vec_push(B, m)); + } + return ns(Monster_vec_end(B)); +} + +static int create_root_monster(flatcc_builder_t *B) +{ + ns(Monster_vec_ref_t) mv; + + flatcc_builder_reset(B); + ns(Monster_start_as_root(B)); + ns(Monster_name_create_str(B, "root_monster")); + mv = create_monsters(B); + assert(mv); + ns(Monster_testarrayoftables_add(B, mv)); + ns(Monster_end_as_root(B)); + return 0; +} + +#if MEASURE_DECODE +static int verify_monster(const char *base, ns(Monster_table_t) mon) +{ + size_t i; + nsc(string_t) s = ns(Monster_name(mon)); + /* + * This only works because it is a byte, otherwise + * vec_at should be used to convert endian format. + */ + const uint8_t *inv = ns(Monster_inventory(mon)); + + if (nsc(string_len(s)) != NAME_REP * 7) { + assert(0); + return -1; + } + if (nsc(uint8_vec_len(inv)) != INVENTORY_REP * c_vec_len(invdata)) { + assert(0); + return -1; + } + for (i = 0; i < NAME_REP; ++i) { + if (memcmp(s + i * 7, "Monster", 7)) { + printf("failed monster name at %lu: %s\n", (unsigned long)i, s ? s : "NULL"); + printf("offset: %ld\n", (long)(s + i * 7 - base)); + assert(0); + return -1; + } + } + for (i = 0; i < INVENTORY_REP; ++i) { + if (memcmp(inv + i * c_vec_len(invdata), invdata, c_vec_len(invdata))) { + assert(0); + return -1; + } + } + return 0; +} +#endif + +int main(int argc, char *argv[]) +{ + FILE *fp; + void *buffer; + size_t size; + flatcc_builder_t builder, *B; + ns(Monster_table_t) mon; + ns(Monster_vec_t) mv; + double t1, t2; + int rep = 10, i; + int ret = 0; + +#if MEASURE_DECODE + size_t j; +#endif + + (void)argc; + (void)argv; + + B = &builder; + flatcc_builder_init(B); + create_root_monster(B); + buffer = flatcc_builder_finalize_buffer(B, &size); + fp = fopen("monster_load_test.dat", "wb"); + if (!fp) { + ret = -1; + goto done; + } + ret |= size != fwrite(buffer, 1, size, fp); + fclose(fp); + if (ret) { + goto done; + } + printf("buffer size: %lu\n", (unsigned long)size); + printf("start timing ...\n"); + t1 = elapsed_realtime(); + for (i = 0; i < rep; ++i) { + create_root_monster(B); + flatcc_builder_copy_buffer(B, buffer, size); + mon = ns(Monster_as_root(buffer)); + ret |= strcmp(ns(Monster_name(mon)), "root_monster"); + assert(ret == 0); + mv = ns(Monster_testarrayoftables(mon)); + /* Negated logic, 0 is OK. */ + ret |= ns(Monster_vec_len(mv)) != MONSTER_REP; + assert(ret == 0); +#if MEASURE_DECODE + for (j = 0; j < MONSTER_REP; ++j) { + ret |= verify_monster(buffer, ns(Monster_vec_at(mv, j))); + assert(ret == 0); + } +#endif + if (ret) { + goto done; + } + } + t2 = elapsed_realtime(); + show_benchmark("encode and partially decode large buffer", t1, t2, size, rep, 0); +done: + flatcc_builder_clear(B); + free(buffer); + if (ret) { + printf("load test failed\n"); + } + return ret; +} |