Loading tests/Input/src/com/android/test/input/InputEventSenderAndReceiverTest.kt +5 −7 Original line number Diff line number Diff line Loading @@ -92,13 +92,12 @@ class InputEventSenderAndReceiverTest { val seq = 10 mSender.sendInputEvent(seq, key) val receivedKey = mReceiver.getInputEvent() as KeyEvent val finishedSignal = mSender.getFinishedSignal() // Check receiver assertKeyEvent(key, receivedKey) // Check sender assertEquals(SpyInputEventSender.FinishedSignal(seq, handled = true), finishedSignal) mSender.assertReceivedFinishedSignal(seq, handled = true) } // The timeline case is slightly unusual because it goes from InputConsumer to InputPublisher. Loading Loading @@ -135,13 +134,13 @@ class InputEventSenderAndReceiverTest { @Test fun testCrashingReceiverDoesNotCrash() { val channels = InputChannel.openInputChannelPair("TestChannel2") val sender = SpyInputEventSender(channels[0], mHandlerThread.getLooper()) val sender = SpyInputEventSender(channels[0], mHandlerThread.looper) // Need a separate thread for the receiver so that the sender can still get the response // after the receiver crashes val receiverThread = HandlerThread("Receive input events") val receiverThread = HandlerThread("Crash when input event comes in") receiverThread.start() val crashingReceiver = CrashingInputEventReceiver(channels[1], receiverThread.getLooper()) val crashingReceiver = CrashingInputEventReceiver(channels[1], receiverThread.looper) receiverThread.setUncaughtExceptionHandler { thread, exception -> if (thread == receiverThread && exception is IllegalArgumentException) { // do nothing - this is the exception that we need to ignore Loading @@ -153,8 +152,7 @@ class InputEventSenderAndReceiverTest { val key = getTestKeyEvent() val seq = 11 sender.sendInputEvent(seq, key) val finishedSignal = sender.getFinishedSignal() assertEquals(SpyInputEventSender.FinishedSignal(seq, handled = true), finishedSignal) sender.assertReceivedFinishedSignal(seq, handled = true) // Clean up crashingReceiver.dispose() Loading tests/Input/src/com/android/test/input/PointerEventDispatcherTest.kt +2 −3 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.view.WindowManagerPolicyConstants.PointerEventListener import com.android.server.UiThread import com.android.server.wm.PointerEventDispatcher import org.junit.After import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test Loading Loading @@ -87,11 +86,11 @@ class PointerEventDispatcherTest { motionEvent.source = InputDevice.SOURCE_TOUCHSCREEN val seq = 10 mSender.sendInputEvent(seq, motionEvent) val finishedSignal = mSender.getFinishedSignal() // Since the listener raises an exception during the event handling, the event should be // marked as 'not handled'. assertEquals(SpyInputEventSender.FinishedSignal(seq, handled = false), finishedSignal) mSender.assertReceivedFinishedSignal(seq, handled = false) // Ensure that there aren't double finish calls. mSender.assertNoEvents() } Loading tests/Input/src/com/android/test/input/SpyInputEventSenderAndReceiver.kt +21 −7 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.view.KeyEvent import android.view.MotionEvent import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.TimeUnit import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull private fun <T> getEvent(queue: LinkedBlockingQueue<T>): T? { Loading @@ -39,19 +41,28 @@ private fun <T> assertNoEvents(queue: LinkedBlockingQueue<T>) { class SpyInputEventReceiver(channel: InputChannel, looper: Looper) : InputEventReceiver(channel, looper) { private val mInputEvents = LinkedBlockingQueue<InputEvent>() private val inputEvents = LinkedBlockingQueue<InputEvent>() override fun onInputEvent(event: InputEvent) { addInputEvent(event) finishInputEvent(event, true /*handled*/) } private fun addInputEvent(event: InputEvent) { when (event) { is KeyEvent -> mInputEvents.put(KeyEvent.obtain(event)) is MotionEvent -> mInputEvents.put(MotionEvent.obtain(event)) is KeyEvent -> inputEvents.put(KeyEvent.obtain(event)) is MotionEvent -> inputEvents.put(MotionEvent.obtain(event)) else -> throw Exception("Received $event is neither a key nor a motion") } finishInputEvent(event, true /*handled*/) } fun getInputEvent(): InputEvent? { return getEvent(mInputEvents) return getEvent(inputEvents) } fun assertNoEvents() { assertNoEvents(inputEvents) } } Loading @@ -72,8 +83,11 @@ class SpyInputEventSender(channel: InputChannel, looper: Looper) : mTimelines.put(Timeline(inputEventId, gpuCompletedTime, presentTime)) } fun getFinishedSignal(): FinishedSignal? { return getEvent(mFinishedSignals) fun assertReceivedFinishedSignal(seq: Int, handled: Boolean) { val finished = getEvent(mFinishedSignals) assertNotNull("Did not receive 'finished' event", finished) assertEquals("Unexpected sequence number", seq, finished!!.seq) assertEquals("Unexpected 'handled' value", handled, finished!!.handled) } fun getTimeline(): Timeline? { Loading Loading
tests/Input/src/com/android/test/input/InputEventSenderAndReceiverTest.kt +5 −7 Original line number Diff line number Diff line Loading @@ -92,13 +92,12 @@ class InputEventSenderAndReceiverTest { val seq = 10 mSender.sendInputEvent(seq, key) val receivedKey = mReceiver.getInputEvent() as KeyEvent val finishedSignal = mSender.getFinishedSignal() // Check receiver assertKeyEvent(key, receivedKey) // Check sender assertEquals(SpyInputEventSender.FinishedSignal(seq, handled = true), finishedSignal) mSender.assertReceivedFinishedSignal(seq, handled = true) } // The timeline case is slightly unusual because it goes from InputConsumer to InputPublisher. Loading Loading @@ -135,13 +134,13 @@ class InputEventSenderAndReceiverTest { @Test fun testCrashingReceiverDoesNotCrash() { val channels = InputChannel.openInputChannelPair("TestChannel2") val sender = SpyInputEventSender(channels[0], mHandlerThread.getLooper()) val sender = SpyInputEventSender(channels[0], mHandlerThread.looper) // Need a separate thread for the receiver so that the sender can still get the response // after the receiver crashes val receiverThread = HandlerThread("Receive input events") val receiverThread = HandlerThread("Crash when input event comes in") receiverThread.start() val crashingReceiver = CrashingInputEventReceiver(channels[1], receiverThread.getLooper()) val crashingReceiver = CrashingInputEventReceiver(channels[1], receiverThread.looper) receiverThread.setUncaughtExceptionHandler { thread, exception -> if (thread == receiverThread && exception is IllegalArgumentException) { // do nothing - this is the exception that we need to ignore Loading @@ -153,8 +152,7 @@ class InputEventSenderAndReceiverTest { val key = getTestKeyEvent() val seq = 11 sender.sendInputEvent(seq, key) val finishedSignal = sender.getFinishedSignal() assertEquals(SpyInputEventSender.FinishedSignal(seq, handled = true), finishedSignal) sender.assertReceivedFinishedSignal(seq, handled = true) // Clean up crashingReceiver.dispose() Loading
tests/Input/src/com/android/test/input/PointerEventDispatcherTest.kt +2 −3 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.view.WindowManagerPolicyConstants.PointerEventListener import com.android.server.UiThread import com.android.server.wm.PointerEventDispatcher import org.junit.After import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test Loading Loading @@ -87,11 +86,11 @@ class PointerEventDispatcherTest { motionEvent.source = InputDevice.SOURCE_TOUCHSCREEN val seq = 10 mSender.sendInputEvent(seq, motionEvent) val finishedSignal = mSender.getFinishedSignal() // Since the listener raises an exception during the event handling, the event should be // marked as 'not handled'. assertEquals(SpyInputEventSender.FinishedSignal(seq, handled = false), finishedSignal) mSender.assertReceivedFinishedSignal(seq, handled = false) // Ensure that there aren't double finish calls. mSender.assertNoEvents() } Loading
tests/Input/src/com/android/test/input/SpyInputEventSenderAndReceiver.kt +21 −7 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.view.KeyEvent import android.view.MotionEvent import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.TimeUnit import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull private fun <T> getEvent(queue: LinkedBlockingQueue<T>): T? { Loading @@ -39,19 +41,28 @@ private fun <T> assertNoEvents(queue: LinkedBlockingQueue<T>) { class SpyInputEventReceiver(channel: InputChannel, looper: Looper) : InputEventReceiver(channel, looper) { private val mInputEvents = LinkedBlockingQueue<InputEvent>() private val inputEvents = LinkedBlockingQueue<InputEvent>() override fun onInputEvent(event: InputEvent) { addInputEvent(event) finishInputEvent(event, true /*handled*/) } private fun addInputEvent(event: InputEvent) { when (event) { is KeyEvent -> mInputEvents.put(KeyEvent.obtain(event)) is MotionEvent -> mInputEvents.put(MotionEvent.obtain(event)) is KeyEvent -> inputEvents.put(KeyEvent.obtain(event)) is MotionEvent -> inputEvents.put(MotionEvent.obtain(event)) else -> throw Exception("Received $event is neither a key nor a motion") } finishInputEvent(event, true /*handled*/) } fun getInputEvent(): InputEvent? { return getEvent(mInputEvents) return getEvent(inputEvents) } fun assertNoEvents() { assertNoEvents(inputEvents) } } Loading @@ -72,8 +83,11 @@ class SpyInputEventSender(channel: InputChannel, looper: Looper) : mTimelines.put(Timeline(inputEventId, gpuCompletedTime, presentTime)) } fun getFinishedSignal(): FinishedSignal? { return getEvent(mFinishedSignals) fun assertReceivedFinishedSignal(seq: Int, handled: Boolean) { val finished = getEvent(mFinishedSignals) assertNotNull("Did not receive 'finished' event", finished) assertEquals("Unexpected sequence number", seq, finished!!.seq) assertEquals("Unexpected 'handled' value", handled, finished!!.handled) } fun getTimeline(): Timeline? { Loading