@@ -26,6 +26,7 @@ CREATE_FLAG(flag_discovered);
2626CREATE_FLAG (flag_codec_found );
2727CREATE_FLAG (flag_endpoint_found );
2828CREATE_FLAG (flag_started );
29+ CREATE_FLAG (flag_start_timeout );
2930CREATE_FLAG (flag_updated );
3031CREATE_FLAG (flag_stopped );
3132CREATE_FLAG (flag_mtu_exchanged );
@@ -114,13 +115,13 @@ static void cap_discovery_complete_cb(struct bt_conn *conn, int err,
114115static void unicast_start_complete_cb (struct bt_bap_unicast_group * unicast_group , int err ,
115116 struct bt_conn * conn )
116117{
117- if (err != 0 ) {
118+ if (err == - ECANCELED ) {
119+ SET_FLAG (flag_start_timeout );
120+ } else if (err != 0 ) {
118121 FAIL ("Failed to start (failing conn %p): %d" , conn , err );
119-
120- return ;
122+ } else {
123+ SET_FLAG ( flag_started ) ;
121124 }
122-
123- SET_FLAG (flag_started );
124125}
125126
126127static void unicast_update_complete_cb (int err , struct bt_conn * conn )
@@ -469,7 +470,7 @@ static void unicast_audio_start_inval(struct bt_bap_unicast_group *unicast_group
469470 }
470471}
471472
472- static void unicast_audio_start (struct bt_bap_unicast_group * unicast_group )
473+ static void unicast_audio_start (struct bt_bap_unicast_group * unicast_group , bool wait )
473474{
474475 struct bt_cap_unicast_audio_start_stream_param stream_param [1 ];
475476 struct bt_cap_unicast_audio_start_param param ;
@@ -492,7 +493,9 @@ static void unicast_audio_start(struct bt_bap_unicast_group *unicast_group)
492493 return ;
493494 }
494495
495- WAIT_FOR_FLAG (flag_started );
496+ if (wait ) {
497+ WAIT_FOR_FLAG (flag_started );
498+ }
496499}
497500
498501static void unicast_audio_update_inval (void )
@@ -584,6 +587,17 @@ static void unicast_audio_stop(struct bt_bap_unicast_group *unicast_group)
584587 }
585588}
586589
590+ static void unicast_audio_cancel (void )
591+ {
592+ int err ;
593+
594+ err = bt_cap_initiator_unicast_audio_cancel ();
595+ if (err != 0 ) {
596+ FAIL ("Failed to cancel unicast audio: %d\n" , err );
597+ return ;
598+ }
599+ }
600+
587601static void unicast_group_delete_inval (void )
588602{
589603 int err ;
@@ -635,7 +649,7 @@ static void test_main_cap_initiator_unicast(void)
635649
636650 for (size_t j = 0U ; j < iterations ; j ++ ) {
637651 unicast_audio_start_inval (unicast_group );
638- unicast_audio_start (unicast_group );
652+ unicast_audio_start (unicast_group , true );
639653
640654 unicast_audio_update_inval ();
641655 unicast_audio_update ();
@@ -652,13 +666,58 @@ static void test_main_cap_initiator_unicast(void)
652666 PASS ("CAP initiator unicast passed\n" );
653667}
654668
669+ static void test_cap_initiator_unicast_timeout (void )
670+ {
671+ struct bt_bap_unicast_group * unicast_group ;
672+ const k_timeout_t timeout = K_SECONDS (1 );
673+ const size_t iterations = 2 ;
674+
675+ init ();
676+
677+ scan_and_connect ();
678+
679+ WAIT_FOR_FLAG (flag_mtu_exchanged );
680+
681+ discover_cas ();
682+
683+ discover_sink ();
684+
685+ unicast_group_create (& unicast_group );
686+
687+ for (size_t j = 0U ; j < iterations ; j ++ ) {
688+ unicast_audio_start (unicast_group , false);
689+
690+ k_sleep (timeout );
691+ if ((bool )atomic_get (& flag_started )) {
692+ FAIL ("Unexpected start complete\n" );
693+ } else {
694+ unicast_audio_cancel ();
695+ }
696+
697+ WAIT_FOR_FLAG (flag_start_timeout );
698+
699+ unicast_audio_stop (unicast_group );
700+ }
701+
702+ unicast_group_delete (unicast_group );
703+ unicast_group = NULL ;
704+
705+ PASS ("CAP initiator unicast passed\n" );
706+ }
707+
655708static const struct bst_test_instance test_cap_initiator_unicast [] = {
656709 {
657710 .test_id = "cap_initiator_unicast" ,
658711 .test_post_init_f = test_init ,
659712 .test_tick_f = test_tick ,
660713 .test_main_f = test_main_cap_initiator_unicast ,
661714 },
715+ {
716+ .test_id = "cap_initiator_unicast_timeout" ,
717+ .test_post_init_f = test_init ,
718+ .test_tick_f = test_tick ,
719+ .test_main_f = test_cap_initiator_unicast_timeout ,
720+ },
662721 BSTEST_END_MARKER ,
663722};
664723
0 commit comments