16
16
import 'dart:async' ;
17
17
import 'dart:io' ;
18
18
19
- const ansiRed = '\x 1b[31m' ;
20
- const ansiDefault = '\x 1b[39;49m' ;
21
-
22
- void printError (Object ? message) {
23
- if (stderr.supportsAnsiEscapes) {
24
- message = '$ansiRed $message $ansiDefault ' ;
25
- }
26
- stderr.writeln (message);
27
- }
28
-
29
- class StepFailure implements Exception {
30
- StepFailure (this .name);
31
- String name;
32
- @override
33
- String toString () => 'step failed: $name ' ;
34
- }
35
-
36
- abstract class Step {
37
- /// Runs this step, raises an exception if something fails.
38
- Future <void > run ();
39
- }
40
-
41
- class Callback implements Step {
42
- Callback (this .name, this .function);
43
- String name;
44
- Future <void > Function () function;
45
- @override
46
- Future <void > run () => function ();
47
- }
48
-
49
- class Command implements Step {
50
- Command (this .exec, this .args, this .workingDirectory);
51
- final String exec;
52
- final List <String > args;
53
- final String workingDirectory;
54
-
55
- @override
56
- Future <void > run () async {
57
- final result =
58
- await Process .run (exec, args, workingDirectory: workingDirectory);
59
- if (result.exitCode != 0 ) {
60
- printError (result.stdout);
61
- printError (result.stderr);
62
- final commandString = "$exec ${args .join (" " )}" ;
63
- stderr.writeln ("failure executing command: $commandString " );
64
- throw StepFailure (commandString);
65
- }
66
- }
67
- }
68
-
69
- class Runner {
70
- static final gitRoot = getRepositoryRoot ();
71
- Runner (this .name, this .defaultWorkingDir);
72
- String name;
73
- String defaultWorkingDir;
74
- final steps = < Step > [];
75
- final cleanupSteps = < Step > [];
76
-
77
- void chainCommand (String exec, List <String > args,
78
- {String ? workingDirectory}) =>
79
- _addCommand (steps, exec, args, workingDirectory: workingDirectory);
80
-
81
- void chainCleanupCommand (String exec, List <String > args,
82
- {String ? workingDirectory}) =>
83
- _addCommand (cleanupSteps, exec, args, workingDirectory: workingDirectory);
84
-
85
- void _addCommand (List <Step > list, String exec, List <String > args,
86
- {String ? workingDirectory}) {
87
- final resolvedWorkingDirectory =
88
- gitRoot.resolve (workingDirectory ?? defaultWorkingDir);
89
- list.add (Command (exec, args, resolvedWorkingDirectory.toFilePath ()));
90
- }
91
-
92
- void chainCallback (String name, Future <void > Function () callback) {
93
- steps.add (Callback (name, callback));
94
- }
95
-
96
- Future <void > run () async {
97
- stderr.writeln ("started: $name " );
98
- var error = false ;
99
- for (var step in steps) {
100
- try {
101
- await step.run ();
102
- } on StepFailure catch (e) {
103
- stderr.writeln (e);
104
- error = true ;
105
- exitCode = 1 ;
106
- break ;
107
- }
108
- }
109
- stderr.writeln ('${error ? "failed" : "complete" }: $name ' );
110
- for (var step in cleanupSteps) {
111
- try {
112
- await step.run ();
113
- } on Exception catch (e) {
114
- printError ("ERROR: $e " );
115
- }
116
- }
117
- }
118
- }
119
-
120
- Uri getRepositoryRoot () {
121
- final gitCommand = Process .runSync ("git" , ["rev-parse" , "--show-toplevel" ]);
122
- final output = gitCommand.stdout as String ;
123
- return Uri .directory (output.trim ());
124
- }
19
+ import 'command_runner.dart' ;
125
20
126
21
void main () async {
127
- final jniAnalyze = Runner ("Analyze JNI" , "jni" );
22
+ final gitRoot = getRepositoryRoot ();
23
+
24
+ // change to project root
25
+ Directory .current = gitRoot.toFilePath ();
26
+
27
+ final tempDir = Directory .current.createTempSync ('jnigen_checks_clone_' );
28
+ final tempJniPath = tempDir.uri.resolve ("jni/" );
29
+ final tempJnigenPath = tempDir.uri.resolve ("jnigen/" );
30
+ final gitClone = Runner ("Clone jni" , Directory .current.uri)
31
+ ..chainCommand ('git' , ['clone' , '.' , tempDir.path])
32
+ ..chainCommand ("flutter" , ["pub" , "get" , "--offline" ],
33
+ workingDirectory: tempJniPath)
34
+ ..chainCommand ("dart" , ["pub" , "get" , "--offline" ],
35
+ workingDirectory: tempJnigenPath);
36
+ await gitClone.run ();
37
+
38
+ final jniAnalyze = Runner ("Analyze JNI" , tempJniPath);
128
39
jniAnalyze
129
40
..chainCommand ("dart" , ["analyze" , "--fatal-infos" ])
130
41
..chainCommand (
@@ -139,35 +50,44 @@ void main() async {
139
50
"third_party/global_jni_env.c" ,
140
51
"third_party/global_jni_env.h" ,
141
52
],
142
- workingDirectory: "jni/ src" );
143
- final jniTest = Runner ("Test JNI" , "jni" )
53
+ workingDirectory: tempJniPath. resolve ( " src/" ) );
54
+ final jniTest = Runner ("Test JNI" , tempJniPath )
144
55
..chainCommand ("dart" , ["run" , "jni:setup" ])
145
56
..chainCommand ("dart" , ["test" , "-j" , "1" ]);
146
57
unawaited (jniAnalyze.run ().then ((f) => jniTest.run ()));
58
+
147
59
final ffigenBindingsPath = getRepositoryRoot ()
148
60
.resolve ("jni/lib/src/third_party/jni_bindings_generated.dart" );
149
61
final ffigenBindings = File .fromUri (ffigenBindingsPath);
150
62
final oldBindingsText = ffigenBindings.readAsStringSync ();
151
- final ffigenCompare = Runner ("Generate & Compare FFIGEN bindings" , "jni" )
152
- ..chainCommand ("dart" , ["run" , "ffigen" , "--config" , "ffigen.yaml" ])
153
- ..chainCallback ("compare bindings" , () async {
154
- final newBindingsText = await ffigenBindings.readAsString ();
155
- if (newBindingsText != oldBindingsText) {
156
- await ffigenBindings.writeAsString (oldBindingsText);
157
- throw "new JNI.h bindings differ from old bindings" ;
158
- }
159
- });
63
+ final ffigenCompare =
64
+ Runner ("Generate & Compare FFIGEN bindings" , tempJniPath)
65
+ ..chainCommand ("dart" , ["run" , "ffigen" , "--config" , "ffigen.yaml" ])
66
+ ..chainCallback ("compare bindings" , () async {
67
+ final newBindingsText = await ffigenBindings.readAsString ();
68
+ if (newBindingsText != oldBindingsText) {
69
+ await ffigenBindings.writeAsString (oldBindingsText);
70
+ throw "new JNI.h bindings differ from old bindings" ;
71
+ }
72
+ });
160
73
unawaited (ffigenCompare.run ());
161
74
162
- final jnigenAnalyze = Runner ("Analyze jnigen" , "jnigen" )
75
+ final jnigenAnalyze = Runner ("Analyze jnigen" , tempJnigenPath )
163
76
..chainCommand ("dart" , ["analyze" , "--fatal-infos" ])
164
77
..chainCommand (
165
78
"dart" , ["format" , "--output=none" , "--set-exit-if-changed" , "." ])
166
79
..chainCommand ("dart" , ["run" , "jnigen:setup" ]);
167
- final jnigenTest = Runner ("Test jnigen" , "jnigen" )
168
- ..chainCommand ("dart" , ["test" ]);
80
+
81
+ // Tests may need more time when running on systems with less cores.
82
+ // So '--timeout 2x' is specified.
83
+ final jnigenTest = Runner ("Test jnigen" , gitRoot.resolve ("jnigen/" ))
84
+ ..chainCommand ("dart" , ["test" , "--timeout" , "2x" ]);
85
+
86
+ // Note: Running in_app_java and notification_plugin checks on source dir
87
+ // itself, because running flutter build in cloned dir will take time.
169
88
final compareInAppJavaBindings = Runner (
170
- "Generate & compare InAppJava bindings" , "jnigen/example/in_app_java" )
89
+ "Generate & compare InAppJava bindings" ,
90
+ gitRoot.resolve ("jnigen/example/in_app_java" ))
171
91
..chainCommand ("dart" , [
172
92
"run" ,
173
93
"jnigen" ,
@@ -179,8 +99,9 @@ void main() async {
179
99
..chainCommand ("diff" , ["lib/android_utils.dart" , "_temp.dart" ])
180
100
..chainCommand ("diff" , ["-qr" , "src/android_utils/" , "src_temp/" ])
181
101
..chainCleanupCommand ("rm" , ["-r" , "_temp.dart" , "src_temp" ]);
182
- final comparePdfboxBindings = Runner (
183
- "Generate & compare PdfBox Bindings" , "jnigen/example/pdfbox_plugin" )
102
+
103
+ final comparePdfboxBindings = Runner ("Generate & compare PdfBox Bindings" ,
104
+ gitRoot.resolve ("jnigen/example/pdfbox_plugin" ))
184
105
..chainCommand ("dart" , [
185
106
"run" ,
186
107
"jnigen" ,
@@ -192,9 +113,10 @@ void main() async {
192
113
..chainCommand ("diff" , ["-qr" , "lib/src/third_party/" , "lib_temp/" ])
193
114
..chainCommand ("diff" , ["-qr" , "src/" , "src_temp/" ])
194
115
..chainCleanupCommand ("rm" , ["-r" , "lib_temp" , "src_temp" ]);
116
+
195
117
final compareNotificationPluginBindings = Runner (
196
118
"Generate & compare NotificationPlugin Bindings" ,
197
- "jnigen/example/notification_plugin" )
119
+ gitRoot. resolve ( "jnigen/example/notification_plugin" ) )
198
120
..chainCommand ("dart" , [
199
121
"run" ,
200
122
"jnigen" ,
@@ -206,10 +128,14 @@ void main() async {
206
128
..chainCommand ("diff" , ["lib/notifications.dart" , "_temp.dart" ])
207
129
..chainCommand ("diff" , ["-qr" , "src/" , "src_temp/" ])
208
130
..chainCleanupCommand ("rm" , ["-r" , "_temp.dart" , "src_temp" ]);
131
+
209
132
unawaited (jnigenAnalyze.run ().then ((_) {
210
- jnigenTest.run ();
211
- compareInAppJavaBindings.run ();
212
- comparePdfboxBindings.run ();
213
- compareNotificationPluginBindings.run ();
133
+ final test = jnigenTest.run ();
134
+ final inAppJava = compareInAppJavaBindings.run ();
135
+ final pdfBox = comparePdfboxBindings.run ();
136
+ final notificationPlugin = compareNotificationPluginBindings.run ();
137
+ return Future .wait ([test, inAppJava, pdfBox, notificationPlugin]);
138
+ }).then ((_) {
139
+ tempDir.deleteSync (recursive: true );
214
140
}));
215
141
}
0 commit comments