10
10
#include "../toxcore/tox.h"
11
11
#include "../toxcore/util.h"
12
12
#include "../testing/misc_tools.h"
13
+
13
14
#include "auto_test_support.h"
14
15
#include "check_compat.h"
15
16
16
- #define FR_MESSAGE "Gentoo"
17
+ #define REQUEST_MESSAGE "Hello, I would like to be your friend. Please respond."
18
+
19
+ typedef struct Callback_Data {
20
+ Tox * tox1 ; // request sender
21
+ Tox * tox2 ; // request receiver
22
+ uint8_t message [TOX_MAX_FRIEND_REQUEST_LENGTH ];
23
+ uint16_t length ;
24
+ } Callback_Data ;
17
25
18
- static void accept_friend_request (const Tox_Event_Friend_Request * event ,
19
- void * userdata )
26
+ static void accept_friend_request (const Tox_Event_Friend_Request * event , void * userdata )
20
27
{
21
- Tox * state_tox = (Tox * )userdata ;
28
+ Callback_Data * cb_data = (Callback_Data * )userdata ;
22
29
23
30
const uint8_t * public_key = tox_event_friend_request_get_public_key (event );
24
31
const uint8_t * data = tox_event_friend_request_get_message (event );
25
32
const size_t length = tox_event_friend_request_get_message_length (event );
26
33
27
- ck_assert_msg (length == sizeof ( FR_MESSAGE ) && memcmp (FR_MESSAGE , data , sizeof ( FR_MESSAGE ) ) == 0 ,
34
+ ck_assert_msg (length == cb_data -> length && memcmp (cb_data -> message , data , cb_data -> length ) == 0 ,
28
35
"unexpected friend request message" );
29
- tox_friend_add_norequest (state_tox , public_key , nullptr );
36
+
37
+ fprintf (stderr , "Tox2 accepts friend request.\n" );
38
+
39
+ Tox_Err_Friend_Add err ;
40
+ tox_friend_add_norequest (cb_data -> tox2 , public_key , & err );
41
+
42
+ ck_assert_msg (err == TOX_ERR_FRIEND_ADD_OK , "tox_friend_add_norequest failed: %d" , err );
30
43
}
31
44
32
- static void iterate2_wait (const Tox_Dispatch * dispatch , Tox * tox1 , Tox * tox2 )
45
+ static void iterate2_wait (const Tox_Dispatch * dispatch , Callback_Data * cb_data )
33
46
{
34
47
Tox_Err_Events_Iterate err ;
35
48
Tox_Events * events ;
36
49
37
- events = tox_events_iterate (tox1 , true, & err );
50
+ events = tox_events_iterate (cb_data -> tox1 , true, & err );
38
51
ck_assert (err == TOX_ERR_EVENTS_ITERATE_OK );
39
- tox_dispatch_invoke (dispatch , events , tox1 );
52
+ tox_dispatch_invoke (dispatch , events , cb_data );
40
53
tox_events_free (events );
41
54
42
- events = tox_events_iterate (tox2 , true, & err );
55
+ events = tox_events_iterate (cb_data -> tox2 , true, & err );
43
56
ck_assert (err == TOX_ERR_EVENTS_ITERATE_OK );
44
- tox_dispatch_invoke (dispatch , events , tox2 );
57
+ tox_dispatch_invoke (dispatch , events , cb_data );
45
58
tox_events_free (events );
46
59
47
60
c_sleep (ITERATION_INTERVAL );
48
61
}
49
62
50
- static void test_friend_request (void )
63
+ static void test_friend_request (const uint8_t * message , uint16_t length )
51
64
{
52
65
printf ("Initialising 2 toxes.\n" );
53
66
uint32_t index [] = { 1 , 2 };
@@ -60,7 +73,7 @@ static void test_friend_request(void)
60
73
tox_events_init (tox1 );
61
74
tox_events_init (tox2 );
62
75
63
- printf ("Bootstrapping tox2 off tox1 .\n" );
76
+ printf ("Bootstrapping Tox2 off Tox1 .\n" );
64
77
uint8_t dht_key [TOX_PUBLIC_KEY_SIZE ];
65
78
tox_self_get_dht_id (tox1 , dht_key );
66
79
const uint16_t dht_port = tox_self_get_udp_port (tox1 , nullptr );
@@ -70,25 +83,36 @@ static void test_friend_request(void)
70
83
Tox_Dispatch * dispatch = tox_dispatch_new (nullptr );
71
84
ck_assert (dispatch != nullptr );
72
85
86
+ Callback_Data cb_data = {nullptr };
87
+ cb_data .tox1 = tox1 ;
88
+ cb_data .tox2 = tox2 ;
89
+
90
+ ck_assert (length <= sizeof (cb_data .message ));
91
+ memcpy (cb_data .message , message , length );
92
+ cb_data .length = length ;
93
+
73
94
do {
74
- iterate2_wait (dispatch , tox1 , tox2 );
95
+ iterate2_wait (dispatch , & cb_data );
75
96
} while (tox_self_get_connection_status (tox1 ) == TOX_CONNECTION_NONE ||
76
97
tox_self_get_connection_status (tox2 ) == TOX_CONNECTION_NONE );
77
98
78
99
printf ("Toxes are online, took %lu seconds.\n" , (unsigned long )(time (nullptr ) - cur_time ));
79
100
const time_t con_time = time (nullptr );
80
101
81
- printf ("Tox1 adds tox2 as friend, tox2 accepts .\n" );
102
+ printf ("Tox1 adds Tox2 as friend. Waiting for Tox2 to accept .\n" );
82
103
tox_events_callback_friend_request (dispatch , accept_friend_request );
83
104
84
105
uint8_t address [TOX_ADDRESS_SIZE ];
85
106
tox_self_get_address (tox2 , address );
86
107
87
- const uint32_t test = tox_friend_add (tox1 , address , (const uint8_t * )FR_MESSAGE , sizeof (FR_MESSAGE ), nullptr );
108
+ Tox_Err_Friend_Add err ;
109
+ const uint32_t test = tox_friend_add (tox1 , address , message , length , & err );
110
+
111
+ ck_assert_msg (err == TOX_ERR_FRIEND_ADD_OK , "tox_friend_add failed: %d" , err );
88
112
ck_assert_msg (test == 0 , "failed to add friend error code: %u" , test );
89
113
90
114
do {
91
- iterate2_wait (dispatch , tox1 , tox2 );
115
+ iterate2_wait (dispatch , & cb_data );
92
116
} while (tox_friend_get_connection_status (tox1 , 0 , nullptr ) != TOX_CONNECTION_UDP ||
93
117
tox_friend_get_connection_status (tox2 , 0 , nullptr ) != TOX_CONNECTION_UDP );
94
118
@@ -104,6 +128,20 @@ int main(void)
104
128
{
105
129
setvbuf (stdout , nullptr , _IONBF , 0 );
106
130
107
- test_friend_request ();
131
+ fprintf (stderr , "Testing friend request with the smallest allowed message length.\n" );
132
+ test_friend_request ((const uint8_t * )"a" , 1 );
133
+
134
+ fprintf (stderr , "Testing friend request with an average sized message length.\n" );
135
+ test_friend_request ((const uint8_t * )REQUEST_MESSAGE , sizeof (REQUEST_MESSAGE ) - 1 );
136
+
137
+ uint8_t long_message [TOX_MAX_FRIEND_REQUEST_LENGTH ];
138
+
139
+ for (uint16_t i = 0 ; i < sizeof (long_message ); ++ i ) {
140
+ long_message [i ] = 'a' ;
141
+ }
142
+
143
+ fprintf (stderr , "Testing friend request with the largest allowed message length.\n" );
144
+ test_friend_request (long_message , sizeof (long_message ));
145
+
108
146
return 0 ;
109
147
}
0 commit comments