summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorsaber safavi <saber.safavi@codic.se>2022-12-05 13:11:07 +0100
committersaber safavi <saber.safavi@codic.se>2022-12-13 15:09:47 +0100
commit9429cdb0e7bd79d324e17a45c2f081bac9703b74 (patch)
treec9e1922f8b5ff1f422bbce380c8e6e02b7635e6b /android
parentfa9f5a0d8fe897ce65a63cee4918fcf77442c761 (diff)
downloadmullvadvpn-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.kt7
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxyTest.kt92
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()
+ }
+}