blob: ace5077ae2e94b5befa17b63befc9d0fe6ee2355 [file] [log] [blame]
Ian Hickson449f4a62019-11-27 15:04:02 -08001// Copyright 2014 The Flutter Authors. All rights reserved.
Sarah Zakarias49ba9742017-09-26 14:48:52 +02002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
fmatosqg197d4312018-05-21 10:52:33 +10005import 'package:file/file.dart';
6import 'package:file/memory.dart';
7import 'package:flutter_tools/src/base/file_system.dart';
Jonah Williams8ed40dd2020-04-13 18:55:01 -07008import 'package:flutter_tools/src/base/logger.dart';
Sarah Zakarias49ba9742017-09-26 14:48:52 +02009import 'package:flutter_tools/src/cache.dart';
10import 'package:flutter_tools/src/flutter_manifest.dart';
Sarah Zakarias49ba9742017-09-26 14:48:52 +020011
Ian Hicksond919e692019-07-13 11:51:44 -070012import '../src/common.dart';
13import '../src/context.dart';
Sarah Zakarias49ba9742017-09-26 14:48:52 +020014
15void main() {
16 setUpAll(() {
17 Cache.flutterRoot = getFlutterRoot();
18 });
19
Jonah Williams8ed40dd2020-04-13 18:55:01 -070020 testWithoutContext('FlutterManifest is empty when the pubspec.yaml file is empty', () async {
21 final BufferLogger logger = BufferLogger.test();
22 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
23 '',
24 logger: logger,
25 );
Sarah Zakarias3cbbbf02017-09-26 23:14:20 +020026
Jonah Williams8ed40dd2020-04-13 18:55:01 -070027 expect(flutterManifest.isEmpty, true);
28 expect(flutterManifest.appName, '');
29 expect(flutterManifest.usesMaterialDesign, false);
30 expect(flutterManifest.fontsDescriptor, isEmpty);
31 expect(flutterManifest.fonts, isEmpty);
32 expect(flutterManifest.assets, isEmpty);
33 });
34
35 testWithoutContext('FlutterManifest has no fonts or assets when the "flutter" section is empty', () async {
36 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +020037name: test
38dependencies:
39 flutter:
40 sdk: flutter
41''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -070042 final BufferLogger logger = BufferLogger.test();
43 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
44 manifest,
45 logger: logger,
46 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +020047
Jonah Williams8ed40dd2020-04-13 18:55:01 -070048 expect(flutterManifest, isNotNull);
49 expect(flutterManifest.isEmpty, false);
50 expect(flutterManifest.appName, 'test');
51 expect(flutterManifest.usesMaterialDesign, false);
52 expect(flutterManifest.fontsDescriptor, isEmpty);
53 expect(flutterManifest.fonts, isEmpty);
54 expect(flutterManifest.assets, isEmpty);
55 });
56
57 testWithoutContext('FlutterManifest knows if material design is used', () async {
58 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +020059name: test
60dependencies:
61 flutter:
62 sdk: flutter
63flutter:
64 uses-material-design: true
65''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -070066 final BufferLogger logger = BufferLogger.test();
67 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
68 manifest,
69 logger: logger,
70 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +020071
Jonah Williams8ed40dd2020-04-13 18:55:01 -070072 expect(flutterManifest.usesMaterialDesign, true);
73 });
74
75 testWithoutContext('FlutterManifest has two assets', () async {
76 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +020077name: test
78dependencies:
79 flutter:
80 sdk: flutter
81flutter:
82 uses-material-design: true
83 assets:
84 - a/foo
85 - a/bar
86''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -070087 final BufferLogger logger = BufferLogger.test();
88 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
89 manifest,
90 logger: logger,
91 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +020092
Jonah Williams8ed40dd2020-04-13 18:55:01 -070093 expect(flutterManifest.assets, <Uri>[
94 Uri.parse('a/foo'),
95 Uri.parse('a/bar'),
96 ]);
97 });
98
99 testWithoutContext('FlutterManifest has one font family with one asset', () async {
100 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200101name: test
102dependencies:
103 flutter:
104 sdk: flutter
105flutter:
106 uses-material-design: true
107 fonts:
108 - family: foo
109 fonts:
110 - asset: a/bar
111''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700112 final BufferLogger logger = BufferLogger.test();
113 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
114 manifest,
115 logger: logger,
116 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200117
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700118 expect(flutterManifest.fonts, hasLength(1));
119 expect(flutterManifest.fonts.single, matchesFont(
120 familyName: 'foo',
121 descriptor: <String, Object>{
122 'family': 'foo',
123 'fonts': <Object>[
124 <String, Object>{'asset': 'a/bar'},
125 ],
126 },
127 fontAssets: <Matcher>[
128 matchesFontAsset(assetUri: Uri.parse('a/bar')),
129 ],
130 ));
131 });
132
133 testWithoutContext('FlutterManifest has one font family with a simple asset '
134 'and one with weight', () async {
Alexandre Ardhuin841d5d72018-02-01 07:51:26 +0100135 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200136name: test
137dependencies:
138 flutter:
139 sdk: flutter
140flutter:
141 uses-material-design: true
142 fonts:
143 - family: foo
144 fonts:
145 - asset: a/bar
146 - asset: a/bar
147 weight: 400
148''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700149 final BufferLogger logger = BufferLogger.test();
150 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
151 manifest,
152 logger: logger,
153 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200154
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700155 expect(flutterManifest.fonts, hasLength(1));
156 expect(flutterManifest.fonts.single, matchesFont(
157 familyName: 'foo',
158 descriptor: <String, Object>{
159 'family': 'foo',
160 'fonts': <Object>[
161 <String, Object>{'asset': 'a/bar'},
162 <String, Object>{'weight': 400, 'asset': 'a/bar'},
163 ],
164 },
165 fontAssets: <Matcher>[
166 matchesFontAsset(assetUri: Uri.parse('a/bar')),
167 matchesFontAsset(assetUri: Uri.parse('a/bar'), weight: 400),
168 ])
169 );
170 });
171
172 testWithoutContext('FlutterManifest has one font family with a simple asset '
173 'and one with weight and style', () {
174 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200175name: test
176dependencies:
177 flutter:
178 sdk: flutter
179flutter:
180 uses-material-design: true
181 fonts:
182 - family: foo
183 fonts:
184 - asset: a/bar
185 - asset: a/bar
186 weight: 400
187 style: italic
188''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700189 final BufferLogger logger = BufferLogger.test();
190 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
191 manifest,
192 logger: logger,
193 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200194
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700195 expect(flutterManifest.fonts, hasLength(1));
196 expect(flutterManifest.fonts.single, matchesFont(
197 familyName: 'foo',
198 descriptor: <String, Object>{
199 'family': 'foo',
200 'fonts': <Object>[
201 <String, Object>{'asset': 'a/bar'},
202 <String, Object>{'weight': 400, 'style': 'italic', 'asset': 'a/bar'},
203 ],
204 },
205 fontAssets: <Matcher>[
206 matchesFontAsset(assetUri: Uri.parse('a/bar')),
207 matchesFontAsset(assetUri: Uri.parse('a/bar'), weight: 400, style: 'italic'),
208 ],
209 ));
210 });
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200211
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700212 testWithoutContext('FlutterManifest has two font families, each with one '
213 'simple asset and one with weight and style', () {
214 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200215name: test
216dependencies:
217 flutter:
218 sdk: flutter
219flutter:
220 uses-material-design: true
221 fonts:
222 - family: foo
223 fonts:
224 - asset: a/bar
225 - asset: a/bar
226 weight: 400
227 style: italic
228 - family: bar
229 fonts:
230 - asset: a/baz
231 - weight: 400
232 asset: a/baz
233 style: italic
234''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700235 final BufferLogger logger = BufferLogger.test();
236 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
237 manifest,
238 logger: logger,
239 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200240
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700241 expect(flutterManifest.fonts, hasLength(2));
242 expect(flutterManifest.fonts, containsAll(<Matcher>[
243 matchesFont(
244 familyName: 'foo',
245 descriptor: <String, Object>{
246 'family': 'foo',
247 'fonts': <Object>[
248 <String, Object>{'asset': 'a/bar'},
249 <String, Object>{'weight': 400, 'style': 'italic', 'asset': 'a/bar'},
250 ],
251 },
252 fontAssets: <Matcher>[
253 matchesFontAsset(assetUri: Uri.parse('a/bar')),
254 matchesFontAsset(assetUri: Uri.parse('a/bar'), weight: 400, style: 'italic'),
255 ],
256 ),
257 matchesFont(
258 familyName: 'bar',
259 descriptor: <String, Object>{
260 'family': 'bar',
261 'fonts': <Object>[
262 <String, Object>{'asset': 'a/baz'},
263 <String, Object>{'weight': 400, 'style': 'italic', 'asset': 'a/baz'},
264 ],
265 },
266 fontAssets: <Matcher>[
267 matchesFontAsset(assetUri: Uri.parse('a/baz')),
268 matchesFontAsset(assetUri: Uri.parse('a/baz'), weight: 400, style: 'italic'),
269 ],
270 ),
271 ]));
272 });
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200273
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700274 testWithoutContext('FlutterManifest.fontsDescriptor combines descriptors from '
275 'individual fonts', () {
276 const String manifest = '''
277name: test
278dependencies:
279 flutter:
280 sdk: flutter
281flutter:
282 uses-material-design: true
283 fonts:
284 - family: foo
285 fonts:
286 - asset: a/bar
287 - asset: a/bar
288 weight: 400
289 style: italic
290 - family: bar
291 fonts:
292 - asset: a/baz
293 - weight: 400
294 asset: a/baz
295 style: italic
296''';
297 final BufferLogger logger = BufferLogger.test();
298 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
299 manifest,
300 logger: logger,
301 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200302
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700303 expect(flutterManifest.fontsDescriptor, <Object>[
304 <String, Object>{
305 'family': 'foo',
306 'fonts': <Object>[
307 <String, Object>{'asset': 'a/bar'},
308 <String, Object>{'weight': 400, 'style': 'italic', 'asset': 'a/bar'},
309 ],
310 },
311 <String, Object>{
312 'family': 'bar',
313 'fonts': <Object>[
314 <String, Object>{'asset': 'a/baz'},
315 <String, Object>{'weight': 400, 'style': 'italic', 'asset': 'a/baz'},
316 ],
317 },
318 ]);
319 });
320
321 testWithoutContext('FlutterManifest has only one of two font families when '
322 'one declaration is missing the "family" option', () async {
323 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200324name: test
325dependencies:
326 flutter:
327 sdk: flutter
328flutter:
329 uses-material-design: true
330 fonts:
331 - family: foo
332 fonts:
333 - asset: a/bar
334 - asset: a/bar
335 weight: 400
336 style: italic
337 - fonts:
338 - asset: a/baz
339 - asset: a/baz
340 weight: 400
341 style: italic
342''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700343 final BufferLogger logger = BufferLogger.test();
344 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
345 manifest,
346 logger: logger,
347 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200348
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700349 expect(flutterManifest.fonts, hasLength(1));
350 expect(flutterManifest.fonts, containsAll(<Matcher>[
351 matchesFont(
352 familyName: 'foo',
353 descriptor: <String, Object>{
354 'family': 'foo',
355 'fonts': <Object>[
356 <String, Object>{'asset': 'a/bar'},
357 <String, Object>{'weight': 400, 'style': 'italic', 'asset': 'a/bar'},
358 ],
359 },
360 fontAssets: <Matcher>[
361 matchesFontAsset(assetUri: Uri.parse('a/bar')),
362 matchesFontAsset(assetUri: Uri.parse('a/bar'), weight: 400, style: 'italic'),
363 ],
364 ),
365 ]));
366 });
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200367
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700368 testWithoutContext('FlutterManifest has only one of two font families when '
369 'one declaration is missing the "fonts" option', () async {
370 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200371name: test
372dependencies:
373 flutter:
374 sdk: flutter
375flutter:
376 uses-material-design: true
377 fonts:
378 - family: foo
379 fonts:
380 - asset: a/bar
381 - asset: a/bar
382 weight: 400
383 style: italic
384 - family: bar
385''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700386 final BufferLogger logger = BufferLogger.test();
387 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
388 manifest,
389 logger: logger,
390 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200391
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700392 expect(flutterManifest.fonts, hasLength(1));
393 expect(flutterManifest.fonts, containsAll(<Matcher>[
394 matchesFont(
395 familyName: 'foo',
396 descriptor: <String, Object>{
397 'family': 'foo',
398 'fonts': <Object>[
399 <String, Object>{'asset': 'a/bar'},
400 <String, Object>{'weight': 400, 'style': 'italic', 'asset': 'a/bar'},
401 ],
402 },
403 fontAssets: <Matcher>[
404 matchesFontAsset(assetUri: Uri.parse('a/bar')),
405 matchesFontAsset(assetUri: Uri.parse('a/bar'), weight: 400, style: 'italic'),
406 ],
407 ),
408 ]));
409 });
410
411 testWithoutContext('FlutterManifest has no font family when declaration is '
412 'missing the "asset" option', () async {
413 const String manifest = '''
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200414name: test
415dependencies:
416 flutter:
417 sdk: flutter
418flutter:
419 uses-material-design: true
420 fonts:
421 - family: foo
422 fonts:
423 - weight: 400
424''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700425 final BufferLogger logger = BufferLogger.test();
426 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
427 manifest,
428 logger: logger,
429 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200430
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700431 expect(flutterManifest.fontsDescriptor, isEmpty);
432 expect(flutterManifest.fonts, isEmpty);
433 });
Victor Choueiri7edd5c82018-03-19 23:55:54 +0200434
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700435 testWithoutContext('FlutterManifest allows a blank flutter section', () {
436 const String manifest = '''
Victor Choueiri7edd5c82018-03-19 23:55:54 +0200437name: test
438dependencies:
439 flutter:
440 sdk: flutter
441flutter:
442''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700443 final BufferLogger logger = BufferLogger.test();
444 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
445 manifest,
446 logger: logger,
447 );
Mikkel Nygaard Ravn651c5ab2018-08-02 19:16:32 +0200448
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700449 expect(flutterManifest.isEmpty, false);
450 expect(flutterManifest.isModule, false);
451 expect(flutterManifest.isPlugin, false);
452 expect(flutterManifest.androidPackage, null);
453 expect(flutterManifest.usesAndroidX, false);
454 });
455
456 testWithoutContext('FlutterManifest allows a module declaration', () {
457 const String manifest = '''
Mikkel Nygaard Ravn651c5ab2018-08-02 19:16:32 +0200458name: test
459flutter:
Greg Spencer0ff9e8a2018-10-10 11:01:40 -0700460 module:
Mikkel Nygaard Ravn651c5ab2018-08-02 19:16:32 +0200461 androidPackage: com.example
Jenn Magder7d8f8202019-11-26 14:06:31 -0800462 androidX: true
Mikkel Nygaard Ravn651c5ab2018-08-02 19:16:32 +0200463''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700464 final BufferLogger logger = BufferLogger.test();
465 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
466 manifest,
467 logger: logger,
468 );
Mikkel Nygaard Ravn651c5ab2018-08-02 19:16:32 +0200469
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700470 expect(flutterManifest.isModule, true);
471 expect(flutterManifest.androidPackage, 'com.example');
472 expect(flutterManifest.usesAndroidX, true);
473 });
474
475 testWithoutContext('FlutterManifest allows a legacy plugin declaration', () {
476 const String manifest = '''
Mikkel Nygaard Ravn651c5ab2018-08-02 19:16:32 +0200477name: test
478flutter:
479 plugin:
480 androidPackage: com.example
481''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700482 final BufferLogger logger = BufferLogger.test();
483 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
484 manifest,
485 logger: logger,
486 );
Jenn Magder25121632020-02-06 15:50:04 -0800487
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700488 expect(flutterManifest.isPlugin, true);
489 expect(flutterManifest.androidPackage, 'com.example');
490 });
491
492 testWithoutContext('FlutterManifest allows a multi-plat plugin declaration '
493 'with android only', () {
494 const String manifest = '''
Kaushik Iskafc05c372019-08-29 21:51:31 -0700495name: test
496flutter:
497 plugin:
498 platforms:
499 android:
500 package: com.example
501 pluginClass: TestPlugin
502''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700503 final BufferLogger logger = BufferLogger.test();
504 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
505 manifest,
506 logger: logger,
507 );
Kaushik Iskafc05c372019-08-29 21:51:31 -0700508
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700509 expect(flutterManifest.isPlugin, true);
510 expect(flutterManifest.androidPackage, 'com.example');
511 });
512
513 testWithoutContext('FlutterManifest allows a multi-plat plugin declaration '
514 'with ios only', () {
515 const String manifest = '''
Jenn Magder25121632020-02-06 15:50:04 -0800516name: test
517flutter:
518 plugin:
519 platforms:
520 ios:
521 pluginClass: HelloPlugin
522''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700523 final BufferLogger logger = BufferLogger.test();
524 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
525 manifest,
526 logger: logger,
527 );
Jenn Magder25121632020-02-06 15:50:04 -0800528
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700529 expect(flutterManifest.isPlugin, true);
530 expect(flutterManifest.androidPackage, isNull);
531 });
532
533 testUsingContext('FlutterManifest handles an invalid plugin declaration', () {
534 const String manifest = '''
Jonah Williams6c91a132019-10-21 16:46:07 -0700535name: test
536flutter:
537 plugin:
538''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700539 final BufferLogger logger = BufferLogger.test();
540 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
541 manifest,
542 logger: logger,
543 );
Jonah Williams6c91a132019-10-21 16:46:07 -0700544
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700545 expect(flutterManifest, null);
546 expect(logger.errorText,
547 contains('Expected "plugin" to be an object, but got null'));
548 });
Ralph Bergmannc65e9d12018-05-30 16:51:25 +0200549
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700550 testWithoutContext('FlutterManifest parses major.minor.patch+build version clause 1', () {
551 const String manifest = '''
Ralph Bergmannc65e9d12018-05-30 16:51:25 +0200552name: test
553version: 1.0.0+2
554dependencies:
555 flutter:
556 sdk: flutter
557flutter:
558''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700559 final BufferLogger logger = BufferLogger.test();
560 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
561 manifest,
562 logger: logger,
563 );
KyleWong4b4a94002019-02-13 23:48:03 +0800564
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700565 expect(flutterManifest, matchesManifest(
566 appVersion: '1.0.0+2',
567 buildName: '1.0.0',
568 buildNumber: '2'),
569 );
570 });
571
572 testWithoutContext('FlutterManifest parses major.minor.patch with no build version', () {
573 const String manifest = '''
Jenn Magderdd1fb3b2019-07-31 16:18:09 -0700574name: test
575version: 0.0.1
576dependencies:
577 flutter:
578 sdk: flutter
579flutter:
580''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700581 final BufferLogger logger = BufferLogger.test();
582 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
583 manifest,
584 logger: logger,
585 );
Jenn Magderdd1fb3b2019-07-31 16:18:09 -0700586
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700587 expect(flutterManifest, matchesManifest(
588 appVersion: '0.0.1',
589 buildName: '0.0.1',
590 buildNumber: null),
591 );
592 });
593
594 testWithoutContext('FlutterManifest parses major.minor.patch+build version clause 2', () {
595 const String manifest = '''
KyleWong4b4a94002019-02-13 23:48:03 +0800596name: test
597version: 1.0.0-beta+exp.sha.5114f85
598dependencies:
599 flutter:
600 sdk: flutter
601flutter:
602''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700603 final BufferLogger logger = BufferLogger.test();
604 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
605 manifest,
606 logger: logger,
607 );
Ralph Bergmannc65e9d12018-05-30 16:51:25 +0200608
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700609 expect(flutterManifest, matchesManifest(
610 appVersion: '1.0.0-beta+exp.sha.5114f85',
611 buildName: '1.0.0-beta',
612 buildNumber: 'exp.sha.5114f85'),
613 );
614 });
615
616 testWithoutContext('FlutterManifest parses major.minor+build version clause', () {
617 const String manifest = '''
Ralph Bergmannc65e9d12018-05-30 16:51:25 +0200618name: test
619version: 1.0+2
620dependencies:
621 flutter:
622 sdk: flutter
623flutter:
624''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700625 final BufferLogger logger = BufferLogger.test();
626 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
627 manifest,
628 logger: logger,
629 );
Ralph Bergmannc65e9d12018-05-30 16:51:25 +0200630
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700631 expect(flutterManifest, matchesManifest(
632 appVersion: '1.0+2',
633 buildName: '1.0',
634 buildNumber: '2'),
635 );
636 });
637
638 testWithoutContext('FlutterManifest parses empty version clause', () {
639 const String manifest = '''
Ralph Bergmannc65e9d12018-05-30 16:51:25 +0200640name: test
641version:
642dependencies:
643 flutter:
644 sdk: flutter
645flutter:
646''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700647 final BufferLogger logger = BufferLogger.test();
648 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
649 manifest,
650 logger: logger,
651 );
Emmanuel Garcia3e65bb02019-05-01 09:49:39 -0700652
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700653 expect(flutterManifest, matchesManifest(
654 appVersion: null,
655 buildName: null,
656 buildNumber: null),
657 );
658 });
659
660 testWithoutContext('FlutterManifest parses no version clause', () {
661 const String manifest = '''
Ralph Bergmannc65e9d12018-05-30 16:51:25 +0200662name: test
663dependencies:
664 flutter:
665 sdk: flutter
666flutter:
667''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700668 final BufferLogger logger = BufferLogger.test();
669 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
670 manifest,
671 logger: logger,
672 );
673
674 expect(flutterManifest, matchesManifest(
675 appVersion: null,
676 buildName: null,
677 buildNumber: null),
678 );
679 });
Emmanuel Garcia3e65bb02019-05-01 09:49:39 -0700680
681 // Regression test for https://github.com/flutter/flutter/issues/31764
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700682 testWithoutContext('FlutterManifest returns proper error when font detail is malformed', () {
683 const String manifest = '''
Emmanuel Garcia3e65bb02019-05-01 09:49:39 -0700684name: test
685dependencies:
686 flutter:
687 sdk: flutter
688flutter:
689 fonts:
690 - family: foo
691 fonts:
692 -asset: a/bar
693''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700694 final BufferLogger logger = BufferLogger.test();
695 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
696 manifest,
697 logger: logger,
698 );
Emmanuel Garcia3e65bb02019-05-01 09:49:39 -0700699
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700700 expect(flutterManifest, null);
701 expect(logger.errorText,
702 contains('Expected "fonts" to either be null or a list.'));
703 });
Zachary Anderson500d7c52019-08-05 13:14:57 -0700704
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700705 testWithoutContext('FlutterManifest returns proper error when font detail is '
706 'not a list of maps', () {
707 const String manifest = '''
Zachary Andersonaf93b6a2019-10-11 12:17:37 -0700708name: test
709dependencies:
710 flutter:
711 sdk: flutter
712flutter:
713 fonts:
714 - family: foo
715 fonts:
716 - asset
717''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700718 final BufferLogger logger = BufferLogger.test();
719 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
720 manifest,
721 logger: logger,
722 );
Zachary Andersonaf93b6a2019-10-11 12:17:37 -0700723
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700724 expect(flutterManifest, null);
725 expect(logger.errorText,
726 contains('Expected "fonts" to be a list of maps.'));
727 });
Zachary Andersonaf93b6a2019-10-11 12:17:37 -0700728
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700729 testWithoutContext('FlutterManifest returns proper error when font is a map '
730 'instead of a list', () {
731 const String manifest = '''
Zachary Andersond2206312019-08-14 07:57:30 -0700732name: test
733dependencies:
734 flutter:
735 sdk: flutter
736flutter:
737 fonts:
738 family: foo
739 fonts:
740 -asset: a/bar
741''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700742 final BufferLogger logger = BufferLogger.test();
743 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
744 manifest,
745 logger: logger,
746 );
Zachary Andersond2206312019-08-14 07:57:30 -0700747
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700748 expect(flutterManifest, null);
749 expect(logger.errorText, contains('Expected "fonts" to be a list'));
750 });
Zachary Andersond2206312019-08-14 07:57:30 -0700751
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700752 testWithoutContext('FlutterManifest returns proper error when second font '
753 'family is invalid', () {
754 const String manifest = '''
Zachary Anderson500d7c52019-08-05 13:14:57 -0700755name: test
756dependencies:
757 flutter:
758 sdk: flutter
759flutter:
760 uses-material-design: true
761 fonts:
762 - family: foo
763 fonts:
764 - asset: a/bar
765 - string
766''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700767 final BufferLogger logger = BufferLogger.test();
768 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
769 manifest,
770 logger: logger,
771 );
Jonah Williams0af2a842019-10-02 12:45:51 -0700772
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700773 expect(flutterManifest, null);
774 expect(logger.errorText, contains('Expected a map.'));
775 });
776
777 testWithoutContext('FlutterManifest does not crash on empty entry', () {
778 const String manifest = '''
Jonah Williams0af2a842019-10-02 12:45:51 -0700779name: test
780dependencies:
781 flutter:
782 sdk: flutter
783flutter:
784 uses-material-design: true
785 assets:
786 - lib/gallery/example_code.dart
787 -
788''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700789 final BufferLogger logger = BufferLogger.test();
790 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
791 manifest,
792 logger: logger,
793 );
794 final List<Uri> assets = flutterManifest.assets;
Jonah Williams0af2a842019-10-02 12:45:51 -0700795
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700796 expect(logger.errorText, contains('Asset manifest contains a null or empty uri.'));
797 expect(assets, hasLength(1));
798 });
Jason Simmons63016c82020-01-15 16:43:02 -0800799
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700800 testWithoutContext('FlutterManifest handles special characters in asset URIs', () {
801 const String manifest = '''
Jason Simmons63016c82020-01-15 16:43:02 -0800802name: test
803dependencies:
804 flutter:
805 sdk: flutter
806flutter:
807 uses-material-design: true
808 assets:
809 - lib/gallery/abc#xyz
810 - lib/gallery/abc?xyz
811 - lib/gallery/aaa bbb
812''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700813 final BufferLogger logger = BufferLogger.test();
814 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
815 manifest,
816 logger: logger,
817 );
818 final List<Uri> assets = flutterManifest.assets;
Jason Simmons63016c82020-01-15 16:43:02 -0800819
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700820 expect(assets, hasLength(3));
821 expect(assets, <Uri>[
822 Uri.parse('lib/gallery/abc%23xyz'),
823 Uri.parse('lib/gallery/abc%3Fxyz'),
824 Uri.parse('lib/gallery/aaa%20bbb'),
825 ]);
826 });
Jenn Magderd8092d92020-01-21 16:43:16 -0800827
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700828 testWithoutContext('FlutterManifest returns proper error when flutter is a '
829 'list instead of a map', () {
830 const String manifest = '''
Jenn Magderd8092d92020-01-21 16:43:16 -0800831name: test
832dependencies:
833 flutter:
834 sdk: flutter
835flutter:
836 - uses-material-design: true
837''';
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700838 final BufferLogger logger = BufferLogger.test();
839 final FlutterManifest flutterManifest = FlutterManifest.createFromString(
840 manifest,
841 logger: logger,
842 );
Jenn Magderd8092d92020-01-21 16:43:16 -0800843
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700844 expect(flutterManifest, null);
845 expect(logger.errorText,
846 contains(
847 'Expected "flutter" section to be an object or null, but got '
848 '[{uses-material-design: true}].',
849 ),
850 );
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200851 });
fmatosqg197d4312018-05-21 10:52:33 +1000852
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700853 testWithoutContext('FlutterManifest can parse manifest on posix filesystem', () {
854 const String manifest = '''
855name: test
856dependencies:
857 flutter:
858 sdk: flutter
859flutter:
860''';
861 final FileSystem fileSystem = MemoryFileSystem.test();
862 fileSystem.file('pubspec.yaml').writeAsStringSync(manifest);
863 final BufferLogger logger = BufferLogger.test();
864 final FlutterManifest flutterManifest = FlutterManifest.createFromPath(
865 'pubspec.yaml',
866 fileSystem: fileSystem,
867 logger: logger,
868 );
869
870 expect(flutterManifest.isEmpty, false);
871 });
872
873 testWithoutContext('FlutterManifest can parse manifest on windows filesystem', () {
874 const String manifest = '''
fmatosqg197d4312018-05-21 10:52:33 +1000875name: test
876dependencies:
877 flutter:
878 sdk: flutter
879flutter:
880''';
881
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700882 final FileSystem fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows);
883 fileSystem.file('pubspec.yaml').writeAsStringSync(manifest);
884 final BufferLogger logger = BufferLogger.test();
885 final FlutterManifest flutterManifest = FlutterManifest.createFromPath(
886 'pubspec.yaml',
887 fileSystem: fileSystem,
888 logger: logger,
fmatosqg197d4312018-05-21 10:52:33 +1000889 );
890
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700891 expect(flutterManifest.isEmpty, false);
fmatosqg197d4312018-05-21 10:52:33 +1000892 });
Sarah Zakarias49ba9742017-09-26 14:48:52 +0200893}
Jonah Williams8ed40dd2020-04-13 18:55:01 -0700894
895Matcher matchesManifest({
896 String appVersion,
897 String buildName,
898 String buildNumber,
899}) {
900 return isA<FlutterManifest>()
901 .having((FlutterManifest manifest) => manifest.appVersion, 'appVersion', appVersion)
902 .having((FlutterManifest manifest) => manifest.buildName, 'buildName', buildName)
903 .having((FlutterManifest manifest) => manifest.buildNumber, 'buildNumber', buildNumber);
904}
905
906Matcher matchesFontAsset({
907 Uri assetUri,
908 int weight,
909 String style,
910}) {
911 return isA<FontAsset>()
912 .having((FontAsset fontAsset) => fontAsset.assetUri, 'assetUri', assetUri)
913 .having((FontAsset fontAsset) => fontAsset.weight, 'weight', weight)
914 .having((FontAsset fontAsset) => fontAsset.style, 'style', style);
915}
916
917Matcher matchesFont({
918 Map<String, Object> descriptor,
919 String familyName,
920 List<Matcher> fontAssets,
921}) {
922 return isA<Font>()
923 .having((Font font) => font.descriptor, 'descriptor', descriptor)
924 .having((Font font) => font.familyName, 'familyName', familyName)
925 .having((Font font) => font.fontAssets, 'fontAssets', containsAll(fontAssets));
926}