Extract PubPackageAnalysisServerTest.
Change-Id: Ib952f26c226f147221471af0366bf9c95c7bc5b2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/239201
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/test/analysis/get_errors_test.dart b/pkg/analysis_server/test/analysis/get_errors_test.dart
index 41ea3c8..db72005 100644
--- a/pkg/analysis_server/test/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/get_errors_test.dart
@@ -8,7 +8,7 @@
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import '../domain_completion_test.dart';
+import '../analysis_server_base.dart';
void main() {
defineReflectiveSuite(() {
diff --git a/pkg/analysis_server/test/analysis/get_hover_test.dart b/pkg/analysis_server/test/analysis/get_hover_test.dart
index 4c704ab..9120539 100644
--- a/pkg/analysis_server/test/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/analysis/get_hover_test.dart
@@ -8,7 +8,7 @@
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../analysis_abstract.dart';
-import '../domain_completion_test.dart';
+import '../analysis_server_base.dart';
void main() {
defineReflectiveSuite(() {
diff --git a/pkg/analysis_server/test/analysis/get_signature_test.dart b/pkg/analysis_server/test/analysis/get_signature_test.dart
index 4d77353..3d14e5d 100644
--- a/pkg/analysis_server/test/analysis/get_signature_test.dart
+++ b/pkg/analysis_server/test/analysis/get_signature_test.dart
@@ -6,7 +6,7 @@
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import '../domain_completion_test.dart';
+import '../analysis_server_base.dart';
void main() {
defineReflectiveSuite(() {
diff --git a/pkg/analysis_server/test/analysis_server_base.dart b/pkg/analysis_server/test/analysis_server_base.dart
new file mode 100644
index 0000000..6d6a1bf
--- /dev/null
+++ b/pkg/analysis_server/test/analysis_server_base.dart
@@ -0,0 +1,236 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// 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 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/domain_completion.dart';
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
+import 'package:analysis_server/src/utilities/mocks.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/instrumentation/service.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+
+import 'mocks.dart';
+
+/// TODO(scheglov) this is duplicate
+class AnalysisOptionsFileConfig {
+ final List<String> experiments;
+ final bool implicitCasts;
+ final bool implicitDynamic;
+ final List<String> lints;
+ final bool strictCasts;
+ final bool strictInference;
+ final bool strictRawTypes;
+
+ AnalysisOptionsFileConfig({
+ this.experiments = const [],
+ this.implicitCasts = true,
+ this.implicitDynamic = true,
+ this.lints = const [],
+ this.strictCasts = false,
+ this.strictInference = false,
+ this.strictRawTypes = false,
+ });
+
+ String toContent() {
+ var buffer = StringBuffer();
+
+ buffer.writeln('analyzer:');
+ buffer.writeln(' enable-experiment:');
+ for (var experiment in experiments) {
+ buffer.writeln(' - $experiment');
+ }
+ buffer.writeln(' language:');
+ buffer.writeln(' strict-casts: $strictCasts');
+ buffer.writeln(' strict-inference: $strictInference');
+ buffer.writeln(' strict-raw-types: $strictRawTypes');
+ buffer.writeln(' strong-mode:');
+ buffer.writeln(' implicit-casts: $implicitCasts');
+ buffer.writeln(' implicit-dynamic: $implicitDynamic');
+
+ buffer.writeln('linter:');
+ buffer.writeln(' rules:');
+ for (var lint in lints) {
+ buffer.writeln(' - $lint');
+ }
+
+ return buffer.toString();
+ }
+}
+
+class PubPackageAnalysisServerTest with ResourceProviderMixin {
+ late final MockServerChannel serverChannel;
+ late final AnalysisServer server;
+
+ AnalysisDomainHandler get analysisDomain {
+ return server.handlers.whereType<AnalysisDomainHandler>().single;
+ }
+
+ CompletionDomainHandler get completionDomain {
+ return server.handlers.whereType<CompletionDomainHandler>().single;
+ }
+
+ List<String> get experiments => [
+ EnableString.enhanced_enums,
+ EnableString.named_arguments_anywhere,
+ EnableString.super_parameters,
+ ];
+
+ File get testFile => getFile(testFilePath);
+
+ String get testFileContent => testFile.readAsStringSync();
+
+ String get testFilePath => '$testPackageLibPath/test.dart';
+
+ String get testFilePathPlatform => convertPath(testFilePath);
+
+ String get testPackageLibPath => '$testPackageRootPath/lib';
+
+ Folder get testPackageRoot => getFolder(testPackageRootPath);
+
+ String get testPackageRootPath => '$workspaceRootPath/test';
+
+ String get testPackageTestPath => '$testPackageRootPath/test';
+
+ String get workspaceRootPath => '/home';
+
+ void assertResponseFailure(
+ Response response, {
+ required String requestId,
+ required RequestErrorCode errorCode,
+ }) {
+ expect(
+ response,
+ isResponseFailure(requestId, errorCode),
+ );
+ }
+
+ void deleteTestPackageAnalysisOptionsFile() {
+ deleteAnalysisOptionsYamlFile(testPackageRootPath);
+ }
+
+ void deleteTestPackageConfigJsonFile() {
+ deletePackageConfigJsonFile(testPackageRootPath);
+ }
+
+ /// Returns the offset of [search] in [testFileContent].
+ /// Fails if not found.
+ /// TODO(scheglov) Rename it.
+ int findOffset(String search) {
+ var offset = testFileContent.indexOf(search);
+ expect(offset, isNot(-1));
+ return offset;
+ }
+
+ Future<Response> handleRequest(Request request) async {
+ return await serverChannel.sendRequest(request);
+ }
+
+ /// Validates that the given [request] is handled successfully.
+ Future<Response> handleSuccessfulRequest(Request request) async {
+ var response = await handleRequest(request);
+ expect(response, isResponseSuccess(request.id));
+ return response;
+ }
+
+ void processNotification(Notification notification) {}
+
+ Future<void> setRoots({
+ required List<String> included,
+ required List<String> excluded,
+ }) async {
+ var includedConverted = included.map(convertPath).toList();
+ var excludedConverted = excluded.map(convertPath).toList();
+ await handleSuccessfulRequest(
+ AnalysisSetAnalysisRootsParams(
+ includedConverted,
+ excludedConverted,
+ packageRoots: {},
+ ).toRequest('0'),
+ );
+ }
+
+ @mustCallSuper
+ void setUp() {
+ serverChannel = MockServerChannel();
+
+ var sdkRoot = newFolder('/sdk');
+ createMockSdk(
+ resourceProvider: resourceProvider,
+ root: sdkRoot,
+ );
+
+ writeTestPackageConfig();
+
+ writeTestPackageAnalysisOptionsFile(
+ AnalysisOptionsFileConfig(
+ experiments: experiments,
+ ),
+ );
+
+ serverChannel.notifications.listen(processNotification);
+
+ server = AnalysisServer(
+ serverChannel,
+ resourceProvider,
+ AnalysisServerOptions(),
+ DartSdkManager(sdkRoot.path),
+ CrashReportingAttachmentsBuilder.empty,
+ InstrumentationService.NULL_SERVICE,
+ );
+
+ server.pendingFilesRemoveOverlayDelay = const Duration(milliseconds: 10);
+ completionDomain.budgetDuration = const Duration(seconds: 30);
+ }
+
+ Future<void> tearDown() async {
+ await server.dispose();
+ }
+
+ void writePackageConfig(Folder root, PackageConfigFileBuilder config) {
+ newPackageConfigJsonFile(
+ root.path,
+ config.toContent(toUriStr: toUriStr),
+ );
+ }
+
+ void writeTestPackageAnalysisOptionsFile(AnalysisOptionsFileConfig config) {
+ newAnalysisOptionsYamlFile2(
+ testPackageRootPath,
+ config.toContent(),
+ );
+ }
+
+ void writeTestPackageConfig({
+ PackageConfigFileBuilder? config,
+ String? languageVersion,
+ }) {
+ if (config == null) {
+ config = PackageConfigFileBuilder();
+ } else {
+ config = config.copy();
+ }
+
+ config.add(
+ name: 'test',
+ rootPath: testPackageRootPath,
+ languageVersion: languageVersion,
+ );
+
+ writePackageConfig(testPackageRoot, config);
+ }
+
+ void writeTestPackagePubspecYamlFile(String content) {
+ newPubspecYamlFile(testPackageRootPath, content);
+ }
+}
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 9cb255d..7090fc1 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -8,7 +8,7 @@
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import '../domain_completion_test.dart';
+import '../analysis_server_base.dart';
import '../services/completion/dart/completion_check.dart';
import '../services/completion/dart/completion_contributor_util.dart';
import 'impl/completion_driver.dart';
diff --git a/pkg/analysis_server/test/client/impl/completion_driver.dart b/pkg/analysis_server/test/client/impl/completion_driver.dart
index 3383e6c..df8faf3 100644
--- a/pkg/analysis_server/test/client/impl/completion_driver.dart
+++ b/pkg/analysis_server/test/client/impl/completion_driver.dart
@@ -13,8 +13,8 @@
import 'package:matcher/matcher.dart';
import 'package:meta/meta.dart';
+import '../../analysis_server_base.dart';
import '../../constants.dart';
-import '../../domain_completion_test.dart';
import 'expect_mixin.dart';
CompletionSuggestion _createCompletionSuggestionFromAvailableSuggestion(
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 4a09435..8fce9e5 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -14,7 +14,7 @@
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'analysis_abstract.dart';
-import 'domain_completion_test.dart';
+import 'analysis_server_base.dart';
import 'mocks.dart';
void main() {
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index e240d69..ab580d0 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -4,21 +4,11 @@
import 'dart:async';
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/domain_analysis.dart';
-import 'package:analysis_server/src/domain_completion.dart';
import 'package:analysis_server/src/plugin/plugin_manager.dart';
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
-import 'package:analysis_server/src/utilities/mocks.dart';
-import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/instrumentation/service.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:analyzer_utilities/check/check.dart';
@@ -26,6 +16,7 @@
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'analysis_server_base.dart';
import 'domain_completion_util.dart';
import 'mocks.dart';
import 'services/completion/dart/completion_check.dart';
@@ -40,52 +31,6 @@
});
}
-/// TODO(scheglov) this is duplicate
-class AnalysisOptionsFileConfig {
- final List<String> experiments;
- final bool implicitCasts;
- final bool implicitDynamic;
- final List<String> lints;
- final bool strictCasts;
- final bool strictInference;
- final bool strictRawTypes;
-
- AnalysisOptionsFileConfig({
- this.experiments = const [],
- this.implicitCasts = true,
- this.implicitDynamic = true,
- this.lints = const [],
- this.strictCasts = false,
- this.strictInference = false,
- this.strictRawTypes = false,
- });
-
- String toContent() {
- var buffer = StringBuffer();
-
- buffer.writeln('analyzer:');
- buffer.writeln(' enable-experiment:');
- for (var experiment in experiments) {
- buffer.writeln(' - $experiment');
- }
- buffer.writeln(' language:');
- buffer.writeln(' strict-casts: $strictCasts');
- buffer.writeln(' strict-inference: $strictInference');
- buffer.writeln(' strict-raw-types: $strictRawTypes');
- buffer.writeln(' strong-mode:');
- buffer.writeln(' implicit-casts: $implicitCasts');
- buffer.writeln(' implicit-dynamic: $implicitDynamic');
-
- buffer.writeln('linter:');
- buffer.writeln(' rules:');
- for (var lint in lints) {
- buffer.writeln(' - $lint');
- }
-
- return buffer.toString();
- }
-}
-
@reflectiveTest
class CompletionDomainHandlerGetSuggestionDetails2Test
extends PubPackageAnalysisServerTest {
@@ -212,6 +157,11 @@
expect(response.error?.code, RequestErrorCode.INVALID_FILE_PATH_FORMAT);
}
+ Future<void> _configureWithWorkspaceRoot() async {
+ await setRoots(included: [workspaceRootPath], excluded: []);
+ await server.onAnalysisComplete;
+ }
+
Future<CompletionGetSuggestionDetails2Result> _getCodeDetails({
required String path,
required String content,
@@ -1961,6 +1911,11 @@
]);
}
+ Future<void> _configureWithWorkspaceRoot() async {
+ await setRoots(included: [workspaceRootPath], excluded: []);
+ await server.onAnalysisComplete;
+ }
+
Future<CompletionResponseForTesting> _getCodeSuggestions({
required String path,
required String content,
@@ -2940,178 +2895,6 @@
}
}
-class PubPackageAnalysisServerTest with ResourceProviderMixin {
- late final MockServerChannel serverChannel;
- late final AnalysisServer server;
-
- AnalysisDomainHandler get analysisDomain {
- return server.handlers.whereType<AnalysisDomainHandler>().single;
- }
-
- CompletionDomainHandler get completionDomain {
- return server.handlers.whereType<CompletionDomainHandler>().single;
- }
-
- List<String> get experiments => [
- EnableString.enhanced_enums,
- EnableString.named_arguments_anywhere,
- EnableString.super_parameters,
- ];
-
- File get testFile => getFile(testFilePath);
-
- String get testFileContent => testFile.readAsStringSync();
-
- String get testFilePath => '$testPackageLibPath/test.dart';
-
- String get testFilePathPlatform => convertPath(testFilePath);
-
- String get testPackageLibPath => '$testPackageRootPath/lib';
-
- Folder get testPackageRoot => getFolder(testPackageRootPath);
-
- String get testPackageRootPath => '$workspaceRootPath/test';
-
- String get testPackageTestPath => '$testPackageRootPath/test';
-
- String get workspaceRootPath => '/home';
-
- void assertResponseFailure(
- Response response, {
- required String requestId,
- required RequestErrorCode errorCode,
- }) {
- expect(
- response,
- isResponseFailure(requestId, errorCode),
- );
- }
-
- void deleteTestPackageAnalysisOptionsFile() {
- deleteAnalysisOptionsYamlFile(testPackageRootPath);
- }
-
- void deleteTestPackageConfigJsonFile() {
- deletePackageConfigJsonFile(testPackageRootPath);
- }
-
- /// Returns the offset of [search] in [testFileContent].
- /// Fails if not found.
- /// TODO(scheglov) Rename it.
- int findOffset(String search) {
- var offset = testFileContent.indexOf(search);
- expect(offset, isNot(-1));
- return offset;
- }
-
- Future<Response> handleRequest(Request request) async {
- return await serverChannel.sendRequest(request);
- }
-
- /// Validates that the given [request] is handled successfully.
- Future<Response> handleSuccessfulRequest(Request request) async {
- var response = await handleRequest(request);
- expect(response, isResponseSuccess(request.id));
- return response;
- }
-
- void processNotification(Notification notification) {}
-
- Future<void> setRoots({
- required List<String> included,
- required List<String> excluded,
- }) async {
- var includedConverted = included.map(convertPath).toList();
- var excludedConverted = excluded.map(convertPath).toList();
- await handleSuccessfulRequest(
- AnalysisSetAnalysisRootsParams(
- includedConverted,
- excludedConverted,
- packageRoots: {},
- ).toRequest('0'),
- );
- }
-
- @mustCallSuper
- void setUp() {
- serverChannel = MockServerChannel();
-
- var sdkRoot = newFolder('/sdk');
- createMockSdk(
- resourceProvider: resourceProvider,
- root: sdkRoot,
- );
-
- writeTestPackageConfig();
-
- writeTestPackageAnalysisOptionsFile(
- AnalysisOptionsFileConfig(
- experiments: experiments,
- ),
- );
-
- serverChannel.notifications.listen(processNotification);
-
- server = AnalysisServer(
- serverChannel,
- resourceProvider,
- AnalysisServerOptions(),
- DartSdkManager(sdkRoot.path),
- CrashReportingAttachmentsBuilder.empty,
- InstrumentationService.NULL_SERVICE,
- );
-
- server.pendingFilesRemoveOverlayDelay = const Duration(milliseconds: 10);
- completionDomain.budgetDuration = const Duration(seconds: 30);
- }
-
- Future<void> tearDown() async {
- await server.dispose();
- }
-
- void writePackageConfig(Folder root, PackageConfigFileBuilder config) {
- newPackageConfigJsonFile(
- root.path,
- config.toContent(toUriStr: toUriStr),
- );
- }
-
- void writeTestPackageAnalysisOptionsFile(AnalysisOptionsFileConfig config) {
- newAnalysisOptionsYamlFile2(
- testPackageRootPath,
- config.toContent(),
- );
- }
-
- void writeTestPackageConfig({
- PackageConfigFileBuilder? config,
- String? languageVersion,
- }) {
- if (config == null) {
- config = PackageConfigFileBuilder();
- } else {
- config = config.copy();
- }
-
- config.add(
- name: 'test',
- rootPath: testPackageRootPath,
- languageVersion: languageVersion,
- );
-
- writePackageConfig(testPackageRoot, config);
- }
-
- void writeTestPackagePubspecYamlFile(String content) {
- newPubspecYamlFile(testPackageRootPath, content);
- }
-
- Future<void> _configureWithWorkspaceRoot() async {
- await setRoots(included: [workspaceRootPath], excluded: []);
- await server.onAnalysisComplete;
- }
-}
-
class RequestWithFutureResponse {
final int offset;
final Request request;