diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-11-22 14:32:51 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-11-22 16:35:43 -0500 |
| commit | 31275f4cee6f0593fc39fecef04477d4a26e8df4 (patch) | |
| tree | 5ae3dfc297fb3729ecf74b0e8a52bb7cf3ddc574 /test | |
| parent | f23b4ce2dd648174a5df0e259faf7209c5d4c653 (diff) | |
pkmem.h: test for expected assert failures
Diffstat (limited to 'test')
| -rw-r--r-- | test/pkmem.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/test/pkmem.cpp b/test/pkmem.cpp index cc7cf9c..8dc429a 100644 --- a/test/pkmem.cpp +++ b/test/pkmem.cpp @@ -1,10 +1,41 @@ #include "../pkmem.h" +#include <csetjmp> +#include <signal.h> +#include <thread> + +static bool expected_exit = false; +static bool caught = false; +static jmp_buf jmp_env; +void +exit(int code) +{ + if (expected_exit) { + caught = true; + longjmp(jmp_env, 1); + } else { + _exit(code); + } +} +// assert() calls abort(), handle +void +handle_assert_abort(int sig) +{ + if (expected_exit) { + caught = true; + longjmp(jmp_env, 1); + } else { + _exit(1); + } +} + int main(int argc, char *argv[]) { + signal(SIGABRT, handle_assert_abort); (void)argc; (void)argv; + int i; // pk_new<T> { @@ -12,6 +43,110 @@ int main(int argc, char *argv[]) fprintf(stdout, "some_dang_string: %p\n", some_dang_string); pk_delete<char>(some_dang_string, 64); } + pk_memory_teardown_all(); + + // assert bucket count + do + { + int r; + r = setjmp(jmp_env); + if (r == 1) { + if (expected_exit == true && caught == true) { + expected_exit = false; + caught = false; + PK_LOGV_INF("%s: successfully caught err.\n", __FILE__); + fflush(stdout); + fflush(stderr); + break; + } else { + goto uncaught_err; + } + } + for (i = 0; i < PK_MAX_BUCKET_COUNT + 1; ++i) { + caught = false; + expected_exit = true; + pk_membucket *bkt = pk_bucket_create("lol", 1024, false); + expected_exit = false; + (void)bkt; + } + goto uncaught_err; + } + while(false); + pk_memory_teardown_all(); + + // assert no buckets available on pk_new with full memory + do + { + int r; + caught = false; + expected_exit = false; + for (i = 0; i < PK_MAX_BUCKET_COUNT; ++i) { + pk_membucket *bkt = pk_bucket_create("lol2", 1024, false); + char *asdf = pk_new<char>(768, bkt); + (void)asdf; + } + r = setjmp(jmp_env); + if (r == 1) { + if (expected_exit == true && caught == true) { + expected_exit = false; + caught = false; + PK_LOGV_INF("%s: successfully caught err.\n", __FILE__); + fflush(stdout); + fflush(stderr); + break; + } else { + goto uncaught_err; + } + } + caught = false; + expected_exit = true; + char *asdf = pk_new<char>(768); + (void)asdf; + expected_exit = false; + goto uncaught_err; + } + while(false); + pk_memory_teardown_all(); + + // assert no buckets available on pk_new with full memory + do + { + int r; + caught = false; + expected_exit = false; + pk_membucket *bkt = nullptr; + for (i = 0; i < PK_MAX_BUCKET_COUNT; ++i) { + bkt = pk_bucket_create("lol3", 1024, false); + char *asdf = pk_new<char>(768, bkt); + (void)asdf; + } + r = setjmp(jmp_env); + if (r == 1) { + if (expected_exit == true && caught == true) { + expected_exit = false; + caught = false; + PK_LOGV_INF("%s: successfully caught err.\n", __FILE__); + fflush(stdout); + fflush(stderr); + break; + } else { + goto uncaught_err; + } + } + caught = false; + expected_exit = true; + char *asdf = pk_new<char>(768, bkt); + (void)asdf; + expected_exit = false; + goto uncaught_err; + } + while(false); + pk_memory_teardown_all(); return 0; +uncaught_err: + PK_LOGV_ERR("%s: failed to catch err.\n", __FILE__); + fflush(stdout); + fflush(stderr); + return 1; } |
