c3d80286fe
This adds support for the legacy server to switch to URIs using a client capability. In this mode, all "FilePaths" will be URI strings over the protocol (in both directions). It also allows the server to send LSP notifications (wrapped inside an "lsp.notification" notification, matching how requests/responses work). Notifications are automatically enabled if the client uses any LSP methods or sends the new "supportsUris" capability. Change-Id: I5d2b76e396862129c61de70d57397603c958a02d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/349120 Reviewed-by: Jaime Wren <jwren@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
134 lines
4.6 KiB
Dart
134 lines
4.6 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:io';
|
|
|
|
import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
|
|
import 'package:path/path.dart' as path;
|
|
import 'package:test/test.dart';
|
|
|
|
import '../../tool/spec/api.dart';
|
|
import '../../tool/spec/from_html.dart';
|
|
|
|
/// Define tests to fail if there's no mention in the coverage file.
|
|
void main() {
|
|
Api api;
|
|
File coverageFile;
|
|
String pathPrefix;
|
|
|
|
// parse the API file
|
|
if (FileSystemEntity.isFileSync(
|
|
path.join('tool', 'spec', 'spec_input.html'))) {
|
|
api = readApi('.');
|
|
pathPrefix = '.';
|
|
} else {
|
|
api = readApi(path.join('pkg', 'analysis_server'));
|
|
pathPrefix = path.join('pkg', 'analysis_server');
|
|
}
|
|
|
|
coverageFile =
|
|
File(path.join(pathPrefix, 'test', 'integration', 'coverage.md'));
|
|
var lines = coverageFile.readAsLinesSync();
|
|
|
|
// ## server domain
|
|
var coveredDomains = lines
|
|
.where((line) => line.startsWith('## ') && line.endsWith(' domain'))
|
|
.map((line) =>
|
|
line.substring('##'.length, line.length - 'domain'.length).trim())
|
|
.toSet();
|
|
|
|
// Remove any ' (test failed)' suffixes.
|
|
lines = lines.map((String line) {
|
|
var index = line.indexOf('(');
|
|
return index != -1 ? line.substring(0, index).trim() : line;
|
|
}).toList();
|
|
|
|
// - [ ] server.getVersion
|
|
var allMembers = lines
|
|
.where((line) => line.startsWith('- '))
|
|
.map((line) => line.substring('- [ ]'.length).trim())
|
|
.toSet();
|
|
var coveredMembers = lines
|
|
.where((line) => line.startsWith('- [x]'))
|
|
.map((line) => line.substring('- [x]'.length).trim())
|
|
.toSet();
|
|
|
|
// generate domain tests
|
|
for (var domain in api.domains) {
|
|
group('integration coverage of ${domain.name}', () {
|
|
// domain
|
|
test('domain', () {
|
|
if (!coveredDomains.contains(domain.name)) {
|
|
fail('${domain.name} domain not found in ${coverageFile.path}');
|
|
}
|
|
});
|
|
|
|
// requests
|
|
group('request', () {
|
|
for (var request in domain.requests) {
|
|
var fullName = '${domain.name}.${request.method}';
|
|
test(fullName, () {
|
|
if (!allMembers.contains(fullName)) {
|
|
fail('$fullName not found in ${coverageFile.path}');
|
|
}
|
|
|
|
var fileName = getCamelWords(request.method)
|
|
.map((s) => s.toLowerCase())
|
|
.join('_');
|
|
var testName = path.join(domain.name, '${fileName}_test.dart');
|
|
var testPath =
|
|
path.join(pathPrefix, 'test', 'integration', testName);
|
|
|
|
// Test that if checked, a test file exists; if not checked, no such
|
|
// file exists.
|
|
var fileExists = FileSystemEntity.isFileSync(testPath);
|
|
var isMarkedAsCovered = coveredMembers.contains(fullName);
|
|
expect(fileExists, isMarkedAsCovered,
|
|
reason: isMarkedAsCovered
|
|
? '$testName marked as covered but has no test at $testPath'
|
|
: '$testName marked as not covered has test at $testPath');
|
|
});
|
|
}
|
|
});
|
|
|
|
// notifications
|
|
group('notification', () {
|
|
for (var notification in domain.notifications) {
|
|
var fullName = '${domain.name}.${notification.event}';
|
|
test(fullName, () {
|
|
if (!allMembers.contains(fullName)) {
|
|
fail('$fullName not found in ${coverageFile.path}');
|
|
}
|
|
|
|
var fileName = getCamelWords(notification.event)
|
|
.map((s) => s.toLowerCase())
|
|
.join('_');
|
|
var testName = path.join(domain.name, '${fileName}_test.dart');
|
|
var testPath =
|
|
path.join(pathPrefix, 'test', 'integration', testName);
|
|
|
|
// Test that if checked, a test file exists; if not checked, no such
|
|
// file exists.
|
|
var fileExists = FileSystemEntity.isFileSync(testPath);
|
|
var isMarkedAsCovered = coveredMembers.contains(fullName);
|
|
expect(fileExists, isMarkedAsCovered,
|
|
reason: isMarkedAsCovered
|
|
? '$testName marked as covered but has no test at $testPath'
|
|
: '$testName marked as not covered has test at $testPath');
|
|
});
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
// validate no unexpected domains
|
|
group('integration coverage', () {
|
|
test('no unexpected domains', () {
|
|
for (var domain in coveredDomains) {
|
|
expect(api.domains.map((d) => d.name), contains(domain));
|
|
}
|
|
});
|
|
});
|
|
}
|