From 4d27898418e3bdf8d6de5baccc135e2146085349 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 8 Aug 2024 20:58:25 +0200 Subject: [PATCH] Use test runner's own tracking allocator. --- core/testing/testing.odin | 15 +++++++-------- tests/core/mem/test_mem_dynamic_pool.odin | 6 ++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/core/testing/testing.odin b/core/testing/testing.odin index 5282f5a20..b7cd23adf 100644 --- a/core/testing/testing.odin +++ b/core/testing/testing.odin @@ -141,20 +141,19 @@ expect_value :: proc(t: ^T, value, expected: $T, loc := #caller_location) -> boo Memory_Verifier_Proc :: #type proc(t: ^T, ta: ^mem.Tracking_Allocator) expect_leaks :: proc(t: ^T, client_test: proc(t: ^T), verifier: Memory_Verifier_Proc) { - { - ta: mem.Tracking_Allocator - mem.tracking_allocator_init(&ta, context.allocator) - defer mem.tracking_allocator_destroy(&ta) - context.allocator = mem.tracking_allocator(&ta) - + when TRACKING_MEMORY { client_test(t) + ta := (^mem.Tracking_Allocator)(context.allocator.data) + sync.mutex_lock(&ta.mutex) // The verifier can inspect this local tracking allocator. // And then call `testing.expect_*` as makes sense for the client test. - verifier(t, &ta) + verifier(t, ta) sync.mutex_unlock(&ta.mutex) + + clear(&ta.bad_free_array) + free_all(context.allocator) } - free_all(context.allocator) } set_fail_timeout :: proc(t: ^T, duration: time.Duration, loc := #caller_location) { diff --git a/tests/core/mem/test_mem_dynamic_pool.odin b/tests/core/mem/test_mem_dynamic_pool.odin index b6a54f09a..d1086cfe6 100644 --- a/tests/core/mem/test_mem_dynamic_pool.odin +++ b/tests/core/mem/test_mem_dynamic_pool.odin @@ -87,9 +87,15 @@ test_intentional_leaks :: proc(t: ^testing.T) { // Not tagged with @(test) because it's run through `test_intentional_leaks` intentionally_leaky_test :: proc(t: ^testing.T) { a: [dynamic]int + // Intentional leak append(&a, 42) + + // Intentional bad free + b := uintptr(&a[0]) + 42 + free(rawptr(b)) } leak_verifier :: proc(t: ^testing.T, ta: ^mem.Tracking_Allocator) { testing.expect_value(t, len(ta.allocation_map), 1) + testing.expect_value(t, len(ta.bad_free_array), 1) } \ No newline at end of file