// 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 'dart:collection'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/src/dart/analysis/driver.dart'; import 'package:analyzer/src/dart/analysis/file_state.dart'; import 'package:analyzer/src/generated/engine.dart'; 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 extends AnalysisDriver { @override Set addedFiles = new HashSet(); MockAnalysisDriver() : super( new AnalysisDriverScheduler(null), null, new MockResourceProvider(), null, new FileContentOverlay(), null, new SourceFactory([]), new AnalysisOptionsImpl()); @override bool get hasFilesToAnalyze => false; @override set priorityFiles(List priorityPaths) {} @override AnalysisDriverPriority get workPriority => AnalysisDriverPriority.nothing; @override void addFile(String path) { addedFiles.add(path); } @override void dispose() {} @override Future performWork() => new Future.value(null); } class MockChannel implements PluginCommunicationChannel { bool _closed = false; void Function() _onDone; Function _onError; void Function(Notification) _onNotification; void Function(Request) _onRequest; List sentNotifications = []; int idCounter = 0; Map> completers = >{}; @override void close() { _closed = true; } @override void listen(void onRequest(Request request), {void onDone(), Function onError, Function onNotification}) { _onDone = onDone; _onError = onError; _onNotification = onNotification; _onRequest = onRequest; } void sendDone() { _onDone(); } void sendError(Object exception, StackTrace stackTrace) { _onError(exception, stackTrace); } @override void sendNotification(Notification notification) { if (_closed) { throw new StateError('Sent a notification to a closed channel'); } if (_onNotification == null) { fail('Unexpected invocation of sendNotification'); } _onNotification(notification); } Future sendRequest(RequestParams params) { if (_onRequest == null) { fail('Unexpected invocation of sendNotification'); } String id = (idCounter++).toString(); Request request = params.toRequest(id); Completer completer = new Completer(); completers[request.id] = completer; _onRequest(request); return completer.future; } @override void sendResponse(Response response) { if (_closed) { throw new StateError('Sent a response to a closed channel'); } Completer completer = completers.remove(response.id); completer.complete(response); } } class MockResourceProvider implements ResourceProvider { @override 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 get fileGlobsToAnalyze => ['*.dart']; @override String get name => 'Test Plugin'; @override String get version => '0.1.0'; @override AnalysisDriverGeneric createAnalysisDriver(ContextRoot contextRoot) { return new MockAnalysisDriver(); } } class MockSource implements Source { @override TimestampedData get contents => null; @override String get encoding => null; @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; }