Enable widget load assets in its own package in test (#35991)

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 0000000..cda62d7
--- /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 0000000..8e1c574
--- /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 0000000..3277025
--- /dev/null
+++ b/dev/automated_tests/icon/test.png
Binary files differ
diff --git a/dev/automated_tests/pubspec.yaml b/dev/automated_tests/pubspec.yaml
index 12a9096..98f2c57 100644
--- a/dev/automated_tests/pubspec.yaml
+++ b/dev/automated_tests/pubspec.yaml
@@ -64,5 +64,6 @@
 
 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 bf7d337..abd96cd 100644
--- a/packages/flutter_test/lib/src/binding.dart
+++ b/packages/flutter_test/lib/src/binding.dart
@@ -811,15 +811,23 @@
     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<ByteData>.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<ByteData>.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 7600047..77a7b4e 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 @@
       '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 348ce99..4217fa1 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 @@
       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,