blob: df1fa2108c296250fc429c1ac6f90e29d13d3dee [file] [log] [blame]
package io.flutter.plugin.common;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.content.res.AssetManager;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import io.flutter.embedding.engine.FlutterJNI;
import io.flutter.embedding.engine.dart.DartExecutor;
import java.nio.ByteBuffer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.robolectric.annotation.Config;
@Config(manifest = Config.NONE)
@RunWith(AndroidJUnit4.class)
public class MethodChannelTest {
@Test
public void resizeChannelBufferMessageIsWellformed() {
FlutterJNI mockFlutterJNI = mock(FlutterJNI.class);
DartExecutor dartExecutor = new DartExecutor(mockFlutterJNI, mock(AssetManager.class));
String channel = "flutter/test";
MethodChannel rawChannel = new MethodChannel(dartExecutor, channel);
int newSize = 3;
rawChannel.resizeChannelBuffer(newSize);
// Created from the following Dart code:
// MethodCall methodCall = const MethodCall('resize', ['flutter/test', 3]);
// const StandardMethodCodec().encodeMethodCall(methodCall).buffer.asUint8List();
final byte[] expected = {
7, 6, 114, 101, 115, 105, 122, 101, 12, 2, 7, 12, 102, 108, 117, 116, 116, 101, 114, 47, 116,
101, 115, 116, 3, 3, 0, 0, 0
};
// Verify that the correct message was sent to FlutterJNI.
ArgumentMatcher<ByteBuffer> packetMatcher =
new ByteBufferContentMatcher(ByteBuffer.wrap(expected));
verify(mockFlutterJNI, times(1))
.dispatchPlatformMessage(
eq(BasicMessageChannel.CHANNEL_BUFFERS_CHANNEL),
argThat(packetMatcher),
anyInt(),
anyInt());
}
@Test
public void overflowChannelBufferMessageIsWellformed() {
FlutterJNI mockFlutterJNI = mock(FlutterJNI.class);
DartExecutor dartExecutor = new DartExecutor(mockFlutterJNI, mock(AssetManager.class));
String channel = "flutter/test";
MethodChannel rawChannel = new MethodChannel(dartExecutor, channel);
rawChannel.setWarnsOnChannelOverflow(false);
// Created from the following Dart code:
// MethodCall methodCall = const MethodCall('overflow', ['flutter/test', true]);
// const StandardMethodCodec().encodeMethodCall(methodCall).buffer.asUint8List();
final byte[] expected = {
7, 8, 111, 118, 101, 114, 102, 108, 111, 119, 12, 2, 7, 12, 102, 108, 117, 116, 116, 101, 114,
47, 116, 101, 115, 116, 1
};
// Verify that the correct message was sent to FlutterJNI.
ArgumentMatcher<ByteBuffer> packetMatcher =
new ByteBufferContentMatcher(ByteBuffer.wrap(expected));
verify(mockFlutterJNI, times(1))
.dispatchPlatformMessage(
eq(BasicMessageChannel.CHANNEL_BUFFERS_CHANNEL),
argThat(packetMatcher),
anyInt(),
anyInt());
}
}
// Custom ByteBuffer matcher which calls rewind on both buffers before calling equals.
// ByteBuffer.equals might return true when comparing byte buffers with different content if
// both have no remaining elements.
class ByteBufferContentMatcher implements ArgumentMatcher<ByteBuffer> {
private ByteBuffer expected;
public ByteBufferContentMatcher(ByteBuffer expected) {
this.expected = expected;
}
@Override
public boolean matches(ByteBuffer received) {
expected.rewind();
received.rewind();
return received.equals(expected);
}
}