Load assets during test from file system instead of manifest. (#36553)
diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart index abd96cd..dbe67e9 100644 --- a/packages/flutter_test/lib/src/binding.dart +++ b/packages/flutter_test/lib/src/binding.dart
@@ -798,9 +798,6 @@ @override int get microtaskCount => _currentFakeAsync.microtaskCount; - /// A whitelist [Set] that is used in mocking the asset message channel. - static Set<String> _allowedAssetKeys; - void _mockFlutterAssets() { if (isBrowser) { return; @@ -809,46 +806,29 @@ return; } final String assetFolderPath = Platform.environment['UNIT_TEST_ASSETS']; - _ensureInitialized(assetFolderPath); - final String prefix = 'packages/${Platform.environment['APP_NAME']}/'; - if (_allowedAssetKeys.isNotEmpty) { - defaultBinaryMessenger.setMockMessageHandler('flutter/assets', (ByteData message) { - String key = utf8.decode(message.buffer.asUint8List()); - if (!_allowedAssetKeys.contains(key)) { - // For tests in package, it will load assets with its own package prefix. - // In this case, we do a best-effort look up. - if (!key.startsWith(prefix)) - return null; - key = key.replaceFirst(prefix, ''); - if (!_allowedAssetKeys.contains(key)) - return null; - } - final File asset = File(path.join(assetFolderPath, key)); - final Uint8List encoded = Uint8List.fromList(asset.readAsBytesSync()); - return Future<ByteData>.value(encoded.buffer.asByteData()); - }); - } - } + defaultBinaryMessenger.setMockMessageHandler('flutter/assets', (ByteData message) { + String key = utf8.decode(message.buffer.asUint8List()); + File asset = File(path.join(assetFolderPath, key)); - void _ensureInitialized(String assetFolderPath) { - 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 = <String>{}; - return; - } - final Map<String, dynamic> manifest = json.decode(manifestFile.readAsStringSync()); - _allowedAssetKeys = <String>{ - 'AssetManifest.json', - ...manifest.values.cast<List<dynamic>>().expand<dynamic>((List<dynamic> e) => e).cast<String>(), - }; + if (!asset.existsSync()) { + // For tests in package, it will load assets with its own package prefix. + // In this case, we do a best-effort look up. + if (!key.startsWith(prefix)) { + return null; + } + + key = key.replaceFirst(prefix, ''); + asset = File(path.join(assetFolderPath, key)); + if (!asset.existsSync()) { + return null; + } + } + + final Uint8List encoded = Uint8List.fromList(asset.readAsBytesSync()); + return Future<ByteData>.value(encoded.buffer.asByteData()); + }); } @override