2727#include "fhss_stub.h"
2828#include "fhss_callbacks_stub.h"
2929#include "fhss_platform_stub.h"
30+ #include "channel_functions_stub.h"
3031#include "common_functions_stub.h"
3132
3233#define VENDOR_CHANNEL 89
3334#define DEFAULT_CHANNEL 99
3435#define DEFAULT_PANID 0xabcd
3536#define DEFAULT_FRAME_TYPE FHSS_DATA_FRAME
3637#define DEFAULT_FHSS_STATE FHSS_SYNCHRONIZED
37- #define DEFAULT_TX_TIME 0
38+ #define DEFAULT_TX_TIME 1000000
3839#define DEFAULT_TIMER_DELAY 0
3940#define DEFAULT_FRAME_LENGTH 100
4041#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_
5455 return VENDOR_CHANNEL ;
5556}
5657
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+
5763static fhss_ws_neighbor_timing_info_t * app_get_neighbor_info (const fhss_api_t * api , uint8_t eui64 [8 ])
5864{
5965 return & neighbor_info ;
@@ -85,6 +91,10 @@ static fhss_api_t *test_generate_fhss_api(void)
8591 memset (& ws , 0 , sizeof (fhss_ws_t ));
8692 memset (& fhss_callbacks_stub , 0 , sizeof (fhss_callbacks_stub_def ));
8793 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 ;
8898 fhss_common_stub .fhss_struct .fhss_api = & fhss_api ;
8999 fhss_common_stub .fhss_struct .ws = & ws ;
90100 fhss_common_stub .fhss_struct .ws -> fhss_configuration .fhss_uc_dwell_interval = 200 ;
@@ -170,17 +180,53 @@ bool test_fhss_ws_tx_handle_callback()
170180 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 ) {
171181 return false;
172182 }
173- // Test fixed channel
183+ // Test when no neighbor info found
174184 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 ;
175191 fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_channel_function = WS_FIXED_CHANNEL ;
176192 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 ) {
177193 return false;
178194 }
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+ */
180200 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 )) {
182203 return false;
183204 }
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 ));
184230 // Test direct hash channel function
185231 fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_channel_function = WS_DH1CF ;
186232 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()
418464 fhss_common_stub .callback [0 ](fhss_common_stub .fhss_struct .fhss_api , DEFAULT_TIMER_DELAY );
419465 return true;
420466}
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