summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-11-22 14:32:51 -0500
committerJonathan Bradley <jcb@pikum.xyz>2024-11-22 16:35:43 -0500
commit31275f4cee6f0593fc39fecef04477d4a26e8df4 (patch)
tree5ae3dfc297fb3729ecf74b0e8a52bb7cf3ddc574 /test
parentf23b4ce2dd648174a5df0e259faf7209c5d4c653 (diff)
pkmem.h: test for expected assert failures
Diffstat (limited to 'test')
-rw-r--r--test/pkmem.cpp135
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;
}