Skip to content

Commit d6667dd

Browse files
committed
Added unit testing for UTF8 decoder in Serial
1 parent a82f9a0 commit d6667dd

File tree

2 files changed

+87
-20
lines changed

2 files changed

+87
-20
lines changed
+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* This file is part of Arduino.
3+
*
4+
* Copyright 2020 Arduino LLC (http://www.arduino.cc/)
5+
*
6+
* Arduino is free software; you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation; either version 2 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with this program; if not, write to the Free Software
18+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
*
20+
* As a special exception, you may use this file as part of a free software
21+
* library without restriction. Specifically, if other files instantiate
22+
* templates or use macros or inline functions from this file, or you compile
23+
* this file and link it with other files to produce an executable, this
24+
* file does not by itself cause the resulting executable to be covered by
25+
* the GNU General Public License. This exception does not however
26+
* invalidate any other reasons why the executable file might be covered by
27+
* the GNU General Public License.
28+
*/
29+
30+
package processing.app;
31+
32+
import static org.junit.Assert.assertEquals;
33+
34+
import org.junit.Test;
35+
36+
public class SerialTest {
37+
class NullSerial extends Serial {
38+
public NullSerial() throws SerialException {
39+
super("none", 0, 'n', 0, 0, false, false);
40+
}
41+
42+
@Override
43+
protected void message(char[] chars, int length) {
44+
output += new String(chars, 0, length);
45+
}
46+
47+
String output = "";
48+
}
49+
50+
@Test
51+
public void testSerialUTF8Decoder() throws Exception {
52+
NullSerial s = new NullSerial();
53+
// https://github.com/arduino/Arduino/issues/9808
54+
String testdata = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789°0123456789";
55+
s.processSerialEvent(testdata.getBytes());
56+
assertEquals(s.output, testdata);
57+
}
58+
}

arduino-core/src/processing/app/Serial.java

+29-20
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public static boolean touchForCDCReset(String iname) throws SerialException {
116116
}
117117
}
118118

119-
private Serial(String iname, int irate, char iparity, int idatabits, float istopbits, boolean setRTS, boolean setDTR) throws SerialException {
119+
protected Serial(String iname, int irate, char iparity, int idatabits, float istopbits, boolean setRTS, boolean setDTR) throws SerialException {
120120
//if (port != null) port.close();
121121
//this.parent = parent;
122122
//parent.attach(this);
@@ -131,6 +131,11 @@ private Serial(String iname, int irate, char iparity, int idatabits, float istop
131131
if (istopbits == 1.5f) stopbits = SerialPort.STOPBITS_1_5;
132132
if (istopbits == 2) stopbits = SerialPort.STOPBITS_2;
133133

134+
// This is required for unit-testing
135+
if (iname.equals("none")) {
136+
return;
137+
}
138+
134139
try {
135140
port = new SerialPort(iname);
136141
port.openPort();
@@ -175,31 +180,35 @@ public synchronized void serialEvent(SerialPortEvent serialEvent) {
175180
if (serialEvent.isRXCHAR()) {
176181
try {
177182
byte[] buf = port.readBytes(serialEvent.getEventValue());
178-
int next = 0;
179-
while(next < buf.length) {
180-
while(next < buf.length && outToMessage.hasRemaining()) {
181-
int spaceInIn = inFromSerial.remaining();
182-
int copyNow = buf.length - next < spaceInIn ? buf.length - next : spaceInIn;
183-
inFromSerial.put(buf, next, copyNow);
184-
next += copyNow;
185-
inFromSerial.flip();
186-
bytesToStrings.decode(inFromSerial, outToMessage, false);
187-
inFromSerial.compact();
188-
}
189-
outToMessage.flip();
190-
if(outToMessage.hasRemaining()) {
191-
char[] chars = new char[outToMessage.remaining()];
192-
outToMessage.get(chars);
193-
message(chars, chars.length);
194-
}
195-
outToMessage.clear();
196-
}
183+
processSerialEvent(buf);
197184
} catch (SerialPortException e) {
198185
errorMessage("serialEvent", e);
199186
}
200187
}
201188
}
202189

190+
public void processSerialEvent(byte[] buf) {
191+
int next = 0;
192+
while(next < buf.length) {
193+
while(next < buf.length && outToMessage.hasRemaining()) {
194+
int spaceInIn = inFromSerial.remaining();
195+
int copyNow = buf.length - next < spaceInIn ? buf.length - next : spaceInIn;
196+
inFromSerial.put(buf, next, copyNow);
197+
next += copyNow;
198+
inFromSerial.flip();
199+
bytesToStrings.decode(inFromSerial, outToMessage, false);
200+
inFromSerial.compact();
201+
}
202+
outToMessage.flip();
203+
if(outToMessage.hasRemaining()) {
204+
char[] chars = new char[outToMessage.remaining()];
205+
outToMessage.get(chars);
206+
message(chars, chars.length);
207+
}
208+
outToMessage.clear();
209+
}
210+
}
211+
203212
/**
204213
* This method is intented to be extended to receive messages
205214
* coming from serial port.

0 commit comments

Comments
 (0)