27
27
#include "fhss_stub.h"
28
28
#include "fhss_callbacks_stub.h"
29
29
#include "fhss_platform_stub.h"
30
+ #include "channel_functions_stub.h"
30
31
#include "common_functions_stub.h"
31
32
32
33
#define VENDOR_CHANNEL 89
33
34
#define DEFAULT_CHANNEL 99
34
35
#define DEFAULT_PANID 0xabcd
35
36
#define DEFAULT_FRAME_TYPE FHSS_DATA_FRAME
36
37
#define DEFAULT_FHSS_STATE FHSS_SYNCHRONIZED
37
- #define DEFAULT_TX_TIME 0
38
+ #define DEFAULT_TX_TIME 1000000
38
39
#define DEFAULT_TIMER_DELAY 0
39
40
#define DEFAULT_FRAME_LENGTH 100
40
41
#define DEFAULT_PHY_HEAD_LENGTH 10
@@ -54,6 +55,11 @@ static int32_t app_channel_function(const fhss_api_t *api, uint16_t slot, uint8_
54
55
return VENDOR_CHANNEL ;
55
56
}
56
57
58
+ static fhss_ws_neighbor_timing_info_t * app_no_neighbor_info (const fhss_api_t * api , uint8_t eui64 [8 ])
59
+ {
60
+ return NULL ;
61
+ }
62
+
57
63
static fhss_ws_neighbor_timing_info_t * app_get_neighbor_info (const fhss_api_t * api , uint8_t eui64 [8 ])
58
64
{
59
65
return & neighbor_info ;
@@ -85,6 +91,10 @@ static fhss_api_t *test_generate_fhss_api(void)
85
91
memset (& ws , 0 , sizeof (fhss_ws_t ));
86
92
memset (& fhss_callbacks_stub , 0 , sizeof (fhss_callbacks_stub_def ));
87
93
memset (& fhss_common_stub , 0 , sizeof (fhss_common_stub_def ));
94
+ neighbor_info .uc_timing_info .ufsi = 1000000 ;
95
+ neighbor_info .uc_timing_info .unicast_channel_function = WS_TR51CF ;
96
+ neighbor_info .uc_timing_info .unicast_dwell_interval = 200 ;
97
+ neighbor_info .uc_timing_info .utt_rx_timestamp = 100000 ;
88
98
fhss_common_stub .fhss_struct .fhss_api = & fhss_api ;
89
99
fhss_common_stub .fhss_struct .ws = & ws ;
90
100
fhss_common_stub .fhss_struct .ws -> fhss_configuration .fhss_uc_dwell_interval = 200 ;
@@ -170,17 +180,53 @@ bool test_fhss_ws_tx_handle_callback()
170
180
if (fhss_common_stub .fhss_struct .fhss_api -> tx_handle (api , true, dest_address , DEFAULT_FRAME_TYPE , DEFAULT_FRAME_LENGTH , DEFAULT_PHY_HEAD_LENGTH , DEFAULT_PHY_TAIL_LENGTH , DEFAULT_TX_TIME ) != 0 ) {
171
181
return false;
172
182
}
173
- // Test fixed channel
183
+ // Test when no neighbor info found
174
184
fhss_common_stub .fhss_struct .fhss_state = DEFAULT_FHSS_STATE ;
185
+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .get_neighbor_info = & app_no_neighbor_info ;
186
+ if (fhss_common_stub .fhss_struct .fhss_api -> tx_handle (api , DEFAULT_IS_BC_DEST , dest_address , DEFAULT_FRAME_TYPE , DEFAULT_FRAME_LENGTH , DEFAULT_PHY_HEAD_LENGTH , DEFAULT_PHY_TAIL_LENGTH , DEFAULT_TX_TIME ) != -1 ) {
187
+ return false;
188
+ }
189
+ // Test fixed channel
190
+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .get_neighbor_info = & app_get_neighbor_info ;
175
191
fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_channel_function = WS_FIXED_CHANNEL ;
176
192
if (fhss_common_stub .fhss_struct .fhss_api -> tx_handle (api , DEFAULT_IS_BC_DEST , dest_address , DEFAULT_FRAME_TYPE , DEFAULT_FRAME_LENGTH , DEFAULT_PHY_HEAD_LENGTH , DEFAULT_PHY_TAIL_LENGTH , DEFAULT_TX_TIME ) != -1 ) {
177
193
return false;
178
194
}
179
- // Test TR51 channel function
195
+ /* Test TR51 channel function
196
+ * Dest. slot: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
197
+ * |dest. ufsi| 900ms |
198
+ * timestamps: 100000us| 1000000us|
199
+ */
180
200
fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_channel_function = WS_TR51CF ;
181
- if (fhss_common_stub .fhss_struct .fhss_api -> tx_handle (api , DEFAULT_IS_BC_DEST , dest_address , DEFAULT_FRAME_TYPE , DEFAULT_FRAME_LENGTH , DEFAULT_PHY_HEAD_LENGTH , DEFAULT_PHY_TAIL_LENGTH , DEFAULT_TX_TIME ) != 0 ) {
201
+ if ((fhss_common_stub .fhss_struct .fhss_api -> tx_handle (api , DEFAULT_IS_BC_DEST , dest_address , DEFAULT_FRAME_TYPE , DEFAULT_FRAME_LENGTH , DEFAULT_PHY_HEAD_LENGTH , DEFAULT_PHY_TAIL_LENGTH , DEFAULT_TX_TIME ) != 0 )
202
+ || (channel_functions_stub .uint8_value != 7 )) {
182
203
return false;
183
204
}
205
+ /* Test TR51 channel function when timestamp overflows
206
+ * Dest. slot: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
207
+ * |dest. ufsi| 1000ms |
208
+ * timestamps: 4294867000us| 900000us|
209
+ */
210
+ neighbor_info .uc_timing_info .utt_rx_timestamp = 4294867000 ;
211
+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_channel_function = WS_TR51CF ;
212
+ if ((fhss_common_stub .fhss_struct .fhss_api -> tx_handle (api , DEFAULT_IS_BC_DEST , dest_address , DEFAULT_FRAME_TYPE , DEFAULT_FRAME_LENGTH , DEFAULT_PHY_HEAD_LENGTH , DEFAULT_PHY_TAIL_LENGTH , 900000 ) != 0 )
213
+ || (channel_functions_stub .uint8_value != 7 )) {
214
+ return false;
215
+ }
216
+ /* Test TR51 channel function when channel list overflows
217
+ * Dest. slot: | 0 | 1 | 2 | 3 |...| 0 | 1 | 2 | 3 |
218
+ * |dest. ufsi| 10000ms |
219
+ * timestamps: 100000us| 10100000us|
220
+ */
221
+ neighbor_info .uc_timing_info .utt_rx_timestamp = 100000 ;
222
+ uint32_t tx_time = neighbor_info .uc_timing_info .utt_rx_timestamp + (fhss_common_stub .fhss_struct .number_of_channels * neighbor_info .uc_timing_info .unicast_dwell_interval * 1000 );
223
+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_channel_function = WS_TR51CF ;
224
+ if ((fhss_common_stub .fhss_struct .fhss_api -> tx_handle (api , DEFAULT_IS_BC_DEST , dest_address , DEFAULT_FRAME_TYPE , DEFAULT_FRAME_LENGTH , DEFAULT_PHY_HEAD_LENGTH , DEFAULT_PHY_TAIL_LENGTH , tx_time ) != 0 )
225
+ || (channel_functions_stub .uint8_value != 2 )) {
226
+ return false;
227
+ }
228
+ // For more coverage, set neighbor info NULL
229
+ memset (& neighbor_info , 0 , sizeof (fhss_ws_neighbor_timing_info_t ));
184
230
// Test direct hash channel function
185
231
fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_channel_function = WS_DH1CF ;
186
232
if (fhss_common_stub .fhss_struct .fhss_api -> tx_handle (api , DEFAULT_IS_BC_DEST , dest_address , DEFAULT_FRAME_TYPE , DEFAULT_FRAME_LENGTH , DEFAULT_PHY_HEAD_LENGTH , DEFAULT_PHY_TAIL_LENGTH , DEFAULT_TX_TIME ) != 0 ) {
@@ -418,3 +464,62 @@ bool test_fhss_unicast_handler()
418
464
fhss_common_stub .callback [0 ](fhss_common_stub .fhss_struct .fhss_api , DEFAULT_TIMER_DELAY );
419
465
return true;
420
466
}
467
+
468
+ bool test_fhss_ws_set_parent ()
469
+ {
470
+ uint8_t dest_address [8 ] = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 };
471
+ broadcast_timing_info_t bc_timing_info ;
472
+ memset (& bc_timing_info , 0 , sizeof (broadcast_timing_info_t ));
473
+ fhss_api_t * api = test_generate_fhss_api ();
474
+
475
+ // Test without WS enabled FHSS
476
+ fhss_structure_t fake_fhss_structure ;
477
+ memset (& fake_fhss_structure , 0 , sizeof (fhss_structure_t ));
478
+ if (-1 != fhss_ws_set_parent (& fake_fhss_structure , dest_address , & bc_timing_info )) {
479
+ return false;
480
+ }
481
+ // Test success
482
+ bc_timing_info .broadcast_channel_function = WS_TR51CF ;
483
+ bc_timing_info .broadcast_dwell_interval = 250 ;
484
+ bc_timing_info .broadcast_interval = 1000 ;
485
+ bc_timing_info .broadcast_interval_offset = 2000 ;
486
+ bc_timing_info .broadcast_schedule_id = 1 ;
487
+ bc_timing_info .broadcast_slot = 10 ;
488
+ bc_timing_info .bt_rx_timestamp = 100000 ;
489
+ if (0 != fhss_ws_set_parent (& fhss_common_stub .fhss_struct , dest_address , & bc_timing_info )
490
+ || (fhss_common_stub .fhss_struct .ws -> parent_bc_info -> broadcast_channel_function != WS_TR51CF )
491
+ || (fhss_common_stub .fhss_struct .ws -> parent_bc_info -> broadcast_dwell_interval != 250 )
492
+ || (fhss_common_stub .fhss_struct .ws -> parent_bc_info -> broadcast_interval != 1000 )
493
+ || (fhss_common_stub .fhss_struct .ws -> parent_bc_info -> broadcast_interval_offset != 2000 )
494
+ || (fhss_common_stub .fhss_struct .ws -> parent_bc_info -> broadcast_schedule_id != 1 )
495
+ || (fhss_common_stub .fhss_struct .ws -> parent_bc_info -> broadcast_slot != 10 )
496
+ || (fhss_common_stub .fhss_struct .ws -> parent_bc_info -> bt_rx_timestamp != 100000 )) {
497
+ return false;
498
+ }
499
+ // Test updating value
500
+ bc_timing_info .broadcast_interval_offset = 5000 ;
501
+ if (fhss_common_stub .fhss_struct .ws -> parent_bc_info -> broadcast_interval_offset != 5000 ) {
502
+ return false;
503
+ }
504
+ return true;
505
+ }
506
+
507
+ bool test_fhss_ws_remove_parent ()
508
+ {
509
+ uint8_t dest_address [8 ] = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 };
510
+ fhss_api_t * api = test_generate_fhss_api ();
511
+ broadcast_timing_info_t bc_timing_info ;
512
+ fhss_common_stub .fhss_struct .ws -> parent_bc_info = & bc_timing_info ;
513
+
514
+ // Test without WS enabled FHSS
515
+ fhss_structure_t fake_fhss_structure ;
516
+ memset (& fake_fhss_structure , 0 , sizeof (fhss_structure_t ));
517
+ if (-1 != fhss_ws_remove_parent (& fake_fhss_structure , dest_address )) {
518
+ return false;
519
+ }
520
+ // Test success
521
+ if ((0 != fhss_ws_remove_parent (& fhss_common_stub .fhss_struct , dest_address )) || (fhss_common_stub .fhss_struct .ws -> parent_bc_info != NULL )) {
522
+ return false;
523
+ }
524
+ return true;
525
+ }
0 commit comments