diff options
author | TheJackiMonster <thejackimonster@gmail.com> | 2022-04-04 16:01:55 +0200 |
---|---|---|
committer | TheJackiMonster <thejackimonster@gmail.com> | 2022-04-04 16:01:55 +0200 |
commit | de5dccb421f01bb09764ae1da40cb226c30b8d45 (patch) | |
tree | 7c9085092c2d215a48eb4863c5aae3f421e589f0 | |
parent | 4e7fe777d6bb03b88ae3e0ac781f366f5296b23d (diff) |
Added test suite for lobbies
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-rw-r--r-- | Makefile | 31 | ||||
-rw-r--r-- | src/gnunet_chat_handle.c | 48 | ||||
-rw-r--r-- | tests/test_gnunet_chat_handle.c | 2 | ||||
-rw-r--r-- | tests/test_gnunet_chat_lobby.c | 252 |
4 files changed, 292 insertions, 41 deletions
@@ -7,26 +7,27 @@ INSTALL_DIR ?= /usr/local/ LIBRARY = lib$(TARGET_NAME).so SOURCES = gnunet_chat_lib.c\ - gnunet_chat_account.c\ - gnunet_chat_contact.c\ - gnunet_chat_context.c\ - gnunet_chat_file.c\ - gnunet_chat_group.c\ - gnunet_chat_handle.c\ - gnunet_chat_invitation.c\ - gnunet_chat_lobby.c\ - gnunet_chat_message.c\ - gnunet_chat_uri.c\ - gnunet_chat_util.c + gnunet_chat_account.c\ + gnunet_chat_contact.c\ + gnunet_chat_context.c\ + gnunet_chat_file.c\ + gnunet_chat_group.c\ + gnunet_chat_handle.c\ + gnunet_chat_invitation.c\ + gnunet_chat_lobby.c\ + gnunet_chat_message.c\ + gnunet_chat_uri.c\ + gnunet_chat_util.c HEADERS = gnunet_chat_lib.h -TESTS = test_gnunet_chat_handle.c +TESTS = test_gnunet_chat_handle.c\ + test_gnunet_chat_lobby.c LIBRARIES = gnunetarm\ gnunetfs\ - gnunetidentity\ - gnunetgns\ + gnunetidentity\ + gnunetgns\ gnunetmessenger\ gnunetnamestore\ gnunetregex\ @@ -66,7 +67,7 @@ $(LIBRARY): $(OBJECT_FILES) $(GNU_LD) $(LDFLAGS) $^ -o $@ $(LIBRARY_FLAGS) check: $(TEST_CASES) - ./$(TEST_CASES) + $(foreach TEST_CASE,$(TEST_CASES),./$(TEST_CASE);) %.test: %.c $(GNU_CC) $(CFLAGS) $< -o $@ -I $(INCLUDE_DIR) $(TEST_FLAGS) diff --git a/src/gnunet_chat_handle.c b/src/gnunet_chat_handle.c index b9b1d3e..c5d70a8 100644 --- a/src/gnunet_chat_handle.c +++ b/src/gnunet_chat_handle.c @@ -312,9 +312,33 @@ handle_disconnect (struct GNUNET_CHAT_Handle *handle) if (handle->messenger) GNUNET_MESSENGER_disconnect(handle->messenger); + struct GNUNET_CHAT_UriLookups *lookups; + while (handle->lookups_head) + { + lookups = handle->lookups_head; + + if (lookups->request) + GNUNET_GNS_lookup_cancel(lookups->request); + + if (lookups->uri) + uri_destroy(lookups->uri); + + GNUNET_CONTAINER_DLL_remove( + handle->lookups_head, + handle->lookups_tail, + lookups + ); + + GNUNET_free(lookups); + } + if (handle->gns) GNUNET_GNS_disconnect(handle->gns); + GNUNET_CONTAINER_multihashmap_iterate( + handle->files, it_destroy_handle_files, NULL + ); + if (handle->fs) GNUNET_FS_stop(handle->fs); @@ -322,10 +346,6 @@ handle_disconnect (struct GNUNET_CHAT_Handle *handle) handle->gns = NULL; handle->messenger = NULL; - GNUNET_CONTAINER_multihashmap_iterate( - handle->files, it_destroy_handle_files, NULL - ); - struct GNUNET_CHAT_InternalLobbies *lobbies; while (handle->lobbies_head) { @@ -343,26 +363,6 @@ handle_disconnect (struct GNUNET_CHAT_Handle *handle) GNUNET_free(lobbies); } - struct GNUNET_CHAT_UriLookups *lookups; - while (handle->lookups_head) - { - lookups = handle->lookups_head; - - if (lookups->request) - GNUNET_GNS_lookup_cancel(lookups->request); - - if (lookups->uri) - uri_destroy(lookups->uri); - - GNUNET_CONTAINER_DLL_remove( - handle->lookups_head, - handle->lookups_tail, - lookups - ); - - GNUNET_free(lookups); - } - GNUNET_CONTAINER_multihashmap_destroy(handle->groups); GNUNET_CONTAINER_multishortmap_destroy(handle->contacts); GNUNET_CONTAINER_multihashmap_destroy(handle->contexts); diff --git a/tests/test_gnunet_chat_handle.c b/tests/test_gnunet_chat_handle.c index c8a9e89..134448a 100644 --- a/tests/test_gnunet_chat_handle.c +++ b/tests/test_gnunet_chat_handle.c @@ -346,8 +346,6 @@ skip_search_account: const char *name = GNUNET_CHAT_get_name(handle); ck_assert_ptr_ne(name, NULL); - printf("login: %s\n", name); - char *dup = (char*) GNUNET_CHAT_get_user_pointer(handle); if (!dup) diff --git a/tests/test_gnunet_chat_lobby.c b/tests/test_gnunet_chat_lobby.c new file mode 100644 index 0000000..8f079ed --- /dev/null +++ b/tests/test_gnunet_chat_lobby.c @@ -0,0 +1,252 @@ +/* + This file is part of GNUnet. + Copyright (C) 2022 GNUnet e.V. + + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + SPDX-License-Identifier: AGPL3.0-or-later + */ +/* + * @author Tobias Frisch + * @file test_gnunet_chat_lobby.c + */ + +#include "test_gnunet_chat.h" + +int +on_gnunet_chat_lobby_base_it(void *cls, + const struct GNUNET_CHAT_Handle *handle, + struct GNUNET_CHAT_Account *account) +{ + struct GNUNET_CHAT_Handle *chat = (struct GNUNET_CHAT_Handle*) cls; + + ck_assert_ptr_ne(chat, NULL); + ck_assert_ptr_eq(handle, chat); + ck_assert_ptr_ne(account, NULL); + + const char *name = GNUNET_CHAT_account_get_name(account); + + ck_assert_ptr_ne(name, NULL); + ck_assert_ptr_eq(GNUNET_CHAT_get_connected(handle), NULL); + + if (0 == strcmp(name, "gnunet_chat_lobby_base")) + { + GNUNET_CHAT_connect(chat, account); + return GNUNET_NO; + } + + return GNUNET_YES; +} + +int +on_gnunet_chat_lobby_base_msg(void *cls, + struct GNUNET_CHAT_Context *context, + const struct GNUNET_CHAT_Message *message) +{ + struct GNUNET_CHAT_Handle *handle = *( + (struct GNUNET_CHAT_Handle**) cls + ); + + ck_assert_ptr_ne(handle, NULL); + ck_assert_ptr_eq(context, NULL); + ck_assert_ptr_ne(message, NULL); + + enum GNUNET_CHAT_MessageKind kind = GNUNET_CHAT_message_get_kind(message); + + if ((kind != GNUNET_CHAT_KIND_REFRESH) || + (GNUNET_CHAT_get_connected(handle))) + goto skip_search_account; + + ck_assert(kind == GNUNET_CHAT_KIND_REFRESH); + + GNUNET_CHAT_iterate_accounts( + handle, + on_gnunet_chat_lobby_base_it, + handle + ); + + if (!GNUNET_CHAT_get_connected(handle)) + return GNUNET_YES; + +skip_search_account: + if (GNUNET_CHAT_KIND_LOGIN != kind) + return GNUNET_YES; + + ck_assert(kind == GNUNET_CHAT_KIND_LOGIN); + + struct GNUNET_CHAT_Lobby *lobby = GNUNET_CHAT_lobby_open( + handle, + GNUNET_TIME_relative_get_second_(), + NULL, + NULL + ); + + ck_assert_ptr_ne(lobby, NULL); + + GNUNET_CHAT_lobby_close(lobby); + GNUNET_CHAT_disconnect(handle); + + ck_assert_int_eq(GNUNET_CHAT_account_delete( + handle, + "gnunet_chat_lobby_base" + ), GNUNET_OK); + + GNUNET_CHAT_stop(handle); + + return GNUNET_YES; +} + +void +call_gnunet_chat_lobby_base(const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + static struct GNUNET_CHAT_Handle *handle = NULL; + handle = GNUNET_CHAT_start(cfg, on_gnunet_chat_lobby_base_msg, &handle); + + ck_assert_ptr_ne(handle, NULL); + ck_assert_int_eq(GNUNET_CHAT_account_create( + handle, + "gnunet_chat_lobby_base" + ), GNUNET_OK); +} + +CREATE_GNUNET_TEST(test_gnunet_chat_lobby_base, call_gnunet_chat_lobby_base) + +int +on_gnunet_chat_lobby_join_it(void *cls, + const struct GNUNET_CHAT_Handle *handle, + struct GNUNET_CHAT_Account *account) +{ + struct GNUNET_CHAT_Handle *chat = (struct GNUNET_CHAT_Handle*) cls; + + ck_assert_ptr_ne(chat, NULL); + ck_assert_ptr_eq(handle, chat); + ck_assert_ptr_ne(account, NULL); + + const char *name = GNUNET_CHAT_account_get_name(account); + + ck_assert_ptr_ne(name, NULL); + ck_assert_ptr_eq(GNUNET_CHAT_get_connected(handle), NULL); + + if (0 == strcmp(name, "gnunet_chat_lobby_join")) + { + GNUNET_CHAT_connect(chat, account); + return GNUNET_NO; + } + + return GNUNET_YES; +} + +void +on_gnunet_chat_lobby_join_task(void *cls) +{ + struct GNUNET_CHAT_Handle *chat = (struct GNUNET_CHAT_Handle*) cls; + + ck_assert_ptr_ne(chat, NULL); + + GNUNET_CHAT_disconnect(chat); + + ck_assert_int_eq(GNUNET_CHAT_account_delete( + chat, + "gnunet_chat_lobby_join" + ), GNUNET_OK); + + GNUNET_CHAT_stop(chat); +} + +void +on_gnunet_chat_lobby_join_open(void *cls, + const struct GNUNET_CHAT_Uri *uri) +{ + struct GNUNET_CHAT_Handle *chat = (struct GNUNET_CHAT_Handle*) cls; + + ck_assert_ptr_ne(chat, NULL); + ck_assert_ptr_ne(uri, NULL); + + GNUNET_CHAT_lobby_join(chat, uri); + + GNUNET_SCHEDULER_add_now( + on_gnunet_chat_lobby_join_task, + chat + ); +} + +int +on_gnunet_chat_lobby_join_msg(void *cls, + struct GNUNET_CHAT_Context *context, + const struct GNUNET_CHAT_Message *message) +{ + struct GNUNET_CHAT_Handle *handle = *( + (struct GNUNET_CHAT_Handle**) cls + ); + + ck_assert_ptr_ne(handle, NULL); + ck_assert_ptr_ne(message, NULL); + + enum GNUNET_CHAT_MessageKind kind = GNUNET_CHAT_message_get_kind(message); + + if ((kind != GNUNET_CHAT_KIND_REFRESH) || + (GNUNET_CHAT_get_connected(handle))) + goto skip_search_account; + + ck_assert(kind == GNUNET_CHAT_KIND_REFRESH); + ck_assert_ptr_eq(context, NULL); + + GNUNET_CHAT_iterate_accounts( + handle, + on_gnunet_chat_lobby_join_it, + handle + ); + + if (!GNUNET_CHAT_get_connected(handle)) + return GNUNET_YES; + +skip_search_account: + if (GNUNET_CHAT_KIND_LOGIN != kind) + return GNUNET_YES; + + ck_assert(kind == GNUNET_CHAT_KIND_LOGIN); + ck_assert_ptr_eq(context, NULL); + + struct GNUNET_CHAT_Lobby *lobby = GNUNET_CHAT_lobby_open( + handle, + GNUNET_TIME_relative_get_second_(), + on_gnunet_chat_lobby_join_open, + handle + ); + + ck_assert_ptr_ne(lobby, NULL); + return GNUNET_YES; +} + +void +call_gnunet_chat_lobby_join(const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + static struct GNUNET_CHAT_Handle *handle = NULL; + handle = GNUNET_CHAT_start(cfg, on_gnunet_chat_lobby_join_msg, &handle); + + ck_assert_ptr_ne(handle, NULL); + ck_assert_int_eq(GNUNET_CHAT_account_create( + handle, + "gnunet_chat_lobby_join" + ), GNUNET_OK); +} + +CREATE_GNUNET_TEST(test_gnunet_chat_lobby_join, call_gnunet_chat_lobby_join) + +START_SUITE(handle_suite, "Lobby") +ADD_TEST_TO_SUITE(test_gnunet_chat_lobby_base, "Open/Close") +ADD_TEST_TO_SUITE(test_gnunet_chat_lobby_join, "Join") +END_SUITE + +MAIN_SUITE(handle_suite, CK_NORMAL) |