diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 5a90033..fb40314 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -2,16 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/analysis/analysis_context.dart';
-import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
-import 'package:analyzer/src/dart/analysis/session.dart';
-import 'package:analyzer/src/test_utilities/mock_sdk.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -129,85 +123,56 @@
 }
 
 @reflectiveTest
-class AnalysisSessionImplTest with ResourceProviderMixin {
-  late final AnalysisContextCollection contextCollection;
-  late final AnalysisContext context;
-  late final AnalysisSessionImpl session;
-
-  late final String testContextPath;
-  late final String aaaContextPath;
-  late final String bbbContextPath;
-
-  late final String testPath;
-
-  void setUp() {
-    var sdkRoot = newFolder('/sdk');
-    createMockSdk(
-      resourceProvider: resourceProvider,
-      root: sdkRoot,
-    );
-
-    testContextPath = newFolder('/home/test').path;
-    aaaContextPath = newFolder('/home/aaa').path;
-    bbbContextPath = newFolder('/home/bbb').path;
-
-    newDotPackagesFile('/home/test', content: r'''
-test:lib/
-''');
-
-    contextCollection = AnalysisContextCollectionImpl(
-      includedPaths: [testContextPath, aaaContextPath, bbbContextPath],
-      resourceProvider: resourceProvider,
-      sdkPath: sdkRoot.path,
-    );
-    context = contextCollection.contextFor(testContextPath);
-    session = context.currentSession as AnalysisSessionImpl;
-
-    testPath = convertPath('/home/test/lib/test.dart');
-  }
-
+class AnalysisSessionImplTest extends PubPackageResolutionTest {
   test_getErrors() async {
-    newFile(testPath, content: 'class C {');
-    var errorsResult = await session.getErrorsValid(testPath);
+    var test = newFile(testFilePath, content: 'class C {');
+
+    var session = contextFor(testFilePath).currentSession;
+    var errorsResult = await session.getErrorsValid(test.path);
     expect(errorsResult.session, session);
-    expect(errorsResult.path, testPath);
+    expect(errorsResult.path, test.path);
     expect(errorsResult.errors, isNotEmpty);
   }
 
   test_getErrors_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     var errorsResult = await session.getErrors('not_absolute.dart');
     expect(errorsResult, isA<InvalidPathResult>());
   }
 
   test_getFile_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     var errorsResult = session.getFile('not_absolute.dart');
     expect(errorsResult, isA<InvalidPathResult>());
   }
 
   test_getFileSync_library() async {
-    var path = convertPath('/home/test/lib/a.dart');
-    newFile(path, content: '');
-    var file = session.getFileValid(path);
-    expect(file.path, path);
+    var a = newFile('$testPackageLibPath/a.dart', content: '');
+
+    var session = contextFor(testFilePath).currentSession;
+    var file = session.getFileValid(a.path);
+    expect(file.path, a.path);
     expect(file.uri.toString(), 'package:test/a.dart');
     expect(file.isPart, isFalse);
   }
 
   test_getFileSync_part() async {
-    var path = convertPath('/home/test/lib/a.dart');
-    newFile(path, content: 'part of lib;');
-    var file = session.getFileValid(path);
-    expect(file.path, path);
+    var a = newFile('$testPackageLibPath/a.dart', content: 'part of lib;');
+
+    var session = contextFor(testFilePath).currentSession;
+    var file = session.getFileValid(a.path);
+    expect(file.path, a.path);
     expect(file.uri.toString(), 'package:test/a.dart');
     expect(file.isPart, isTrue);
   }
 
   test_getLibraryByUri() async {
-    newFile(testPath, content: r'''
+    newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
+    var session = contextFor(testFilePath).currentSession;
     var result = await session.getLibraryByUriValid('package:test/test.dart');
     var library = result.element;
     expect(library.getType('A'), isNotNull);
@@ -216,39 +181,42 @@
   }
 
   test_getLibraryByUri_unresolvedUri() async {
+    var session = contextFor(testFilePath).currentSession;
     var result = await session.getLibraryByUri('package:foo/foo.dart');
     expect(result, isA<CannotResolveUriResult>());
   }
 
   test_getParsedLibrary() async {
-    newFile(testPath, content: r'''
+    var test = newFile('$testPackageLibPath/a.dart', content: r'''
 class A {}
 class B {}
 ''');
 
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
     expect(parsedLibrary.session, session);
 
     expect(parsedLibrary.units, hasLength(1));
     {
       var parsedUnit = parsedLibrary.units[0];
       expect(parsedUnit.session, session);
-      expect(parsedUnit.path, testPath);
-      expect(parsedUnit.uri, Uri.parse('package:test/test.dart'));
+      expect(parsedUnit.path, test.path);
+      expect(parsedUnit.uri, Uri.parse('package:test/a.dart'));
       expect(parsedUnit.unit.declarations, hasLength(2));
     }
   }
 
   test_getParsedLibrary_getElementDeclaration_class() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
 
     var element = libraryResult.element.getType('A')!;
     var declaration = parsedLibrary.getElementDeclaration(element)!;
@@ -259,14 +227,15 @@
   }
 
   test_getParsedLibrary_getElementDeclaration_notThisLibrary() async {
-    newFile(testPath, content: '');
+    var test = newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var resolvedUnit =
-        await session.getResolvedUnit(testPath) as ResolvedUnitResult;
+        await session.getResolvedUnit(test.path) as ResolvedUnitResult;
     var typeProvider = resolvedUnit.typeProvider;
     var intClass = typeProvider.intType.element;
 
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
 
     expect(() {
       parsedLibrary.getElementDeclaration(intClass);
@@ -274,13 +243,14 @@
   }
 
   test_getParsedLibrary_getElementDeclaration_synthetic() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 int foo = 0;
 ''');
 
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
 
-    var unitResult = await session.getUnitElementValid(testPath);
+    var unitResult = await session.getUnitElementValid(test.path);
     var fooElement = unitResult.element.topLevelVariables[0];
     expect(fooElement.name, 'foo');
 
@@ -298,13 +268,14 @@
   }
 
   test_getParsedLibrary_invalidPartUri() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 part 'a.dart';
 part ':[invalid uri].dart';
 part 'c.dart';
 ''');
 
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
 
     expect(parsedLibrary.units, hasLength(3));
     expect(
@@ -322,20 +293,18 @@
   }
 
   test_getParsedLibrary_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     var result = session.getParsedLibrary('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
   test_getParsedLibrary_notLibrary() async {
-    newFile(testPath, content: 'part of "a.dart";');
-    expect(session.getParsedLibrary(testPath), isA<NotLibraryButPartResult>());
+    var test = newFile(testFilePath, content: 'part of "a.dart";');
+    var session = contextFor(testFilePath).currentSession;
+    expect(session.getParsedLibrary(test.path), isA<NotLibraryButPartResult>());
   }
 
   test_getParsedLibrary_parts() async {
-    var a = convertPath('/home/test/lib/a.dart');
-    var b = convertPath('/home/test/lib/b.dart');
-    var c = convertPath('/home/test/lib/c.dart');
-
     var aContent = r'''
 part 'b.dart';
 part 'c.dart';
@@ -358,38 +327,40 @@
 class C3 {}
 ''';
 
-    newFile(a, content: aContent);
-    newFile(b, content: bContent);
-    newFile(c, content: cContent);
+    var a = newFile('$testPackageLibPath/a.dart', content: aContent);
+    var b = newFile('$testPackageLibPath/b.dart', content: bContent);
+    var c = newFile('$testPackageLibPath/c.dart', content: cContent);
 
-    var parsedLibrary = session.getParsedLibraryValid(a);
+    var session = contextFor(testFilePath).currentSession;
+    var parsedLibrary = session.getParsedLibraryValid(a.path);
     expect(parsedLibrary.units, hasLength(3));
 
     {
       var aUnit = parsedLibrary.units[0];
-      expect(aUnit.path, a);
+      expect(aUnit.path, a.path);
       expect(aUnit.uri, Uri.parse('package:test/a.dart'));
       expect(aUnit.unit.declarations, hasLength(1));
     }
 
     {
       var bUnit = parsedLibrary.units[1];
-      expect(bUnit.path, b);
+      expect(bUnit.path, b.path);
       expect(bUnit.uri, Uri.parse('package:test/b.dart'));
       expect(bUnit.unit.declarations, hasLength(2));
     }
 
     {
       var cUnit = parsedLibrary.units[2];
-      expect(cUnit.path, c);
+      expect(cUnit.path, c.path);
       expect(cUnit.uri, Uri.parse('package:test/c.dart'));
       expect(cUnit.unit.declarations, hasLength(3));
     }
   }
 
   test_getParsedLibraryByElement() async {
-    newFile(testPath, content: '');
+    var test = newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
@@ -401,55 +372,54 @@
 
     {
       var unit = parsedLibrary.units[0];
-      expect(unit.path, testPath);
+      expect(unit.path, test.path);
       expect(unit.uri, Uri.parse('package:test/test.dart'));
       expect(unit.unit, isNotNull);
     }
   }
 
   test_getParsedLibraryByElement_differentSession() async {
-    newFile(testPath, content: '');
+    newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
     var element = libraryResult.element;
 
-    var aaaSession =
-        contextCollection.contextFor(aaaContextPath).currentSession;
+    var aaaSession = contextFor('$workspaceRootPath/aaa').currentSession;
 
     var result = aaaSession.getParsedLibraryByElement(element);
     expect(result, isA<NotElementOfThisSessionResult>());
   }
 
   test_getParsedUnit() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
-    var unitResult = session.getParsedUnitValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var unitResult = session.getParsedUnitValid(test.path);
     expect(unitResult.session, session);
-    expect(unitResult.path, testPath);
+    expect(unitResult.path, test.path);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
     expect(unitResult.unit.declarations, hasLength(2));
   }
 
   test_getParsedUnit_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     var result = session.getParsedUnit('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
   test_getResolvedLibrary() async {
-    var a = convertPath('/home/test/lib/a.dart');
-    var b = convertPath('/home/test/lib/b.dart');
-
     var aContent = r'''
 part 'b.dart';
 
 class A /*a*/ {}
 ''';
-    newFile(a, content: aContent);
+    var a = newFile('$testPackageLibPath/a.dart', content: aContent);
 
     var bContent = r'''
 part of 'a.dart';
@@ -457,9 +427,10 @@
 class B /*b*/ {}
 class B2 extends X {}
 ''';
-    newFile(b, content: bContent);
+    var b = newFile('$testPackageLibPath/b.dart', content: bContent);
 
-    var resolvedLibrary = await session.getResolvedLibraryValid(a);
+    var session = contextFor(testFilePath).currentSession;
+    var resolvedLibrary = await session.getResolvedLibraryValid(a.path);
     expect(resolvedLibrary.session, session);
 
     var typeProvider = resolvedLibrary.typeProvider;
@@ -472,7 +443,7 @@
     var bClass = libraryElement.getType('B')!;
 
     var aUnitResult = resolvedLibrary.units[0];
-    expect(aUnitResult.path, a);
+    expect(aUnitResult.path, a.path);
     expect(aUnitResult.uri, Uri.parse('package:test/a.dart'));
     expect(aUnitResult.content, aContent);
     expect(aUnitResult.unit, isNotNull);
@@ -481,7 +452,7 @@
     expect(aUnitResult.errors, isEmpty);
 
     var bUnitResult = resolvedLibrary.units[1];
-    expect(bUnitResult.path, b);
+    expect(bUnitResult.path, b.path);
     expect(bUnitResult.uri, Uri.parse('package:test/b.dart'));
     expect(bUnitResult.content, bContent);
     expect(bUnitResult.unit, isNotNull);
@@ -505,9 +476,10 @@
   }
 
   test_getResolvedLibrary_getElementDeclaration_notThisLibrary() async {
-    newFile(testPath, content: '');
+    var test = newFile(testFilePath, content: '');
 
-    var resolvedLibrary = await session.getResolvedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var resolvedLibrary = await session.getResolvedLibraryValid(test.path);
 
     expect(() {
       var intClass = resolvedLibrary.typeProvider.intType.element;
@@ -516,11 +488,12 @@
   }
 
   test_getResolvedLibrary_getElementDeclaration_synthetic() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 int foo = 0;
 ''');
 
-    var resolvedLibrary = await session.getResolvedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var resolvedLibrary = await session.getResolvedLibraryValid(test.path);
     var unitElement = resolvedLibrary.element.definingCompilationUnit;
 
     var fooElement = unitElement.topLevelVariables[0];
@@ -540,13 +513,14 @@
   }
 
   test_getResolvedLibrary_invalidPartUri() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 part 'a.dart';
 part ':[invalid uri].dart';
 part 'c.dart';
 ''');
 
-    var resolvedLibrary = await session.getResolvedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var resolvedLibrary = await session.getResolvedLibraryValid(test.path);
 
     expect(resolvedLibrary.units, hasLength(3));
     expect(
@@ -564,20 +538,23 @@
   }
 
   test_getResolvedLibrary_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     var result = await session.getResolvedLibrary('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
   test_getResolvedLibrary_notLibrary() async {
-    newFile(testPath, content: 'part of "a.dart";');
+    var test = newFile(testFilePath, content: 'part of "a.dart";');
 
-    var result = await session.getResolvedLibrary(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var result = await session.getResolvedLibrary(test.path);
     expect(result, isA<NotLibraryButPartResult>());
   }
 
   test_getResolvedLibraryByElement() async {
-    newFile(testPath, content: '');
+    var test = newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
@@ -586,36 +563,37 @@
     var result = await session.getResolvedLibraryByElementValid(element);
     expect(result.session, session);
     expect(result.units, hasLength(1));
-    expect(result.units[0].path, testPath);
+    expect(result.units[0].path, test.path);
     expect(result.units[0].uri, Uri.parse('package:test/test.dart'));
     expect(result.units[0].unit.declaredElement, isNotNull);
   }
 
   test_getResolvedLibraryByElement_differentSession() async {
-    newFile(testPath, content: '');
+    newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
     var element = libraryResult.element;
 
-    var aaaSession =
-        contextCollection.contextFor(aaaContextPath).currentSession;
+    var aaaSession = contextFor('$workspaceRootPath/aaa').currentSession;
 
     var result = await aaaSession.getResolvedLibraryByElement(element);
     expect(result, isA<NotElementOfThisSessionResult>());
   }
 
   test_getResolvedUnit() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
+    var session = contextFor(testFilePath).currentSession;
     var unitResult =
-        await session.getResolvedUnit(testPath) as ResolvedUnitResult;
+        await session.getResolvedUnit(test.path) as ResolvedUnitResult;
     expect(unitResult.session, session);
-    expect(unitResult.path, testPath);
+    expect(unitResult.path, test.path);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
     expect(unitResult.unit.declarations, hasLength(2));
     expect(unitResult.typeProvider, isNotNull);
@@ -623,19 +601,21 @@
   }
 
   test_getUnitElement() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
-    var unitResult = await session.getUnitElementValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var unitResult = await session.getUnitElementValid(test.path);
     expect(unitResult.session, session);
-    expect(unitResult.path, testPath);
+    expect(unitResult.path, test.path);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
     expect(unitResult.element.classes, hasLength(2));
   }
 
   test_resourceProvider() async {
+    var session = contextFor(testFilePath).currentSession;
     expect(session.resourceProvider, resourceProvider);
   }
 }
diff --git a/tools/VERSION b/tools/VERSION
index 020f99a..00374dc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 61
+PRERELEASE 62
 PRERELEASE_PATCH 0
\ No newline at end of file
