From 35fdeb1e1355cdddc3b208949a9598cd6f17da8f Mon Sep 17 00:00:00 2001 From: kai-morich Date: Thu, 24 Aug 2023 19:51:47 +0200 Subject: [PATCH] improved exception type also for read with timeout --- usbSerialForAndroid/build.gradle | 2 +- .../hoho/android/usbserial/DeviceTest.java | 56 +++++++++++++++++-- .../usbserial/driver/CommonUsbSerialPort.java | 3 + .../usbserial/driver/FtdiSerialDriver.java | 2 +- 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/usbSerialForAndroid/build.gradle b/usbSerialForAndroid/build.gradle index ed91fca..feb7a2e 100644 --- a/usbSerialForAndroid/build.gradle +++ b/usbSerialForAndroid/build.gradle @@ -13,7 +13,7 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments = [ // Raspi Windows LinuxVM ... - 'rfc2217_server_host': '192.168.0.145', + 'rfc2217_server_host': '192.168.0.143', 'rfc2217_server_nonstandard_baudrates': 'true', // true false false ] } diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java index e7342dd..7e13e53 100644 --- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java +++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java @@ -253,13 +253,15 @@ public class DeviceTest { } try { usb.write(new byte[]{0x00}); - fail("write error expected"); - } catch (IOException ignored) { + fail("write closed expected"); + } catch(IOException ex) { + assertEquals("Connection closed", ex.getMessage()); } try { usb.read(1); - fail("read error expected"); - } catch (IOException ignored) { + fail("read closed expected"); + } catch(IOException ex) { + assertEquals("Connection closed", ex.getMessage()); } try { usb.setParameters(9600, 8, 1, UsbSerialPort.PARITY_NONE); @@ -281,10 +283,56 @@ public class DeviceTest { break; Thread.sleep(1); } + try { + usb.read(); + fail("closed expected"); + } catch (IOException ex) { + assertEquals("java.io.IOException: Connection closed", ex.getMessage()); + } // assertEquals(SerialInputOutputManager.State.STOPPED, usb.usbIoManager.getState()); // unstable. null'ify not-stopped ioManager, else usbClose would try again if(SerialInputOutputManager.State.STOPPED != usb.ioManager.getState()) usb.ioManager = null; + usb.close(); + + // close while waiting in read + class CloseRunnable implements Runnable { + boolean wait; + public void run() { + try { + while(wait) + Thread.sleep(1); + Thread.sleep(5); + } catch (InterruptedException ignored) { + } + Log.d(TAG, "close"); + usb.close(); + } + } + usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); + CloseRunnable closer = new CloseRunnable(); + closer.wait = true; + Thread th = new Thread(closer); + th.start(); + try { + closer.wait = false; + usb.serialPort.read(new byte[256], 2000); + fail("closed expected"); + } catch(IOException ex) { + assertEquals("Connection closed", ex.getMessage()); + } + th.join(); + closer.wait = true; + th = new Thread(closer); + th.start(); + try { + closer.wait = false; + usb.serialPort.read(new byte[256], 0); + fail("closed expected"); + } catch(IOException ex) { + assertEquals("Connection closed", ex.getMessage()); + } + th.join(); } @Test diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java index b3c8f41..f23cfd7 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java @@ -158,6 +158,9 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { * use simple USB request supported by all devices to test if connection is still valid */ protected void testConnection() throws IOException { + if(mConnection == null || mUsbRequest == null) { + throw new IOException("Connection closed"); + } byte[] buf = new byte[2]; int len = mConnection.controlTransfer(0x80 /*DEVICE*/, 0 /*GET_STATUS*/, 0, 0, buf, buf.length, 200); if(len < 0) diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java index cb3087b..291ceeb 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java @@ -156,7 +156,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { testConnection(); } else { do { - nread = super.read(dest, timeout, false); + nread = super.read(dest, timeout); } while (nread == READ_HEADER_LENGTH); } return readFilter(dest, nread);