blob: d1ffb5204e8089297c6b5c6c38a8c251a01eb72e [file] [log] [blame]
package io.flutter.plugin.common;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import android.text.SpannableString;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
@Config(manifest = Config.NONE)
@RunWith(AndroidJUnit4.class)
public class StandardMessageCodecTest {
// Data types defined as per StandardMessageCodec.Java
// XXX Please consider exposing these so that tests can access them
private static final byte NULL = 0;
private static final byte TRUE = 1;
private static final byte FALSE = 2;
private static final byte INT = 3;
private static final byte LONG = 4;
private static final byte BIGINT = 5;
private static final byte DOUBLE = 6;
private static final byte STRING = 7;
private static final byte BYTE_ARRAY = 8;
private static final byte INT_ARRAY = 9;
private static final byte LONG_ARRAY = 10;
private static final byte DOUBLE_ARRAY = 11;
private static final byte LIST = 12;
private static final byte MAP = 13;
private static final byte FLOAT_ARRAY = 14;
@Test
public void itEncodesNullLiterals() {
// Setup message codec
StandardMessageCodec codec = new StandardMessageCodec();
// Attempt to encode message with a null literal inside a list
// A list with a null is used instead of just a null literal because if
// only null is encoded, then no message is returned; null is returned instead
ArrayList<Object> messageContent = new ArrayList();
messageContent.add(null);
ByteBuffer message = codec.encodeMessage(messageContent);
message.flip();
ByteBuffer expected = ByteBuffer.allocateDirect(3);
expected.put(new byte[] {LIST, 1, NULL});
expected.flip();
assertEquals(expected, message);
}
@Test
public void itEncodesNullObjects() {
// An example class that equals null
class ExampleNullObject {
@Override
public boolean equals(Object other) {
return other == null || other == this;
}
@Override
public int hashCode() {
return 0;
}
}
// Setup message codec
StandardMessageCodec codec = new StandardMessageCodec();
// Same as itEncodesNullLiterals but with objects that equal null instead
ArrayList<Object> messageContent = new ArrayList();
messageContent.add(new ExampleNullObject());
ByteBuffer message = codec.encodeMessage(messageContent);
message.flip();
ByteBuffer expected = ByteBuffer.allocateDirect(3);
expected.put(new byte[] {LIST, 1, NULL});
expected.flip();
assertEquals(expected, message);
}
@Test
@SuppressWarnings("deprecation")
public void itEncodesBooleans() {
// Setup message codec
StandardMessageCodec codec = new StandardMessageCodec();
ArrayList<Object> messageContent = new ArrayList();
// Test handling of Boolean objects other than the static TRUE and FALSE constants.
messageContent.add(new Boolean(true));
messageContent.add(new Boolean(false));
ByteBuffer message = codec.encodeMessage(messageContent);
message.flip();
ByteBuffer expected = ByteBuffer.allocateDirect(4);
expected.put(new byte[] {LIST, 2, TRUE, FALSE});
expected.flip();
assertEquals(expected, message);
}
@Test
public void itEncodesFloatArrays() {
StandardMessageCodec codec = new StandardMessageCodec();
float[] expectedValues = new float[] {1.0f, 2.2f, 5.3f};
ByteBuffer message = codec.encodeMessage(expectedValues);
message.flip();
float[] values = (float[]) codec.decodeMessage(message);
assertArrayEquals(expectedValues, values, 0.01f);
}
@Test
public void itEncodesCharSequences() {
StandardMessageCodec codec = new StandardMessageCodec();
CharSequence cs = new SpannableString("hello world");
ByteBuffer message = codec.encodeMessage(cs);
message.flip();
String value = (String) codec.decodeMessage(message);
assertEquals(value, "hello world");
}
private static class NotEncodable {
@Override
public String toString() {
return "not encodable";
}
}
@Test
public void errorHasType() {
StandardMessageCodec codec = new StandardMessageCodec();
NotEncodable notEncodable = new NotEncodable();
Exception exception =
assertThrows(
IllegalArgumentException.class,
() -> {
codec.encodeMessage(notEncodable);
});
assertTrue(exception.getMessage().contains("NotEncodable"));
}
}