From 4247bcbbdc58884776c9cdde15d7a052d6350a69 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Mon, 28 Mar 2022 21:48:20 +0000 Subject: [PATCH] Extract PubPackageAnalysisServerTest. Change-Id: Ib952f26c226f147221471af0366bf9c95c7bc5b2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/239201 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov --- .../test/analysis/get_errors_test.dart | 2 +- .../test/analysis/get_hover_test.dart | 2 +- .../test/analysis/get_signature_test.dart | 2 +- .../test/analysis_server_base.dart | 236 +++++++++++++++++ .../test/client/completion_driver_test.dart | 2 +- .../test/client/impl/completion_driver.dart | 2 +- .../test/domain_analysis_test.dart | 2 +- .../test/domain_completion_test.dart | 239 +----------------- 8 files changed, 253 insertions(+), 234 deletions(-) create mode 100644 pkg/analysis_server/test/analysis_server_base.dart diff --git a/pkg/analysis_server/test/analysis/get_errors_test.dart b/pkg/analysis_server/test/analysis/get_errors_test.dart index 41ea3c81e2c..db72005561c 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:analyzer_plugin/protocol/protocol_common.dart'; 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 4c704ab9cf0..9120539dfbc 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/test.dart'; 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 4d77353d86d..3d14e5d996c 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:analysis_server/src/protocol_server.dart'; 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 00000000000..6d6a1bfac32 --- /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 experiments; + final bool implicitCasts; + final bool implicitDynamic; + final List 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().single; + } + + CompletionDomainHandler get completionDomain { + return server.handlers.whereType().single; + } + + List 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 handleRequest(Request request) async { + return await serverChannel.sendRequest(request); + } + + /// Validates that the given [request] is handled successfully. + Future handleSuccessfulRequest(Request request) async { + var response = await handleRequest(request); + expect(response, isResponseSuccess(request.id)); + return response; + } + + void processNotification(Notification notification) {} + + Future setRoots({ + required List included, + required List 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 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 9cb255d5e3d..7090fc11e1b 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:analyzer_plugin/protocol/protocol_common.dart'; 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 3383e6cdce2..df8faf3a518 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:analyzer_plugin/protocol/protocol_common.dart'; 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 4a09435b33a..8fce9e50800 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/test.dart'; 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 e240d69456a..ab580d0557a 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:meta/meta.dart'; 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 @@ void main() { }); } -/// TODO(scheglov) this is duplicate -class AnalysisOptionsFileConfig { - final List experiments; - final bool implicitCasts; - final bool implicitDynamic; - final List 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 @@ void f() { expect(response.error?.code, RequestErrorCode.INVALID_FILE_PATH_FORMAT); } + Future _configureWithWorkspaceRoot() async { + await setRoots(included: [workspaceRootPath], excluded: []); + await server.onAnalysisComplete; + } + Future _getCodeDetails({ required String path, required String content, @@ -1961,6 +1911,11 @@ void f() { ]); } + Future _configureWithWorkspaceRoot() async { + await setRoots(included: [workspaceRootPath], excluded: []); + await server.onAnalysisComplete; + } + Future _getCodeSuggestions({ required String path, required String content, @@ -2940,178 +2895,6 @@ class B extends A {m() {^}} } } -class PubPackageAnalysisServerTest with ResourceProviderMixin { - late final MockServerChannel serverChannel; - late final AnalysisServer server; - - AnalysisDomainHandler get analysisDomain { - return server.handlers.whereType().single; - } - - CompletionDomainHandler get completionDomain { - return server.handlers.whereType().single; - } - - List 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 handleRequest(Request request) async { - return await serverChannel.sendRequest(request); - } - - /// Validates that the given [request] is handled successfully. - Future handleSuccessfulRequest(Request request) async { - var response = await handleRequest(request); - expect(response, isResponseSuccess(request.id)); - return response; - } - - void processNotification(Notification notification) {} - - Future setRoots({ - required List included, - required List 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 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 _configureWithWorkspaceRoot() async { - await setRoots(included: [workspaceRootPath], excluded: []); - await server.onAnalysisComplete; - } -} - class RequestWithFutureResponse { final int offset; final Request request;