| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // @dart = 2.6 |
| import 'dart:typed_data'; |
| |
| import 'package:ui/src/engine.dart' hide window; |
| import 'package:ui/ui.dart'; |
| |
| /// Encapsulates the info of a platform message that was intercepted by |
| /// [PlatformMessagesSpy]. |
| class PlatformMessage { |
| PlatformMessage(this.channel, this.methodCall); |
| |
| /// The name of the channel on which the message was sent. |
| final String channel; |
| |
| /// The [MethodCall] instance that was sent in the platform message. |
| final MethodCall methodCall; |
| |
| /// Shorthand for getting the name of the method call. |
| String get methodName => methodCall.method; |
| |
| /// Shorthand for getting the arguments of the method call. |
| String get methodArguments => methodCall.arguments; |
| } |
| |
| /// Intercepts platform messages sent from the engine to the framework. |
| /// |
| /// It holds all intercepted platform messages in a [messages] list that can |
| /// be inspected in tests. |
| class PlatformMessagesSpy { |
| PlatformMessageCallback _callback; |
| PlatformMessageCallback _backup; |
| |
| bool get _isActive => _callback != null; |
| |
| /// List of intercepted messages since the last [setUp] call. |
| final List<PlatformMessage> messages = <PlatformMessage>[]; |
| |
| /// Start spying on platform messages. |
| /// |
| /// This is typically called inside a test's `setUp` callback. |
| void setUp() { |
| assert(!_isActive); |
| _callback = (String channel, ByteData data, |
| PlatformMessageResponseCallback callback) { |
| messages.add(PlatformMessage( |
| channel, |
| const JSONMethodCodec().decodeMethodCall(data), |
| )); |
| }; |
| |
| _backup = window.onPlatformMessage; |
| window.onPlatformMessage = _callback; |
| } |
| |
| /// Stop spying on platform messages and clear all intercepted messages. |
| /// |
| /// Make sure this is called after each test that uses [PlatformMessagesSpy]. |
| void tearDown() { |
| assert(_isActive); |
| // Make sure [window.onPlatformMessage] wasn't tampered with. |
| assert(window.onPlatformMessage == _callback); |
| _callback = null; |
| messages.clear(); |
| window.onPlatformMessage = _backup; |
| } |
| } |