2222import java .util .Arrays ;
2323import java .util .List ;
2424import java .util .concurrent .CountDownLatch ;
25+ import java .util .concurrent .TimeUnit ;
2526
2627import dev .onvoid .webrtc .media .audio .AudioOptions ;
2728import dev .onvoid .webrtc .media .audio .AudioTrack ;
@@ -67,6 +68,10 @@ List<String> getToneBuffers() {
6768 void waitUntilCompleted () throws InterruptedException {
6869 completedLatch .await ();
6970 }
71+
72+ boolean awaitCompletion () throws InterruptedException {
73+ return completedLatch .await (1 , TimeUnit .SECONDS );
74+ }
7075 }
7176
7277 TestPeerConnection caller ;
@@ -124,28 +129,29 @@ void insertDtmf() {
124129 }
125130
126131 @ Test
127- void getTones () {
128- dtmfSender .insertDtmf ("123" , 100 , 70 );
129- assertEquals ("123" , dtmfSender .tones ());
132+ void getTones () throws InterruptedException {
133+ insertTones (Arrays .asList ("1" , "2" , "3" ), 100 , 70 );
130134 }
131135
132136 @ Test
133- void getDuration () {
137+ void getDuration () throws InterruptedException {
134138 assertEquals (100 , dtmfSender .duration ()); // Default value
135139
136- assertTrue ( dtmfSender . insertDtmf ( "123 " , 120 , 70 ) );
140+ insertTones ( Arrays . asList ( "1 " , "2" , "3" ), 120 , 70 );
137141 assertEquals (120 , dtmfSender .duration ());
138- assertTrue (dtmfSender .insertDtmf ("456" , 170 , 70 ));
142+
143+ insertTones (Arrays .asList ("4" , "5" , "6" ), 170 , 70 );
139144 assertEquals (170 , dtmfSender .duration ());
140145 }
141146
142147 @ Test
143- void getInterToneGap () {
148+ void getInterToneGap () throws InterruptedException {
144149 assertEquals (50 , dtmfSender .interToneGap ()); // Default value
145150
146- assertTrue ( dtmfSender . insertDtmf ( "123 " , 100 , 70 ) );
151+ insertTones ( Arrays . asList ( "1 " , "2" , "3" ), 100 , 70 );
147152 assertEquals (70 , dtmfSender .interToneGap ());
148- assertTrue (dtmfSender .insertDtmf ("456" , 100 , 60 ));
153+
154+ insertTones (Arrays .asList ("4" , "5" , "6" ), 100 , 60 );
149155 assertEquals (60 , dtmfSender .interToneGap ());
150156 }
151157
@@ -167,4 +173,25 @@ void registerAndUnregisterObserver() throws InterruptedException {
167173
168174 assertEquals (Arrays .asList ("1" , "2" , "3" , null ), observer .getTones ()); // No new events
169175 }
170- }
176+
177+ private void insertTones (List <String > tones , int duration , int interToneGap ) throws InterruptedException {
178+ TestDtmfSenderObserver observer = new TestDtmfSenderObserver ();
179+
180+ dtmfSender .registerObserver (observer );
181+ assertTrue (dtmfSender .insertDtmf (String .join ("" , tones ), duration , interToneGap ));
182+
183+ // Wait until the DTMF sequence completes (observer receives null/empty tone).
184+ assertTrue (observer .awaitCompletion (),
185+ "Timed out waiting for DTMF sequence to complete" );
186+
187+ // All tones should have been delivered to the observer in order, followed by null.
188+ List <String > expectedTones = new ArrayList <>(tones );
189+ expectedTones .add (null );
190+ assertEquals (expectedTones , observer .getTones ());
191+
192+ // After completion, the internal tone buffer should be empty.
193+ assertNull (dtmfSender .tones ());
194+
195+ dtmfSender .unregisterObserver ();
196+ }
197+ }
0 commit comments