From fb709c876a4b7ab0bb70fc6b2a3dceeafde94acd Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 7 Sep 2015 10:27:06 +1000 Subject: [PATCH] test: add more refcounting test cases And change some to drop all parent refs before we even test the struct we want to test. This way we're more likely to blow up during the test too. Signed-off-by: Peter Hutterer --- test/test-device.c | 189 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 185 insertions(+), 4 deletions(-) diff --git a/test/test-device.c b/test/test-device.c index 42434342..4cca2c82 100644 --- a/test/test-device.c +++ b/test/test-device.c @@ -164,10 +164,29 @@ START_TEST(device_ref_unref) d = ratbag_device_new_test_device(r, &td); ck_assert(d != NULL); + ratbag_unref(r); + ref_unref_test(ratbag_device, d); ratbag_device_unref(d); - ratbag_unref(r); +} +END_TEST + +START_TEST(device_free_context_before_device) +{ + struct ratbag *r; + struct ratbag_device *d; + struct ratbag_test_device td = sane_device; + + r = ratbag_create_context(&abort_iface, NULL); + d = ratbag_device_new_test_device(r, &td); + ck_assert(d != NULL); + + r = ratbag_unref(r); + ck_assert(r != NULL); + + d = ratbag_device_unref(d); + ck_assert(d == NULL); } END_TEST @@ -219,12 +238,12 @@ START_TEST(device_profiles_ref_unref) d = ratbag_device_new_test_device(r, &td); p = ratbag_device_get_profile_by_index(d, 1); - ref_unref_test(ratbag_profile, p); - + ratbag_unref(r); ratbag_device_unref(d); + ref_unref_test(ratbag_profile, p); + ratbag_profile_unref(p); - ratbag_unref(r); } END_TEST @@ -375,6 +394,30 @@ START_TEST(device_resolutions) } END_TEST +START_TEST(device_resolutions_ref_unref) +{ + struct ratbag *r; + struct ratbag_device *d; + struct ratbag_profile *p; + struct ratbag_resolution *res; + + struct ratbag_test_device td = sane_device; + + r = ratbag_create_context(&abort_iface, NULL); + d = ratbag_device_new_test_device(r, &td); + p = ratbag_device_get_profile_by_index(d, 1); + res = ratbag_profile_get_resolution(p, 0); + + ratbag_unref(r); + ratbag_device_unref(d); + ratbag_profile_unref(p); + + ref_unref_test(ratbag_resolution, res); + + ratbag_resolution_unref(res); +} +END_TEST + START_TEST(device_resolutions_num_0) { struct ratbag *r; @@ -476,6 +519,139 @@ START_TEST(device_and_profile_freed_before_button) } END_TEST +START_TEST(device_and_profile_freed_before_resolution) +{ + struct ratbag *r; + struct ratbag_device *d; + struct ratbag_profile *p; + struct ratbag_resolution *res; + int device_freed_count = 0; + + struct ratbag_test_device td = sane_device; + + td.destroyed_data = &device_freed_count; + + r = ratbag_create_context(&abort_iface, NULL); + d = ratbag_device_new_test_device(r, &td); + ck_assert(d != NULL); + + p = ratbag_device_get_profile_by_index(d, 0); + ck_assert(p != NULL); + + d = ratbag_device_unref(d); + /* a ref to d is still kept through p, so d can not be NULL */ + ck_assert(d != NULL); + + res = ratbag_profile_get_resolution(p, 0); + ck_assert(res != NULL); + + p = ratbag_profile_unref(p); + /* a ref to p is still kept through res, so p can not be NULL */ + ck_assert(p != NULL); + + /* FIXME: should probably call something for the resolution */ + res = ratbag_resolution_unref(res); + ck_assert(res == NULL); + + ratbag_unref(r); + ck_assert_int_eq(device_freed_count, 1); +} +END_TEST + +START_TEST(device_and_profile_and_button_freed_before_resolution) +{ + struct ratbag *r; + struct ratbag_device *d; + struct ratbag_profile *p; + struct ratbag_resolution *res; + struct ratbag_button *b; + int device_freed_count = 0; + + struct ratbag_test_device td = sane_device; + + td.destroyed_data = &device_freed_count; + + r = ratbag_create_context(&abort_iface, NULL); + d = ratbag_device_new_test_device(r, &td); + ck_assert(d != NULL); + + p = ratbag_device_get_profile_by_index(d, 0); + ck_assert(p != NULL); + + d = ratbag_device_unref(d); + /* a ref to d is still kept through p, so d can not be NULL */ + ck_assert(d != NULL); + + res = ratbag_profile_get_resolution(p, 0); + ck_assert(res != NULL); + + b = ratbag_profile_get_button_by_index(p, 0); + ck_assert(b != NULL); + + p = ratbag_profile_unref(p); + /* a ref to p is still kept through res and b, so p can not be NULL */ + ck_assert(p != NULL); + + /* a ref to p is still in res */ + b = ratbag_button_unref(b); + ck_assert(b == NULL); + + /* FIXME: should probably call something for the resolution */ + res = ratbag_resolution_unref(res); + ck_assert(res == NULL); + + ratbag_unref(r); + ck_assert_int_eq(device_freed_count, 1); +} +END_TEST + +START_TEST(device_and_profile_and_resolution_freed_before_button) +{ + struct ratbag *r; + struct ratbag_device *d; + struct ratbag_profile *p; + struct ratbag_resolution *res; + struct ratbag_button *b; + int device_freed_count = 0; + + struct ratbag_test_device td = sane_device; + + td.destroyed_data = &device_freed_count; + + r = ratbag_create_context(&abort_iface, NULL); + d = ratbag_device_new_test_device(r, &td); + ck_assert(d != NULL); + + p = ratbag_device_get_profile_by_index(d, 0); + ck_assert(p != NULL); + + d = ratbag_device_unref(d); + /* a ref to d is still kept through p, so d can not be NULL */ + ck_assert(d != NULL); + + res = ratbag_profile_get_resolution(p, 0); + ck_assert(res != NULL); + + b = ratbag_profile_get_button_by_index(p, 0); + ck_assert(b != NULL); + + p = ratbag_profile_unref(p); + /* a ref to p is still kept through res and b, so p can not be NULL */ + ck_assert(p != NULL); + + /* a ref to p is still in res */ + res = ratbag_resolution_unref(res); + ck_assert(res == NULL); + + /* FIXME: should probably call something for the button */ + b = ratbag_button_unref(b); + ck_assert(b == NULL); + + ratbag_unref(r); + ck_assert_int_eq(device_freed_count, 1); +} +END_TEST + static Suite * test_context_suite(void) { @@ -486,6 +662,7 @@ test_context_suite(void) tc = tcase_create("device"); tcase_add_test(tc, device_init); tcase_add_test(tc, device_ref_unref); + tcase_add_test(tc, device_free_context_before_device); suite_add_tcase(s, tc); tc = tcase_create("profiles"); @@ -496,10 +673,14 @@ test_context_suite(void) tcase_add_test(tc, device_profiles_get_invalid); tcase_add_test(tc, device_freed_before_profile); tcase_add_test(tc, device_and_profile_freed_before_button); + tcase_add_test(tc, device_and_profile_freed_before_resolution); + tcase_add_test(tc, device_and_profile_and_button_freed_before_resolution); + tcase_add_test(tc, device_and_profile_and_resolution_freed_before_button); suite_add_tcase(s, tc); tc = tcase_create("resolutions"); tcase_add_test(tc, device_resolutions); + tcase_add_test(tc, device_resolutions_ref_unref); tcase_add_test(tc, device_resolutions_num_0); suite_add_tcase(s, tc);