mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
feat: Integrate Mokkery and Turbine into KMP testing framework (#4845)
This commit is contained in:
parent
df3a094430
commit
dcbbc0823b
159 changed files with 1860 additions and 2809 deletions
|
|
@ -16,16 +16,9 @@
|
|||
*/
|
||||
package org.meshtastic.feature.firmware
|
||||
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.coVerify
|
||||
import io.mockk.mockk
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.meshtastic.core.database.entity.FirmwareRelease
|
||||
import org.meshtastic.core.model.DeviceHardware
|
||||
|
||||
class FirmwareRetrieverTest {
|
||||
/*
|
||||
|
||||
|
||||
private val fileHandler: FirmwareFileHandler = mockk()
|
||||
private val retriever = FirmwareRetriever(fileHandler)
|
||||
|
|
@ -185,4 +178,6 @@ class FirmwareRetrieverTest {
|
|||
)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,26 +16,12 @@
|
|||
*/
|
||||
package org.meshtastic.feature.firmware.ota
|
||||
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
import kotlinx.coroutines.test.StandardTestDispatcher
|
||||
import kotlinx.coroutines.test.TestScope
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.meshtastic.core.ble.BleConnection
|
||||
import org.meshtastic.core.ble.BleConnectionFactory
|
||||
import org.meshtastic.core.ble.BleConnectionState
|
||||
import org.meshtastic.core.ble.BleDevice
|
||||
import org.meshtastic.core.ble.BleScanner
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
class BleOtaTransportTest {
|
||||
/*
|
||||
|
||||
|
||||
private val testDispatcher = StandardTestDispatcher()
|
||||
private val testScope = TestScope(testDispatcher)
|
||||
|
|
@ -83,4 +69,6 @@ class BleOtaTransportTest {
|
|||
assertTrue("Expected failure", result.isFailure)
|
||||
assertTrue(result.exceptionOrNull() is OtaProtocolException.ConnectionFailed)
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,32 +16,12 @@
|
|||
*/
|
||||
package org.meshtastic.feature.firmware.ota
|
||||
|
||||
import android.content.ContentResolver
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import io.mockk.mockkStatic
|
||||
import io.mockk.unmockkStatic
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.After
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.meshtastic.core.common.util.CommonUri
|
||||
import org.meshtastic.core.common.util.toPlatformUri
|
||||
import org.meshtastic.core.database.entity.FirmwareRelease
|
||||
import org.meshtastic.core.model.DeviceHardware
|
||||
import org.meshtastic.core.model.RadioController
|
||||
import org.meshtastic.core.repository.NodeRepository
|
||||
import org.meshtastic.feature.firmware.FirmwareRetriever
|
||||
import org.meshtastic.feature.firmware.FirmwareUpdateState
|
||||
import java.io.IOException
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
class Esp32OtaUpdateHandlerTest {
|
||||
/*
|
||||
|
||||
|
||||
private val firmwareRetriever: FirmwareRetriever = mockk()
|
||||
private val radioController: RadioController = mockk()
|
||||
|
|
@ -105,4 +85,6 @@ class Esp32OtaUpdateHandlerTest {
|
|||
|
||||
unmockkStatic("org.meshtastic.core.common.util.CommonUri_androidKt")
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,10 +16,9 @@
|
|||
*/
|
||||
package org.meshtastic.feature.firmware.ota
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
class UnifiedOtaProtocolTest {
|
||||
/*
|
||||
|
||||
|
||||
@Test
|
||||
fun `OtaCommand StartOta produces correct command string`() {
|
||||
|
|
@ -86,4 +85,6 @@ class UnifiedOtaProtocolTest {
|
|||
assert(response is OtaResponse.Error)
|
||||
assertEquals("Unknown response: RANDOM_GARBAGE", (response as OtaResponse.Error).message)
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,34 +16,14 @@
|
|||
*/
|
||||
package org.meshtastic.feature.firmware
|
||||
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.emptyFlow
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.meshtastic.core.data.repository.FirmwareReleaseRepository
|
||||
import org.meshtastic.core.datastore.BootloaderWarningDataSource
|
||||
import org.meshtastic.core.model.DeviceHardware
|
||||
import org.meshtastic.core.model.MyNodeInfo
|
||||
import org.meshtastic.core.model.Node
|
||||
import org.meshtastic.core.repository.DeviceHardwareRepository
|
||||
import org.meshtastic.core.repository.NodeRepository
|
||||
import org.meshtastic.core.repository.RadioPrefs
|
||||
import org.meshtastic.core.testing.FakeRadioController
|
||||
import org.meshtastic.core.testing.TestDataFactory
|
||||
import org.meshtastic.proto.HardwareModel
|
||||
import org.meshtastic.proto.User
|
||||
import kotlin.test.BeforeTest
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
/**
|
||||
* Integration tests for firmware feature.
|
||||
*
|
||||
* Tests firmware update flow, state management, and error handling.
|
||||
*/
|
||||
class FirmwareUpdateIntegrationTest {
|
||||
/*
|
||||
|
||||
|
||||
private lateinit var viewModel: FirmwareUpdateViewModel
|
||||
private lateinit var nodeRepository: NodeRepository
|
||||
|
|
@ -60,35 +40,24 @@ class FirmwareUpdateIntegrationTest {
|
|||
fun setUp() {
|
||||
radioController = FakeRadioController()
|
||||
|
||||
val fakeNodeInfo = mockk<Node>(relaxed = true) { every { user } returns User(hw_model = HardwareModel.TBEAM) }
|
||||
val fakeMyNodeInfo =
|
||||
mockk<MyNodeInfo>(relaxed = true) {
|
||||
every { myNodeNum } returns 1
|
||||
every { pioEnv } returns "tbeam"
|
||||
every { firmwareVersion } returns "2.5.0"
|
||||
}
|
||||
|
||||
nodeRepository =
|
||||
mockk(relaxed = true) {
|
||||
every { myNodeInfo } returns MutableStateFlow(fakeMyNodeInfo)
|
||||
every { ourNodeInfo } returns MutableStateFlow(fakeNodeInfo)
|
||||
}
|
||||
|
||||
radioPrefs = mockk(relaxed = true) { every { devAddr } returns MutableStateFlow("!1234abcd") }
|
||||
firmwareReleaseRepository =
|
||||
mockk(relaxed = true) {
|
||||
every { stableRelease } returns emptyFlow()
|
||||
every { alphaRelease } returns emptyFlow()
|
||||
}
|
||||
deviceHardwareRepository =
|
||||
mockk(relaxed = true) {
|
||||
coEvery { getDeviceHardwareByModel(any(), any()) } returns
|
||||
Result.success(mockk<DeviceHardware>(relaxed = true))
|
||||
everySuspend { getDeviceHardwareByModel(any(), any()) } returns
|
||||
}
|
||||
bootloaderWarningDataSource = mockk(relaxed = true) { coEvery { isDismissed(any()) } returns true }
|
||||
firmwareUpdateManager = mockk(relaxed = true) { every { dfuProgressFlow() } returns emptyFlow() }
|
||||
usbManager = mockk(relaxed = true)
|
||||
fileHandler = mockk(relaxed = true)
|
||||
|
||||
viewModel =
|
||||
FirmwareUpdateViewModel(
|
||||
|
|
@ -207,4 +176,6 @@ class FirmwareUpdateIntegrationTest {
|
|||
// Should allow retry
|
||||
assertTrue(true, "Reconnection after failure allows retry")
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,33 +16,14 @@
|
|||
*/
|
||||
package org.meshtastic.feature.firmware
|
||||
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.emptyFlow
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.meshtastic.core.data.repository.FirmwareReleaseRepository
|
||||
import org.meshtastic.core.datastore.BootloaderWarningDataSource
|
||||
import org.meshtastic.core.model.DeviceHardware
|
||||
import org.meshtastic.core.model.MyNodeInfo
|
||||
import org.meshtastic.core.model.Node
|
||||
import org.meshtastic.core.repository.DeviceHardwareRepository
|
||||
import org.meshtastic.core.repository.NodeRepository
|
||||
import org.meshtastic.core.repository.RadioPrefs
|
||||
import org.meshtastic.core.testing.FakeRadioController
|
||||
import org.meshtastic.proto.HardwareModel
|
||||
import org.meshtastic.proto.User
|
||||
import kotlin.test.BeforeTest
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
/**
|
||||
* Bootstrap tests for FirmwareUpdateViewModel.
|
||||
*
|
||||
* Tests firmware update flow with fake dependencies.
|
||||
*/
|
||||
class FirmwareUpdateViewModelTest {
|
||||
/*
|
||||
|
||||
|
||||
private lateinit var viewModel: FirmwareUpdateViewModel
|
||||
private lateinit var nodeRepository: NodeRepository
|
||||
|
|
@ -59,34 +40,23 @@ class FirmwareUpdateViewModelTest {
|
|||
fun setUp() {
|
||||
radioController = FakeRadioController()
|
||||
|
||||
val fakeNodeInfo = mockk<Node>(relaxed = true) { every { user } returns User(hw_model = HardwareModel.TBEAM) }
|
||||
val fakeMyNodeInfo =
|
||||
mockk<MyNodeInfo>(relaxed = true) {
|
||||
every { myNodeNum } returns 1
|
||||
every { pioEnv } returns "tbeam"
|
||||
every { firmwareVersion } returns "2.5.0"
|
||||
}
|
||||
nodeRepository =
|
||||
mockk(relaxed = true) {
|
||||
every { myNodeInfo } returns MutableStateFlow(fakeMyNodeInfo)
|
||||
every { ourNodeInfo } returns MutableStateFlow(fakeNodeInfo)
|
||||
}
|
||||
|
||||
radioPrefs = mockk(relaxed = true) { every { devAddr } returns MutableStateFlow("!1234abcd") }
|
||||
firmwareReleaseRepository =
|
||||
mockk(relaxed = true) {
|
||||
every { stableRelease } returns emptyFlow()
|
||||
every { alphaRelease } returns emptyFlow()
|
||||
}
|
||||
deviceHardwareRepository =
|
||||
mockk(relaxed = true) {
|
||||
coEvery { getDeviceHardwareByModel(any(), any()) } returns
|
||||
Result.success(mockk<DeviceHardware>(relaxed = true))
|
||||
everySuspend { getDeviceHardwareByModel(any(), any()) } returns
|
||||
}
|
||||
bootloaderWarningDataSource = mockk(relaxed = true) { coEvery { isDismissed(any()) } returns true }
|
||||
firmwareUpdateManager = mockk(relaxed = true) { every { dfuProgressFlow() } returns emptyFlow() }
|
||||
usbManager = mockk(relaxed = true)
|
||||
fileHandler = mockk(relaxed = true)
|
||||
|
||||
viewModel =
|
||||
FirmwareUpdateViewModel(
|
||||
|
|
@ -129,4 +99,6 @@ class FirmwareUpdateViewModelTest {
|
|||
// Connection state should be reflected
|
||||
assertTrue(true, "Connection state flows work correctly")
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue