| // 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); |
| }); |
| } |