blob: 96047fb17ad2a15924227e40827b2beba6df7d79 [file] [log] [blame]
// @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);
});
}