// Copyright 2017 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 'dart:async'; import 'dart:typed_data'; import 'package:flutter/services.dart'; import 'test_step.dart'; Future basicBinaryHandshake(ByteData message) async { const BasicMessageChannel channel = const BasicMessageChannel( 'binary-msg', const BinaryCodec(), ); return _basicMessageHandshake( 'Binary >${toString(message)}<', channel, message); } Future basicStringHandshake(String message) async { const BasicMessageChannel channel = const BasicMessageChannel( 'string-msg', const StringCodec(), ); return _basicMessageHandshake('String >$message<', channel, message); } Future basicJsonHandshake(dynamic message) async { const BasicMessageChannel channel = const BasicMessageChannel( 'json-msg', const JSONMessageCodec(), ); return _basicMessageHandshake('JSON >$message<', channel, message); } Future basicStandardHandshake(dynamic message) async { const BasicMessageChannel channel = const BasicMessageChannel( 'std-msg', const StandardMessageCodec(), ); return _basicMessageHandshake( 'Standard >${toString(message)}<', channel, message); } Future basicBinaryMessageToUnknownChannel() async { const BasicMessageChannel channel = const BasicMessageChannel( 'binary-unknown', const BinaryCodec(), ); return _basicMessageToUnknownChannel('Binary', channel); } Future basicStringMessageToUnknownChannel() async { const BasicMessageChannel channel = const BasicMessageChannel( 'string-unknown', const StringCodec(), ); return _basicMessageToUnknownChannel('String', channel); } Future basicJsonMessageToUnknownChannel() async { const BasicMessageChannel channel = const BasicMessageChannel( 'json-unknown', const JSONMessageCodec(), ); return _basicMessageToUnknownChannel('JSON', channel); } Future basicStandardMessageToUnknownChannel() async { const BasicMessageChannel channel = const BasicMessageChannel( 'std-unknown', const StandardMessageCodec(), ); return _basicMessageToUnknownChannel('Standard', channel); } /// Sends the specified message to the platform, doing a /// receive message/send reply/receive reply echo handshake initiated by the /// platform, then expecting a reply echo to the original message. /// /// Fails, if an error occurs, or if any message seen is not deeply equal to /// the original message. Future _basicMessageHandshake( String description, BasicMessageChannel channel, T message, ) async { final List received = []; channel.setMessageHandler((T message) async { received.add(message); return message; }); dynamic messageEcho = nothing; dynamic error = nothing; try { messageEcho = await channel.send(message); } catch (e) { error = e; } return resultOfHandshake( 'Basic message handshake', description, message, received, messageEcho, error, ); } /// Sends a message on a channel that no one listens on. Future _basicMessageToUnknownChannel( String description, BasicMessageChannel channel, ) async { dynamic messageEcho = nothing; dynamic error = nothing; try { messageEcho = await channel.send(null); } catch (e) { error = e; } return resultOfHandshake( 'Message on unknown channel', description, null, [null, null], messageEcho, error, ); } String toString(dynamic message) { if (message is ByteData) return message.buffer .asUint8List(message.offsetInBytes, message.lengthInBytes) .toString(); else return '$message'; }