// Copyright (c) 2021, 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:convert'; import 'dart:io'; import 'package:test/test.dart'; import '../utils.dart' as utils; void main() { group( 'language-server', defineLanguageServerTests, timeout: utils.longTimeout, onPlatform: { 'windows': Skip('https://github.com/dart-lang/sdk/issues/44679'), }, ); } void defineLanguageServerTests() { utils.TestProject project; Process process; tearDown(() { project?.dispose(); process?.kill(); }); Future runWithLsp(List args) async { project = utils.project(); process = await project.start(args); final Stream inStream = process.stdout.transform(utf8.decoder); // Send an LSP init. final String message = jsonEncode({ 'jsonrpc': '2.0', 'id': 1, 'method': 'initialize', 'params': { 'processId': pid, 'clientInfo': {'name': 'dart-cli-tester'}, 'capabilities': {}, 'rootUri': project.dir.uri.toString(), }, }); process.stdin.write('Content-Length: ${message.length}\r\n'); process.stdin.write('\r\n'); process.stdin.write(message); List responses = await inStream.take(2).toList(); expect(responses, hasLength(2)); expect(responses[0], startsWith('Content-Length: ')); final json = jsonDecode(responses[1]); expect(json['id'], 1); expect(json['result'], isNotNull); final result = json['result']; expect(result['capabilities'], isNotNull); expect(result['serverInfo'], isNotNull); final serverInfo = result['serverInfo']; expect(serverInfo['name'], isNotEmpty); process.kill(); process = null; } test('protocol default', () async { return runWithLsp(['language-server']); }); test('protocol lsp', () async { return runWithLsp(['language-server', '--protocol=lsp']); }); test('protocol analyzer', () async { project = utils.project(); process = await project.start(['language-server', '--protocol=analyzer']); final Stream inStream = process.stdout .transform(utf8.decoder) .transform(const LineSplitter()); final line = await inStream.first; final json = jsonDecode(line); expect(json['event'], 'server.connected'); expect(json['params'], isNotNull); final params = json['params']; expect(params['version'], isNotEmpty); expect(params['pid'], isNot(0)); process.kill(); process = null; }); }