aboutsummaryrefslogtreecommitdiff
path: root/test/load_test
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2023-07-16 02:03:33 +0200
committerToni Uhlig <matzeton@googlemail.com>2023-07-16 02:03:33 +0200
commit5a40295c4cf0af5ea8da9ced04a4ce7d3621a080 (patch)
treecb21506e7b04d10b45d6066a0ee1655563d5d52b /test/load_test
Squashed 'flatcc/' content from commit 473da2a
git-subtree-dir: flatcc git-subtree-split: 473da2afa5ca435363f8c5e6569167aee6bc31c5
Diffstat (limited to 'test/load_test')
-rw-r--r--test/load_test/CMakeLists.txt20
-rw-r--r--test/load_test/load_test.c164
-rwxr-xr-xtest/load_test/load_test.sh22
3 files changed, 206 insertions, 0 deletions
diff --git a/test/load_test/CMakeLists.txt b/test/load_test/CMakeLists.txt
new file mode 100644
index 0000000..0c146d1
--- /dev/null
+++ b/test/load_test/CMakeLists.txt
@@ -0,0 +1,20 @@
+include(CTest)
+
+set(INC_DIR "${PROJECT_SOURCE_DIR}/include")
+set(GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
+set(FBS_DIR "${PROJECT_SOURCE_DIR}/test/monster_test")
+
+include_directories("${GEN_DIR}" "${INC_DIR}")
+
+add_custom_target(gen_load_test ALL)
+add_custom_command (
+ TARGET gen_load_test
+ COMMAND ${CMAKE_COMMAND} -E make_directory "${GEN_DIR}"
+ COMMAND flatcc_cli -a -o "${GEN_DIR}" "${FBS_DIR}/monster_test.fbs"
+ DEPENDS flatcc_cli "${FBS_DIR}/monster_test.fbs" "${FBS_DIR}/include_test1.fbs" "${FBS_DIR}/include_test2.fbs"
+)
+add_executable(load_test load_test.c)
+add_dependencies(load_test gen_load_test)
+target_link_libraries(load_test flatccrt)
+
+add_test(load_test load_test${CMAKE_EXECUTABLE_SUFFIX})
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;
+}
diff --git a/test/load_test/load_test.sh b/test/load_test/load_test.sh
new file mode 100755
index 0000000..d94fbb0
--- /dev/null
+++ b/test/load_test/load_test.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+
+set -e
+cd `dirname $0`/../..
+ROOT=`pwd`
+TMP=build/tmp/test/load_test
+
+${ROOT}/scripts/build.sh
+mkdir -p ${TMP}
+rm -rf ${TMP}/*
+bin/flatcc -a -o ${TMP} test/monster_test/monster_test.fbs
+
+cp test/load_test/*.c ${TMP}
+cd ${TMP}
+cc -g -I ${ROOT}/include load_test.c \
+ ${ROOT}/lib/libflatccrt.a -o load_test_d
+cc -O3 -DNDEBUG -I ${ROOT}/include load_test.c \
+ ${ROOT}/lib/libflatccrt.a -o load_test
+echo "running load test debug"
+./load_test_d
+echo "running load test optimized"
+./load_test