diff --git a/dev/automated_tests/flutter_test/package_assets_expectation.txt b/dev/automated_tests/flutter_test/package_assets_expectation.txt new file mode 100644 index 00000000000..cda62d712cd --- /dev/null +++ b/dev/automated_tests/flutter_test/package_assets_expectation.txt @@ -0,0 +1 @@ +[0-9]+:[0-9]+ [+]1: All tests passed! diff --git a/dev/automated_tests/flutter_test/package_assets_test.dart b/dev/automated_tests/flutter_test/package_assets_test.dart new file mode 100644 index 00000000000..8e1c5745a7b --- /dev/null +++ b/dev/automated_tests/flutter_test/package_assets_test.dart @@ -0,0 +1,20 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Rendering Error', (WidgetTester tester) async { + // Assets can load with its package name. + await tester.pumpWidget( + Image.asset('icon/test.png', + width: 54, + height: 54, + fit: BoxFit.none, + package: 'flutter_automated_tests' + ), + ); + }); +} diff --git a/dev/automated_tests/icon/test.png b/dev/automated_tests/icon/test.png new file mode 100644 index 00000000000..3277025d93b Binary files /dev/null and b/dev/automated_tests/icon/test.png differ diff --git a/dev/automated_tests/pubspec.yaml b/dev/automated_tests/pubspec.yaml index 12a9096f7d4..98f2c570c87 100644 --- a/dev/automated_tests/pubspec.yaml +++ b/dev/automated_tests/pubspec.yaml @@ -64,5 +64,6 @@ dependencies: flutter: uses-material-design: true - + assets: + - icon/ # PUBSPEC CHECKSUM: 4625 diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart index bf7d337f488..abd96cd74f7 100644 --- a/packages/flutter_test/lib/src/binding.dart +++ b/packages/flutter_test/lib/src/binding.dart @@ -811,15 +811,23 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding { 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) { - 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()); + 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; } - return null; + final File asset = File(path.join(assetFolderPath, key)); + final Uint8List encoded = Uint8List.fromList(asset.readAsBytesSync()); + return Future.value(encoded.buffer.asByteData()); }); } } diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart index 76000478e00..77a7b4efe4f 100644 --- a/packages/flutter_tools/lib/src/test/flutter_platform.dart +++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart @@ -866,6 +866,7 @@ class FlutterPlatform extends PlatformPlugin { 'FLUTTER_TEST': flutterTest, 'FONTCONFIG_FILE': _fontConfigFile.path, 'SERVER_PORT': serverPort.toString(), + 'APP_NAME': flutterProject?.manifest?.appName ?? '', }; if (buildTestAssets) { environment['UNIT_TEST_ASSETS'] = fs.path.join( diff --git a/packages/flutter_tools/test/general.shard/commands/test_test.dart b/packages/flutter_tools/test/general.shard/commands/test_test.dart index 348ce999ad9..4217fa1f24c 100644 --- a/packages/flutter_tools/test/general.shard/commands/test_test.dart +++ b/packages/flutter_tools/test/general.shard/commands/test_test.dart @@ -65,6 +65,11 @@ void main() { return _testFile('print_user_created_ancestor_no_flag', automatedTestsDirectory, flutterTestDirectory); }, skip: io.Platform.isWindows); // TODO(chunhtai): Dart on Windows has trouble with unicode characters in output (#35425). + testUsingContext('can load assets within its own package', () async { + Cache.flutterRoot = '../..'; + return _testFile('package_assets', automatedTestsDirectory, flutterTestDirectory, exitCode: isZero); + }, skip: io.Platform.isWindows); + testUsingContext('run a test when its name matches a regexp', () async { Cache.flutterRoot = '../..'; final ProcessResult result = await _runFlutterTest('filtering', automatedTestsDirectory, flutterTestDirectory,