Enable TestDefaultBinaryMessenger to intercept all platform channels. (#100049)

This commit is contained in:
Sai Sandeep Mutyala 2022-04-25 23:14:07 +05:30 committed by GitHub
parent 46cb9ede2f
commit 7b580fd5df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 1 deletions

View file

@ -8,6 +8,11 @@ import 'dart:ui' as ui;
import 'package:fake_async/fake_async.dart';
import 'package:flutter/services.dart';
/// A function which takes the name of the method channel, it's handler,
/// platform message and asynchronously returns an encoded response.
typedef AllMessagesHandler = Future<ByteData?>? Function(
String channel, MessageHandler? handler, ByteData? message);
/// A [BinaryMessenger] subclass that is used as the default binary messenger
/// under testing environment.
///
@ -116,11 +121,17 @@ class TestDefaultBinaryMessenger extends BinaryMessenger {
// can implement the [checkMockMessageHandler] method.
final Map<String, Object> _outboundHandlerIdentities = <String, Object>{};
/// Handler that intercepts and responds to outgoing messages, pretending
/// to be the platform, for all channels.
AllMessagesHandler? allMessagesHandler;
@override
Future<ByteData?>? send(String channel, ByteData? message) {
final Future<ByteData?>? resultFuture;
final MessageHandler? handler = _outboundHandlers[channel];
if (handler != null) {
if (allMessagesHandler != null) {
resultFuture = allMessagesHandler!(channel, handler, message);
} else if (handler != null) {
resultFuture = handler(message);
} else {
resultFuture = delegate.send(channel, message);

View file

@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/services.dart';
@ -26,6 +27,19 @@ class TestDelegate extends BinaryMessenger {
void setMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError();
}
class WorkingTestDelegate extends BinaryMessenger {
@override
Future<ByteData?>? send(String channel, ByteData? message) async {
return ByteData.sublistView(Uint8List.fromList(<int>[1, 2, 3]));
}
// Rest of the API isn't needed for this test.
@override
Future<void> handlePlatformMessage(String channel, ByteData? data, ui.PlatformMessageResponseCallback? callback) => throw UnimplementedError();
@override
void setMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError();
}
void main() {
testWidgets('Caught exceptions are caught by the test framework', (WidgetTester tester) async {
final BinaryMessenger delegate = TestDelegate();
@ -39,4 +53,29 @@ void main() {
expect(error, const RecognizableTestException());
}
});
testWidgets('Mock MessageHandler is set correctly',
(WidgetTester tester) async {
final TestDefaultBinaryMessenger binaryMessenger =
TestDefaultBinaryMessenger(WorkingTestDelegate());
binaryMessenger.setMockMessageHandler(
'',
(ByteData? message) async =>
ByteData.sublistView(Uint8List.fromList(<int>[2, 3, 4])));
final ByteData? result = await binaryMessenger.send('', null);
expect(result?.buffer.asUint8List(), Uint8List.fromList(<int>[2, 3, 4]));
});
testWidgets('Mock AllMessagesHandler is set correctly',
(WidgetTester tester) async {
final TestDefaultBinaryMessenger binaryMessenger =
TestDefaultBinaryMessenger(WorkingTestDelegate());
binaryMessenger.allMessagesHandler =
(String channel, MessageHandler? handler, ByteData? message) async =>
ByteData.sublistView(Uint8List.fromList(<int>[2, 3, 4]));
final ByteData? result = await binaryMessenger.send('', null);
expect(result?.buffer.asUint8List(), Uint8List.fromList(<int>[2, 3, 4]));
});
}