| // @dart = 2.6 |
| import 'dart:convert'; |
| import 'dart:typed_data'; |
| import 'dart:ui' as ui; |
| |
| import 'package:test/test.dart'; |
| |
| void main() { |
| |
| ByteData _makeByteData(String str) { |
| final Uint8List list = utf8.encode(str) as Uint8List; |
| final ByteBuffer buffer = list is Uint8List ? list.buffer : Uint8List.fromList(list).buffer; |
| return ByteData.view(buffer); |
| } |
| |
| void _resize(ui.ChannelBuffers buffers, String name, int newSize) { |
| buffers.handleMessage(_makeByteData('resize\r$name\r$newSize')); |
| } |
| |
| test('push drain', () async { |
| const String channel = 'foo'; |
| final ByteData data = _makeByteData('bar'); |
| final ui.ChannelBuffers buffers = ui.ChannelBuffers(); |
| final ui.PlatformMessageResponseCallback callback = (ByteData responseData) {}; |
| buffers.push(channel, data, callback); |
| await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) { |
| expect(drainedData, equals(data)); |
| expect(drainedCallback, equals(callback)); |
| return; |
| }); |
| }); |
| |
| test('push drain zero', () async { |
| const String channel = 'foo'; |
| final ByteData data = _makeByteData('bar'); |
| final |
| ui.ChannelBuffers buffers = ui.ChannelBuffers(); |
| final ui.PlatformMessageResponseCallback callback = (ByteData responseData) {}; |
| _resize(buffers, channel, 0); |
| buffers.push(channel, data, callback); |
| bool didCall = false; |
| await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) { |
| didCall = true; |
| return; |
| }); |
| expect(didCall, equals(false)); |
| }); |
| |
| test('empty', () async { |
| const String channel = 'foo'; |
| final ui.ChannelBuffers buffers = ui.ChannelBuffers(); |
| bool didCall = false; |
| await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) { |
| didCall = true; |
| return; |
| }); |
| expect(didCall, equals(false)); |
| }); |
| |
| test('overflow', () async { |
| const String channel = 'foo'; |
| final ByteData one = _makeByteData('one'); |
| final ByteData two = _makeByteData('two'); |
| final ByteData three = _makeByteData('three'); |
| final ByteData four = _makeByteData('four'); |
| final ui.ChannelBuffers buffers = ui.ChannelBuffers(); |
| final ui.PlatformMessageResponseCallback callback = (ByteData responseData) {}; |
| _resize(buffers, channel, 3); |
| expect(buffers.push(channel, one, callback), equals(false)); |
| expect(buffers.push(channel, two, callback), equals(false)); |
| expect(buffers.push(channel, three, callback), equals(false)); |
| expect(buffers.push(channel, four, callback), equals(true)); |
| int counter = 0; |
| await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) { |
| if (counter++ == 0) { |
| expect(drainedData, equals(two)); |
| expect(drainedCallback, equals(callback)); |
| } |
| return; |
| }); |
| expect(counter, equals(3)); |
| }); |
| |
| test('resize drop', () async { |
| const String channel = 'foo'; |
| final ByteData one = _makeByteData('one'); |
| final ByteData two = _makeByteData('two'); |
| final ui.ChannelBuffers buffers = ui.ChannelBuffers(); |
| _resize(buffers, channel, 100); |
| final ui.PlatformMessageResponseCallback callback = (ByteData responseData) {}; |
| expect(buffers.push(channel, one, callback), equals(false)); |
| expect(buffers.push(channel, two, callback), equals(false)); |
| _resize(buffers, channel, 1); |
| int counter = 0; |
| await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) { |
| if (counter++ == 0) { |
| expect(drainedData, equals(two)); |
| expect(drainedCallback, equals(callback)); |
| } |
| return; |
| }); |
| expect(counter, equals(1)); |
| }); |
| |
| test('resize dropping calls callback', () async { |
| const String channel = 'foo'; |
| final ByteData one = _makeByteData('one'); |
| final ByteData two = _makeByteData('two'); |
| final ui.ChannelBuffers buffers = ui.ChannelBuffers(); |
| bool didCallCallback = false; |
| final ui.PlatformMessageResponseCallback oneCallback = (ByteData responseData) { |
| didCallCallback = true; |
| }; |
| final ui.PlatformMessageResponseCallback twoCallback = (ByteData responseData) {}; |
| _resize(buffers, channel, 100); |
| expect(buffers.push(channel, one, oneCallback), equals(false)); |
| expect(buffers.push(channel, two, twoCallback), equals(false)); |
| _resize(buffers, channel, 1); |
| expect(didCallCallback, equals(true)); |
| }); |
| |
| test('overflow calls callback', () async { |
| const String channel = 'foo'; |
| final ByteData one = _makeByteData('one'); |
| final ByteData two = _makeByteData('two'); |
| final ui.ChannelBuffers buffers = ui.ChannelBuffers(); |
| bool didCallCallback = false; |
| final ui.PlatformMessageResponseCallback oneCallback = (ByteData responseData) { |
| didCallCallback = true; |
| }; |
| final ui.PlatformMessageResponseCallback twoCallback = (ByteData responseData) {}; |
| _resize(buffers, channel, 1); |
| expect(buffers.push(channel, one, oneCallback), equals(false)); |
| expect(buffers.push(channel, two, twoCallback), equals(true)); |
| expect(didCallCallback, equals(true)); |
| }); |
| |
| test('handle garbage', () async { |
| final ui.ChannelBuffers buffers = ui.ChannelBuffers(); |
| expect(() => buffers.handleMessage(_makeByteData('asdfasdf')), |
| throwsException); |
| }); |
| |
| test('handle resize garbage', () async { |
| final ui.ChannelBuffers buffers = ui.ChannelBuffers(); |
| expect(() => buffers.handleMessage(_makeByteData('resize\rfoo\rbar')), |
| throwsException); |
| }); |
| } |