22// Use of this source code is governed by a BSD-style license that can be
33// found in the LICENSE file.
44
5+ import * as Common from '../../core/common/common.js' ;
56import * as Host from '../../core/host/host.js' ;
67import type * as Platform from '../../core/platform/platform.js' ;
78import * as ProjectSettings from '../project_settings/project_settings.js' ;
89
910import * as Persistence from './persistence.js' ;
1011
12+ function createStubInstances (
13+ availability : ProjectSettings . ProjectSettingsModel . ProjectSettingsAvailability ,
14+ projectSettings : ProjectSettings . ProjectSettingsModel . ProjectSettings ,
15+ ) {
16+ const inspectorFrontendHost =
17+ sinon . createStubInstance ( class extends Host . InspectorFrontendHost . InspectorFrontendHostStub {
18+ override events = sinon . createStubInstance ( Common . ObjectWrapper . ObjectWrapper ) ;
19+ } ) ;
20+ inspectorFrontendHost . events = sinon . createStubInstance ( Common . ObjectWrapper . ObjectWrapper ) ;
21+ const projectSettingsModel = sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
22+ sinon . stub ( projectSettingsModel , 'availability' ) . value ( availability ) ;
23+ sinon . stub ( projectSettingsModel , 'projectSettings' ) . value ( projectSettings ) ;
24+ return { inspectorFrontendHost, projectSettingsModel} ;
25+ }
26+
1127describe ( 'Persistence' , ( ) => {
1228 describe ( 'AutomaticFileSystemManager' , ( ) => {
1329 describe ( 'AutomaticFileSystemManager' , ( ) => {
@@ -22,11 +38,7 @@ describe('Persistence', () => {
2238 } ) ;
2339
2440 it ( 'initially doesn\'t report an automatic file system' , ( ) => {
25- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
26- const projectSettingsModel =
27- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
28- sinon . stub ( projectSettingsModel , 'availability' ) . value ( 'available' ) ;
29- sinon . stub ( projectSettingsModel , 'projectSettings' ) . value ( { } ) ;
41+ const { inspectorFrontendHost, projectSettingsModel} = createStubInstances ( 'available' , { } ) ;
3042
3143 const manager = AutomaticFileSystemManager . instance ( {
3244 forceNew : true ,
@@ -40,9 +52,7 @@ describe('Persistence', () => {
4052
4153 it ( 'doesn\'t listen to project settings changes when `devToolsAutomaticFileSystems` is off' , ( ) => {
4254 const hostConfig = { devToolsAutomaticFileSystems : { enabled : false } } ;
43- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
44- const projectSettingsModel =
45- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
55+ const { inspectorFrontendHost, projectSettingsModel} = createStubInstances ( 'available' , { } ) ;
4656
4757 AutomaticFileSystemManager . instance ( {
4858 forceNew : true ,
@@ -54,12 +64,24 @@ describe('Persistence', () => {
5464 sinon . assert . notCalled ( projectSettingsModel . addEventListener ) ;
5565 } ) ;
5666
67+ it ( 'listens to FileSystemRemoved events' , ( ) => {
68+ const { inspectorFrontendHost, projectSettingsModel} = createStubInstances ( 'available' , { } ) ;
69+
70+ const automaticFileSystemManager = AutomaticFileSystemManager . instance ( {
71+ forceNew : true ,
72+ hostConfig,
73+ inspectorFrontendHost,
74+ projectSettingsModel,
75+ } ) ;
76+
77+ sinon . assert . calledOnceWithMatch (
78+ inspectorFrontendHost . events . addEventListener , Host . InspectorFrontendHostAPI . Events . FileSystemRemoved ,
79+ sinon . match . func , automaticFileSystemManager ) ;
80+ } ) ;
81+
5782 it ( 'attempts to automatically connect the file system initially' , ( ) => {
58- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
59- const projectSettingsModel =
60- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
61- sinon . stub ( projectSettingsModel , 'availability' ) . value ( 'available' ) ;
62- sinon . stub ( projectSettingsModel , 'projectSettings' ) . value ( { workspace : { root, uuid} } ) ;
83+ const { inspectorFrontendHost, projectSettingsModel} =
84+ createStubInstances ( 'available' , { workspace : { root, uuid} } ) ;
6385
6486 const manager = AutomaticFileSystemManager . instance ( {
6587 forceNew : true ,
@@ -74,11 +96,8 @@ describe('Persistence', () => {
7496 } ) ;
7597
7698 it ( 'reflects state correctly when automatic connection succeeds' , async ( ) => {
77- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
78- const projectSettingsModel =
79- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
80- sinon . stub ( projectSettingsModel , 'availability' ) . value ( 'available' ) ;
81- sinon . stub ( projectSettingsModel , 'projectSettings' ) . value ( { workspace : { root, uuid} } ) ;
99+ const { inspectorFrontendHost, projectSettingsModel} =
100+ createStubInstances ( 'available' , { workspace : { root, uuid} } ) ;
82101
83102 const manager = AutomaticFileSystemManager . instance ( {
84103 forceNew : true ,
@@ -95,11 +114,8 @@ describe('Persistence', () => {
95114 } ) ;
96115
97116 it ( 'reflects state correctly when automatic connection fails' , async ( ) => {
98- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
99- const projectSettingsModel =
100- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
101- sinon . stub ( projectSettingsModel , 'availability' ) . value ( 'available' ) ;
102- sinon . stub ( projectSettingsModel , 'projectSettings' ) . value ( { workspace : { root, uuid} } ) ;
117+ const { inspectorFrontendHost, projectSettingsModel} =
118+ createStubInstances ( 'available' , { workspace : { root, uuid} } ) ;
103119
104120 const manager = AutomaticFileSystemManager . instance ( {
105121 forceNew : true ,
@@ -116,11 +132,8 @@ describe('Persistence', () => {
116132 } ) ;
117133
118134 it ( 'performs first-time setup of automatic file system correctly' , async ( ) => {
119- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
120- const projectSettingsModel =
121- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
122- sinon . stub ( projectSettingsModel , 'availability' ) . value ( 'available' ) ;
123- sinon . stub ( projectSettingsModel , 'projectSettings' ) . value ( { workspace : { root, uuid} } ) ;
135+ const { inspectorFrontendHost, projectSettingsModel} =
136+ createStubInstances ( 'available' , { workspace : { root, uuid} } ) ;
124137 const manager = AutomaticFileSystemManager . instance ( {
125138 forceNew : true ,
126139 hostConfig,
@@ -147,11 +160,8 @@ describe('Persistence', () => {
147160 } ) ;
148161
149162 it ( 'correctly disconnects automatic file systems' , async ( ) => {
150- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
151- const projectSettingsModel =
152- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
153- sinon . stub ( projectSettingsModel , 'availability' ) . value ( 'available' ) ;
154- sinon . stub ( projectSettingsModel , 'projectSettings' ) . value ( { workspace : { root, uuid} } ) ;
163+ const { inspectorFrontendHost, projectSettingsModel} =
164+ createStubInstances ( 'available' , { workspace : { root, uuid} } ) ;
155165 const manager = AutomaticFileSystemManager . instance ( {
156166 forceNew : true ,
157167 hostConfig,
@@ -171,11 +181,31 @@ describe('Persistence', () => {
171181 assert . deepEqual ( manager . automaticFileSystem , { root, uuid, state : 'disconnected' } ) ;
172182 } ) ;
173183
184+ it ( 'reflects disconnected state correctly when the file system is removed' , async ( ) => {
185+ const { inspectorFrontendHost, projectSettingsModel} =
186+ createStubInstances ( 'available' , { workspace : { root, uuid} } ) ;
187+ const manager = AutomaticFileSystemManager . instance ( {
188+ forceNew : true ,
189+ hostConfig,
190+ inspectorFrontendHost,
191+ projectSettingsModel,
192+ } ) ;
193+ const [ , fileSystemRemoved ] = inspectorFrontendHost . events . addEventListener . lastCall . args ;
194+ const [ , , , setupCallback ] = inspectorFrontendHost . connectAutomaticFileSystem . lastCall . args ;
195+ setupCallback ( { success : true } ) ;
196+ await manager . once ( AUTOMATIC_FILE_SYSTEM_CHANGED ) ;
197+ const automaticFileSystemPromise = manager . once ( AUTOMATIC_FILE_SYSTEM_CHANGED ) ;
198+
199+ fileSystemRemoved . call ( manager , { data : root } ) ;
200+
201+ const automaticFileSystem = await automaticFileSystemPromise ;
202+ assert . strictEqual ( manager . automaticFileSystem , automaticFileSystem ) ;
203+ assert . deepEqual ( manager . automaticFileSystem , { root, uuid, state : 'disconnected' } ) ;
204+ } ) ;
205+
174206 it ( 'reports unavailable when `devToolsAutomaticFileSystems` is off' , ( ) => {
175207 const hostConfig = { devToolsAutomaticFileSystems : { enabled : false } } ;
176- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
177- const projectSettingsModel =
178- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
208+ const { inspectorFrontendHost, projectSettingsModel} = createStubInstances ( 'available' , { } ) ;
179209
180210 const manager = AutomaticFileSystemManager . instance ( {
181211 forceNew : true ,
@@ -188,11 +218,7 @@ describe('Persistence', () => {
188218 } ) ;
189219
190220 it ( 'reports available when project settings are available' , ( ) => {
191- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
192- const projectSettingsModel =
193- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
194- sinon . stub ( projectSettingsModel , 'availability' ) . value ( 'available' ) ;
195- sinon . stub ( projectSettingsModel , 'projectSettings' ) . value ( { } ) ;
221+ const { inspectorFrontendHost, projectSettingsModel} = createStubInstances ( 'available' , { } ) ;
196222
197223 const manager = AutomaticFileSystemManager . instance ( {
198224 forceNew : true ,
@@ -205,11 +231,7 @@ describe('Persistence', () => {
205231 } ) ;
206232
207233 it ( 'reports unavailable when project settings are unavailable' , ( ) => {
208- const inspectorFrontendHost = sinon . createStubInstance ( Host . InspectorFrontendHost . InspectorFrontendHostStub ) ;
209- const projectSettingsModel =
210- sinon . createStubInstance ( ProjectSettings . ProjectSettingsModel . ProjectSettingsModel ) ;
211- sinon . stub ( projectSettingsModel , 'availability' ) . value ( 'unavailable' ) ;
212- sinon . stub ( projectSettingsModel , 'projectSettings' ) . value ( { } ) ;
234+ const { inspectorFrontendHost, projectSettingsModel} = createStubInstances ( 'unavailable' , { } ) ;
213235
214236 const manager = AutomaticFileSystemManager . instance ( {
215237 forceNew : true ,
0 commit comments