Skip to content

Commit de36084

Browse files
committed
WIP: [ffigen] Support concurrent tests
1 parent 613aa5f commit de36084

File tree

7 files changed

+26
-38
lines changed

7 files changed

+26
-38
lines changed

pkgs/ffigen/dart_test.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
11
# This package uses dart:ffi.
22
test_on: vm
3-
4-
# https://github.com/dart-lang/native/issues/461
5-
concurrency: 1

pkgs/ffigen/lib/src/logger.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@ import 'dart:io';
77
import 'package:logging/logging.dart';
88

99
/// Creates a default logger that logs to stdout and stderr.
10-
Logger createDefaultLogger() {
10+
Logger createDefaultLogger([Level level = Level.INFO]) {
1111
final logger = Logger.detached('FFIgen');
12-
logger.level = Level.INFO;
12+
logger.level = level;
1313
logger.onRecord.listen((record) {
14+
final levelStr = '[${record.level.name}]'.padRight(9);
15+
final log = '$levelStr: ${record.message}';
1416
if (record.level >= Level.WARNING) {
15-
stderr.writeln(record.message);
17+
stderr.writeln(log);
1618
} else {
17-
stdout.writeln(record.message);
19+
stdout.writeln(log);
1820
}
1921
if (record.error != null) {
2022
stderr.writeln(record.error);

pkgs/ffigen/test/example_tests/libclang_example_test.dart

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ import '../test_utils.dart';
1515

1616
void main() {
1717
group('example_test', () {
18-
setUpAll(() {
19-
logWarnings(Level.SEVERE);
20-
});
2118
test('libclang-example', () {
2219
final configYaml = File(
2320
path.join(
@@ -27,12 +24,19 @@ void main() {
2724
'config.yaml',
2825
),
2926
).absolute;
30-
late FfiGenerator generator;
31-
late Library library;
32-
withChDir(configYaml.path, () {
33-
generator = testConfigFromPath(configYaml.path);
34-
library = parse(testContext(generator));
35-
});
27+
final generator = testConfigFromPath(configYaml.path);
28+
29+
// The clang parser is run using the current working directory, and the
30+
// libclang-example config relies on relative paths for one of its '-I'
31+
// compiler options. It can't use absolute paths because it's checked in
32+
// yaml code. To support concurrent tests, we can't set Directory.current.
33+
// As a workaround, add an extra '-I' option that uses the absolute path.
34+
generator.headers.compilerOptions!.add(
35+
'-I${path.join(packagePathForTests, 'third_party/libclang/include')}'
36+
);
37+
38+
final context = testContext(generator);
39+
final library = parse(context);
3640

3741
matchLibraryWithExpected(library, 'example_libclang.dart', [
3842
generator.output.dartFile.toFilePath(),

pkgs/ffigen/test/large_integration_tests/large_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:ffigen/src/code_generator/imports.dart';
66
import 'package:ffigen/src/config_provider/config.dart';
77
import 'package:ffigen/src/config_provider/config_types.dart';
8+
import 'package:ffigen/src/context.dart';
89
import 'package:ffigen/src/header_parser.dart';
910
import 'package:logging/logging.dart';
1011
import 'package:path/path.dart' as path;
@@ -25,7 +26,7 @@ void main() {
2526
'include',
2627
);
2728
final logArr = <String>[];
28-
logToArray(logArr, Level.SEVERE);
29+
final logger = logToArray(logArr, Level.SEVERE);
2930
final generator = FfiGenerator(
3031
output: Output(
3132
dartFile: Uri.file('unused'),
@@ -75,7 +76,7 @@ void main() {
7576
imported: [ImportedType(ffiImport, 'Int64', 'int', 'time_t')],
7677
),
7778
);
78-
final library = parse(testContext(generator));
79+
final library = parse(Context(logger, generator));
7980

8081
matchLibraryWithExpected(
8182
library,

pkgs/ffigen/test/native_test/native_test.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,7 @@ void main() {
4242
),
4343
).absolute;
4444

45-
late FfiGenerator config;
46-
withChDir(configFile.path, () {
47-
config = testConfigFromPath(configFile.path);
48-
});
45+
final config = testConfigFromPath(configFile.path);
4946
final library = parse(testContext(config));
5047

5148
library.generateFile(outFile);

pkgs/ffigen/test/test_utils.dart

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:ffigen/src/config_provider/config.dart';
1111
import 'package:ffigen/src/config_provider/utils.dart';
1212
import 'package:ffigen/src/config_provider/yaml_config.dart';
1313
import 'package:ffigen/src/context.dart';
14+
import 'package:ffigen/src/logger.dart';
1415
import 'package:ffigen/src/visitor/ast.dart';
1516
import 'package:logging/logging.dart';
1617
import 'package:package_config/package_config_types.dart';
@@ -21,7 +22,7 @@ import 'package:yaml/yaml.dart' as yaml;
2122
export 'package:ffigen/src/config_provider/utils.dart';
2223

2324
Context testContext([FfiGenerator? generator]) => Context(
24-
Logger.root,
25+
createDefaultLogger(Level.SEVERE),
2526
generator ?? FfiGenerator(output: Output(dartFile: Uri.file('unused'))),
2627
);
2728

@@ -248,19 +249,4 @@ FfiGenerator testConfigFromPath(String path) {
248249
return testConfig(yamlBody, filename: path);
249250
}
250251

251-
T withChDir<T>(String path, T Function() inner) {
252-
final oldDir = Directory.current;
253-
Directory.current = File(path).parent;
254-
255-
late T result;
256-
257-
try {
258-
result = inner();
259-
} finally {
260-
Directory.current = oldDir;
261-
}
262-
263-
return result;
264-
}
265-
266252
bool isFlutterTester = Platform.resolvedExecutable.contains('flutter_tester');

pkgs/ffigen/tool/libclang_config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ functions:
6464
- clang_getDiagnosticSeverity
6565
- clang_disposeDiagnostic
6666
- clang_parseTranslationUnit
67+
- clang_parseTranslationUnit2FullArgv
6768
- clang_disposeTranslationUnit
6869
- clang_EvalResult_getKind
6970
- clang_EvalResult_getAsInt

0 commit comments

Comments
 (0)