// -*- mode: java; c-basic-offset: 2; -*- // Copyright 2009-2011 Google, All Rights reserved // Copyright 2011-2012 MIT, All rights reserved // Released under the Apache License, Version 2.0 // http://www.apache.org/licenses/LICENSE-2.0 package com.google.appinventor.components.runtime; import com.google.appinventor.components.runtime.util.ErrorMessages; import com.google.appinventor.components.runtime.util.YailList; import junit.framework.TestCase; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.util.ArrayList; import java.util.List; /** * Tests BluetoothConnectionBase.java. * * @author lizlooney@google.com (Liz Looney) */ public class BluetoothConnectionBaseTest extends TestCase { private BluetoothConnectionBase connection; private ByteArrayOutputStream outputStream; private int recordedErrorNumber; private PipedOutputStream pipe; @Override protected void setUp() throws Exception { outputStream = new ByteArrayOutputStream(); pipe = new PipedOutputStream(); connection = new BluetoothConnectionBase(outputStream, new PipedInputStream(pipe)) { @Override protected void bluetoothError(String functionName, int errorNumber, Object... messageArgs) { recordedErrorNumber = errorNumber; } @Override protected void write(String functionName, byte b) { super.write(functionName, b); try { pipe.write(b); } catch (IOException e) { throw new RuntimeException(e); } } @Override protected void write(String functionName, byte[] bytes) { super.write(functionName, bytes); try { pipe.write(bytes); } catch (IOException e) { throw new RuntimeException(e); } } }; } public void testSendAndReceiveText() { connection.SendText("Hello"); assertEquals(5, connection.BytesAvailableToReceive()); assertEquals("Hello", connection.ReceiveText(5)); // Test DelimiterByte with default value of 0 connection.SendText("World"); connection.Send1ByteNumber("0x0"); // send delimiter assertEquals(6, connection.BytesAvailableToReceive()); assertEquals("World", connection.ReceiveText(-1)); // Test DelimiterByte with value of 10 (line feed) connection.DelimiterByte(10); connection.SendText("Hello World"); connection.Send1ByteNumber("13"); // send carriage return connection.Send1ByteNumber("10"); // send line feed assertEquals(13, connection.BytesAvailableToReceive()); assertEquals("Hello World\r", connection.ReceiveText(-1)); assertEquals(0, recordedErrorNumber); byte[] bytes = outputStream.toByteArray(); assertEquals(24, bytes.length); int i = 0; assertEquals((byte) 72, bytes[i++]); // H assertEquals((byte) 101, bytes[i++]); // e assertEquals((byte) 108, bytes[i++]); // l assertEquals((byte) 108, bytes[i++]); // l assertEquals((byte) 111, bytes[i++]); // o assertEquals((byte) 87, bytes[i++]); // W assertEquals((byte) 111, bytes[i++]); // o assertEquals((byte) 114, bytes[i++]); // r assertEquals((byte) 108, bytes[i++]); // l assertEquals((byte) 100, bytes[i++]); // d assertEquals((byte) 0, bytes[i++]); // delimiter 0 assertEquals((byte) 72, bytes[i++]); // H assertEquals((byte) 101, bytes[i++]); // e assertEquals((byte) 108, bytes[i++]); // l assertEquals((byte) 108, bytes[i++]); // l assertEquals((byte) 111, bytes[i++]); // o assertEquals((byte) 32, bytes[i++]); // space assertEquals((byte) 87, bytes[i++]); // W assertEquals((byte) 111, bytes[i++]); // o assertEquals((byte) 114, bytes[i++]); // r assertEquals((byte) 108, bytes[i++]); // l assertEquals((byte) 100, bytes[i++]); // d assertEquals((byte) 13, bytes[i++]); // carriage return assertEquals((byte) 10, bytes[i++]); // line feed } public void testSendandReceive1ByteNumber() { connection.Send1ByteNumber("0"); assertEquals(0, connection.ReceiveUnsigned1ByteNumber()); connection.Send1ByteNumber("1"); assertEquals(1, connection.ReceiveUnsigned1ByteNumber()); connection.Send1ByteNumber("-1"); assertEquals(-1, connection.ReceiveSigned1ByteNumber()); connection.Send1ByteNumber("127"); assertEquals(127, connection.ReceiveUnsigned1ByteNumber()); connection.Send1ByteNumber("-128"); assertEquals(-128, connection.ReceiveSigned1ByteNumber()); connection.Send1ByteNumber("255"); assertEquals(255, connection.ReceiveUnsigned1ByteNumber()); connection.Send1ByteNumber("0x0"); assertEquals(0x0, connection.ReceiveUnsigned1ByteNumber()); connection.Send1ByteNumber("0x1"); assertEquals(0x1, connection.ReceiveUnsigned1ByteNumber()); connection.Send1ByteNumber("0xFF"); assertEquals(0xFF, connection.ReceiveUnsigned1ByteNumber()); connection.Send1ByteNumber("0xab"); assertEquals(0xab, connection.ReceiveUnsigned1ByteNumber()); assertEquals(0, recordedErrorNumber); connection.Send1ByteNumber("abc"); assertEquals(ErrorMessages.ERROR_BLUETOOTH_COULD_NOT_DECODE, recordedErrorNumber); recordedErrorNumber = 0; connection.Send1ByteNumber("256"); assertEquals(ErrorMessages.ERROR_BLUETOOTH_COULD_NOT_FIT_NUMBER_IN_BYTE, recordedErrorNumber); byte[] bytes = outputStream.toByteArray(); assertEquals(10, bytes.length); int i = 0; assertEquals((byte) 0x00, bytes[i++]); // 0 assertEquals((byte) 0x01, bytes[i++]); // 1 assertEquals((byte) 0xFF, bytes[i++]); // -1 assertEquals((byte) 0x7F, bytes[i++]); // 127 assertEquals((byte) 0x80, bytes[i++]); // -128 assertEquals((byte) 0xFF, bytes[i++]); // 255 assertEquals((byte) 0x00, bytes[i++]); // 0x00 assertEquals((byte) 0x01, bytes[i++]); // 0x01 assertEquals((byte) 0xFF, bytes[i++]); // 0xFF assertEquals((byte) 0xAB, bytes[i++]); // 0xab } public void testSendAndReceive2ByteNumber() { connection.HighByteFirst(true); connection.Send2ByteNumber("0"); assertEquals(0, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("1"); assertEquals(1, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("-1"); assertEquals(-1, connection.ReceiveSigned2ByteNumber()); connection.Send2ByteNumber("32767"); assertEquals(32767, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("-32768"); assertEquals(-32768, connection.ReceiveSigned2ByteNumber()); connection.Send2ByteNumber("65535"); assertEquals(65535, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("0x0"); assertEquals(0x0, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("0x1"); assertEquals(0x1, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("0xFFFF"); assertEquals(0xFFFF, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("0xabcd"); assertEquals(0xabcd, connection.ReceiveUnsigned2ByteNumber()); connection.HighByteFirst(false); connection.Send2ByteNumber("0"); assertEquals(0, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("1"); assertEquals(1, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("-1"); assertEquals(-1, connection.ReceiveSigned2ByteNumber()); connection.Send2ByteNumber("32767"); assertEquals(32767, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("-32768"); assertEquals(-32768, connection.ReceiveSigned2ByteNumber()); connection.Send2ByteNumber("65535"); assertEquals(65535, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("0x0"); assertEquals(0x0, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("0x1"); assertEquals(0x1, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("0xFFFF"); assertEquals(0xFFFF, connection.ReceiveUnsigned2ByteNumber()); connection.Send2ByteNumber("0xabcd"); assertEquals(0xabcd, connection.ReceiveUnsigned2ByteNumber()); assertEquals(0, recordedErrorNumber); connection.Send2ByteNumber("abc"); assertEquals(ErrorMessages.ERROR_BLUETOOTH_COULD_NOT_DECODE, recordedErrorNumber); recordedErrorNumber = 0; connection.Send2ByteNumber("65536"); assertEquals(ErrorMessages.ERROR_BLUETOOTH_COULD_NOT_FIT_NUMBER_IN_BYTES, recordedErrorNumber); byte[] bytes = outputStream.toByteArray(); assertEquals(40, bytes.length); int i = 0; assertEquals((byte) 0x00, bytes[i++]); // 0 high byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 1 high byte first assertEquals((byte) 0x01, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // -1 high byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x7F, bytes[i++]); // 32767 high byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x80, bytes[i++]); // -32768 high byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 65535 high byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 0x0 high byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 0x1 high byte first assertEquals((byte) 0x01, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 0xFFFF high byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xAB, bytes[i++]); // 0xabcd high byte first assertEquals((byte) 0xCD, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 0 low byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x01, bytes[i++]); // 1 low byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // -1 low byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 32767 low byte first assertEquals((byte) 0x7F, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // -32768 low byte first assertEquals((byte) 0x80, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 65535 low byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 0x0 low byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x01, bytes[i++]); // 0x1 low byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 0xFFFF low byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xCD, bytes[i++]); // 0xabcd low byte first assertEquals((byte) 0xAB, bytes[i++]); } public void testSendAndReceive4ByteNumber() { connection.HighByteFirst(true); connection.Send4ByteNumber("0"); assertEquals(0, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("1"); assertEquals(1, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("-1"); assertEquals(-1, connection.ReceiveSigned4ByteNumber()); connection.Send4ByteNumber("2147483647"); assertEquals(2147483647, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("-2147483648"); assertEquals(-2147483648, connection.ReceiveSigned4ByteNumber()); connection.Send4ByteNumber("4294967295"); assertEquals(4294967295L, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("0x0"); assertEquals(0x0, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("0x1"); assertEquals(0x1, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("0xFFFFFFFF"); assertEquals(0xFFFFFFFFL, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("0xabcdef"); assertEquals(0xabcdef, connection.ReceiveUnsigned4ByteNumber()); connection.HighByteFirst(false); connection.Send4ByteNumber("0"); assertEquals(0, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("1"); assertEquals(1, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("-1"); assertEquals(-1, connection.ReceiveSigned4ByteNumber()); connection.Send4ByteNumber("2147483647"); assertEquals(2147483647, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("-2147483648"); assertEquals(-2147483648, connection.ReceiveSigned4ByteNumber()); connection.Send4ByteNumber("4294967295"); assertEquals(4294967295L, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("0x0"); assertEquals(0x0, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("0x1"); assertEquals(0x1, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("0xFFFFFFFF"); assertEquals(0xFFFFFFFFL, connection.ReceiveUnsigned4ByteNumber()); connection.Send4ByteNumber("0xabcdef"); assertEquals(0xabcdef, connection.ReceiveUnsigned4ByteNumber()); assertEquals(0, recordedErrorNumber); connection.Send4ByteNumber("abc"); assertEquals(ErrorMessages.ERROR_BLUETOOTH_COULD_NOT_DECODE, recordedErrorNumber); recordedErrorNumber = 0; connection.Send4ByteNumber("4294967296"); assertEquals(ErrorMessages.ERROR_BLUETOOTH_COULD_NOT_FIT_NUMBER_IN_BYTES, recordedErrorNumber); byte[] bytes = outputStream.toByteArray(); assertEquals(80, bytes.length); int i = 0; assertEquals((byte) 0x00, bytes[i++]); // 0 high byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 1 high byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x01, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // -1 high byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x7F, bytes[i++]); // 2147483647 high byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x80, bytes[i++]); // -2147483648 high byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 4294967295 high byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 0x0 high byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 0x1 high byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x01, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 0xFFFFFFFF high byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 0xabcdef high byte first assertEquals((byte) 0xAB, bytes[i++]); assertEquals((byte) 0xCD, bytes[i++]); assertEquals((byte) 0xEF, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 0 low byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x01, bytes[i++]); // 1 low byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // -1 low byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 2147483647 low byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x7F, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // -2147483648 low byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x80, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 4294967295 low byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); // 0x0 low byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x01, bytes[i++]); // 0x1 low byte first assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); // 0xFFFFFFFF low byte first assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xFF, bytes[i++]); assertEquals((byte) 0xEF, bytes[i++]); // 0xabcdef low byte first assertEquals((byte) 0xCD, bytes[i++]); assertEquals((byte) 0xAB, bytes[i++]); assertEquals((byte) 0x00, bytes[i++]); } public void testSendAndReceiveBytes() { List<Object> list = new ArrayList<Object>(); list.add((byte) 0); list.add((short) 1); list.add(-1); list.add((long) 127); list.add((byte) -128); list.add((short) 255); list.add("0x0"); list.add("0x1"); list.add("0xFF"); list.add("0xab"); connection.SendBytes(YailList.makeList(list)); assertEquals(0, recordedErrorNumber); assertEquals(10, connection.BytesAvailableToReceive()); List<Integer> signedBytes = connection.ReceiveSignedBytes(5); assertEquals(0, signedBytes.get(0).intValue()); assertEquals(1, signedBytes.get(1).intValue()); assertEquals(-1, signedBytes.get(2).intValue()); assertEquals(127, signedBytes.get(3).intValue()); assertEquals(-128, signedBytes.get(4).intValue()); List<Integer> unsignedBytes = connection.ReceiveUnsignedBytes(5); assertEquals(255, unsignedBytes.get(0).intValue()); assertEquals(0x0, unsignedBytes.get(1).intValue()); assertEquals(0x1, unsignedBytes.get(2).intValue()); assertEquals(0xFF, unsignedBytes.get(3).intValue()); assertEquals(0xab, unsignedBytes.get(4).intValue()); assertEquals(0, recordedErrorNumber); list = new ArrayList<Object>(); list.add("abc"); connection.SendBytes(YailList.makeList(list)); assertEquals(ErrorMessages.ERROR_BLUETOOTH_COULD_NOT_DECODE_ELEMENT, recordedErrorNumber); recordedErrorNumber = 0; list = new ArrayList<Object>(); list.add("256"); connection.SendBytes(YailList.makeList(list)); assertEquals(ErrorMessages.ERROR_BLUETOOTH_COULD_NOT_FIT_ELEMENT_IN_BYTE, recordedErrorNumber); byte[] bytes = outputStream.toByteArray(); assertEquals(10, bytes.length); int i = 0; assertEquals((byte) 0x00, bytes[i++]); // 0 assertEquals((byte) 0x01, bytes[i++]); // 1 assertEquals((byte) 0xFF, bytes[i++]); // -1 assertEquals((byte) 0x7F, bytes[i++]); // 127 assertEquals((byte) 0x80, bytes[i++]); // -128 assertEquals((byte) 0xFF, bytes[i++]); // 255 assertEquals((byte) 0x00, bytes[i++]); // 0x00 assertEquals((byte) 0x01, bytes[i++]); // 0x01 assertEquals((byte) 0xFF, bytes[i++]); // 0xFF assertEquals((byte) 0xAB, bytes[i++]); // 0xab } }