114d7b980a
Bug: https://github.com/dart-lang/sdk/issues/45236 Change-Id: I01175a2b2b1eb3ce6cdf30ade794d8186c6e8ead Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/191622 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
192 lines
4.8 KiB
Dart
192 lines
4.8 KiB
Dart
// Copyright (c) 2017, 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:analyzer/dart/analysis/results.dart';
|
|
import 'package:analyzer/error/error.dart';
|
|
import 'package:analyzer/file_system/file_system.dart';
|
|
import 'package:analyzer/src/dart/analysis/driver.dart';
|
|
import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
|
|
import 'package:analyzer/src/generated/source.dart';
|
|
import 'package:analyzer/src/generated/timestamped_data.dart';
|
|
import 'package:analyzer_plugin/channel/channel.dart';
|
|
import 'package:analyzer_plugin/plugin/plugin.dart';
|
|
import 'package:analyzer_plugin/protocol/protocol.dart';
|
|
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
|
|
import 'package:analyzer_plugin/src/protocol/protocol_internal.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
class MockAnalysisDriver implements AnalysisDriver {
|
|
@override
|
|
final Set<String> addedFiles = {};
|
|
|
|
@override
|
|
set priorityFiles(List<String> priorityPaths) {}
|
|
|
|
@override
|
|
void addFile(String path) {
|
|
addedFiles.add(path);
|
|
}
|
|
|
|
@override
|
|
dynamic noSuchMethod(Invocation invocation) {
|
|
return super.noSuchMethod(invocation);
|
|
}
|
|
}
|
|
|
|
class MockChannel implements PluginCommunicationChannel {
|
|
bool _closed = false;
|
|
|
|
void Function()? _onDone;
|
|
Function? _onError;
|
|
void Function(Notification)? _onNotification;
|
|
void Function(Request)? _onRequest;
|
|
|
|
List<Notification> sentNotifications = <Notification>[];
|
|
|
|
int idCounter = 0;
|
|
|
|
Map<String, Completer<Response>> completers = <String, Completer<Response>>{};
|
|
|
|
@override
|
|
void close() {
|
|
_closed = true;
|
|
}
|
|
|
|
@override
|
|
void listen(void Function(Request request)? onRequest,
|
|
{void Function()? onDone,
|
|
Function? onError,
|
|
Function(Notification)? onNotification}) {
|
|
_onDone = onDone;
|
|
_onError = onError;
|
|
_onNotification = onNotification;
|
|
_onRequest = onRequest;
|
|
}
|
|
|
|
void sendDone() {
|
|
if (_onDone != null) {
|
|
_onDone!();
|
|
}
|
|
}
|
|
|
|
void sendError(Object exception, StackTrace stackTrace) {
|
|
if (_onError != null) {
|
|
_onError!(exception, stackTrace);
|
|
}
|
|
}
|
|
|
|
@override
|
|
void sendNotification(Notification notification) {
|
|
if (_closed) {
|
|
throw StateError('Sent a notification to a closed channel');
|
|
}
|
|
if (_onNotification == null) {
|
|
fail('Unexpected invocation of sendNotification');
|
|
}
|
|
_onNotification!(notification);
|
|
}
|
|
|
|
Future<Response> sendRequest(RequestParams params) {
|
|
if (_onRequest == null) {
|
|
fail('Unexpected invocation of sendNotification');
|
|
}
|
|
var id = (idCounter++).toString();
|
|
var request = params.toRequest(id);
|
|
var completer = Completer<Response>();
|
|
completers[request.id] = completer;
|
|
_onRequest!(request);
|
|
return completer.future;
|
|
}
|
|
|
|
@override
|
|
void sendResponse(Response response) {
|
|
if (_closed) {
|
|
throw StateError('Sent a response to a closed channel');
|
|
}
|
|
var completer = completers.remove(response.id);
|
|
completer?.complete(response);
|
|
}
|
|
}
|
|
|
|
class MockResolvedUnitResult implements ResolvedUnitResult {
|
|
@override
|
|
final List<AnalysisError> errors;
|
|
|
|
@override
|
|
final LineInfo lineInfo;
|
|
|
|
@override
|
|
final String path;
|
|
|
|
MockResolvedUnitResult(
|
|
{List<AnalysisError>? errors, LineInfo? lineInfo, String? path})
|
|
: errors = errors ?? [],
|
|
lineInfo = lineInfo ?? LineInfo([0]),
|
|
path = path ?? '';
|
|
|
|
@override
|
|
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
|
}
|
|
|
|
class MockResourceProvider implements ResourceProvider {
|
|
@override
|
|
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
|
}
|
|
|
|
/// A concrete implementation of a server plugin that is suitable for testing.
|
|
class MockServerPlugin extends ServerPlugin {
|
|
MockServerPlugin(ResourceProvider resourceProvider) : super(resourceProvider);
|
|
|
|
@override
|
|
List<String> get fileGlobsToAnalyze => <String>['*.dart'];
|
|
|
|
@override
|
|
String get name => 'Test Plugin';
|
|
|
|
@override
|
|
String get version => '0.1.0';
|
|
|
|
@override
|
|
AnalysisDriverGeneric createAnalysisDriver(ContextRoot contextRoot) {
|
|
return MockAnalysisDriver();
|
|
}
|
|
}
|
|
|
|
class MockSource implements Source {
|
|
@override
|
|
TimestampedData<String> get contents => TimestampedData(0, '');
|
|
|
|
@override
|
|
String get encoding => '';
|
|
|
|
@override
|
|
String get fullName => '/pkg/lib/test.dart';
|
|
|
|
@override
|
|
bool get isInSystemLibrary => false;
|
|
|
|
@override
|
|
Source get librarySource => this;
|
|
|
|
@override
|
|
int get modificationStamp => 0;
|
|
|
|
@override
|
|
String get shortName => 'test.dart';
|
|
|
|
@override
|
|
Source get source => this;
|
|
|
|
@override
|
|
Uri get uri => Uri.parse('package:test/test.dart');
|
|
|
|
@override
|
|
UriKind get uriKind => UriKind.PACKAGE_URI;
|
|
|
|
@override
|
|
bool exists() => true;
|
|
}
|