Handle uncaught error for warnIfSlow (#56418)
diff --git a/packages/flutter_driver/lib/src/driver/vmservice_driver.dart b/packages/flutter_driver/lib/src/driver/vmservice_driver.dart
index 52d3bcf..af9a4fb 100644
--- a/packages/flutter_driver/lib/src/driver/vmservice_driver.dart
+++ b/packages/flutter_driver/lib/src/driver/vmservice_driver.dart
@@ -633,7 +633,15 @@
assert(future != null);
assert(timeout != null);
assert(message != null);
- return future..timeout(timeout, onTimeout: () { _log(message); return null; });
+ future
+ .timeout(timeout, onTimeout: () {
+ _log(message);
+ return null;
+ })
+ // Don't duplicate errors if [future] completes with an error.
+ .catchError((dynamic e) => null);
+
+ return future;
}
/// Encapsulates connection information to an instance of a Flutter application.
diff --git a/packages/flutter_driver/test/flutter_driver_test.dart b/packages/flutter_driver/test/flutter_driver_test.dart
index 18906b3..f60ad1b 100644
--- a/packages/flutter_driver/test/flutter_driver_test.dart
+++ b/packages/flutter_driver/test/flutter_driver_test.dart
@@ -665,6 +665,16 @@
expect(error.message, 'Error in Flutter application: {message: This is a failure}');
}
});
+
+ test('uncaught remote error', () async {
+ when(mockIsolate.invokeExtension(any, any)).thenAnswer((Invocation i) {
+ return Future<Map<String, dynamic>>.error(
+ rpc.RpcException(9999, 'test error'),
+ );
+ });
+
+ expect(driver.waitFor(find.byTooltip('foo')), throwsDriverError);
+ });
});
});