public void readChangedCharacteristic(BluetoothGattCharacteristic characteristic) { byte[] data; data = characteristic.getValue(); // *** this is going to get overwritten by next call, so make a queue if (data != null && data.length > 0 && (isConnected())) { messageBuffer.append(new String(data, 0, data.length)); if(JsonStreamer.containsJson(messageBuffer.toString())) { int delimiterIndex = messageBuffer.indexOf(DELIMITER); if (delimiterIndex != -1) { byte message[] = messageBuffer.substring(0, delimiterIndex + 1).getBytes(); BLEInputStream.getInstance().putDataInBuffer(message); messageBuffer.delete(0, delimiterIndex + 1); } } else { BLEInputStream.getInstance().putDataInBuffer(data); } } }
@Test public void completePartial() { byte[] bytes = new String("{\"name\": \"foo\"}\u0000").getBytes(); streamer.receive(bytes, bytes.length); bytes = new String("{\"name\": \"mira").getBytes(); streamer.receive(bytes, bytes.length); assertThat(streamer.parseNextMessage(), notNullValue()); assertThat(streamer.parseNextMessage(), nullValue()); bytes = new String("cle\"}\u0000").getBytes(); streamer.receive(bytes, bytes.length); assertThat(streamer.parseNextMessage(), notNullValue()); assertThat(streamer.parseNextMessage(), nullValue()); }
@Override public VehicleMessage parseNextMessage() { String line = readToDelimiter(); if(line != null) { try { return JsonFormatter.deserialize(line); } catch(UnrecognizedMessageTypeException e) { Log.w(TAG, "Unable to deserialize JSON", e); } } return null; }
@Test public void deserializeSerialized() { byte[] data = streamer.serializeForStream(message); streamer.receive(data, data.length); VehicleMessage deserialized = streamer.parseNextMessage(); assertEquals(message, deserialized); }
synchronized(this) { if(mStreamHandler == null) { if(JsonStreamer.containsJson(new String(bytes))) { mStreamHandler = new JsonStreamer(); Log.i(getTag(), "Source is sending JSON"); } else {
@Test public void receiveValidJsonTriggersCallback() { source.start(); source.connect(); SimpleVehicleMessage message = new SimpleVehicleMessage("foo", "bar"); source.inject(new JsonStreamer().serializeForStream(message)); TestUtils.pause(100); ArgumentCaptor<VehicleMessage> argument = ArgumentCaptor.forClass( VehicleMessage.class); verify(callback).receive(argument.capture()); VehicleMessage received = argument.getValue(); received.untimestamp(); assertEquals(received, message); }
@Before public void setup() { streamer = new JsonStreamer(); }
@Test public void emptyHasNoMessages() { assertThat(streamer.parseNextMessage(), nullValue()); }
@Test public void logTransferStatsAfterMegabyte() { byte[] data = streamer.serializeForStream(message); for(int i = 0; i < 10000; i++) { streamer.receive(data, data.length); } for(int i = 0; i < 10000; i++) { VehicleMessage deserialized = streamer.parseNextMessage(); assertEquals(message, deserialized); } } }
@Test public void readMultipleMessageAtOnceReceivesAll() { source.start(); source.connect(); List<SimpleVehicleMessage> messages = new ArrayList<>(); messages.add(new SimpleVehicleMessage("1", "foo")); messages.add(new SimpleVehicleMessage("2", "bar")); messages.add(new SimpleVehicleMessage("3", "baz")); for(SimpleVehicleMessage message : messages) { source.inject(new JsonStreamer().serializeForStream(message), false); } source.signal(); TestUtils.pause(100); ArgumentCaptor<VehicleMessage> argument = ArgumentCaptor.forClass( VehicleMessage.class); verify(callback, times(3)).receive(argument.capture()); List<VehicleMessage> capturedMessages = argument.getAllValues(); for(int i = 0; i < messages.size(); i++) { VehicleMessage received = capturedMessages.get(i); received.untimestamp(); assertEquals(received, messages.get(i)); } }
public void receive(VehicleMessage command) throws DataSinkException { if(isConnected()) { VehicleMessageStreamer streamer; synchronized(this) { streamer = mStreamHandler; if(streamer == null) { // See https://github.com/openxc/openxc-android/issues/181 streamer = new JsonStreamer(); Log.i(getTag(), "Payload format unknown, guessing JSON"); } } try { if(!write(streamer.serializeForStream(command))) { throw new DataSinkException("Unable to send command"); } } catch(SerializationException e) { throw new DataSinkException( "Unable to serialize command for sending", e); } } else { throw new DataSinkException("Not connected"); } }
@Test public void readLinesTwo() { byte[] bytes = new String("{\"name\": \"foo\"}\u0000").getBytes(); streamer.receive(bytes, bytes.length); bytes = new String("{\"name\": \"miracle\"}\u0000").getBytes(); streamer.receive(bytes, bytes.length); assertThat(streamer.parseNextMessage(), notNullValue()); assertThat(streamer.parseNextMessage(), notNullValue()); assertThat(streamer.parseNextMessage(), nullValue()); }
@Test public void paritalJsonDoesntContainJson() { assertFalse(JsonStreamer.containsJson("{\"name\": \"foo\"}\u0000\u0001\u0002")); }
@Test public void leavePartial() { byte[] bytes = new String("{\"name\": \"foo\"}\u0000").getBytes(); streamer.receive(bytes, bytes.length); bytes = new String("{\"name\": \"mira").getBytes(); streamer.receive(bytes, bytes.length); assertThat(streamer.parseNextMessage(), notNullValue()); assertThat(streamer.parseNextMessage(), nullValue()); }
@Test public void notJsonDoesntContainJson() { assertFalse(JsonStreamer.containsJson("\u0000\u0001\u0002")); }
@Test public void readingGenericThenSpecific() { byte[] bytes = new String("{\"name\": \"bar\"}\u0000").getBytes(); streamer.receive(bytes, bytes.length); bytes = new String("{\"name\": \"foo\", \"value\": \"bar\"}\u0000").getBytes(); streamer.receive(bytes, bytes.length); assertThat(streamer.parseNextMessage(), notNullValue()); assertThat(streamer.parseNextMessage(), notNullValue()); }
@Test public void jsonContainsJson() { assertTrue(JsonStreamer.containsJson("{\"name\": \"foo\"}\u0000")); }
@Test public void readWithOnlyExtras() { byte[] bytes = new String("{\"extras\": {\"foo\": \"bar\"}}\u0000").getBytes(); streamer.receive(bytes, bytes.length); assertThat(streamer.parseNextMessage(), notNullValue()); }
@Test public void clearsDelimitersInFrontOfMessage() { byte[] bytes = new String("\u0000\u0000{\"name\": \"bar\"}\u0000").getBytes(); streamer.receive(bytes, bytes.length); assertThat(streamer.parseNextMessage(), notNullValue()); }
@Test public void readUnrecognizedFields() { byte[] bytes = new String("{\"foo\": \"bar\"}\u0000").getBytes(); streamer.receive(bytes, bytes.length); assertThat(streamer.parseNextMessage(), nullValue()); }