diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart index 58560c57fc1..cd1b2336370 100644 --- a/packages/flutter_test/lib/src/binding.dart +++ b/packages/flutter_test/lib/src/binding.dart @@ -740,7 +740,8 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding { @override int get microtaskCount => _currentFakeAsync.microtaskCount; - static Set _allowedKeys; + /// A whitelist [Set] that is used in mocking the asset message channel. + static Set _allowedAssetKeys; void _mockFlutterAssets() { if (!Platform.environment.containsKey('UNIT_TEST_ASSETS')) { @@ -748,29 +749,39 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding { } final String assetFolderPath = Platform.environment['UNIT_TEST_ASSETS']; _ensureInitialized(assetFolderPath); - BinaryMessages.setMockMessageHandler('flutter/assets', (ByteData message) { - final String key = utf8.decode(message.buffer.asUint8List()); - if (_allowedKeys.contains(key)) { - final File asset = File(path.join(assetFolderPath, key)); - final Uint8List encoded = Uint8List.fromList(asset.readAsBytesSync()); - return Future.value(encoded.buffer.asByteData()); - } - }); + + if (_allowedAssetKeys.isNotEmpty) { + BinaryMessages.setMockMessageHandler('flutter/assets', (ByteData message) { + final String key = utf8.decode(message.buffer.asUint8List()); + if (_allowedAssetKeys.contains(key)) { + final File asset = File(path.join(assetFolderPath, key)); + final Uint8List encoded = Uint8List.fromList(asset.readAsBytesSync()); + return Future.value(encoded.buffer.asByteData()); + } + }); + } } void _ensureInitialized(String assetFolderPath) { - if (_allowedKeys == null) { - final File manifestFile = File( - path.join(assetFolderPath, 'AssetManifest.json')); - final Map manifest = json.decode( - manifestFile.readAsStringSync()); - _allowedKeys = { - 'AssetManifest.json', - }; - for (List value in manifest.values) { - final List strList = List.from(value); - _allowedKeys.addAll(strList); - } + if (_allowedAssetKeys != null) { + return; + } + final File manifestFile = File( + path.join(assetFolderPath, 'AssetManifest.json')); + // If the file does not exist, it means there is no asset declared in + // the project. + if (!manifestFile.existsSync()) { + _allowedAssetKeys = {}; + return; + } + final Map manifest = json.decode( + manifestFile.readAsStringSync()); + _allowedAssetKeys = { + 'AssetManifest.json', + }; + for (List value in manifest.values) { + final List strList = List.from(value); + _allowedAssetKeys.addAll(strList); } } diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index 30e8d26e035..6f1caa480f4 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -127,13 +127,14 @@ class TestCommand extends FastFlutterCommand { await pubGet(context: PubContext.getVerifyContext(name), skipPubspecYamlCheck: true); } final bool buildTestAssets = argResults['test-assets']; - if (buildTestAssets) { - await _buildTestAsset(); - } final List names = argResults['name']; final List plainNames = argResults['plain-name']; final FlutterProject flutterProject = FlutterProject.current(); + if (buildTestAssets && flutterProject.manifest.assets.isNotEmpty) { + await _buildTestAsset(); + } + Iterable files = argResults.rest.map((String testPath) => fs.path.absolute(testPath)).toList(); final bool startPaused = argResults['start-paused'];