From af93b6af80de7ed21139408a60fa1d8ca458fbd0 Mon Sep 17 00:00:00 2001 From: Zachary Anderson Date: Fri, 11 Oct 2019 12:17:37 -0700 Subject: [PATCH] [flutter_tool] Improve yaml font map validation (#42538) --- .../lib/src/flutter_manifest.dart | 9 +++++++-- .../general.shard/flutter_manifest_test.dart | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart index 5334b5b1d6..759734ce26 100644 --- a/packages/flutter_tools/lib/src/flutter_manifest.dart +++ b/packages/flutter_tools/lib/src/flutter_manifest.dart @@ -439,8 +439,13 @@ void _validateFonts(YamlList fonts, List errors) { errors.add('Expected "fonts" to either be null or a list.'); continue; } - for (final YamlMap fontListItem in fontMap['fonts']) { - for (final MapEntry kvp in fontListItem.entries) { + for (final dynamic fontListItem in fontMap['fonts']) { + if (fontListItem is! YamlMap) { + errors.add('Expected "fonts" to be a list of maps.'); + continue; + } + final YamlMap fontMapList = fontListItem; + for (final MapEntry kvp in fontMapList.entries) { if (kvp.key is! String) { errors.add('Expected "${kvp.key}" under "fonts" to be a string.'); } diff --git a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart index 7f0d34731b..cfdc70fe9c 100644 --- a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart @@ -534,6 +534,25 @@ flutter: expect(logger.errorText, contains('Expected "fonts" to either be null or a list.')); }); + testUsingContext('Returns proper error when font detail is not a list of maps', () async { + final BufferLogger logger = context.get(); + const String manifest = ''' +name: test +dependencies: + flutter: + sdk: flutter +flutter: + fonts: + - family: foo + fonts: + - asset +'''; + final FlutterManifest flutterManifest = FlutterManifest.createFromString(manifest); + + expect(flutterManifest, null); + expect(logger.errorText, contains('Expected "fonts" to be a list of maps.')); + }); + testUsingContext('Returns proper error when font is a map instead of a list', () async { final BufferLogger logger = context.get(); const String manifest = '''