@@ -144,19 +144,24 @@ void main() {
144144
145145 group (ExtensionsApi .apiExtensionEnabledState, () {
146146 late File optionsFile;
147- late final optionsFileUriString = p.posix.join (
148- extensionTestManager.runtimeAppRoot,
149- devtoolsOptionsFileName,
150- );
147+ late String optionsFileUriString;
151148
152149 setUp (() async {
153150 await initializeTestDirectory ();
151+ // Recompute per test: each test gets a fresh temp directory, so this
152+ // must not be cached across tests (otherwise it would point at a
153+ // previous test's directory).
154+ optionsFileUriString = p.posix.join (
155+ extensionTestManager.runtimeAppRoot,
156+ devtoolsOptionsFileName,
157+ );
154158 optionsFile = File .fromUri (Uri .parse (optionsFileUriString));
155159 });
156160
157161 Future <Response > sendEnabledStateRequest ({
158162 required String extensionName,
159163 bool ? enable,
164+ String ? optionsUriOverride,
160165 }) async {
161166 final request = Request (
162167 'post' ,
@@ -165,7 +170,8 @@ void main() {
165170 host: 'localhost' ,
166171 path: ExtensionsApi .apiExtensionEnabledState,
167172 queryParameters: {
168- ExtensionsApi .devtoolsOptionsUriPropertyName: optionsFileUriString,
173+ ExtensionsApi .devtoolsOptionsUriPropertyName:
174+ optionsUriOverride ?? optionsFileUriString,
169175 ExtensionsApi .extensionNamePropertyName: extensionName,
170176 if (enable != null )
171177 ExtensionsApi .enabledStatePropertyName: enable.toString (),
@@ -179,6 +185,37 @@ void main() {
179185 );
180186 }
181187
188+ test ('rejects a devtoolsOptionsUri that is not a devtools_options.yaml '
189+ 'file' , () async {
190+ await serveExtensions (extensionsManager);
191+ const invalidUris = [
192+ // Wrong file name.
193+ 'file:///tmp/evil.txt' ,
194+ 'file:///tmp/devtools_options.yaml.bak' ,
195+ // Non-file scheme.
196+ 'https://evil.example.com/devtools_options.yaml' ,
197+ // UNC path / non-empty host.
198+ 'file://remotehost/share/devtools_options.yaml' ,
199+ ];
200+ for (final invalidUri in invalidUris) {
201+ final response = await sendEnabledStateRequest (
202+ extensionName: 'drift' ,
203+ optionsUriOverride: invalidUri,
204+ );
205+ expect (
206+ response.statusCode,
207+ HttpStatus .badRequest,
208+ reason: 'expected $invalidUri to be rejected' ,
209+ );
210+ }
211+ });
212+
213+ test ('accepts a valid devtools_options.yaml file: URI' , () async {
214+ await serveExtensions (extensionsManager);
215+ final response = await sendEnabledStateRequest (extensionName: 'drift' );
216+ expect (response.statusCode, HttpStatus .ok);
217+ });
218+
182219 test ('options file does not exist until first acesss' , () async {
183220 await serveExtensions (extensionsManager);
184221 expect (optionsFile.existsSync (), isFalse);
0 commit comments