/* * unittests.c * * Copyright (C) 2015 - 2018 James Booth * Copyright (C) 2018 - 2026 Michael Vetter * * SPDX-License-Identifier: GPL-3.0-or-later */ #include #include #include #include "prof_cmocka.h" #include #include #include #include #include "config.h" #include "xmpp/chat_session.h" #include "helpers.h" #include "tools/test_autocomplete.h" #include "xmpp/test_chat_session.h" #include "test_common.h" #include "xmpp/test_contact.h" #include "command/test_cmd_connect.h" #include "command/test_cmd_account.h" #include "command/test_cmd_rooms.h" #include "command/test_cmd_sub.h" #include "command/test_cmd_presence.h" #include "command/test_cmd_otr.h" #include "command/test_cmd_pgp.h" #include "test_forced_encryption.h" #include "xmpp/test_jid.h" #include "tools/test_parser.h" #include "xmpp/test_roster_list.h" #include "config/test_preferences.h" #include "event/test_server_events.h" #include "command/test_cmd_alias.h" #include "command/test_cmd_bookmark.h" #include "command/test_cmd_join.h" #include "xmpp/test_muc.h" #include "command/test_cmd_ac.h" #include "command/test_cmd_roster.h" #include "command/test_cmd_disconnect.h" #include "xmpp/test_form.h" #include "plugins/test_callbacks.h" #include "plugins/test_plugins_disco.h" #include "test_ai_client.h" #include "test_database_export.h" #include "test_database_stress.h" #define muc_unit_test(f) cmocka_unit_test_setup_teardown(f, muc_before_test, muc_after_test) int main(int argc, char* argv[]) { setlocale(LC_ALL, "en_GB.UTF-8"); char* codeset = nl_langinfo(CODESET); char* lang = getenv("LANG"); printf("Charset information:\n"); if (lang) { printf(" LANG: %s\n", lang); } if (codeset) { printf(" CODESET: %s\n", codeset); } printf(" MB_CUR_MAX: %d\n", (int)MB_CUR_MAX); printf(" MB_LEN_MAX: %d\n", (int)MB_LEN_MAX); if (argc > 1) cmocka_set_test_filter(argv[1]); const struct CMUnitTest all_tests[] = { cmocka_unit_test(str_replace__returns__one_substr), cmocka_unit_test(str_replace__returns__one_substr_beginning), cmocka_unit_test(str_replace__returns__one_substr_end), cmocka_unit_test(str_replace__returns__two_substr), cmocka_unit_test(str_replace__returns__char), cmocka_unit_test(str_replace__returns__original_when_none), cmocka_unit_test(str_replace__returns__replaced_when_match), cmocka_unit_test(str_replace__returns__empty_when_string_empty), cmocka_unit_test(str_replace__returns__null_when_string_null), cmocka_unit_test(str_replace__returns__original_when_sub_empty), cmocka_unit_test(str_replace__returns__original_when_sub_null), cmocka_unit_test(str_replace__returns__empty_when_new_empty), cmocka_unit_test(str_replace__returns__original_when_new_null), cmocka_unit_test(valid_resource_presence_string__is__true_for_online), cmocka_unit_test(valid_resource_presence_string__is__true_for_chat), cmocka_unit_test(valid_resource_presence_string__is__true_for_away), cmocka_unit_test(valid_resource_presence_string__is__true_for_xa), cmocka_unit_test(valid_resource_presence_string__is__true_for_dnd), cmocka_unit_test(valid_resource_presence_string__is__false_for_available), cmocka_unit_test(valid_resource_presence_string__is__false_for_unavailable), cmocka_unit_test(valid_resource_presence_string__is__false_for_blah), cmocka_unit_test(utf8_display_len__returns__0_for_null), cmocka_unit_test(utf8_display_len__returns__1_for_non_wide), cmocka_unit_test(utf8_display_len__returns__2_for_wide), cmocka_unit_test(utf8_display_len__returns__correct_for_non_wide), cmocka_unit_test(utf8_display_len__returns__correct_for_wide), cmocka_unit_test(utf8_display_len__returns__correct_for_all_wide), cmocka_unit_test(strip_arg_quotes__returns__original_when_no_quotes), cmocka_unit_test(strip_arg_quotes__returns__stripped_first), cmocka_unit_test(strip_arg_quotes__returns__stripped_last), cmocka_unit_test(strip_arg_quotes__returns__stripped_both), cmocka_unit_test(strip_arg_quotes__unescapes), cmocka_unit_test(format_call_external_argv__tests__table_driven), cmocka_unit_test(unique_filename_from_url__tests__table_driven), cmocka_unit_test(string_to_verbosity__returns__correct_values), cmocka_unit_test(get_expanded_path__returns__expanded), cmocka_unit_test_setup_teardown(cmd_ac_complete_filepath__no_segfault_when_empty, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_ac_complete_filepath__finds_files_in_current_dir, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_ac_complete_filepath__finds_files_with_dot_slash, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_ac_complete_filepath__cycles_through_files, load_preferences, close_preferences), cmocka_unit_test(strtoi_range__returns__true_for_valid_input), cmocka_unit_test(strtoi_range__returns__false_for_out_of_range), cmocka_unit_test(strtoi_range__returns__false_for_invalid_input), cmocka_unit_test(strtoi_range__returns__false_for_null_empty_input), cmocka_unit_test(strtoi_range__returns__correct_values_when_err_msg_null), cmocka_unit_test(strtoi_range__returns__false_for_integer_overflow_underflow), cmocka_unit_test(strtoi_range__returns_consistent_with_strtol_parsing), cmocka_unit_test(string_matches_one_of__tests__edge_cases), cmocka_unit_test(valid_tls_policy_option__is__correct_for_various_inputs), cmocka_unit_test(autocomplete_complete__returns__null_when_empty), cmocka_unit_test(autocomplete_reset__updates__after_create), cmocka_unit_test(autocomplete_complete__returns__null_after_create), cmocka_unit_test(autocomplete_complete__handles__escaped_spaces), cmocka_unit_test(autocomplete_complete__handles__escaped_quotes), cmocka_unit_test(autocomplete_create_list__returns__null_after_create), cmocka_unit_test(autocomplete_add__updates__one_and_complete), cmocka_unit_test(autocomplete_complete__returns__first_of_two), cmocka_unit_test(autocomplete_complete__returns__second_of_two), cmocka_unit_test(autocomplete_add__updates__two_elements), cmocka_unit_test(autocomplete_add__updates__only_once_for_same_value), cmocka_unit_test(autocomplete_add__updates__existing_value), cmocka_unit_test(autocomplete_complete__returns__accented_with_accented), cmocka_unit_test(autocomplete_complete__returns__accented_with_base), cmocka_unit_test(autocomplete_complete__returns__both_with_accented), cmocka_unit_test(autocomplete_complete__returns__both_with_base), cmocka_unit_test(autocomplete_complete__is__case_insensitive), cmocka_unit_test(autocomplete_complete__returns__previous), cmocka_unit_test(autocomplete_complete__returns__greek), cmocka_unit_test(autocomplete_complete__returns__greek_false_match), cmocka_unit_test(autocomplete_complete__returns__greek_case_insensitive), cmocka_unit_test(autocomplete_complete__returns__russian), cmocka_unit_test(autocomplete_complete__returns__chinese), cmocka_unit_test(autocomplete_complete__returns__transliterated), cmocka_unit_test(autocomplete_complete__returns__regular_ascii), cmocka_unit_test(jid_create__returns__null_from_null), cmocka_unit_test(jid_create__returns__null_from_empty_string), cmocka_unit_test(jid_create__returns__full_from_full), cmocka_unit_test(jid_create__returns__bare_from_full), cmocka_unit_test(jid_create__returns__resourcepart_from_full), cmocka_unit_test(jid_create__returns__localpart_from_full), cmocka_unit_test(jid_create__returns__domainpart_from_full), cmocka_unit_test(jid_create__returns__full_from_full_nolocal), cmocka_unit_test(jid_create__returns__bare_from_full_nolocal), cmocka_unit_test(jid_create__returns__resourcepart_from_full_nolocal), cmocka_unit_test(jid_create__returns__domainpart_from_full_nolocal), cmocka_unit_test(jid_create__returns__null_localpart_from_full_nolocal), cmocka_unit_test(jid_create__returns__null_full_from_bare), cmocka_unit_test(jid_create__returns__null_resource_from_bare), cmocka_unit_test(jid_create__returns__bare_from_bare), cmocka_unit_test(jid_create__returns__localpart_from_bare), cmocka_unit_test(jid_create__returns__domainpart_from_bare), cmocka_unit_test(jid_create_from_bare_and_resource__returns__room), cmocka_unit_test(jid_create_from_bare_and_resource__returns__nick), cmocka_unit_test(jid_create__returns__correct_parts_with_slash_in_resource), cmocka_unit_test(jid_create__returns__correct_parts_with_at_in_resource), cmocka_unit_test(jid_create__returns__correct_parts_with_at_and_slash_in_resource), cmocka_unit_test(jid_create__returns__correct_parts_with_trailing_slash), cmocka_unit_test(jid_fulljid_or_barejid__returns__fulljid_when_exists), cmocka_unit_test(jid_fulljid_or_barejid__returns__barejid_when_fulljid_not_exists), cmocka_unit_test(jid_create__returns__bare_from_trailing_slash), cmocka_unit_test(jid_create__returns__null_from_invalid_localpart_chars), cmocka_unit_test(jid_create__returns__null_from_empty_parts), cmocka_unit_test(jid_create__returns__null_from_multiple_at_in_bare), cmocka_unit_test(jid_create__returns__correct_parts_with_at_in_resource_only), cmocka_unit_test(jid_is_valid_user_jid__is__true_for_valid_user_jid), cmocka_unit_test(jid_is_valid_user_jid__is__true_for_at_in_resource), cmocka_unit_test(jid_is_valid_user_jid__is__false_for_domain_jid), cmocka_unit_test(jid_is_valid_user_jid__is__false_for_invalid_jid), cmocka_unit_test(jid_is_valid__is__true_for_valid_jid), cmocka_unit_test(jid_is_valid__is__false_for_invalid_jid), cmocka_unit_test(jid_is_valid__is__false_for_null), cmocka_unit_test(jid_is_valid__is__false_for_empty_string), cmocka_unit_test(parse_args__returns__null_from_null), cmocka_unit_test(parse_args__returns__null_from_empty), cmocka_unit_test(parse_args__returns__null_from_space), cmocka_unit_test(parse_args__returns__null_when_no_args), cmocka_unit_test(parse_args__returns__null_from_cmd_with_space), cmocka_unit_test(parse_args__returns__null_when_too_few), cmocka_unit_test(parse_args__returns__null_when_too_many), cmocka_unit_test(parse_args__returns__one_arg), cmocka_unit_test(parse_args__returns__two_args), cmocka_unit_test(parse_args__returns__three_args), cmocka_unit_test(parse_args__returns__three_args_with_spaces), cmocka_unit_test(parse_args_with_freetext__returns__freetext), cmocka_unit_test(parse_args_with_freetext__returns__one_arg_with_freetext), cmocka_unit_test(parse_args_with_freetext__returns__two_args_with_freetext), cmocka_unit_test(parse_args__returns__zero_args_when_min_zero), cmocka_unit_test(parse_args_with_freetext__returns__zero_args_when_min_zero), cmocka_unit_test(parse_args__returns__quoted_args), cmocka_unit_test(parse_args__returns__quoted_args_with_space), cmocka_unit_test(parse_args__returns__quoted_args_with_many_spaces), cmocka_unit_test(parse_args__returns__many_quoted_args_with_many_spaces), cmocka_unit_test(parse_args_with_freetext__returns__quoted_args), cmocka_unit_test(parse_args_with_freetext__returns__quoted_args_with_space), cmocka_unit_test(parse_args_with_freetext__returns__quoted_args_with_many_spaces), cmocka_unit_test(parse_args_with_freetext__returns__many_quoted_args_with_many_spaces), cmocka_unit_test(parse_args_with_freetext__returns__quoted_freetext), cmocka_unit_test(parse_args_with_freetext__returns__third_arg_quoted), cmocka_unit_test(parse_args_with_freetext__returns__second_arg_quoted), cmocka_unit_test(parse_args_with_freetext__returns__second_and_third_arg_quoted), cmocka_unit_test(parse_args__returns__escaped_quotes), cmocka_unit_test(parse_args__returns__escaped_spaces), cmocka_unit_test(parse_args__returns__escaped_backslash), cmocka_unit_test(count_tokens__returns__one_token), cmocka_unit_test(count_tokens__returns__one_token_quoted_no_whitespace), cmocka_unit_test(count_tokens__returns__one_token_quoted_with_whitespace), cmocka_unit_test(count_tokens__returns__two_tokens), cmocka_unit_test(count_tokens__returns__two_tokens_first_quoted), cmocka_unit_test(count_tokens__returns__two_tokens_second_quoted), cmocka_unit_test(count_tokens__returns__two_tokens_both_quoted), cmocka_unit_test(count_tokens__handles__escapes), cmocka_unit_test(count_tokens__handles__multiple_spaces), cmocka_unit_test(get_start__returns__first_of_one), cmocka_unit_test(get_start__returns__first_of_two), cmocka_unit_test(get_start__returns__first_two_of_three), cmocka_unit_test(get_start__returns__first_two_of_three_first_quoted), cmocka_unit_test(get_start__returns__first_two_of_three_second_quoted), cmocka_unit_test(get_start__returns__first_two_of_three_first_and_second_quoted), cmocka_unit_test(get_start__handles__escapes), cmocka_unit_test(get_start__handles__multiple_spaces), cmocka_unit_test(parse_options__returns__empty_hashmap_when_none), cmocka_unit_test(parse_options__returns__error_when_opt1_no_val), cmocka_unit_test(parse_options__returns__map_when_one), cmocka_unit_test(parse_options__returns__error_when_opt2_no_val), cmocka_unit_test(parse_options__returns__map_when_two), cmocka_unit_test(parse_options__returns__error_when_opt3_no_val), cmocka_unit_test(parse_options__returns__map_when_three), cmocka_unit_test(parse_options__returns__error_when_unknown_opt), cmocka_unit_test(parse_options__returns__error_when_duplicated_option), cmocka_unit_test(roster_get_contacts__returns__empty_list_when_none_added), cmocka_unit_test(roster_get_contacts__returns__one_element), cmocka_unit_test(roster_get_contacts__returns__correct_first_element), cmocka_unit_test(roster_get_contacts__returns__two_elements), cmocka_unit_test(roster_get_contacts__returns__correct_first_and_second_elements), cmocka_unit_test(roster_get_contacts__returns__three_elements), cmocka_unit_test(roster_get_contacts__returns__correct_first_three_elements), cmocka_unit_test(roster_add__updates__adds_once_when_called_twice_at_beginning), cmocka_unit_test(roster_add__updates__adds_once_when_called_twice_in_middle), cmocka_unit_test(roster_add__updates__adds_once_when_called_twice_at_end), cmocka_unit_test(roster_contact_autocomplete__returns__first_exists), cmocka_unit_test(roster_contact_autocomplete__returns__second_exists), cmocka_unit_test(roster_contact_autocomplete__returns__third_exists), cmocka_unit_test(roster_contact_autocomplete__returns__null_when_no_match), cmocka_unit_test(roster_contact_autocomplete__returns__null_on_empty_roster), cmocka_unit_test(roster_contact_autocomplete__returns__second_when_two_match), cmocka_unit_test(roster_contact_autocomplete__returns__fifth_when_multiple_match), cmocka_unit_test(roster_contact_autocomplete__returns__first_when_two_match_and_reset), cmocka_unit_test(roster_contact_autocomplete__returns__utf8), cmocka_unit_test(roster_get_groups__returns__empty_for_no_group), cmocka_unit_test(roster_get_groups__returns__one_group), cmocka_unit_test(roster_get_groups__returns__two_groups), cmocka_unit_test(roster_get_groups__returns__three_groups), cmocka_unit_test(roster_update__updates__adding_two_groups), cmocka_unit_test(roster_update__updates__removing_one_group), cmocka_unit_test(roster_update__updates__removing_two_groups), cmocka_unit_test(roster_update__updates__removing_three_groups), cmocka_unit_test(roster_update__updates__two_new_groups), cmocka_unit_test(roster_remove__updates__contact_groups), cmocka_unit_test(roster_add__updates__different_groups), cmocka_unit_test(roster_add__updates__same_groups), cmocka_unit_test(roster_add__updates__overlapping_groups), cmocka_unit_test(roster_remove__updates__remaining_in_group), cmocka_unit_test(roster_get_display_name__returns__nickname_when_exists), cmocka_unit_test(roster_get_display_name__returns__barejid_when_nickname_empty), cmocka_unit_test(roster_get_display_name__returns__barejid_when_not_exists), cmocka_unit_test_setup_teardown(chat_session_get__returns__null_when_no_session, init_chat_sessions, close_chat_sessions), cmocka_unit_test_setup_teardown(chat_session_recipient_active__updates__new_session, init_chat_sessions, close_chat_sessions), cmocka_unit_test_setup_teardown(chat_session_recipient_active__updates__replace_resource, init_chat_sessions, close_chat_sessions), cmocka_unit_test_setup_teardown(chat_session_remove__updates__session_removed, init_chat_sessions, close_chat_sessions), cmocka_unit_test_setup_teardown(cmd_connect__shows__message_when_disconnecting, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__message_when_connecting, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__message_when_connected, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__tests__no_account, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__fail_message, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__tests__lowercases_argument_with_account, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__tests__lowercases_argument_with_no_account, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__tests__asks_password_when_not_in_account, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__usage_when_no_server_value, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__message_when_connecting_with_account, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__tests__connects_with_account, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__usage_when_server_no_port_value, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__usage_when_no_port_value, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__usage_when_port_no_server_value, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__message_when_port_0, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__message_when_port_minus1, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__message_when_port_65536, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__message_when_port_contains_chars, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__tests__with_server_when_provided, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__tests__with_port_when_provided, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__tests__with_server_and_port_when_provided, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__usage_when_server_provided_twice, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__usage_when_port_provided_twice, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__usage_when_invalid_first_property, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_connect__shows__usage_when_invalid_second_property, load_preferences, close_preferences), cmocka_unit_test(cmd_rooms__shows__message_when_disconnected), cmocka_unit_test(cmd_rooms__shows__message_when_disconnecting), cmocka_unit_test(cmd_rooms__shows__message_when_connecting), cmocka_unit_test(cmd_rooms__tests__account_default_when_no_arg), cmocka_unit_test(cmd_rooms__tests__service_arg_used_when_passed), cmocka_unit_test(cmd_rooms__tests__filter_arg_used_when_passed), cmocka_unit_test(cmd_account__shows__usage_when_not_connected_and_no_args), cmocka_unit_test(cmd_account__shows__account_when_connected_and_no_args), cmocka_unit_test(cmd_account_list__shows__accounts), cmocka_unit_test(cmd_account_show__shows__usage_when_no_arg), cmocka_unit_test(cmd_account_show__shows__message_when_account_does_not_exist), cmocka_unit_test(cmd_account_show__shows__account_when_exists), cmocka_unit_test(cmd_account_add__shows__usage_when_no_arg), cmocka_unit_test(cmd_account_add__updates__adds_account), cmocka_unit_test(cmd_account_enable__shows__usage_when_no_arg), cmocka_unit_test(cmd_account_enable__updates__enables_account), cmocka_unit_test(cmd_account_enable__shows__message_when_account_doesnt_exist), cmocka_unit_test(cmd_account_disable__shows__usage_when_no_arg), cmocka_unit_test(cmd_account_disable__updates__disables_account), cmocka_unit_test(cmd_account_disable__shows__message_when_account_doesnt_exist), cmocka_unit_test(cmd_account_rename__shows__usage_when_no_args), cmocka_unit_test(cmd_account_rename__shows__usage_when_one_arg), cmocka_unit_test(cmd_account_rename__updates__renames_account), cmocka_unit_test(cmd_account_rename__shows__message_when_not_renamed), cmocka_unit_test(cmd_account_set__shows__usage_when_no_args), cmocka_unit_test(cmd_account_set__shows__usage_when_one_arg), cmocka_unit_test(cmd_account_set__shows__usage_when_two_args), cmocka_unit_test(cmd_account_set__shows__message_when_account_doesnt_exist), cmocka_unit_test(cmd_account_set__shows__message_for_malformed_jid), cmocka_unit_test(cmd_account_set__updates__jid_sets_barejid), cmocka_unit_test(cmd_account_set__updates__jid_sets_resource), cmocka_unit_test(cmd_account_set__updates__server_sets_server), cmocka_unit_test(cmd_account_set__updates__resource_sets_resource), cmocka_unit_test(cmd_account_set__shows__resource_sets_resource_with_online_message), cmocka_unit_test(cmd_account_set__updates__password_sets_password), cmocka_unit_test(cmd_account_set__updates__eval_password_sets_eval_password), cmocka_unit_test(cmd_account_set__shows__password_when_eval_password_set), cmocka_unit_test(cmd_account_set__shows__eval_password_when_password_set), cmocka_unit_test(cmd_account_set__updates__muc_sets_muc), cmocka_unit_test(cmd_account_set__updates__nick_sets_nick), #ifdef HAVE_LIBOTR cmocka_unit_test(cmd_account_set__shows__message_for_missing_otr_policy), cmocka_unit_test(cmd_account_set__shows__message_for_invalid_otr_policy), cmocka_unit_test(cmd_account_set__updates__otr_sets_otr), #endif cmocka_unit_test(cmd_account_set__shows__message_when_invalid_status), cmocka_unit_test(cmd_account_set__updates__status_sets_status_when_valid), cmocka_unit_test(cmd_account_set__updates__status_sets_status_when_last), cmocka_unit_test(cmd_account_set__shows__invalid_presence_string_priority_message), cmocka_unit_test(cmd_account_set__shows__last_priority_message), cmocka_unit_test(cmd_account_set__updates__online_priority_sets_preference), cmocka_unit_test(cmd_account_set__updates__chat_priority_sets_preference), cmocka_unit_test(cmd_account_set__updates__away_priority_sets_preference), cmocka_unit_test(cmd_account_set__updates__xa_priority_sets_preference), cmocka_unit_test(cmd_account_set__updates__dnd_priority_sets_preference), cmocka_unit_test(cmd_account_set__shows__priority_too_low_message), cmocka_unit_test(cmd_account_set__shows__priority_too_high_message), cmocka_unit_test(cmd_account_set__shows__priority_when_not_number_message), cmocka_unit_test(cmd_account_set__shows__priority_when_empty_message), cmocka_unit_test(cmd_account_set__updates__priority_updates_presence_when_connected), cmocka_unit_test(cmd_account_clear__shows__usage_when_no_args), cmocka_unit_test(cmd_account_clear__shows__usage_when_one_arg), cmocka_unit_test(cmd_account_clear__shows__message_when_account_doesnt_exist), cmocka_unit_test(cmd_account_clear__shows__message_when_invalid_property), cmocka_unit_test(cmd_sub__shows__message_when_not_connected), cmocka_unit_test(cmd_sub__shows__usage_when_no_arg), cmocka_unit_test(p_contact_in_group__is__true_when_in_group), cmocka_unit_test(p_contact_in_group__is__false_when_not_in_group), cmocka_unit_test(p_contact_name_or_jid__returns__name_when_exists), cmocka_unit_test(p_contact_name_or_jid__returns__jid_when_name_not_exists), cmocka_unit_test(p_contact_create_display_string__returns__name_and_resource_when_name_exists), cmocka_unit_test(p_contact_create_display_string__returns__jid_and_resource_when_name_not_exists), cmocka_unit_test(p_contact_create_display_string__returns__name_when_default_resource), cmocka_unit_test(p_contact_presence__returns__offline_when_no_resources), cmocka_unit_test(p_contact_presence__returns__highest_priority_presence), cmocka_unit_test(p_contact_presence__returns__chat_when_same_priority), cmocka_unit_test(p_contact_presence__returns__online_when_same_priority), cmocka_unit_test(p_contact_presence__returns__away_when_same_priority), cmocka_unit_test(p_contact_presence__returns__xa_when_same_priority), cmocka_unit_test(p_contact_presence__returns__dnd), cmocka_unit_test(p_contact_subscribed__is__true_when_to), cmocka_unit_test(p_contact_subscribed__is__true_when_both), cmocka_unit_test(p_contact_subscribed__is__false_when_from), cmocka_unit_test(p_contact_subscribed__is__false_when_no_subscription_value), cmocka_unit_test(p_contact_is_available__is__false_when_offline), cmocka_unit_test(p_contact_is_available__is__false_when_highest_priority_away), cmocka_unit_test(p_contact_is_available__is__false_when_highest_priority_xa), cmocka_unit_test(p_contact_is_available__is__false_when_highest_priority_dnd), cmocka_unit_test(p_contact_is_available__is__true_when_highest_priority_online), cmocka_unit_test(p_contact_is_available__is__true_when_highest_priority_chat), cmocka_unit_test(cmd_presence__shows__usage_when_bad_subcmd), cmocka_unit_test(cmd_presence__shows__usage_when_bad_console_setting), cmocka_unit_test(cmd_presence__shows__usage_when_bad_chat_setting), cmocka_unit_test(cmd_presence__shows__usage_when_bad_muc_setting), cmocka_unit_test_setup_teardown(cmd_presence__updates__console_all, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_presence__updates__console_online, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_presence__updates__console_none, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_presence__updates__chat_all, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_presence__updates__chat_online, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_presence__updates__chat_none, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_presence__updates__room_all, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_presence__updates__room_online, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_presence__updates__room_none, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(prefs_get_string__returns__all_for_console_default, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(prefs_get_string__returns__none_for_chat_default, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(prefs_get_string__returns__none_for_muc_default, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(sv_ev_contact_online__shows__presence_in_console_when_set_online, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(sv_ev_contact_online__shows__presence_in_console_when_set_all, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(sv_ev_contact_online__shows__dnd_presence_in_console_when_set_all, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(sv_ev_contact_offline__updates__removes_chat_session, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(sv_ev_lost_connection__updates__clears_chat_sessions, load_preferences, close_preferences), cmocka_unit_test(cmd_alias__shows__usage_when_add_no_args), cmocka_unit_test(cmd_alias__shows__usage_when_add_no_value), cmocka_unit_test(cmd_alias__shows__usage_when_remove_no_args), cmocka_unit_test(cmd_alias__shows__usage_when_invalid_subcmd), cmocka_unit_test_setup_teardown(cmd_alias__updates__adds_alias, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_alias__shows__message_when_add_exists, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_alias__updates__removes_alias, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_alias__shows__message_when_remove_no_alias, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_alias__shows__all_aliases, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(muc_invites_add__updates__invites_list, muc_before_test, muc_after_test), cmocka_unit_test_setup_teardown(muc_invites_remove__updates__invites_list, muc_before_test, muc_after_test), cmocka_unit_test_setup_teardown(muc_invites_count__returns__0_when_no_invites, muc_before_test, muc_after_test), cmocka_unit_test_setup_teardown(muc_invites_count__returns__5_when_five_invites_added, muc_before_test, muc_after_test), cmocka_unit_test_setup_teardown(muc_active__is__false_when_not_joined, muc_before_test, muc_after_test), cmocka_unit_test_setup_teardown(muc_active__is__true_when_joined, muc_before_test, muc_after_test), cmocka_unit_test(cmd_bookmark__shows__message_when_disconnected), cmocka_unit_test(cmd_bookmark__shows__message_when_disconnecting), cmocka_unit_test(cmd_bookmark__shows__message_when_connecting), cmocka_unit_test(cmd_bookmark__shows__usage_when_no_args), cmocka_unit_test(cmd_bookmark_list__shows__bookmarks), cmocka_unit_test(cmd_bookmark_add__shows__message_when_invalid_jid), cmocka_unit_test(cmd_bookmark_add__updates__bookmark_with_jid), muc_unit_test(cmd_bookmark__tests__uses_roomjid_in_room), muc_unit_test(cmd_bookmark_add__tests__uses_roomjid_in_room), muc_unit_test(cmd_bookmark_add__tests__uses_supplied_jid_in_room), muc_unit_test(cmd_bookmark_remove__tests__uses_roomjid_in_room), muc_unit_test(cmd_bookmark_remove__tests__uses_supplied_jid_in_room), cmocka_unit_test(cmd_bookmark_add__updates__bookmark_with_jid_nick), cmocka_unit_test(cmd_bookmark_add__updates__bookmark_with_jid_autojoin), cmocka_unit_test(cmd_bookmark_add__updates__bookmark_with_jid_nick_autojoin), cmocka_unit_test(cmd_bookmark_remove__updates__removes_bookmark), cmocka_unit_test(cmd_bookmark_remove__shows__message_when_no_bookmark), #ifdef HAVE_LIBOTR cmocka_unit_test(cmd_otr_log__shows__usage_when_no_args), cmocka_unit_test(cmd_otr_log__shows__usage_when_invalid_subcommand), cmocka_unit_test_setup_teardown(cmd_otr_log__updates__enables_logging, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_otr_log__updates__disables_logging, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_otr_log__updates__redacts_logging, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_otr_log__shows__warning_when_chlog_disabled, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(cmd_otr_log__shows__redact_warning_when_chlog_disabled, load_preferences, close_preferences), cmocka_unit_test(cmd_otr_libver__shows__libotr_version), cmocka_unit_test(cmd_otr_gen__shows__message_when_not_connected), cmocka_unit_test(cmd_otr_gen__tests__generates_key_for_connected_account), cmocka_unit_test(cmd_otr_gen__shows__message_when_disconnected), cmocka_unit_test(cmd_otr_gen__shows__message_when_connecting), cmocka_unit_test(cmd_otr_gen__shows__message_when_disconnecting), cmocka_unit_test(cmd_otr_myfp__shows__message_when_disconnected), cmocka_unit_test(cmd_otr_myfp__shows__message_when_connecting), cmocka_unit_test(cmd_otr_myfp__shows__message_when_disconnecting), cmocka_unit_test(cmd_otr_myfp__shows__message_when_no_key), cmocka_unit_test(cmd_otr_myfp__shows__my_fingerprint), cmocka_unit_test(cmd_otr_theirfp__shows__message_when_in_console), cmocka_unit_test(cmd_otr_theirfp__shows__message_when_in_muc), cmocka_unit_test(cmd_otr_theirfp__shows__message_when_in_private), cmocka_unit_test(cmd_otr_theirfp__shows__message_when_non_otr_chat_window), cmocka_unit_test(cmd_otr_theirfp__shows__fingerprint), cmocka_unit_test(cmd_otr_start__shows__message_when_in_console), cmocka_unit_test(cmd_otr_start__shows__message_when_in_muc), cmocka_unit_test(cmd_otr_start__shows__message_when_in_private), cmocka_unit_test(cmd_otr_start__shows__message_when_already_started), cmocka_unit_test(cmd_otr_start__shows__message_when_no_key), cmocka_unit_test_setup_teardown(cmd_otr_start__tests__sends_otr_query_message_to_current_recipeint, load_preferences, close_preferences), #else cmocka_unit_test(cmd_otr__shows__message_when_otr_unsupported), #endif #ifdef HAVE_LIBGPGME cmocka_unit_test(cmd_pgp__shows__usage_when_no_args), cmocka_unit_test(cmd_pgp_start__shows__message_when_disconnected), cmocka_unit_test(cmd_pgp_start__shows__message_when_disconnecting), cmocka_unit_test(cmd_pgp_start__shows__message_when_connecting), cmocka_unit_test(cmd_pgp_start__shows__message_when_no_arg_in_console), cmocka_unit_test(cmd_pgp_start__shows__message_when_no_arg_in_muc), cmocka_unit_test(cmd_pgp_start__shows__message_when_no_arg_in_conf), cmocka_unit_test(cmd_pgp_start__shows__message_when_no_arg_in_private), cmocka_unit_test(cmd_pgp_start__shows__message_when_no_arg_in_xmlconsole), #else cmocka_unit_test(cmd_pgp__shows__message_when_pgp_unsupported), #endif cmocka_unit_test(cmd_join__shows__message_when_disconnecting), cmocka_unit_test(cmd_join__shows__message_when_connecting), cmocka_unit_test(cmd_join__shows__message_when_disconnected), cmocka_unit_test(cmd_join__shows__error_message_when_invalid_room_jid), muc_unit_test(cmd_join__tests__uses_account_mucservice_when_no_service_specified), muc_unit_test(cmd_join__tests__uses_supplied_nick), muc_unit_test(cmd_join__tests__uses_account_nick_when_not_supplied), muc_unit_test(cmd_join__tests__uses_password_when_supplied), cmocka_unit_test(cmd_roster__shows__message_when_disconnecting), cmocka_unit_test(cmd_roster__shows__message_when_connecting), cmocka_unit_test(cmd_roster__shows__message_when_disconnected), cmocka_unit_test(cmd_roster__shows__roster_when_no_args), cmocka_unit_test(cmd_roster__shows__message_when_add_no_jid), cmocka_unit_test(cmd_roster__tests__add_sends_roster_add_request), cmocka_unit_test(cmd_roster__shows__message_when_remove_no_jid), cmocka_unit_test(cmd_roster__tests__remove_sends_roster_remove_request), cmocka_unit_test(cmd_roster__tests__remove_nickname_sends_roster_remove_request), cmocka_unit_test(cmd_roster__shows__message_when_nick_no_jid), cmocka_unit_test(cmd_roster__shows__message_when_nick_no_nick), cmocka_unit_test(cmd_roster__shows__message_when_nick_no_contact_exists), cmocka_unit_test(cmd_roster__tests__nick_sends_name_change_request), cmocka_unit_test(cmd_roster__shows__message_when_clearnick_no_jid), cmocka_unit_test(cmd_roster__shows__message_when_clearnick_no_contact_exists), cmocka_unit_test(cmd_roster__tests__clearnick_sends_name_change_request_with_empty_nick), cmocka_unit_test(form_get_form_type_field__returns__null_no_fields), cmocka_unit_test(form_get_form_type_field__returns__null_when_not_present), cmocka_unit_test(form_get_form_type_field__returns__value_when_present), cmocka_unit_test(form_get_field_type__returns__unknown_when_no_fields), cmocka_unit_test(form_get_field_type__returns__correct_type), cmocka_unit_test(form_set_value__updates__adds_when_none), cmocka_unit_test(form_set_value__updates__updates_when_one), cmocka_unit_test(form_add_unique_value__updates__adds_when_none), cmocka_unit_test(form_add_unique_value__updates__does_nothing_when_exists), cmocka_unit_test(form_add_unique_value__updates__adds_when_doesnt_exist), cmocka_unit_test(form_add_value__updates__adds_when_none), cmocka_unit_test(form_add_value__updates__adds_when_some), cmocka_unit_test(form_add_value__updates__adds_when_exists), cmocka_unit_test(form_remove_value__updates__does_nothing_when_none), cmocka_unit_test(form_remove_value__updates__does_nothing_when_doesnt_exist), cmocka_unit_test(form_remove_value__updates__removes_when_one), cmocka_unit_test(form_remove_value__updates__removes_when_many), cmocka_unit_test(form_remove_text_multi_value__updates__does_nothing_when_none), cmocka_unit_test(form_remove_text_multi_value__updates__does_nothing_when_doesnt_exist), cmocka_unit_test(form_remove_text_multi_value__updates__removes_when_one), cmocka_unit_test(form_remove_text_multi_value__updates__removes_when_many), cmocka_unit_test_setup_teardown(cmd_disconnect__updates__clears_chat_sessions, load_preferences, close_preferences), cmocka_unit_test(prof_occurrences__tests__partial), cmocka_unit_test(prof_occurrences__tests__whole), cmocka_unit_test(prof_occurrences__tests__large_message), cmocka_unit_test(get_mentions__tests__various), cmocka_unit_test(release_is_new__tests__various), cmocka_unit_test(str_xml_sanitize__strips_illegal_characters), cmocka_unit_test_setup_teardown(plugins_get_command_names__returns__no_commands, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(plugins_get_command_names__returns__commands_when_added, load_preferences, close_preferences), cmocka_unit_test(disco_get_features__returns__empty_list_when_none), cmocka_unit_test(disco_add_feature__updates__added_feature), cmocka_unit_test(disco_close__updates__resets_features), cmocka_unit_test(disco_get_features__returns__all_added_features), cmocka_unit_test(disco_add_feature__updates__not_duplicate_feature), cmocka_unit_test(disco_remove_features__updates__removes_plugin_features), cmocka_unit_test(disco_remove_features__updates__not_remove_when_more_than_one_reference), // Forced encryption cmocka_unit_test_setup_teardown(test_cmd_force_encryption_no_args_bad_cmd, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_cmd_force_encryption_toggles_on, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_cmd_force_encryption_toggles_off, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_cmd_force_encryption_toggles_off_already, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_cmd_force_encryption_toggles_on_already, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_cmd_force_encryption_sets_policy_block, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_cmd_force_encryption_sets_policy_resend, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_allow_unencrypted_message_blocks, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_allow_unencrypted_message_confirms_on_second_attempt, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_cmd_force_encryption_invalid_policy, load_preferences, close_preferences), cmocka_unit_test_setup_teardown(test_allow_unencrypted_message_invalid_mode, load_preferences, close_preferences), // AI client tests cmocka_unit_test_setup_teardown(test_ai_client_init, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_add_provider, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_remove_provider, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_list_providers, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_set_provider_key, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_get_provider_key, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_create, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_ref_unref, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_add_message, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_clear_history, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_set_model, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_api_key_is_copied, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_add_provider_update_existing, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_add_provider_null_name_returns_null, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_add_provider_null_url_returns_null, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_create_null_provider_returns_null, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_create_null_model_returns_null, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_api_key_null_when_no_key_set, ai_client_setup, ai_client_teardown), /* Provider autocomplete tests */ cmocka_unit_test_setup_teardown(test_ai_providers_find_forward, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_providers_find_forward_custom, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_providers_find_forward_no_match, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_providers_find_forward_partial_match, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_providers_find_next, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_providers_find_previous, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_providers_find_empty_search_str, ai_client_setup, ai_client_teardown), /* SIGSEGV on ai_providers_find(NULL, ...) — see test body and * AI_AUTOCOMPLETE_POSSIBLE_ISSUES.md, issue 1. Re-enable once the * NULL-search path is guarded. */ /* cmocka_unit_test_setup_teardown(test_ai_providers_find_null_search_str, ai_client_setup, ai_client_teardown), */ cmocka_unit_test_setup_teardown(test_ai_providers_find_case_insensitive, ai_client_setup, ai_client_teardown), /* Provider default model and settings tests */ cmocka_unit_test_setup_teardown(test_ai_set_provider_default_model, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_get_provider_default_model, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_set_provider_setting, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_set_provider_setting_reserved_key, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_get_provider_setting, ai_client_setup, ai_client_teardown), /* Model caching tests */ cmocka_unit_test_setup_teardown(test_ai_models_are_fresh_initial, ai_client_setup, ai_client_teardown), /* Model parsing tests */ cmocka_unit_test(test_ai_parse_models_openai_format), cmocka_unit_test(test_ai_parse_models_perplexity_format), cmocka_unit_test(test_ai_parse_models_array_format), cmocka_unit_test(test_ai_parse_models_empty_json), cmocka_unit_test(test_ai_parse_models_null_handling), cmocka_unit_test(test_ai_parse_models_escaped_quotes), cmocka_unit_test(test_ai_parse_models_with_whitespace), /* AI autocomplete integration tests */ cmocka_unit_test_setup_teardown(test_ai_start_provider_autocomplete_only_on_exact, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_providers_find_cycling, ai_client_setup, ai_client_teardown), cmocka_unit_test(test_ai_json_escape), cmocka_unit_test(test_ai_json_escape_null), cmocka_unit_test(test_ai_json_escape_empty), cmocka_unit_test(test_ai_json_escape_special_chars), cmocka_unit_test(test_ai_json_escape_percent_signs), cmocka_unit_test(test_ai_json_escape_backslash_quote), /* Chat response parser */ cmocka_unit_test(test_ai_parse_response_openai_content), cmocka_unit_test(test_ai_parse_response_legacy_text_format_unsupported), cmocka_unit_test(test_ai_parse_response_content_preferred_over_text), cmocka_unit_test(test_ai_parse_response_escaped_quote), cmocka_unit_test(test_ai_parse_response_newline_escape), cmocka_unit_test(test_ai_parse_response_empty_content), cmocka_unit_test(test_ai_parse_response_missing_field), cmocka_unit_test(test_ai_parse_response_null_input), cmocka_unit_test(test_ai_parse_response_empty_input), cmocka_unit_test(test_ai_parse_response_percent_signs_safe), cmocka_unit_test(test_ai_parse_response_braces_in_content), cmocka_unit_test(test_ai_parse_response_multiline_content), /* Error response parser */ cmocka_unit_test(test_ai_parse_error_standard_envelope), cmocka_unit_test(test_ai_parse_error_with_escapes), cmocka_unit_test(test_ai_parse_error_no_error_field), cmocka_unit_test(test_ai_parse_error_no_message_field), cmocka_unit_test(test_ai_parse_error_null_input), cmocka_unit_test(test_ai_parse_error_empty_input), cmocka_unit_test(test_ai_parse_error_tab_escape), cmocka_unit_test(test_ai_parse_error_backslash_escape), /* Extended JSON escape coverage */ cmocka_unit_test(test_ai_json_escape_backspace), cmocka_unit_test(test_ai_json_escape_formfeed), cmocka_unit_test(test_ai_json_escape_carriage_return), cmocka_unit_test(test_ai_json_escape_all_specials_combined), cmocka_unit_test(test_ai_json_escape_passes_utf8_through), /* Autocomplete cycling */ cmocka_unit_test_setup_teardown(test_ai_providers_find_cycles_through_many, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_providers_find_previous_walks_backwards, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_providers_find_wraps_around, ai_client_setup, ai_client_teardown), /* Session edge cases */ cmocka_unit_test_setup_teardown(test_ai_session_add_message_null_session_no_crash, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_add_message_null_role_no_crash, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_add_message_null_content_no_crash, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_history_preserves_large_order, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_clear_empty_history, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_set_model_null_keeps_old, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_unref_null_no_crash, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_session_ref_null_returns_null, ai_client_setup, ai_client_teardown), /* Provider edge cases */ cmocka_unit_test_setup_teardown(test_ai_get_provider_null_returns_null, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_remove_provider_null_returns_false, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_remove_provider_twice_second_fails, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_provider_survives_via_session_after_removal, ai_client_setup, ai_client_teardown), /* Settings */ cmocka_unit_test_setup_teardown(test_ai_settings_multiple_keys_independent, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_settings_get_missing_returns_null, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_settings_isolated_between_providers, ai_client_setup, ai_client_teardown), /* Model parsing edge cases */ cmocka_unit_test_setup_teardown(test_ai_parse_models_data_not_array, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_parse_models_empty_data_array, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_parse_models_id_outside_data_ignored, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_parse_models_multiple_models, ai_client_setup, ai_client_teardown), /* Prefs round-trip (uses prefs+ai setup) */ cmocka_unit_test_setup_teardown(test_ai_prefs_round_trip_api_key, ai_client_setup_with_prefs, ai_client_teardown_with_prefs), cmocka_unit_test_setup_teardown(test_ai_prefs_round_trip_remove_key, ai_client_setup_with_prefs, ai_client_teardown_with_prefs), cmocka_unit_test_setup_teardown(test_ai_prefs_multiple_providers_persist, ai_client_setup_with_prefs, ai_client_teardown_with_prefs), /* Autocomplete deeper coverage */ cmocka_unit_test_setup_teardown(test_ai_providers_find_after_remove_skips_removed, ai_client_setup, ai_client_teardown), /* Reset hook + persistence */ cmocka_unit_test_setup_teardown(test_ai_providers_reset_ac_restarts_cycle, ai_client_setup, ai_client_teardown), cmocka_unit_test_setup_teardown(test_ai_add_provider_persisted_across_init, ai_client_setup_with_prefs, ai_client_teardown_with_prefs), cmocka_unit_test_setup_teardown(test_ai_remove_provider_persisted_across_init, ai_client_setup_with_prefs, ai_client_teardown_with_prefs), cmocka_unit_test_setup_teardown(test_ai_models_persisted_across_init, ai_client_setup_with_prefs, ai_client_teardown_with_prefs), // Flatfile export/import round-trip cmocka_unit_test(test_ff_roundtrip_simple_chat), cmocka_unit_test(test_ff_roundtrip_with_all_metadata), cmocka_unit_test(test_ff_roundtrip_with_resource), cmocka_unit_test(test_ff_roundtrip_newline_in_body), cmocka_unit_test(test_ff_roundtrip_pipe_in_stanza_id), cmocka_unit_test(test_ff_roundtrip_backslash_in_body), cmocka_unit_test(test_ff_roundtrip_unicode_body), cmocka_unit_test(test_ff_roundtrip_empty_body), cmocka_unit_test(test_ff_roundtrip_colonspace_in_resource), cmocka_unit_test(test_ff_roundtrip_muc_type), cmocka_unit_test(test_ff_roundtrip_omemo_enc), cmocka_unit_test(test_ff_roundtrip_replace_id), cmocka_unit_test(test_ff_roundtrip_to_jid_and_marked_read), // Escape / unescape cmocka_unit_test(test_ff_escape_unescape_message_identity), cmocka_unit_test(test_ff_escape_unescape_meta_identity), cmocka_unit_test(test_ff_escape_meta_null_returns_null), cmocka_unit_test(test_ff_escape_message_null_returns_empty), // jid_to_dir cmocka_unit_test(test_ff_jid_to_dir_simple), cmocka_unit_test(test_ff_jid_to_dir_with_at), cmocka_unit_test(test_ff_jid_to_dir_path_traversal_rejected), cmocka_unit_test(test_ff_jid_to_dir_null), // Parser edge cases cmocka_unit_test(test_ff_parse_line_empty), cmocka_unit_test(test_ff_parse_line_comment), cmocka_unit_test(test_ff_parse_line_legacy_format), cmocka_unit_test(test_ff_parse_line_no_metadata), cmocka_unit_test(test_ff_parse_line_invalid_timestamp), cmocka_unit_test(test_ff_parse_line_empty_timestamp), cmocka_unit_test(test_ff_parse_line_partial_iso_timestamp), cmocka_unit_test(test_ff_parse_line_garbage_timestamp), cmocka_unit_test(test_ff_parse_line_impossible_calendar_date), cmocka_unit_test(test_ff_parse_line_negative_year_timestamp), cmocka_unit_test(test_ff_parse_line_far_future_timestamp), // Type/enc round-trip cmocka_unit_test(test_ff_type_str_roundtrip), cmocka_unit_test(test_ff_enc_str_roundtrip), // Additional round-trip cmocka_unit_test(test_ff_roundtrip_bracket_in_stanza_id), cmocka_unit_test(test_ff_roundtrip_backslash_in_resource), cmocka_unit_test(test_ff_roundtrip_mucpm_type), cmocka_unit_test(test_ff_roundtrip_all_enc_types), cmocka_unit_test(test_ff_roundtrip_crlf_handling), cmocka_unit_test(test_ff_roundtrip_to_jid_special_chars), cmocka_unit_test(test_ff_roundtrip_multiple_lines), // Additional parser edge cases cmocka_unit_test(test_ff_parsed_line_free_null_safe), cmocka_unit_test(test_ff_parse_line_no_space_rejected), cmocka_unit_test(test_ff_parse_line_unclosed_bracket), // Stress tests cmocka_unit_test(test_stress_rapid_write_parse_1000), cmocka_unit_test(test_stress_rapid_write_parse_10000), cmocka_unit_test(test_stress_muc_many_participants), cmocka_unit_test(test_stress_muc_rapid_messages), cmocka_unit_test(test_stress_large_message_1mb), cmocka_unit_test(test_stress_large_message_body_with_special_chars), cmocka_unit_test(test_stress_many_large_messages_100), cmocka_unit_test(test_stress_index_build_10000_lines), cmocka_unit_test(test_stress_index_extend_append), cmocka_unit_test(test_stress_id_cache_dedup_correctness), cmocka_unit_test(test_stress_export_merge_dedup_1000), cmocka_unit_test(test_stress_mixed_types_and_encodings), cmocka_unit_test(test_stress_lmc_chain_deep), cmocka_unit_test(test_stress_lmc_many_corrections), }; return cmocka_run_group_tests(all_tests, NULL, NULL); }