diff options
-rw-r--r-- | src/android/net/util/FdEventsReader.java | 32 | ||||
-rw-r--r-- | src/android/net/util/PacketReader.java | 2 | ||||
-rw-r--r-- | tests/unit/src/android/net/ip/IpReachabilityMonitorTest.java | 4 | ||||
-rw-r--r-- | tests/unit/src/android/net/util/PacketReaderTest.java | 32 |
4 files changed, 47 insertions, 23 deletions
diff --git a/src/android/net/util/FdEventsReader.java b/src/android/net/util/FdEventsReader.java index 1380ea7..e82c69b 100644 --- a/src/android/net/util/FdEventsReader.java +++ b/src/android/net/util/FdEventsReader.java @@ -63,7 +63,6 @@ import java.io.IOException; * the Handler constructor argument is associated. * * @param <BufferType> the type of the buffer used to read data. - * @hide */ public abstract class FdEventsReader<BufferType> { private static final int FD_EVENTS = EVENT_INPUT | EVENT_ERROR; @@ -93,27 +92,21 @@ public abstract class FdEventsReader<BufferType> { } /** Start this FdEventsReader. */ - public void start() { - if (onCorrectThread()) { - createAndRegisterFd(); - } else { - mHandler.post(() -> { - logError("start() called from off-thread", null); - createAndRegisterFd(); - }); + public boolean start() { + if (!onCorrectThread()) { + throw new IllegalStateException("start() called from off-thread"); } + + return createAndRegisterFd(); } /** Stop this FdEventsReader and destroy the file descriptor. */ public void stop() { - if (onCorrectThread()) { - unregisterAndDestroyFd(); - } else { - mHandler.post(() -> { - logError("stop() called from off-thread", null); - unregisterAndDestroyFd(); - }); + if (!onCorrectThread()) { + throw new IllegalStateException("stop() called from off-thread"); } + + unregisterAndDestroyFd(); } @NonNull @@ -178,8 +171,8 @@ public abstract class FdEventsReader<BufferType> { */ protected void onStop() {} - private void createAndRegisterFd() { - if (mFd != null) return; + private boolean createAndRegisterFd() { + if (mFd != null) return true; try { mFd = createFd(); @@ -189,7 +182,7 @@ public abstract class FdEventsReader<BufferType> { mFd = null; } - if (mFd == null) return; + if (mFd == null) return false; mQueue.addOnFileDescriptorEventListener( mFd, @@ -205,6 +198,7 @@ public abstract class FdEventsReader<BufferType> { return FD_EVENTS; }); onStart(); + return true; } private boolean isRunning() { diff --git a/src/android/net/util/PacketReader.java b/src/android/net/util/PacketReader.java index 4aec6b6..0be7187 100644 --- a/src/android/net/util/PacketReader.java +++ b/src/android/net/util/PacketReader.java @@ -28,8 +28,6 @@ import java.io.FileDescriptor; * * TODO: rename this class to something more correctly descriptive (something * like [or less horrible than] FdReadEventsHandler?). - * - * @hide */ public abstract class PacketReader extends FdEventsReader<byte[]> { diff --git a/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.java b/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.java index 64b168a..428baac 100644 --- a/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.java +++ b/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.java @@ -62,6 +62,8 @@ public class IpReachabilityMonitorTest { @Test public void testNothing() { - IpReachabilityMonitor monitor = makeMonitor(); + // make sure the unit test runs in the same thread with main looper. + // Otherwise, throwing IllegalStateException would cause test fails. + mHandler.post(() -> makeMonitor()); } } diff --git a/tests/unit/src/android/net/util/PacketReaderTest.java b/tests/unit/src/android/net/util/PacketReaderTest.java index 289dcad..3947d15 100644 --- a/tests/unit/src/android/net/util/PacketReaderTest.java +++ b/tests/unit/src/android/net/util/PacketReaderTest.java @@ -24,6 +24,8 @@ import static android.system.OsConstants.SOCK_NONBLOCK; import static android.system.OsConstants.SOL_SOCKET; import static android.system.OsConstants.SO_SNDTIMEO; +import static com.android.testutils.MiscAssertsKt.assertThrows; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -182,7 +184,7 @@ public class PacketReaderTest { assertTrue(Arrays.equals(two, mLastRecvBuf)); assertFalse(mStopped); - mReceiver.stop(); + h.post(() -> mReceiver.stop()); waitForActivity(); assertEquals(2, mReceiver.numPacketsReceived()); assertTrue(Arrays.equals(two, mLastRecvBuf)); @@ -208,4 +210,32 @@ public class PacketReaderTest { assertEquals(DEFAULT_RECV_BUF_SIZE, b.recvBufSize()); } } + + @Test + public void testStartingFromWrongThread() throws Exception { + final Handler h = mHandlerThread.getThreadHandler(); + final PacketReader b = new NullPacketReader(h, DEFAULT_RECV_BUF_SIZE); + assertThrows(IllegalStateException.class, () -> b.start()); + } + + @Test + public void testStoppingFromWrongThread() throws Exception { + final Handler h = mHandlerThread.getThreadHandler(); + final PacketReader b = new NullPacketReader(h, DEFAULT_RECV_BUF_SIZE); + assertThrows(IllegalStateException.class, () -> b.stop()); + } + + @Test + public void testSuccessToCreateSocket() throws Exception { + final Handler h = mHandlerThread.getThreadHandler(); + final PacketReader b = new UdpLoopbackReader(h); + h.post(() -> assertTrue(b.start())); + } + + @Test + public void testFailToCreateSocket() throws Exception { + final Handler h = mHandlerThread.getThreadHandler(); + final PacketReader b = new NullPacketReader(h, DEFAULT_RECV_BUF_SIZE); + h.post(() -> assertFalse(b.start())); + } } |