package nodomain.freeyourgadget.gadgetbridge.test;
|
|
import junit.framework.TestCase;
|
|
import java.io.ByteArrayOutputStream;
|
import java.io.IOException;
|
|
import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.protobuf.messagefields.NestedMessageField;
|
import nodomain.freeyourgadget.gadgetbridge.util.protobuf.messagefields.RootMessageField;
|
import nodomain.freeyourgadget.gadgetbridge.util.protobuf.messagefields.StringMessageField;
|
import nodomain.freeyourgadget.gadgetbridge.util.protobuf.messagefields.VarintMessageField;
|
import nodomain.freeyourgadget.gadgetbridge.util.protobuf.ProtobufUtils;
|
|
public class ProtobufTest extends TestCase {
|
private void assertEncodeVarint(byte[] expected, int valueToEncode){
|
byte[] encoded = ProtobufUtils.encode_varint(valueToEncode);
|
assertEquals(expected.length, encoded.length);
|
|
for(int i = 0; i < expected.length; i++){
|
assertEquals(expected[i], encoded[i]);
|
}
|
}
|
|
public void testEncodeVarint(){
|
assertEncodeVarint(new byte[]{0x00}, 0);
|
assertEncodeVarint(new byte[]{0x01}, 1);
|
assertEncodeVarint(new byte[]{0b1111111}, 0b1111111);
|
assertEncodeVarint(new byte[]{(byte)0b11111111, 0b00000001}, 0b11111111);
|
assertEncodeVarint(new byte[]{(byte)0xeb, (byte)0x86, (byte)0x4e}, 1278827);
|
assertEncodeVarint(new byte[]{(byte)0xf9, (byte) 0xa5 , (byte) 0x3c}, 987897);
|
assertEncodeVarint(new byte[]{(byte) 0xfd, (byte) 0xe5, (byte) 0x90, (byte) 0x01}, 2372349);
|
}
|
|
private void assertEncodeVarintMessageField(byte[] expected, int fieldId, int value) throws IOException {
|
VarintMessageField field = new VarintMessageField(fieldId, value);
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
field.encode(os);
|
byte[] result = os.toByteArray();
|
|
assertEquals(expected.length, result.length);
|
|
for(int i = 0; i < expected.length; i++){
|
assertEquals(expected[i], result[i]);
|
}
|
}
|
|
public void testEncodeVarintMessageField() throws IOException {
|
assertEncodeVarintMessageField(new byte[]{0b00001000, 0b00000000}, 1, 0);
|
assertEncodeVarintMessageField(new byte[]{(byte) 0b10000000, 0b00000001, 0b01111111}, 16, 127);
|
assertEncodeVarintMessageField(new byte[]{(byte) 0b10000000, 0b00000001, (byte) 0xfd, (byte) 0xe5, (byte) 0x90, (byte) 0x01}, 16, 2372349);
|
}
|
|
private void assertEncodeStringMessageField(byte[] expected, int fieldId, String value) throws IOException {
|
StringMessageField field = new StringMessageField(fieldId, value);
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
field.encode(os);
|
byte[] result = os.toByteArray();
|
|
assertEquals(expected.length, result.length);
|
|
for(int i = 0; i < expected.length; i++){
|
assertEquals(expected[i], result[i]);
|
}
|
}
|
|
private void assertEncodeRootMessageField(byte[] expected, RootMessageField value) throws IOException {
|
byte[] result = value.encodeToBytes();
|
|
System.out.println(StringUtils.bytesToHex(result));
|
|
assertEquals(expected.length, result.length);
|
|
for(int i = 0; i < expected.length; i++){
|
assertEquals(expected[i], result[i]);
|
}
|
}
|
|
public void testEncodeStringMessageField() throws IOException {
|
assertEncodeStringMessageField(new byte[]{0b00001010, 0b00000000}, 1, "");
|
assertEncodeStringMessageField(new byte[]{0b01010010, 0x04, 0x74, 0x65, 0x73, 0x74}, 10, "test");
|
}
|
|
public void testNestedMessageField() throws IOException {
|
RootMessageField startAppRequest = new RootMessageField(
|
new VarintMessageField(1, 2),
|
new NestedMessageField(16,
|
new StringMessageField(1, "Infrared"),
|
new StringMessageField(2, "RPC")
|
)
|
);
|
assertEncodeRootMessageField(
|
new byte[]{(byte) 0x14, (byte) 0x08, (byte) 0x02, (byte) 0x82, (byte) 0x01, (byte) 0x0f, (byte) 0x0a, (byte) 0x08, (byte) 0x49, (byte) 0x6e, (byte) 0x66, (byte) 0x72, (byte) 0x61, (byte) 0x72, (byte) 0x65, (byte) 0x64, (byte) 0x12, (byte) 0x03, (byte) 0x52, (byte) 0x50, (byte) 0x43},
|
startAppRequest
|
);
|
|
RootMessageField loadFileRequest = new RootMessageField(
|
new VarintMessageField(1, 3),
|
new NestedMessageField(48,
|
new StringMessageField(1, "/any/infrared/Remote.ir")
|
)
|
);
|
assertEncodeRootMessageField(
|
new byte[]{(byte) 0x1e, (byte) 0x08, (byte) 0x03, (byte) 0x82, (byte) 0x03, (byte) 0x19, (byte) 0x0a, (byte) 0x17, (byte) 0x2f, (byte) 0x61, (byte) 0x6e, (byte) 0x79, (byte) 0x2f, (byte) 0x69, (byte) 0x6e, (byte) 0x66, (byte) 0x72, (byte) 0x61, (byte) 0x72, (byte) 0x65, (byte) 0x64, (byte) 0x2f, (byte) 0x52, (byte) 0x65, (byte) 0x6d, (byte) 0x6f, (byte) 0x74, (byte) 0x65, (byte) 0x2e, (byte) 0x69, (byte) 0x72},
|
loadFileRequest
|
);
|
|
RootMessageField pressButtonRequest = new RootMessageField(
|
new VarintMessageField(1, 4),
|
new NestedMessageField(49,
|
new StringMessageField(1, "Pwr")
|
)
|
);
|
assertEncodeRootMessageField(new byte[]{(byte) 0x0a, (byte) 0x08, (byte) 0x04, (byte) 0x8a, (byte) 0x03, (byte) 0x05, (byte) 0x0a, (byte) 0x03, (byte) 0x50, (byte) 0x77, (byte) 0x72}, pressButtonRequest);
|
|
RootMessageField releaseButtonRequest = new RootMessageField(
|
new VarintMessageField(1, 5),
|
new NestedMessageField(50)
|
);
|
assertEncodeRootMessageField(new byte[]{(byte) 0x05, (byte) 0x08, (byte) 0x05, (byte) 0x92, (byte) 0x03, (byte) 0x00}, releaseButtonRequest);
|
|
RootMessageField exitAppRequest = new RootMessageField(
|
new VarintMessageField(1, 6),
|
new NestedMessageField(47)
|
);
|
assertEncodeRootMessageField(new byte[]{(byte) 0x05, (byte) 0x08, (byte) 0x06, (byte) 0xfa, (byte) 0x02, (byte) 0x00}, exitAppRequest);
|
|
}
|
}
|