@@ -247,4 +247,79 @@ describe('GDBTargetDebugTracker', () => {
247247
248248 } ) ;
249249
250+ describe ( 'refresh timer management' , ( ) => {
251+ let adapterFactory : vscode . DebugAdapterTrackerFactory | undefined ;
252+ let gdbSession : GDBTargetDebugSession | undefined = undefined ;
253+ let tracker : vscode . DebugAdapterTracker | undefined | null = undefined ;
254+
255+ beforeEach ( async ( ) => {
256+ adapterFactory = undefined ;
257+ gdbSession = undefined ;
258+ tracker = undefined ;
259+ ( vscode . debug . registerDebugAdapterTrackerFactory as jest . Mock ) . mockImplementation ( ( _debugType : string , factory : vscode . DebugAdapterTrackerFactory ) : vscode . Disposable => {
260+ adapterFactory = factory ;
261+ return { dispose : jest . fn ( ) } ;
262+ } ) ;
263+ debugTracker . activate ( contextMock ) ;
264+
265+ debugTracker . onWillStartSession ( session => gdbSession = session ) ;
266+ tracker = await adapterFactory ! . createDebugAdapterTracker ( debugSessionFactory ( debugConfigurationFactory ( ) ) ) ;
267+ tracker ! . onWillStartSession ! ( ) ;
268+ // Enable refresh timer
269+ gdbSession ! . refreshTimer . enabled = true ;
270+ } ) ;
271+
272+ const sendContinueEvent = ( ) => {
273+ // Send continued event
274+ const continuedEvent : DebugProtocol . ContinuedEvent = {
275+ event : 'continued' ,
276+ type : 'event' ,
277+ seq : 1 ,
278+ body : {
279+ threadId : 1
280+ }
281+ } ;
282+ tracker ! . onDidSendMessage ! ( continuedEvent ) ;
283+ } ;
284+
285+ const sendStoppedEvent = ( ) => {
286+ // Send stopped event
287+ const stoppedEvent : DebugProtocol . StoppedEvent = {
288+ event : 'stopped' ,
289+ type : 'event' ,
290+ seq : 1 ,
291+ body : {
292+ reason : 'step'
293+ }
294+ } ;
295+ tracker ! . onDidSendMessage ! ( stoppedEvent ) ;
296+ } ;
297+
298+ it . each ( [
299+ { eventName : 'stopped' , eventData : { event : 'stopped' , type : 'event' , seq : 1 , body : { reason : 'step' } } } ,
300+ { eventName : 'terminated' , eventData : { event : 'terminated' , type : 'event' , seq : 1 , body : { } } } , // Does't pass optional 'restart' property
301+ { eventName : 'exited' , eventData : { event : 'exited' , type : 'event' , seq : 1 , body : { exitCode : 0 } } } ,
302+ ] ) ( 'starts refresh timer on session continued event, and stops on $eventName event' , async ( { eventData } ) => {
303+ expect ( gdbSession ) . toBeDefined ( ) ;
304+ sendContinueEvent ( ) ;
305+ expect ( gdbSession ! . refreshTimer . isRunning ) . toBe ( true ) ;
306+ // Send event supposed to stop the timer
307+ tracker ! . onDidSendMessage ! ( eventData ) ;
308+ expect ( gdbSession ! . refreshTimer . isRunning ) . toBe ( false ) ;
309+ } ) ;
310+
311+ it . each ( [
312+ { requestName : 'next' , requestArguments : { command : 'next' , type : 'request' , seq : 1 , arguments : { threadId : 1 } } } ,
313+ { requestName : 'stepIn' , requestArguments : { command : 'stepIn' , type : 'request' , seq : 1 , arguments : { threadId : 1 } } } ,
314+ { requestName : 'stepOut' , requestArguments : { command : 'stepOut' , type : 'request' , seq : 1 , arguments : { threadId : 1 } } } ,
315+ ] ) ( 'starts refresh timer on $requestName request, and stops on stoppedEvent' , async ( { requestArguments } ) => {
316+ expect ( gdbSession ) . toBeDefined ( ) ;
317+ tracker ! . onWillReceiveMessage ! ( requestArguments ) ;
318+ expect ( gdbSession ! . refreshTimer . isRunning ) . toBe ( true ) ;
319+ // Send event supposed to stop the timer
320+ sendStoppedEvent ( ) ;
321+ expect ( gdbSession ! . refreshTimer . isRunning ) . toBe ( false ) ;
322+ } ) ;
323+ } ) ;
324+
250325} ) ;
0 commit comments