diff options
| author | saber safavi <saber.safavi@codic.se> | 2022-12-05 13:11:07 +0100 |
|---|---|---|
| committer | saber safavi <saber.safavi@codic.se> | 2022-12-13 15:09:47 +0100 |
| commit | 9429cdb0e7bd79d324e17a45c2f081bac9703b74 (patch) | |
| tree | c9e1922f8b5ff1f422bbce380c8e6e02b7635e6b /android | |
| parent | fa9f5a0d8fe897ce65a63cee4918fcf77442c761 (diff) | |
| download | mullvadvpn-9429cdb0e7bd79d324e17a45c2f081bac9703b74.tar.xz mullvadvpn-9429cdb0e7bd79d324e17a45c2f081bac9703b74.zip | |
Fix app crash on connect/disconnect
Diffstat (limited to 'android')
| -rw-r--r-- | android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ConnectionProxy.kt | 7 | ||||
| -rw-r--r-- | android/app/src/test/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxyTest.kt | 92 |
2 files changed, 96 insertions, 3 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ConnectionProxy.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ConnectionProxy.kt index 5b4b88ad94..fcd8565550 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ConnectionProxy.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ConnectionProxy.kt @@ -10,6 +10,7 @@ import net.mullvad.mullvadvpn.ipc.Event import net.mullvad.mullvadvpn.ipc.EventDispatcher import net.mullvad.mullvadvpn.ipc.Request import net.mullvad.mullvadvpn.model.TunnelState +import net.mullvad.mullvadvpn.util.trySendRequest import net.mullvad.talpid.tunnel.ActionAfterDisconnect import net.mullvad.talpid.util.EventNotifier @@ -34,19 +35,19 @@ class ConnectionProxy(private val connection: Messenger, eventDispatcher: EventD fun connect() { if (anticipateConnectingState()) { - connection.send(Request.Connect.message) + connection.trySendRequest(Request.Connect, true) } } fun disconnect() { if (anticipateReconnectingState()) { - connection.send(Request.Disconnect.message) + connection.trySendRequest(Request.Disconnect, true) } } fun reconnect() { if (anticipateDisconnectingState()) { - connection.send(Request.Reconnect.message) + connection.trySendRequest(Request.Reconnect, true) } } diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxyTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxyTest.kt new file mode 100644 index 0000000000..44ccdf013b --- /dev/null +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxyTest.kt @@ -0,0 +1,92 @@ +package net.mullvad.mullvadvpn.service + +import android.os.DeadObjectException +import android.os.Looper +import android.os.Messenger +import android.util.Log +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.mockk +import io.mockk.mockkObject +import io.mockk.mockkStatic +import io.mockk.slot +import io.mockk.unmockkAll +import kotlin.reflect.KClass +import kotlin.test.assertEquals +import net.mullvad.mullvadvpn.ipc.Event +import net.mullvad.mullvadvpn.ipc.EventDispatcher +import net.mullvad.mullvadvpn.ipc.Request +import net.mullvad.mullvadvpn.ui.serviceconnection.ConnectionProxy +import org.junit.After +import org.junit.Before +import org.junit.Test + +class ConnectionProxyTest { + + @MockK + private lateinit var mockedMainLooper: Looper + + @MockK + private lateinit var connection: Messenger + + @MockK + private lateinit var mockedDispatchingHandler: EventDispatcher + lateinit var connectionProxy: ConnectionProxy + + @Before + fun setup() { + mockkStatic(Looper::class) + mockkStatic(Log::class) + MockKAnnotations.init(this) + mockkObject(Request.Connect, Request.Disconnect) + every { Request.Connect.message } returns mockk() + every { Request.Disconnect.message } returns mockk() + every { Looper.getMainLooper() } returns mockedMainLooper + every { Log.e(any(), any()) } returns mockk(relaxed = true) + } + + @After + fun tearDown() { + unmockkAll() + } + + @Test + fun test_initialize_connection_proxy() { + // Arrange + val eventType = slot<KClass<Event.TunnelStateChange>>() + every { + mockedDispatchingHandler.registerHandler(capture(eventType), any()) + } just Runs + // Create ConnectionProxy instance and assert initial Event type + connectionProxy = ConnectionProxy(connection, mockedDispatchingHandler) + assertEquals(Event.TunnelStateChange::class, eventType.captured.java.kotlin) + } + + @Test + fun test_tunnel_normal_connect_disconnect() { + // Arrange + every { connection.send(any()) } just Runs + every { + mockedDispatchingHandler.registerHandler(any<KClass<Event>>(), any()) + } just Runs + // Act and Assert no crashes + connectionProxy = ConnectionProxy(connection, mockedDispatchingHandler) + connectionProxy.connect() + connectionProxy.disconnect() + } + + @Test + fun test_tunnel_handle_crash_on_connect() { + // Arrange + every { connection.send(any()) } throws DeadObjectException() + every { + mockedDispatchingHandler.registerHandler(any<KClass<Event>>(), any()) + } just Runs + // Act and Assert no crashes + connectionProxy = ConnectionProxy(connection, mockedDispatchingHandler) + connectionProxy.connect() + } +} |
