blob: a9f288cfd45c82344cb2838e648a460e99200659 [file] [log] [blame]
// Copyright (c) 2014, 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 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'analysis_server_base.dart';
import 'mocks.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(ExecutionDomainTest);
});
// group('ExecutionDomainHandler', () {
// var provider = MemoryResourceProvider();
// late AnalysisServer server;
// late ExecutionDomainHandler handler;
//
// setUp(() {
// server = AnalysisServer(
// MockServerChannel(),
// provider,
// AnalysisServerOptions(),
// DartSdkManager(''),
// CrashReportingAttachmentsBuilder.empty,
// InstrumentationService.NULL_SERVICE);
// handler = ExecutionDomainHandler(server, server.executionContext);
// });
//
// // TODO(brianwilkerson) Re-enable these tests if we re-enable the
// // execution.mapUri request.
// group('mapUri', () {
// String contextId;
//
// void createExecutionContextIdForFile(String path) {
// Request request = new ExecutionCreateContextParams(path).toRequest('0');
// Response response = handler.handleRequest(request, NotCancelableToken());
// expect(response, isResponseSuccess('0'));
// ExecutionCreateContextResult result =
// new ExecutionCreateContextResult.fromResponse(response);
// contextId = result.id;
// }
//
// setUp(() {
// Folder folder = provider.newFile('/a/b.dart', '').parent;
// server.folderMap.putIfAbsent(folder, () {
// SourceFactory factory =
// new SourceFactory([new ResourceUriResolver(provider)]);
// AnalysisContext context =
// AnalysisEngine.instance.createAnalysisContext();
// context.sourceFactory = factory;
// return context;
// });
// createExecutionContextIdForFile('/a/b.dart');
// });
//
// tearDown(() {
// Request request =
// new ExecutionDeleteContextParams(contextId).toRequest('1');
// Response response = handler.handleRequest(request, NotCancelableToken());
// expect(response, isResponseSuccess('1'));
// });
//
// group('file to URI', () {
// test('does not exist', () {
// Request request =
// new ExecutionMapUriParams(contextId, file: '/a/c.dart')
// .toRequest('2');
// Response response = handler.handleRequest(request, NotCancelableToken());
// expect(response, isResponseFailure('2'));
// });
//
// test('directory', () {
// provider.newFolder('/a/d');
// Request request =
// new ExecutionMapUriParams(contextId, file: '/a/d').toRequest('2');
// Response response = handler.handleRequest(request, NotCancelableToken());
// expect(response, isResponseFailure('2'));
// });
// });
//
// group('URI to file', () {
// test('invalid', () {
// Request request =
// new ExecutionMapUriParams(contextId, uri: 'foo:///a/b.dart')
// .toRequest('2');
// Response response = handler.handleRequest(request, NotCancelableToken());
// expect(response, isResponseFailure('2'));
// });
// });
//
// test('invalid context id', () {
// Request request =
// new ExecutionMapUriParams('xxx', uri: '').toRequest('4');
// Response response = handler.handleRequest(request, NotCancelableToken());
// expect(response, isResponseFailure('4'));
// });
//
// test('both file and uri', () {
// Request request =
// new ExecutionMapUriParams('xxx', file: '', uri: '').toRequest('5');
// Response response = handler.handleRequest(request, NotCancelableToken());
// expect(response, isResponseFailure('5'));
// });
//
// test('neither file nor uri', () {
// Request request = new ExecutionMapUriParams('xxx').toRequest('6');
// Response response = handler.handleRequest(request, NotCancelableToken());
// expect(response, isResponseFailure('6'));
// });
// });
// });
}
@reflectiveTest
class ExecutionDomainTest extends PubPackageAnalysisServerTest {
late String contextId;
@override
Future<void> setUp() async {
super.setUp();
await setRoots(included: [workspaceRootPath], excluded: []);
await _createExecutionContext(testFile);
}
@override
Future<void> tearDown() async {
await _disposeExecutionContext();
super.tearDown();
}
Future<void> test_createAndDeleteMultipleContexts() async {
var request = ExecutionCreateContextParams('/a/b.dart').toRequest('0');
var response = await handleSuccessfulRequest(request);
expect(response, isResponseSuccess('0'));
var result = ExecutionCreateContextResult.fromResponse(response);
var id0 = result.id;
request = ExecutionCreateContextParams('/c/d.dart').toRequest('1');
response = await handleSuccessfulRequest(request);
expect(response, isResponseSuccess('1'));
result = ExecutionCreateContextResult.fromResponse(response);
var id1 = result.id;
expect(id0 == id1, isFalse);
request = ExecutionDeleteContextParams(id0).toRequest('2');
response = await handleSuccessfulRequest(request);
expect(response, isResponseSuccess('2'));
request = ExecutionDeleteContextParams(id1).toRequest('3');
response = await handleSuccessfulRequest(request);
expect(response, isResponseSuccess('3'));
}
Future<void> test_deleteNonExistentContext() async {
var request = ExecutionDeleteContextParams('13').toRequest('0');
var response = await handleSuccessfulRequest(request);
// TODO(brianwilkerson) It isn't currently specified to be an error if a
// client attempts to delete a context that doesn't exist. Should it be?
// expect(response, isResponseFailure('0'));
expect(response, isResponseSuccess('0'));
}
Future<void> test_getSuggestions() async {
var code = r'''
class A {
int foo;
}
void contextFunction() {
var a = new A();
// context line
}
''';
var path = newFile('/test.dart', '').path;
newFile(path, code);
var request = ExecutionGetSuggestionsParams(
'a.',
2,
path,
code.indexOf('// context line'),
<RuntimeCompletionVariable>[]).toRequest('0');
var response = await handleSuccessfulRequest(request);
var result = ExecutionGetSuggestionsResult.fromResponse(response);
// expect(result.suggestions, isNotEmpty);
//
// expect(
// result.suggestions,
// contains(
// predicate<CompletionSuggestion>((s) => s.completion == 'foo')));
// TODO(brianwilkerson) Restore the expectations above (and delete the line
// below) after the functionality has been re-enabled.
expect(result.suggestions, isEmpty);
}
Future<void> test_mapUri_file() async {
var path = newFile('/a/b.dart', '').path;
// map the file
var result = await _mapUri(file: path);
expect(result.file, isNull);
expect(result.uri, Uri.file(path).toString());
}
Future<void> test_mapUri_file_dartUriKind() async {
var path = (await _mapUri(uri: 'dart:async')).file;
// map file
var result = await _mapUri(file: path);
expect(result.file, isNull);
expect(result.uri, 'dart:async');
}
Future<void> test_mapUri_uri() async {
var path = newFile('/a/b.dart', '').path;
// map the uri
var result = await _mapUri(uri: Uri.file(path).toString());
expect(result.file, convertPath('/a/b.dart'));
expect(result.uri, isNull);
}
Future<void> _createExecutionContext(File file) async {
var request = ExecutionCreateContextParams(file.path).toRequest('0');
var response = await handleSuccessfulRequest(request);
expect(response, isResponseSuccess('0'));
var result = ExecutionCreateContextResult.fromResponse(response);
contextId = result.id;
}
Future<void> _disposeExecutionContext() async {
var request = ExecutionDeleteContextParams(contextId).toRequest('1');
var response = await handleSuccessfulRequest(request);
expect(response, isResponseSuccess('1'));
}
Future<ExecutionMapUriResult> _mapUri({String? file, String? uri}) async {
var request =
ExecutionMapUriParams(contextId, file: file, uri: uri).toRequest('2');
var response = await handleSuccessfulRequest(request);
expect(response, isResponseSuccess('2'));
return ExecutionMapUriResult.fromResponse(response);
}
}