Fix some extensions + file util tests on Windows (#8846)

* Fix some extensions + file util tests
* Rename projectRoot -> projectRootUriString
* Rename directoryPath -> projectRootDirectoryUriString
diff --git a/packages/devtools_shared/test/helpers/extension_test_manager.dart b/packages/devtools_shared/test/helpers/extension_test_manager.dart
index 0e74817..0355e72 100644
--- a/packages/devtools_shared/test/helpers/extension_test_manager.dart
+++ b/packages/devtools_shared/test/helpers/extension_test_manager.dart
@@ -394,6 +394,10 @@
   final bool requiresConnection;
   final bool isPubliclyHosted;
   final String? packageVersion;
+
+  /// The relative path from the extensions.
+  ///
+  /// Uses the paths separator for the current platform.
   final String relativePathFromExtensions;
 
   String get configYamlContent => '''
@@ -439,8 +443,9 @@
       } else {
         sb
           ..writeln() // Add a new line for the path dependency.
+          // Always write paths in pubspec.yaml with forward slashes.
           ..writeln(
-            '    path: $pathToExtensions/${dep.relativePathFromExtensions}',
+            '    path: $pathToExtensions/${dep.relativePathFromExtensions.replaceAll(r'\', '/')}',
           );
       }
     }
diff --git a/packages/devtools_shared/test/helpers/extension_test_manager_test.dart b/packages/devtools_shared/test/helpers/extension_test_manager_test.dart
index 1ae4ebf..9bf976d 100644
--- a/packages/devtools_shared/test/helpers/extension_test_manager_test.dart
+++ b/packages/devtools_shared/test/helpers/extension_test_manager_test.dart
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.
 
+import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 
 import 'extension_test_manager.dart';
@@ -115,7 +116,7 @@
       expect(newerStaticExtension1Package.packageVersion, null);
       expect(
         newerStaticExtension1Package.relativePathFromExtensions,
-        'newer/static_extension_1',
+        p.join('newer', 'static_extension_1'),
       );
       expect(
         newerStaticExtension1Package.pubspecContent,
diff --git a/packages/devtools_shared/test/server/devtools_extensions_api_test.dart b/packages/devtools_shared/test/server/devtools_extensions_api_test.dart
index 140a834..f075b47 100644
--- a/packages/devtools_shared/test/server/devtools_extensions_api_test.dart
+++ b/packages/devtools_shared/test/server/devtools_extensions_api_test.dart
@@ -146,14 +146,14 @@
 
   group(ExtensionsApi.apiExtensionEnabledState, () {
     late File optionsFile;
-    late final optionsFileUriString = p.join(
+    late final optionsFileUriString = p.posix.join(
       extensionTestManager.runtimeAppRoot,
       devtoolsOptionsFileName,
     );
 
     setUp(() async {
       await initializeTestDirectory();
-      optionsFile = File.fromUri(Uri.file(optionsFileUriString));
+      optionsFile = File.fromUri(Uri.parse(optionsFileUriString));
     });
 
     Future<Response> sendEnabledStateRequest({
@@ -374,7 +374,7 @@
       ext.extensionAssetsPath,
       endsWith(
         p.join(
-          '.pub-cache',
+          Platform.isWindows ? r'Pub\Cache' : '.pub-cache',
           'hosted',
           'pub.dev',
           '${extensionPackage.name}-${extensionPackage.packageVersion}',
@@ -401,7 +401,7 @@
   expect(
     ext.devtoolsOptionsUri,
     endsWith(
-      p.join('packages', detectedFromPath, devtoolsOptionsFileName),
+      p.posix.join('packages', detectedFromPath, devtoolsOptionsFileName),
     ),
   );
   expect(ext.detectedFromStaticContext, fromStaticContext);
diff --git a/packages/devtools_shared/test/utils/file_utils_test.dart b/packages/devtools_shared/test/utils/file_utils_test.dart
index fa90518..fd75504 100644
--- a/packages/devtools_shared/test/utils/file_utils_test.dart
+++ b/packages/devtools_shared/test/utils/file_utils_test.dart
@@ -12,7 +12,9 @@
 import '../helpers/helpers.dart';
 
 const projectRootParts = ['absolute_path_to', 'my_app_root'];
-late String projectRoot;
+
+/// The project root as a URI string.
+late String projectRootUriString;
 
 late Directory testDirectory;
 late File libFile;
@@ -46,7 +48,7 @@
 
       await testDtdConnection!.setIDEWorkspaceRoots(
         dtd!.info!.secret!,
-        [Uri.parse(projectRoot)],
+        [Uri.parse(projectRootUriString)],
       );
     });
 
@@ -72,7 +74,7 @@
         dtd: useDtd ? testDtdConnection! : null,
         throwOnDtdSearchFailed: useDtd,
       );
-      expect(result, equals(expected ?? projectRoot));
+      expect(result, equals(expected ?? projectRootUriString));
     }
 
     test('packageRootFromFileUriString throw exception for invalid input', () {
@@ -130,24 +132,26 @@
           // Dart file in a nested project.
           await verifyPackageRoot(
             nestedProjectLibFile.uri.toString(),
-            expected: p.join(projectRoot, 'example', 'nested_project'),
+            expected:
+                p.posix.join(projectRootUriString, 'example', 'nested_project'),
             useDtd: useDtd,
           );
           await verifyPackageRoot(
             nestedProjectTestFile.uri.toString(),
-            expected: p.join(projectRoot, 'example', 'nested_project'),
+            expected:
+                p.posix.join(projectRootUriString, 'example', 'nested_project'),
             useDtd: useDtd,
           );
 
           // Dart file under an unknown directory.
           await verifyPackageRoot(
             anyFile.uri.toString(),
-            expected: useDtd ? projectRoot : anyFile.uri.toString(),
+            expected: useDtd ? projectRootUriString : anyFile.uri.toString(),
             useDtd: useDtd,
           );
           await verifyPackageRoot(
             anySubFile.uri.toString(),
-            expected: useDtd ? projectRoot : anySubFile.uri.toString(),
+            expected: useDtd ? projectRootUriString : anySubFile.uri.toString(),
             useDtd: useDtd,
           );
         },
@@ -200,11 +204,12 @@
   final projectRootDirectory =
       Directory(p.joinAll([testDirectory.path, ...projectRootParts]))
         ..createSync(recursive: true);
-  final directoryPath =
+  final projectRootDirectoryUriString =
       Uri.file(projectRootDirectory.uri.toFilePath()).toString();
 
   // Remove the trailing slash and set the value of [projectRoot].
-  projectRoot = directoryPath.substring(0, directoryPath.length - 1);
+  projectRootUriString = projectRootDirectoryUriString.substring(
+      0, projectRootDirectoryUriString.length - 1);
 
   // Set up the project root contents.
   Directory(p.join(projectRootDirectory.path, '.dart_tool'))