libgnunetchat

library for GNUnet Messenger
Log | Files | Refs | README | LICENSE

test_gnunet_chat_discourse_write.c (6251B)


      1 /*
      2    This file is part of GNUnet.
      3    Copyright (C) 2024--2026 GNUnet e.V.
      4 
      5    GNUnet is free software: you can redistribute it and/or modify it
      6    under the terms of the GNU Affero General Public License as published
      7    by the Free Software Foundation, either version 3 of the License,
      8    or (at your option) any later version.
      9 
     10    GNUnet is distributed in the hope that it will be useful, but
     11    WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13    Affero General Public License for more details.
     14 
     15    You should have received a copy of the GNU Affero General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17 
     18    SPDX-License-Identifier: AGPL3.0-or-later
     19  */
     20 /*
     21  * @author Tobias Frisch
     22  * @file test_gnunet_chat_discourse_write.c
     23  */
     24 
     25 #include "test_gnunet_chat.h"
     26 
     27 #define TEST_WRITE_ID        "gnunet_chat_discourse_write"
     28 #define TEST_WRITE_GROUP     "gnunet_chat_discourse_write_group"
     29 #define TEST_WRITE_DISCOURSE "gnunet_chat_discourse_write_discourse"
     30 #define TEST_WRITE_SECRET    "test_secret_discourse_write"
     31 
     32 enum GNUNET_GenericReturnValue
     33 on_gnunet_chat_discourse_write_msg(void *cls,
     34                                   struct GNUNET_CHAT_Context *context,
     35                                   struct GNUNET_CHAT_Message *message)
     36 {
     37   static unsigned int discourse_stage = 0;
     38 
     39   struct GNUNET_CHAT_Handle *handle = *(
     40       (struct GNUNET_CHAT_Handle**) cls
     41   );
     42 
     43   ck_assert_ptr_nonnull(handle);
     44   ck_assert_ptr_nonnull(message);
     45 
     46   struct GNUNET_CHAT_Account *account;
     47   account = GNUNET_CHAT_message_get_account(message);
     48 
     49   const char *name = GNUNET_CHAT_get_name(handle);
     50   struct GNUNET_CHAT_DiscourseId discourse_id;
     51 
     52   struct GNUNET_CHAT_Group *group;
     53   struct GNUNET_CHAT_Discourse *discourse;
     54   discourse = GNUNET_CHAT_message_get_discourse(message);
     55 
     56   switch (GNUNET_CHAT_message_get_kind(message))
     57   {
     58     case GNUNET_CHAT_KIND_WARNING:
     59       ck_abort_msg("%s\n", GNUNET_CHAT_message_get_text(message));
     60       break;
     61     case GNUNET_CHAT_KIND_REFRESH:
     62       ck_assert_ptr_null(context);
     63       ck_assert_ptr_null(account);
     64 
     65       if (discourse_stage == 0)
     66       {
     67         account = GNUNET_CHAT_find_account(handle, TEST_WRITE_ID);
     68 
     69         ck_assert_ptr_nonnull(account);
     70 
     71         GNUNET_CHAT_connect(
     72           handle,
     73           account,
     74           TEST_WRITE_SECRET,
     75           strlen(TEST_WRITE_SECRET)
     76         );
     77 
     78         discourse_stage = 1;
     79       }
     80 
     81       break;
     82     case GNUNET_CHAT_KIND_LOGIN:
     83       ck_assert_ptr_null(context);
     84       ck_assert_ptr_nonnull(account);
     85       ck_assert_ptr_nonnull(name);
     86       ck_assert_str_eq(name, TEST_WRITE_ID);
     87       ck_assert_uint_eq(discourse_stage, 1);
     88 
     89       group = GNUNET_CHAT_group_create(handle, TEST_WRITE_GROUP);
     90 
     91       ck_assert_ptr_nonnull(group);
     92 
     93       discourse_stage = 2;
     94       break;
     95     case GNUNET_CHAT_KIND_LOGOUT:
     96       ck_assert_ptr_null(context);
     97       ck_assert_ptr_nonnull(account);
     98       ck_assert_uint_eq(discourse_stage, 7);
     99 
    100       GNUNET_CHAT_stop(handle);
    101       break;
    102     case GNUNET_CHAT_KIND_UPDATE_ACCOUNT:
    103       break;
    104     case GNUNET_CHAT_KIND_UPDATE_CONTEXT:
    105       break;
    106     case GNUNET_CHAT_KIND_JOIN:
    107       ck_assert_ptr_nonnull(context);
    108       ck_assert_ptr_null(discourse);
    109       ck_assert_uint_eq(discourse_stage, 2);
    110 
    111       GNUNET_memcpy(
    112         &discourse_id,
    113         TEST_WRITE_DISCOURSE,
    114         sizeof(discourse_id)
    115       );
    116 
    117       discourse = GNUNET_CHAT_context_open_discourse(
    118         context,
    119         &discourse_id
    120       );
    121 
    122       ck_assert_ptr_nonnull(discourse);
    123       ck_assert_int_eq(GNUNET_CHAT_discourse_is_open(discourse), GNUNET_NO);
    124 
    125       discourse_stage = 3;
    126       break;
    127     case GNUNET_CHAT_KIND_LEAVE:
    128       ck_assert_ptr_nonnull(context);
    129       ck_assert_ptr_nonnull(account);
    130       ck_assert_uint_eq(discourse_stage, 6);
    131 
    132       GNUNET_CHAT_disconnect(handle);
    133 
    134       discourse_stage = 7;
    135       break;
    136     case GNUNET_CHAT_KIND_CONTACT:
    137       break;
    138     case GNUNET_CHAT_KIND_DISCOURSE:
    139       ck_assert_ptr_nonnull(context);
    140       ck_assert_ptr_nonnull(discourse);
    141 
    142       GNUNET_memcpy(
    143         &discourse_id,
    144         TEST_WRITE_DISCOURSE,
    145         sizeof(discourse_id)
    146       );
    147 
    148       if (GNUNET_YES == GNUNET_CHAT_discourse_is_open(discourse))
    149       {
    150         ck_assert_uint_eq(discourse_stage, 3);
    151 
    152         ck_assert_int_eq(
    153           GNUNET_CHAT_discourse_write(
    154             discourse,
    155             (const char*) &discourse_id,
    156             sizeof(discourse_id)
    157           ),
    158           GNUNET_OK
    159         );
    160 
    161         discourse_stage = 4;
    162       }
    163       else
    164       {
    165         ck_assert_uint_eq(discourse_stage, 5);
    166 
    167         group = GNUNET_CHAT_context_get_group(context);
    168 
    169         ck_assert_ptr_nonnull(group);
    170 
    171         ck_assert_int_eq(
    172           GNUNET_CHAT_group_leave(group),
    173           GNUNET_OK
    174         );
    175 
    176         discourse_stage = 6;
    177       }
    178 
    179       break;
    180     case GNUNET_CHAT_KIND_DATA:
    181       ck_assert_ptr_nonnull(context);
    182       ck_assert_ptr_nonnull(discourse);
    183       ck_assert_uint_eq(discourse_stage, 4);
    184 
    185       ck_assert_uint_eq(
    186         GNUNET_CHAT_message_available(message),
    187         sizeof(discourse_id)
    188       );
    189 
    190       ck_assert_int_eq(
    191         GNUNET_CHAT_message_read(
    192           message,
    193           (char*) &discourse_id,
    194           sizeof(discourse_id)
    195         ),
    196         GNUNET_OK
    197       );
    198 
    199       ck_assert_mem_eq(
    200         &discourse_id,
    201         TEST_WRITE_DISCOURSE,
    202         sizeof(discourse_id)
    203       );
    204 
    205       GNUNET_CHAT_discourse_close(discourse);
    206       discourse_stage = 5;
    207       break;
    208     default:
    209       ck_abort_msg("%d\n", GNUNET_CHAT_message_get_kind(message));
    210       ck_abort();
    211       break;
    212   }
    213 
    214   return GNUNET_YES;
    215 }
    216 
    217 REQUIRE_GNUNET_CHAT_ACCOUNT(gnunet_chat_discourse_write, TEST_WRITE_ID)
    218 
    219 void
    220 call_gnunet_chat_discourse_write(const struct GNUNET_CONFIGURATION_Handle *cfg)
    221 {
    222   static struct GNUNET_CHAT_Handle *handle = NULL;
    223   handle = GNUNET_CHAT_start(cfg, on_gnunet_chat_discourse_write_msg, &handle);
    224 
    225   ck_assert_ptr_nonnull(handle);
    226 }
    227 
    228 CREATE_GNUNET_TEST(test_gnunet_chat_discourse_write, gnunet_chat_discourse_write)
    229 
    230 START_SUITE(handle_suite, "Handle")
    231 ADD_TEST_TO_SUITE(test_gnunet_chat_discourse_write, "Talk")
    232 END_SUITE
    233 
    234 MAIN_SUITE(handle_suite, CK_NORMAL)