blob: 5968afe2b849b147d9638d4a476418db9e063712 [file] [edit]
// Copyright (c) 2025, 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:jnigen/jnigen.dart';
import 'package:jnigen/src/logging/logging.dart';
import 'package:jnigen/src/summary/summary.dart';
import 'package:path/path.dart';
import 'package:test/test.dart';
void expectBuildSummarizerTriggered(List<String> log, {bool triggered = true}) {
final matcher = contains(predicate<String>(
(msg) =>
msg.contains('ApiSummarizer.jar exists') ||
msg.contains('Building ApiSummarizer component') ||
msg.contains('Rebuilding ApiSummarizer component'),
));
expect(log, triggered ? matcher : isNot(matcher));
}
void main() {
test('Warn if non-jnigen-generated files exist in directory', () async {
final root = await Directory.current.createTemp();
final nonGenerated =
await File.fromUri(root.uri.resolve('non_gen.dart')).create();
await nonGenerated.writeAsString('void main() {}');
final generated = await File.fromUri(root.uri.resolve('gen.dart')).create();
await generated
.writeAsString('// AUTO GENERATED BY JNIGEN 1.2.3. DO NOT EDIT!\n');
final sourcePath =
join(Directory.current.path, 'test', 'simple_package_test', 'java');
print(sourcePath);
final logMessages = <String>[];
final logSub = log.onRecord.listen((r) => logMessages.add(r.message));
await expectLater(
() => JniGenerator(
input: Input(
classes: ['com.github.dart_lang.jnigen.simple_package'],
sourcePath: [Uri.directory(sourcePath)],
),
output: Output(
dart: DartOutput(
path: root.uri,
structure: OutputStructure.packageStructure,
),
),
).generate(),
throwsA(allOf([
isA<StateError>(),
predicate(
(error) => error.toString().contains('not generated by JNIgen')),
predicate((error) => error.toString().contains('non_gen.dart')),
])),
);
await logSub.cancel();
expectBuildSummarizerTriggered(logMessages, triggered: true);
await root.delete(recursive: true);
});
test('buildSummarizerIfNotExists is skipped if summarizerCommand is passed',
() async {
final root = await Directory.current.createTemp();
final fakeSummarizer = File(join(root.path, 'fake_summarizer.dart'));
const errorMessage = 'Custom summarizer error output';
await fakeSummarizer.writeAsString('''
import 'dart:io';
void main() {
stderr.writeln('$errorMessage');
exit(1);
}
''');
final outDir = Directory(join(root.path, 'out'))..createSync();
final config = JniGenerator(
input: Input(
classes: ['com.example.Test'],
summarizerCommand: '${Platform.executable} ${fakeSummarizer.path}',
),
output: Output(
dart: DartOutput(
path: outDir.uri,
structure: OutputStructure.packageStructure,
),
),
);
final logMessages = <String>[];
final logSub = log.onRecord.listen((r) => logMessages.add(r.message));
try {
await getSummary(config);
fail('Expected SummaryParseException');
} on SummaryParseException catch (e) {
expect(e.stderr, contains(errorMessage));
}
await logSub.cancel();
expectBuildSummarizerTriggered(logMessages, triggered: false);
expect(
logMessages,
contains(predicate<String>(
(msg) => msg.contains('execute ${Platform.executable}'))),
);
await root.delete(recursive: true);
});
}