Files
sdk/pkg/analysis_server/integration_test/coverage_test.dart
T
Danny Tuppeny b0d4ab8ef9 [analysis_server] Move test/integration to integration_test
This was mostly a rename/move of the folder (and the analysis server updated all references), but I also had to:

- add `integration_test/analysis_options.yaml` to import from `../test` to get the same lint ignores
- update paths of exclusions in `verify_sorted_test.dart`

By moving all of the tests that start the server out-of-process out of test, we can:

1. Use "dart test" to just run the faster tests ("dart test test") and get functionality of the pkg:test runner (for example running tests concurrently and JSON output)
2. Allow VS Code to spawn different debug sessions for the "test" and "integration_test" folder, which means we can use a `preLaunchTask` to trigger compilation of the analysis server from source whenever running integration tests (avoiding having to compile manually, or run from source in a way that compiles a new server for each test suite)

Change-Id: I37cc03dc32d08c5b51a2eab79f6338bb079b32ac
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/434801
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2025-06-17 12:54:41 -07:00

117 lines
3.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, 'integration_test', '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, 'integration_test', 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));
}
});
});
}