summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Sales de Andrade <quantum.analyst@gmail.com>2023-03-23 23:11:59 -0500
committerElliott Sales de Andrade <quantum.analyst@gmail.com>2023-03-23 23:11:59 -0500
commit360291de4b74d2c7c23e7fc9d80e1cded9dab8e3 (patch)
treee9717763c171e3c41451cef47ce7ee16edd11388
parente0415c2d77b5e06c6c884f6e81386c13fd801bac (diff)
downloadpidgin-360291de4b74d2c7c23e7fc9d80e1cded9dab8e3.tar.gz
Fix several leaks in tests
All of these are specific to tests, not the library code. For the moment, `protocol_xfer` still leaks connections (and anything they hold on to) because it is very difficult to disentangle them from the connection manager in the partially implemented state they are in. This fixes leaks of options in the account option test (these two leaks occur for every test since they all leak the option): ``` 61 (48 direct, 13 indirect) bytes in 1 blocks are definitely lost in loss record 133 of 276 at 0x4848464: calloc (vg_replace_malloc.c:1340) by 0x49F75F0: g_malloc0 (gmem.c:163) by 0x48C3B2E: purple_account_option_new (purpleaccountoption.c:78) by 0x4014AF: test_purple_account_option_copy_int (test_account_option.c:67) by 0x4A1CC7D: UnknownInlinedFun (gtestutils.c:2933) by 0x4A1CC7D: g_test_run_suite_internal (gtestutils.c:3021) by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A1D181: g_test_run_suite (gtestutils.c:3115) by 0x4A156EC: UnknownInlinedFun (gtestutils.c:2234) by 0x4A156EC: g_test_run (gtestutils.c:2221) by 0x401721: main (test_account_option.c:157) 61 (48 direct, 13 indirect) bytes in 1 blocks are definitely lost in loss record 134 of 276 at 0x4848464: calloc (vg_replace_malloc.c:1340) by 0x49F75F0: g_malloc0 (gmem.c:163) by 0x48C3BC7: purple_account_option_copy (purpleaccountoption.c:93) by 0x4014BF: test_purple_account_option_copy_int (test_account_option.c:68) by 0x4A1CC7D: UnknownInlinedFun (gtestutils.c:2933) by 0x4A1CC7D: g_test_run_suite_internal (gtestutils.c:3021) by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A1D181: g_test_run_suite (gtestutils.c:3115) by 0x4A156EC: UnknownInlinedFun (gtestutils.c:2234) by 0x4A156EC: g_test_run (gtestutils.c:2221) by 0x401721: main (test_account_option.c:157) ``` leaks in the credential manager test (times 3 for read/write/cancel tests): ``` 69 (16 direct, 53 indirect) bytes in 1 blocks are definitely lost in loss record 2,427 of 3,503 at 0x484386F: malloc (vg_replace_malloc.c:393) by 0x4A58168: g_malloc (gmem.c:130) by 0x4A6FAB5: g_slice_alloc (gslice.c:1074) by 0x4A700EC: g_slice_alloc0 (gslice.c:1100) by 0x4A3BECB: g_error_allocate (gerror.c:710) by 0x4A3C93F: UnknownInlinedFun (gerror.c:724) by 0x4A3C93F: g_error_new_valist (gerror.c:766) by 0x4BEE558: g_task_return_new_error (gtask.c:1941) by 0x48D82C0: purple_credential_manager_read_password_async (purplecredentialmanager.c:492) by 0x403634: test_purple_credential_manager_no_provider_read_password_idle (test_credential_manager.c:329) by 0x4A4ECB1: g_idle_dispatch (gmain.c:6124) by 0x4A4FCBE: UnknownInlinedFun (gmain.c:3444) by 0x4A4FCBE: g_main_context_dispatch (gmain.c:4162) by 0x4AA5597: g_main_context_iterate.constprop.0 (gmain.c:4238) by 0x4A4F28E: g_main_loop_run (gmain.c:4438) by 0x40369F: test_purple_credential_manager_no_provider_read_password_async (test_credential_manager.c:345) by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933) by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021) by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A7E181: g_test_run_suite (gtestutils.c:3115) by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234) by 0x4A766EC: g_test_run (gtestutils.c:2221) by 0x4048F6: main (test_credential_manager.c:695) ``` a leak in the image test: ``` 161 bytes in 1 blocks are definitely lost in loss record 260 of 274 at 0x484386F: malloc (vg_replace_malloc.c:393) by 0x4A55363: g_try_malloc (gmem.c:286) by 0x4A3D630: UnknownInlinedFun (gfileutils.c:819) by 0x4A3D630: UnknownInlinedFun (gfileutils.c:924) by 0x4A3D630: g_file_get_contents (gfileutils.c:1027) by 0x401890: test_image_new_from_file (test_image.c:144) by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933) by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021) by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A7E181: g_test_run_suite (gtestutils.c:3115) by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234) by 0x4A766EC: g_test_run (gtestutils.c:2221) by 0x40195D: main (test_image.c:172) ``` a leak in queued output stream test: ``` 72 (40 direct, 32 indirect) bytes in 1 blocks are definitely lost in loss record 219 of 396 at 0x49D51EF: g_type_create_instance (gtype.c:1909) by 0x49BAC1F: g_object_new_internal (gobject.c:2228) by 0x49BC247: g_object_new_with_properties (gobject.c:2391) by 0x49BCFF0: g_object_new (gobject.c:2037) by 0x402003: test_queued_output_stream_push_bytes_async_error (test_queued_output_stream.c:219) by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933) by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021) by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A7E181: g_test_run_suite (gtestutils.c:3115) by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234) by 0x4A766EC: g_test_run (gtestutils.c:2221) by 0x402429: main (test_queued_output_stream.c:280) ``` and protocol xfer tests (times 3 for each test that creates a test protocol object): ``` 112 (48 direct, 64 indirect) bytes in 1 blocks are definitely lost in loss record 3,430 of 3,698 at 0x49D51EF: g_type_create_instance (gtype.c:1909) by 0x49BAC1F: g_object_new_internal (gobject.c:2228) by 0x49BC247: g_object_new_with_properties (gobject.c:2391) by 0x49BCFF0: g_object_new (gobject.c:2037) by 0x40291C: test_purple_protocol_xfer_send_file_func (test_protocol_xfer.c:146) by 0x4A7DC7D: UnknownInlinedFun (gtestutils.c:2933) by 0x4A7DC7D: g_test_run_suite_internal (gtestutils.c:3021) by 0x4A7D9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A7E181: g_test_run_suite (gtestutils.c:3115) by 0x4A766EC: UnknownInlinedFun (gtestutils.c:2234) by 0x4A766EC: g_test_run (gtestutils.c:2221) by 0x402B64: main (test_protocol_xfer.c:195) ``` and util tests (times 3 for each call to `purple_text_strip_mnemonic` in the test): ``` 5 bytes in 1 blocks are definitely lost in loss record 5 of 247 at 0x484386F: malloc (vg_replace_malloc.c:393) by 0x49F7168: g_malloc (gmem.c:130) by 0x491975B: purple_text_strip_mnemonic (util.c:895) by 0x4015B0: test_util_text_strip_mnemonic (test_util.c:49) by 0x4A1CC7D: UnknownInlinedFun (gtestutils.c:2933) by 0x4A1CC7D: g_test_run_suite_internal (gtestutils.c:3021) by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A1C9E4: g_test_run_suite_internal (gtestutils.c:3038) by 0x4A1D181: g_test_run_suite (gtestutils.c:3115) by 0x4A156EC: UnknownInlinedFun (gtestutils.c:2234) by 0x4A156EC: g_test_run (gtestutils.c:2221) by 0x401901: main (test_util.c:224) ``` and these leaks in any test that initializes the test UI: ``` 4,104 bytes in 1 blocks are possibly lost in loss record 3,451 of 3,457 at 0x484386F: malloc (vg_replace_malloc.c:393) by 0x5235B67: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:25493) by 0x5232797: UnknownInlinedFun (sqlite3.c:29181) by 0x5232797: UnknownInlinedFun (sqlite3.c:29227) by 0x5232797: sqlite3Malloc.lto_priv.0 (sqlite3.c:29221) by 0x523BD8B: pcache1Alloc.lto_priv.0 (sqlite3.c:53546) by 0x5249A8B: UnknownInlinedFun (sqlite3.c:53675) by 0x5249A8B: allocateTempSpace (sqlite3.c:70848) by 0x52625A6: sqlite3VdbeExec.lto_priv.0 (sqlite3.c:93857) by 0x525CBEE: UnknownInlinedFun (sqlite3.c:87995) by 0x525CBEE: UnknownInlinedFun (sqlite3.c:88056) by 0x525CBEE: sqlite3_step (sqlite3.c:88045) by 0x529B324: sqlite3_exec (sqlite3.c:131002) by 0x48FD558: purple_sqlite3_run_migration (purplesqlite3.c:37) by 0x48FDBB4: purple_sqlite3_run_migrations_from_resources (purplesqlite3.c:195) by 0x48FDED9: purple_sqlite_history_adapter_run_migrations (purplesqlitehistoryadapter.c:69) by 0x48FE7F0: purple_sqlite_history_adapter_activate (purplesqlitehistoryadapter.c:287) by 0x48DB656: purple_history_adapter_activate (purplehistoryadapter.c:181) by 0x48DC9BC: purple_history_manager_set_active (purplehistorymanager.c:308) by 0x402BA8: test_ui_init_history (test_ui.c:132) by 0x402C80: test_ui_purple_init (test_ui.c:167) by 0x4027BB: main (test_contact.c:88) 4,368 bytes in 1 blocks are possibly lost in loss record 3,453 of 3,457 at 0x484386F: malloc (vg_replace_malloc.c:393) by 0x5235B67: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:25493) by 0x5232797: UnknownInlinedFun (sqlite3.c:29181) by 0x5232797: UnknownInlinedFun (sqlite3.c:29227) by 0x5232797: sqlite3Malloc.lto_priv.0 (sqlite3.c:29221) by 0x523BD8B: pcache1Alloc.lto_priv.0 (sqlite3.c:53546) by 0x5240077: UnknownInlinedFun (sqlite3.c:53634) by 0x5240077: pcache1FetchStage2 (sqlite3.c:54104) by 0x5243E9C: UnknownInlinedFun (sqlite3.c:52671) by 0x5243E9C: getPageNormal.lto_priv.0 (sqlite3.c:60628) by 0x524A510: UnknownInlinedFun (sqlite3.c:60805) by 0x524A510: btreeGetPage.lto_priv.0 (sqlite3.c:70289) by 0x524C2F6: UnknownInlinedFun (sqlite3.c:71257) by 0x524C2F6: sqlite3BtreeBeginTrans.lto_priv.0 (sqlite3.c:71647) by 0x5266B3A: sqlite3VdbeExec.lto_priv.0 (sqlite3.c:93532) by 0x525CBEE: UnknownInlinedFun (sqlite3.c:87995) by 0x525CBEE: UnknownInlinedFun (sqlite3.c:88056) by 0x525CBEE: sqlite3_step (sqlite3.c:88045) by 0x48FD715: purple_sqlite3_get_schema_version (purplesqlite3.c:79) by 0x48FD9DD: purple_sqlite3_run_migrations_from_resources (purplesqlite3.c:146) by 0x48FDED9: purple_sqlite_history_adapter_run_migrations (purplesqlitehistoryadapter.c:69) by 0x48FE7F0: purple_sqlite_history_adapter_activate (purplesqlitehistoryadapter.c:287) by 0x48DB656: purple_history_adapter_activate (purplehistoryadapter.c:181) by 0x48DC9BC: purple_history_manager_set_active (purplehistorymanager.c:308) by 0x402BA8: test_ui_init_history (test_ui.c:132) by 0x402C80: test_ui_purple_init (test_ui.c:167) by 0x4027BB: main (test_contact.c:88) 4,368 bytes in 1 blocks are possibly lost in loss record 3,454 of 3,457 at 0x484386F: malloc (vg_replace_malloc.c:393) by 0x5235B67: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:25493) by 0x5232797: UnknownInlinedFun (sqlite3.c:29181) by 0x5232797: UnknownInlinedFun (sqlite3.c:29227) by 0x5232797: sqlite3Malloc.lto_priv.0 (sqlite3.c:29221) by 0x523BD8B: pcache1Alloc.lto_priv.0 (sqlite3.c:53546) by 0x5240077: UnknownInlinedFun (sqlite3.c:53634) by 0x5240077: pcache1FetchStage2 (sqlite3.c:54104) by 0x5243E9C: UnknownInlinedFun (sqlite3.c:52671) by 0x5243E9C: getPageNormal.lto_priv.0 (sqlite3.c:60628) by 0x52499BC: UnknownInlinedFun (sqlite3.c:60805) by 0x52499BC: UnknownInlinedFun (sqlite3.c:70289) by 0x52499BC: btreeGetUnusedPage (sqlite3.c:70432) by 0x524F504: allocateBtreePage.lto_priv.0 (sqlite3.c:74604) by 0x5256209: btreeCreateTable.lto_priv.0 (sqlite3.c:77830) by 0x5265EB2: UnknownInlinedFun (sqlite3.c:77849) by 0x5265EB2: sqlite3VdbeExec.lto_priv.0 (sqlite3.c:96382) by 0x525CBEE: UnknownInlinedFun (sqlite3.c:87995) by 0x525CBEE: UnknownInlinedFun (sqlite3.c:88056) by 0x525CBEE: sqlite3_step (sqlite3.c:88045) by 0x529B324: sqlite3_exec (sqlite3.c:131002) by 0x48FD558: purple_sqlite3_run_migration (purplesqlite3.c:37) by 0x48FDBB4: purple_sqlite3_run_migrations_from_resources (purplesqlite3.c:195) by 0x48FDED9: purple_sqlite_history_adapter_run_migrations (purplesqlitehistoryadapter.c:69) by 0x48FE7F0: purple_sqlite_history_adapter_activate (purplesqlitehistoryadapter.c:287) by 0x48DB656: purple_history_adapter_activate (purplehistoryadapter.c:181) by 0x48DC9BC: purple_history_manager_set_active (purplehistorymanager.c:308) by 0x402BA8: test_ui_init_history (test_ui.c:132) by 0x402C80: test_ui_purple_init (test_ui.c:167) by 0x4027BB: main (test_contact.c:88) ``` Testing Done: Ran tests in valgrind, and all above leaks were gone except for noted `protocol_xfer` issues, and a bunch of leaks of the `PurpleBuddy`-`PurpleContact` compatibility bindings, which will go away in their entirety eventually. Reviewed at https://reviews.imfreedom.org/r/2385/
-rw-r--r--libpurple/tests/test_account_manager.c8
-rw-r--r--libpurple/tests/test_account_option.c15
-rw-r--r--libpurple/tests/test_authorization_request.c8
-rw-r--r--libpurple/tests/test_contact.c8
-rw-r--r--libpurple/tests/test_contact_info.c8
-rw-r--r--libpurple/tests/test_contact_manager.c8
-rw-r--r--libpurple/tests/test_conversation.c22
-rw-r--r--libpurple/tests/test_credential_manager.c5
-rw-r--r--libpurple/tests/test_credential_provider.c2
-rw-r--r--libpurple/tests/test_history_adapter.c17
-rw-r--r--libpurple/tests/test_history_manager.c21
-rw-r--r--libpurple/tests/test_image.c1
-rw-r--r--libpurple/tests/test_notification.c8
-rw-r--r--libpurple/tests/test_notification_manager.c2
-rw-r--r--libpurple/tests/test_person.c8
-rw-r--r--libpurple/tests/test_protocol.c2
-rw-r--r--libpurple/tests/test_protocol_xfer.c57
-rw-r--r--libpurple/tests/test_purplepath.c9
-rw-r--r--libpurple/tests/test_queued_output_stream.c1
-rw-r--r--libpurple/tests/test_ui.c5
-rw-r--r--libpurple/tests/test_ui.h1
-rw-r--r--libpurple/tests/test_util.c15
-rw-r--r--libpurple/tests/test_whiteboard_manager.c8
23 files changed, 202 insertions, 37 deletions
diff --git a/libpurple/tests/test_account_manager.c b/libpurple/tests/test_account_manager.c
index a5d3805b7b..240869cac1 100644
--- a/libpurple/tests/test_account_manager.c
+++ b/libpurple/tests/test_account_manager.c
@@ -218,6 +218,8 @@ test_purple_account_manager_foreach(void) {
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -231,5 +233,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/account-manager/foreach",
test_purple_account_manager_foreach);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_account_option.c b/libpurple/tests/test_account_option.c
index f46bff567b..5fa28106b8 100644
--- a/libpurple/tests/test_account_option.c
+++ b/libpurple/tests/test_account_option.c
@@ -68,6 +68,9 @@ test_purple_account_option_copy_int(void) {
opt2 = purple_account_option_copy(opt1);
test_purple_account_option_compare(opt1, opt2);
+
+ purple_account_option_destroy(opt1);
+ purple_account_option_destroy(opt2);
}
static void
@@ -84,6 +87,9 @@ test_purple_account_option_copy_int_with_default(void) {
g_assert_cmpint(purple_account_option_get_default_int(opt1),
==,
purple_account_option_get_default_int(opt2));
+
+ purple_account_option_destroy(opt1);
+ purple_account_option_destroy(opt2);
}
static void
@@ -94,6 +100,9 @@ test_purple_account_option_copy_string(void) {
opt2 = purple_account_option_copy(opt1);
test_purple_account_option_compare_string(opt1, opt2);
+
+ purple_account_option_destroy(opt1);
+ purple_account_option_destroy(opt2);
}
static void
@@ -105,6 +114,9 @@ test_purple_account_option_copy_string_with_default(void) {
opt2 = purple_account_option_copy(opt1);
test_purple_account_option_compare_string(opt1, opt2);
+
+ purple_account_option_destroy(opt1);
+ purple_account_option_destroy(opt2);
}
static void
@@ -116,6 +128,9 @@ test_purple_account_option_copy_string_with_masked(void) {
opt2 = purple_account_option_copy(opt1);
test_purple_account_option_compare_string(opt1, opt2);
+
+ purple_account_option_destroy(opt1);
+ purple_account_option_destroy(opt2);
}
/******************************************************************************
diff --git a/libpurple/tests/test_authorization_request.c b/libpurple/tests/test_authorization_request.c
index 815fd33a53..823761561b 100644
--- a/libpurple/tests/test_authorization_request.c
+++ b/libpurple/tests/test_authorization_request.c
@@ -302,6 +302,8 @@ test_purple_authorization_request_deny_message_non_null(void) {
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -325,5 +327,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/request-authorization/deny-message/non-null",
test_purple_authorization_request_deny_message_non_null);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_contact.c b/libpurple/tests/test_contact.c
index 0145535cd5..480a1321ac 100644
--- a/libpurple/tests/test_contact.c
+++ b/libpurple/tests/test_contact.c
@@ -83,6 +83,8 @@ test_purple_contact_properties(void) {
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -92,5 +94,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/contact/properties",
test_purple_contact_properties);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_contact_info.c b/libpurple/tests/test_contact_info.c
index 9c64b59713..367fbb9a65 100644
--- a/libpurple/tests/test_contact_info.c
+++ b/libpurple/tests/test_contact_info.c
@@ -437,6 +437,8 @@ test_purple_contact_info_presence_changed_signal(void) {
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -486,5 +488,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/contact-info/presence-changed-signal",
test_purple_contact_info_presence_changed_signal);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_contact_manager.c b/libpurple/tests/test_contact_manager.c
index 7b21ab7a46..db97230824 100644
--- a/libpurple/tests/test_contact_manager.c
+++ b/libpurple/tests/test_contact_manager.c
@@ -470,6 +470,8 @@ test_purple_contact_manager_person_add_via_contact_remove_person_with_contacts(v
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -499,5 +501,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/contact-manager/person/add-via-contact-remove-person-with-contacts",
test_purple_contact_manager_person_add_via_contact_remove_person_with_contacts);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_conversation.c b/libpurple/tests/test_conversation.c
index 8b7ffe8430..8e52f75d5e 100644
--- a/libpurple/tests/test_conversation.c
+++ b/libpurple/tests/test_conversation.c
@@ -31,6 +31,7 @@ test_purple_conversation_properties(void) {
PurpleAccount *account1 = NULL;
PurpleConnectionFlags features = 0;
PurpleConversation *conversation = NULL;
+ PurpleConversationManager *conversation_manager = NULL;
GListModel *members = NULL;
gchar *name = NULL;
gchar *title = NULL;
@@ -71,6 +72,12 @@ test_purple_conversation_properties(void) {
g_assert_cmpstr(title, ==, "title1");
#endif
+ /* TODO: Conversations are automatically registered on construction for
+ * legacy reasons, so we need to explicitly unregister to clean them up,
+ * but this can go away once that stops happening. */
+ conversation_manager = purple_conversation_manager_get_default();
+ purple_conversation_manager_unregister(conversation_manager, conversation);
+
/* Free/unref all the things. */
g_clear_object(&account1);
g_clear_object(&members);
@@ -107,6 +114,7 @@ test_purple_conversation_members_add_remove(void) {
PurpleAccount *account = NULL;
PurpleContactInfo *info = NULL;
PurpleConversation *conversation = NULL;
+ PurpleConversationManager *conversation_manager = NULL;
PurpleConversationMember *member = NULL;
PurpleConversationMember *member1 = NULL;
gboolean removed = FALSE;
@@ -164,6 +172,12 @@ test_purple_conversation_members_add_remove(void) {
g_assert_false(removed);
g_assert_cmpint(removed_called, ==, 1);
+ /* TODO: Conversations are automatically registered on construction for
+ * legacy reasons, so we need to explicitly unregister to clean them up,
+ * but this can go away once that stops happening. */
+ conversation_manager = purple_conversation_manager_get_default();
+ purple_conversation_manager_unregister(conversation_manager, conversation);
+
/* Clean up everything. */
g_clear_object(&info);
g_clear_object(&member);
@@ -176,6 +190,8 @@ test_purple_conversation_members_add_remove(void) {
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -186,5 +202,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/conversation/members/add-remove",
test_purple_conversation_members_add_remove);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_credential_manager.c b/libpurple/tests/test_credential_manager.c
index 376c436481..6374e91da0 100644
--- a/libpurple/tests/test_credential_manager.c
+++ b/libpurple/tests/test_credential_manager.c
@@ -311,6 +311,7 @@ test_purple_credential_manager_no_provider_read_password_cb(GObject *obj,
password = purple_credential_manager_read_password_finish(manager, res,
&error);
g_assert_error(error, PURPLE_CREDENTIAL_MANAGER_DOMAIN, 0);
+ g_clear_error(&error);
g_assert_null(password);
g_clear_object(&account);
@@ -360,6 +361,7 @@ test_purple_credential_manager_no_provider_write_password_cb(GObject *obj,
r = purple_credential_manager_write_password_finish(manager, res, &error);
g_assert_false(r);
g_assert_error(error, PURPLE_CREDENTIAL_MANAGER_DOMAIN, 0);
+ g_clear_error(&error);
g_clear_object(&account);
@@ -409,6 +411,7 @@ test_purple_credential_manager_no_provider_clear_password_cb(GObject *obj,
r = purple_credential_manager_clear_password_finish(manager, res, &error);
g_assert_false(r);
g_assert_error(error, PURPLE_CREDENTIAL_MANAGER_DOMAIN, 0);
+ g_clear_error(&error);
g_clear_object(&account);
@@ -696,5 +699,7 @@ main(gint argc, gchar *argv[]) {
g_main_loop_unref(loop);
+ test_ui_purple_uninit();
+
return ret;
}
diff --git a/libpurple/tests/test_credential_provider.c b/libpurple/tests/test_credential_provider.c
index 4ae51162ce..3a62732b29 100644
--- a/libpurple/tests/test_credential_provider.c
+++ b/libpurple/tests/test_credential_provider.c
@@ -539,5 +539,7 @@ main(gint argc, gchar *argv[]) {
g_main_loop_unref(loop);
+ test_ui_purple_uninit();
+
return ret;
}
diff --git a/libpurple/tests/test_history_adapter.c b/libpurple/tests/test_history_adapter.c
index 995be8d561..36c1ff9f97 100644
--- a/libpurple/tests/test_history_adapter.c
+++ b/libpurple/tests/test_history_adapter.c
@@ -236,6 +236,7 @@ static void
test_purple_history_adapter_test_write(void) {
PurpleAccount *account = NULL;
PurpleConversation *conversation = NULL;
+ PurpleConversationManager *conversation_manager = NULL;
PurpleHistoryAdapter *adapter = test_purple_history_adapter_new();
PurpleMessage *message = NULL;
TestPurpleHistoryAdapter *ta = TEST_PURPLE_HISTORY_ADAPTER(adapter);
@@ -262,10 +263,14 @@ test_purple_history_adapter_test_write(void) {
g_clear_object(&adapter);
g_clear_object(&message);
- /* TODO: something is freeing our ref. */
- /* g_clear_object(&account); */
+ /* TODO: Conversations are automatically registered on construction for
+ * legacy reasons, so we need to explicitly unregister to clean them up,
+ * but this can go away once that stops happening. */
+ conversation_manager = purple_conversation_manager_get_default();
+ purple_conversation_manager_unregister(conversation_manager, conversation);
g_clear_object(&conversation);
+ g_clear_object(&account);
}
@@ -274,6 +279,8 @@ test_purple_history_adapter_test_write(void) {
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -291,5 +298,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/history-adapter/write",
test_purple_history_adapter_test_write);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_history_manager.c b/libpurple/tests/test_history_manager.c
index 6a12e37776..f05ffd6d74 100644
--- a/libpurple/tests/test_history_manager.c
+++ b/libpurple/tests/test_history_manager.c
@@ -315,6 +315,7 @@ static void
test_purple_history_manager_no_adapter_write(void) {
PurpleAccount *account = NULL;
PurpleConversation *conversation = NULL;
+ PurpleConversationManager *conversation_manager = NULL;
PurpleHistoryManager *manager = NULL;
PurpleMessage *message = NULL;
GError *error = NULL;
@@ -337,11 +338,15 @@ test_purple_history_manager_no_adapter_write(void) {
g_assert_false(result);
- /* TODO: someone is freeing our ref. */
- /* g_clear_object(&account); */
+ /* TODO: Conversations are automatically registered on construction for
+ * legacy reasons, so we need to explicitly unregister to clean them up,
+ * but this can go away once that stops happening. */
+ conversation_manager = purple_conversation_manager_get_default();
+ purple_conversation_manager_unregister(conversation_manager, conversation);
g_clear_object(&message);
g_clear_object(&conversation);
+ g_clear_object(&account);
g_clear_object(&manager);
}
@@ -429,6 +434,7 @@ static void
test_purple_history_manager_adapter_write(void) {
PurpleAccount *account = NULL;
PurpleConversation *conversation = NULL;
+ PurpleConversationManager *conversation_manager = NULL;
PurpleHistoryManager *manager = NULL;
PurpleHistoryAdapter *adapter = NULL;
PurpleMessage *message = NULL;
@@ -471,10 +477,14 @@ test_purple_history_manager_adapter_write(void) {
g_clear_object(&adapter);
g_clear_object(&message);
- /* TODO: something is freeing our ref. */
- /* g_clear_object(&account); */
+ /* TODO: Conversations are automatically registered on construction for
+ * legacy reasons, so we need to explicitly unregister to clean them up,
+ * but this can go away once that stops happening. */
+ conversation_manager = purple_conversation_manager_get_default();
+ purple_conversation_manager_unregister(conversation_manager, conversation);
g_clear_object(&conversation);
+ g_clear_object(&account);
g_clear_object(&manager);
}
@@ -515,7 +525,10 @@ main(gint argc, gchar *argv[]) {
test_purple_history_manager_no_adapter_remove);
g_test_add_func("/history-manager/no-adapter/write",
test_purple_history_manager_no_adapter_write);
+
ret = g_test_run();
+ test_ui_purple_uninit();
+
return ret;
}
diff --git a/libpurple/tests/test_image.c b/libpurple/tests/test_image.c
index a60855f46e..caabef0599 100644
--- a/libpurple/tests/test_image.c
+++ b/libpurple/tests/test_image.c
@@ -153,6 +153,7 @@ test_image_new_from_file(void) {
"image/png"
);
+ g_free(edata);
g_free(path);
}
diff --git a/libpurple/tests/test_notification.c b/libpurple/tests/test_notification.c
index eee59f6383..05f74d3f9a 100644
--- a/libpurple/tests/test_notification.c
+++ b/libpurple/tests/test_notification.c
@@ -148,6 +148,8 @@ test_purple_notification_properties(void) {
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -159,5 +161,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/notification/properties",
test_purple_notification_properties);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_notification_manager.c b/libpurple/tests/test_notification_manager.c
index 153a3d63bb..fa094dd442 100644
--- a/libpurple/tests/test_notification_manager.c
+++ b/libpurple/tests/test_notification_manager.c
@@ -424,5 +424,7 @@ main(gint argc, gchar *argv[]) {
g_main_loop_unref(loop);
+ test_ui_purple_uninit();
+
return ret;
}
diff --git a/libpurple/tests/test_person.c b/libpurple/tests/test_person.c
index a47852b692..1a828f852f 100644
--- a/libpurple/tests/test_person.c
+++ b/libpurple/tests/test_person.c
@@ -494,6 +494,8 @@ test_purple_person_matches_contact_info(void) {
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -532,5 +534,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/person/matches/contact_info",
test_purple_person_matches_contact_info);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_protocol.c b/libpurple/tests/test_protocol.c
index 6bd3b7acf1..3438172555 100644
--- a/libpurple/tests/test_protocol.c
+++ b/libpurple/tests/test_protocol.c
@@ -242,5 +242,7 @@ main(gint argc, gchar *argv[]) {
g_main_loop_unref(loop);
+ test_ui_purple_uninit();
+
return ret;
}
diff --git a/libpurple/tests/test_protocol_xfer.c b/libpurple/tests/test_protocol_xfer.c
index 53d715ba1d..71627c3f38 100644
--- a/libpurple/tests/test_protocol_xfer.c
+++ b/libpurple/tests/test_protocol_xfer.c
@@ -117,51 +117,71 @@ test_purple_protocol_xfer_new(void) {
*****************************************************************************/
static void
test_purple_protocol_xfer_can_receive_func(void) {
- TestPurpleProtocolXfer *xfer = test_purple_protocol_xfer_new();
- PurpleAccount *a = purple_account_new("prpl-xfer-can-receive", "prpl-xfer");
- PurpleConnection *c = g_object_new(PURPLE_TYPE_CONNECTION, "account", a, NULL);
+ TestPurpleProtocolXfer *xfer = NULL;
+ PurpleAccount *account = NULL;
+ PurpleConnection *connection = NULL;
gboolean actual = FALSE;
+ xfer = test_purple_protocol_xfer_new();
+ account = purple_account_new("prpl-xfer-can-receive", "prpl-xfer");
+ connection = g_object_new(PURPLE_TYPE_CONNECTION, "account", account, NULL);
+
g_assert_true(PURPLE_IS_PROTOCOL_XFER(xfer));
xfer->can_send = FALSE;
- actual = purple_protocol_xfer_can_receive(
- PURPLE_PROTOCOL_XFER(xfer),
- c,
- "foo"
- );
+ actual = purple_protocol_xfer_can_receive(PURPLE_PROTOCOL_XFER(xfer),
+ connection, "foo");
g_assert_false(actual);
xfer->can_send = TRUE;
actual = purple_protocol_xfer_can_receive(
PURPLE_PROTOCOL_XFER(xfer),
- c,
+ connection,
"foo"
);
g_assert_true(actual);
+
+ g_clear_object(&account);
+ g_clear_object(&xfer);
}
static void
test_purple_protocol_xfer_send_file_func(void) {
- TestPurpleProtocolXfer *prplxfer = g_object_new(test_purple_protocol_xfer_get_type(), NULL);
- PurpleAccount *a = purple_account_new("prpl-xfer-send", "prpl-xfer");
- PurpleConnection *c = g_object_new(PURPLE_TYPE_CONNECTION, "account", a, NULL);
+ TestPurpleProtocolXfer *prplxfer = NULL;
+ PurpleAccount *account = NULL;
+ PurpleConnection *connection = NULL;
- purple_protocol_xfer_send_file(PURPLE_PROTOCOL_XFER(prplxfer), c, "foo", "somefile");
+ prplxfer = g_object_new(test_purple_protocol_xfer_get_type(), NULL);
+ account = purple_account_new("prpl-xfer-send", "prpl-xfer");
+ connection = g_object_new(PURPLE_TYPE_CONNECTION, "account", account, NULL);
+
+ purple_protocol_xfer_send_file(PURPLE_PROTOCOL_XFER(prplxfer), connection,
+ "foo", "somefile");
g_assert_true(prplxfer->send_called);
+
+ g_clear_object(&account);
+ g_clear_object(&prplxfer);
}
static void
test_purple_protocol_xfer_new_func(void) {
- TestPurpleProtocolXfer *prplxfer = g_object_new(test_purple_protocol_xfer_get_type(), NULL);
- PurpleAccount *a = purple_account_new("prpl-xfer-new-xfer", "prpl-xfer");
- PurpleConnection *c = g_object_new(PURPLE_TYPE_CONNECTION, "account", a, NULL);
+ TestPurpleProtocolXfer *prplxfer = NULL;
+ PurpleAccount *account = NULL;
+ PurpleConnection *connection = NULL;
PurpleXfer *xfer = NULL;
- xfer = purple_protocol_xfer_new_xfer(PURPLE_PROTOCOL_XFER(prplxfer), c, "foo");
+ prplxfer = g_object_new(test_purple_protocol_xfer_get_type(), NULL);
+ account = purple_account_new("prpl-xfer-new-xfer", "prpl-xfer");
+ connection = g_object_new(PURPLE_TYPE_CONNECTION, "account", account, NULL);
+
+ xfer = purple_protocol_xfer_new_xfer(PURPLE_PROTOCOL_XFER(prplxfer),
+ connection, "foo");
g_assert_true(PURPLE_IS_XFER(xfer));
g_assert_cmpstr("foo", ==, purple_xfer_get_remote_user(xfer));
g_assert_true(prplxfer->new_xfer_called);
+
+ g_clear_object(&account);
+ g_clear_object(&prplxfer);
}
/******************************************************************************
@@ -194,5 +214,8 @@ main(gint argc, gchar **argv) {
res = g_test_run();
+ /* FIXME: We cannot call test_ui_purple_uninit() here because connections
+ * are not easily destroyed if they haven't been fully implemented. */
+
return res;
}
diff --git a/libpurple/tests/test_purplepath.c b/libpurple/tests/test_purplepath.c
index 98d5612ba5..8512bba804 100644
--- a/libpurple/tests/test_purplepath.c
+++ b/libpurple/tests/test_purplepath.c
@@ -45,6 +45,8 @@ test_purplepath_data_dir(void) {
gint
main(gint argc, gchar **argv) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -57,5 +59,10 @@ main(gint argc, gchar **argv) {
test_purplepath_config_dir);
g_test_add_func("/purplepath/datadir",
test_purplepath_data_dir);
- return g_test_run();
+
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}
diff --git a/libpurple/tests/test_queued_output_stream.c b/libpurple/tests/test_queued_output_stream.c
index ff5b2f2b11..c251197cf2 100644
--- a/libpurple/tests/test_queued_output_stream.c
+++ b/libpurple/tests/test_queued_output_stream.c
@@ -255,6 +255,7 @@ test_queued_output_stream_push_bytes_async_error(void) {
g_assert_no_error(err);
g_assert_true(ret);
+ g_clear_object(&cancellable);
g_clear_object(&queued);
g_clear_object(&output);
}
diff --git a/libpurple/tests/test_ui.c b/libpurple/tests/test_ui.c
index 469981d076..ea66f041e7 100644
--- a/libpurple/tests/test_ui.c
+++ b/libpurple/tests/test_ui.c
@@ -182,3 +182,8 @@ test_ui_purple_init(void) {
* the preferences using purple_plugins_save_loaded() */
purple_plugins_load_saved("/purple/test_ui/plugins/saved");
}
+
+void
+test_ui_purple_uninit(void) {
+ purple_core_quit();
+}
diff --git a/libpurple/tests/test_ui.h b/libpurple/tests/test_ui.h
index b3bc0d49c5..9d75c36fbe 100644
--- a/libpurple/tests/test_ui.h
+++ b/libpurple/tests/test_ui.h
@@ -27,6 +27,7 @@
G_BEGIN_DECLS
void test_ui_purple_init(void);
+void test_ui_purple_uninit(void);
G_END_DECLS
diff --git a/libpurple/tests/test_util.c b/libpurple/tests/test_util.c
index bf7b2f7100..921104d126 100644
--- a/libpurple/tests/test_util.c
+++ b/libpurple/tests/test_util.c
@@ -44,10 +44,19 @@ test_util_filename_escape(void) {
*****************************************************************************/
static void
test_util_text_strip_mnemonic(void) {
- g_assert_cmpstr("", ==, purple_text_strip_mnemonic(""));
- g_assert_cmpstr("foo", ==, purple_text_strip_mnemonic("foo"));
- g_assert_cmpstr("foo", ==, purple_text_strip_mnemonic("_foo"));
+ char *result = NULL;
+ result = purple_text_strip_mnemonic("");
+ g_assert_cmpstr("", ==, result);
+ g_free(result);
+
+ result = purple_text_strip_mnemonic("foo");
+ g_assert_cmpstr("foo", ==, result);
+ g_free(result);
+
+ result = purple_text_strip_mnemonic("_foo");
+ g_assert_cmpstr("foo", ==, result);
+ g_free(result);
}
/******************************************************************************
diff --git a/libpurple/tests/test_whiteboard_manager.c b/libpurple/tests/test_whiteboard_manager.c
index 3a6ddb19d6..8e32354039 100644
--- a/libpurple/tests/test_whiteboard_manager.c
+++ b/libpurple/tests/test_whiteboard_manager.c
@@ -43,6 +43,8 @@ test_purple_whiteboard_manager_get_default(void) {
*****************************************************************************/
gint
main(gint argc, gchar *argv[]) {
+ gint ret = 0;
+
g_test_init(&argc, &argv, NULL);
test_ui_purple_init();
@@ -50,5 +52,9 @@ main(gint argc, gchar *argv[]) {
g_test_add_func("/whiteboard-manager/get-default",
test_purple_whiteboard_manager_get_default);
- return g_test_run();
+ ret = g_test_run();
+
+ test_ui_purple_uninit();
+
+ return ret;
}