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>
This commit is contained in:
committed by
Commit Bot
parent
0776c6ab59
commit
4247bcbbdc
@@ -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(() {
|
||||
|
||||
@@ -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(() {
|
||||
|
||||
@@ -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(() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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';
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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<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 @@ void f() {
|
||||
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 @@ void f() {
|
||||
]);
|
||||
}
|
||||
|
||||
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 B extends A {m() {^}}
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user