Преглед на файлове

Use test runner's own tracking allocator.

Jeroen van Rijn преди 1 година
родител
ревизия
4d27898418
променени са 2 файла, в които са добавени 13 реда и са изтрити 8 реда
  1. 7 8
      core/testing/testing.odin
  2. 6 0
      tests/core/mem/test_mem_dynamic_pool.odin

+ 7 - 8
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)
 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) {
 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)
 		client_test(t)
+		ta := (^mem.Tracking_Allocator)(context.allocator.data)
+
 		sync.mutex_lock(&ta.mutex)
 		sync.mutex_lock(&ta.mutex)
 		// The verifier can inspect this local tracking allocator.
 		// The verifier can inspect this local tracking allocator.
 		// And then call `testing.expect_*` as makes sense for the client test.
 		// And then call `testing.expect_*` as makes sense for the client test.
-		verifier(t, &ta)
+		verifier(t, ta)
 		sync.mutex_unlock(&ta.mutex)
 		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) {
 set_fail_timeout :: proc(t: ^T, duration: time.Duration, loc := #caller_location) {

+ 6 - 0
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`
 // Not tagged with @(test) because it's run through `test_intentional_leaks`
 intentionally_leaky_test :: proc(t: ^testing.T) {
 intentionally_leaky_test :: proc(t: ^testing.T) {
 	a: [dynamic]int
 	a: [dynamic]int
+	// Intentional leak
 	append(&a, 42)
 	append(&a, 42)
+
+	// Intentional bad free
+	b := uintptr(&a[0]) + 42
+	free(rawptr(b))
 }
 }
 
 
 leak_verifier :: proc(t: ^testing.T, ta: ^mem.Tracking_Allocator) {
 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.allocation_map), 1)
+	testing.expect_value(t, len(ta.bad_free_array), 1)
 }
 }