@@ -298,6 +298,35 @@ describe('CfnLintService', () => {
298298
299299 await expect ( service . mountFolder ( mockWorkspaceFolder ) ) . rejects . toThrow ( 'Failed to mount directory' ) ;
300300 } ) ;
301+
302+ test ( 'should not mount folder twice' , async ( ) => {
303+ await service . initialize ( ) ;
304+
305+ // Mount folder first time
306+ await service . mountFolder ( mockWorkspaceFolder ) ;
307+ expect ( mockWorkerManager . mountFolder . callCount ) . toBe ( 1 ) ;
308+
309+ // Mount same folder again - should not call worker
310+ await service . mountFolder ( mockWorkspaceFolder ) ;
311+ expect ( mockWorkerManager . mountFolder . callCount ) . toBe ( 1 ) ;
312+ } ) ;
313+
314+ test ( 'should remount folders after worker recovery' , async ( ) => {
315+ await service . initialize ( ) ;
316+ await service . mountFolder ( mockWorkspaceFolder ) ;
317+ expect ( mockWorkerManager . mountFolder . callCount ) . toBe ( 1 ) ;
318+
319+ // Simulate worker crash - this sets status to uninitialized
320+ mockWorkerManager . lintTemplate . rejects ( new Error ( 'Worker crashed' ) ) ;
321+ await service . lintDelayed ( mockTemplate , mockUri , LintTrigger . OnSave ) ;
322+
323+ // Reset mock to succeed and trigger recovery
324+ mockWorkerManager . lintTemplate . resolves ( [ ] ) ;
325+ await service . lintDelayed ( mockTemplate , mockUri , LintTrigger . OnSave ) ;
326+
327+ // Should have remounted during recovery
328+ expect ( mockWorkerManager . mountFolder . callCount ) . toBe ( 2 ) ;
329+ } ) ;
301330 } ) ;
302331
303332 describe ( 'lint' , ( ) => {
@@ -352,6 +381,7 @@ describe('CfnLintService', () => {
352381 await service . lint ( mockTemplate , mockUri ) ;
353382
354383 expect ( mockComponents . workspace . getWorkspaceFolder . calledWith ( mockUri ) ) . toBe ( true ) ;
384+ expect ( mockWorkerManager . mountFolder . calledWith ( '/path/to/workspace/project' , '/project' ) ) . toBe ( true ) ;
355385 expect (
356386 mockWorkerManager . lintFile . calledWith (
357387 '/project/template.yaml' ,
@@ -376,6 +406,30 @@ describe('CfnLintService', () => {
376406 ) . toBe ( true ) ;
377407 } ) ;
378408
409+ test ( 'should handle worker crash during standalone linting' , async ( ) => {
410+ mockComponents . workspace . getWorkspaceFolder . returns ( undefined ) ;
411+ mockWorkerManager . lintTemplate . rejects ( new Error ( 'Worker exited unexpectedly with code 1' ) ) ;
412+
413+ await service . lint ( mockTemplate , mockUri ) ;
414+
415+ // Should publish empty diagnostics and not crash
416+ expect ( mockComponents . diagnosticCoordinator . publishDiagnostics . called ) . toBe ( true ) ;
417+ // Service should be marked as uninitialized for recovery
418+ expect ( service . isInitialized ( ) ) . toBe ( false ) ;
419+ } ) ;
420+
421+ test ( 'should handle worker crash during workspace file linting' , async ( ) => {
422+ mockComponents . workspace . getWorkspaceFolder . returns ( mockWorkspaceFolder ) ;
423+ mockWorkerManager . lintFile . rejects ( new Error ( 'Worker exited unexpectedly with code 1' ) ) ;
424+
425+ await service . lint ( mockTemplate , mockUri ) ;
426+
427+ // Should publish empty diagnostics and not crash
428+ expect ( mockComponents . diagnosticCoordinator . publishDiagnostics . called ) . toBe ( true ) ;
429+ // Service should be marked as uninitialized for recovery
430+ expect ( service . isInitialized ( ) ) . toBe ( false ) ;
431+ } ) ;
432+
379433 test ( 'should handle JSON templates' , async ( ) => {
380434 mockComponents . workspace . getWorkspaceFolder . returns ( undefined ) ;
381435
0 commit comments