test(prefs): migrate DataStore tests from androidHostTest to commonTest (#5092)

This commit is contained in:
James Rich 2026-04-12 15:45:19 -05:00 committed by GitHub
parent a11dee42a7
commit 5c47256b3f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 47 additions and 28 deletions

View file

@ -24,7 +24,7 @@ kotlin {
android {
namespace = "org.meshtastic.core.prefs"
androidResources.enable = false
withHostTest { isIncludeAndroidResources = true }
withHostTest {}
}
sourceSets {

View file

@ -22,18 +22,22 @@ import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import okio.FileSystem
import okio.Path
import org.meshtastic.core.di.CoroutineDispatchers
import org.meshtastic.core.repository.FilterPrefs
import java.io.File
import kotlin.test.AfterTest
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertTrue
import kotlin.uuid.ExperimentalUuidApi
import kotlin.uuid.Uuid
@OptIn(ExperimentalUuidApi::class)
class FilterPrefsTest {
private lateinit var tmpFolder: File
private lateinit var tmpDir: Path
private lateinit var dataStore: DataStore<Preferences>
private lateinit var filterPrefs: FilterPrefs
@ -44,15 +48,12 @@ class FilterPrefsTest {
@BeforeTest
fun setup() {
tmpFolder =
File.createTempFile("filterPrefsTest", null).apply {
delete()
mkdirs()
}
tmpDir = FileSystem.SYSTEM_TEMPORARY_DIRECTORY / "filterPrefsTest-${Uuid.random()}"
FileSystem.SYSTEM.createDirectories(tmpDir)
dataStore =
PreferenceDataStoreFactory.create(
PreferenceDataStoreFactory.createWithPath(
scope = testScope,
produceFile = { File(tmpFolder, "test.preferences_pb").also { it.createNewFile() } },
produceFile = { tmpDir / "test.preferences_pb" },
)
dispatchers = CoroutineDispatchers(testDispatcher, testDispatcher, testDispatcher)
filterPrefs = FilterPrefsImpl(dataStore, dispatchers)
@ -60,7 +61,7 @@ class FilterPrefsTest {
@AfterTest
fun tearDown() {
tmpFolder.deleteRecursively()
FileSystem.SYSTEM.deleteRecursively(tmpDir)
}
@Test fun `filterEnabled defaults to false`() = testScope.runTest { assertFalse(filterPrefs.filterEnabled.value) }

View file

@ -22,17 +22,21 @@ import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import okio.FileSystem
import okio.Path
import org.meshtastic.core.di.CoroutineDispatchers
import org.meshtastic.core.repository.NotificationPrefs
import java.io.File
import kotlin.test.AfterTest
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertFalse
import kotlin.test.assertTrue
import kotlin.uuid.ExperimentalUuidApi
import kotlin.uuid.Uuid
@OptIn(ExperimentalUuidApi::class)
class NotificationPrefsTest {
private lateinit var tmpFolder: File
private lateinit var tmpDir: Path
private lateinit var dataStore: DataStore<Preferences>
private lateinit var notificationPrefs: NotificationPrefs
@ -43,15 +47,12 @@ class NotificationPrefsTest {
@BeforeTest
fun setup() {
tmpFolder =
File.createTempFile("notificationPrefsTest", null).apply {
delete()
mkdirs()
}
tmpDir = FileSystem.SYSTEM_TEMPORARY_DIRECTORY / "notificationPrefsTest-${Uuid.random()}"
FileSystem.SYSTEM.createDirectories(tmpDir)
dataStore =
PreferenceDataStoreFactory.create(
PreferenceDataStoreFactory.createWithPath(
scope = testScope,
produceFile = { File(tmpFolder, "test.preferences_pb").also { it.createNewFile() } },
produceFile = { tmpDir / "test.preferences_pb" },
)
dispatchers = CoroutineDispatchers(testDispatcher, testDispatcher, testDispatcher)
notificationPrefs = NotificationPrefsImpl(dataStore, dispatchers)
@ -59,7 +60,7 @@ class NotificationPrefsTest {
@AfterTest
fun tearDown() {
tmpFolder.deleteRecursively()
FileSystem.SYSTEM.deleteRecursively(tmpDir)
}
@Test

View file

@ -22,17 +22,21 @@ import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.rules.TemporaryFolder
import okio.FileSystem
import okio.Path
import org.meshtastic.core.di.CoroutineDispatchers
import org.meshtastic.core.repository.TakPrefs
import kotlin.test.AfterTest
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertFalse
import kotlin.test.assertTrue
import kotlin.uuid.ExperimentalUuidApi
import kotlin.uuid.Uuid
@OptIn(ExperimentalUuidApi::class)
class TakPrefsTest {
@get:Rule val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build()
private lateinit var tmpDir: Path
private lateinit var dataStore: DataStore<Preferences>
private lateinit var takPrefs: TakPrefs
@ -43,15 +47,22 @@ class TakPrefsTest {
@BeforeTest
fun setup() {
tmpDir = FileSystem.SYSTEM_TEMPORARY_DIRECTORY / "takPrefsTest-${Uuid.random()}"
FileSystem.SYSTEM.createDirectories(tmpDir)
dataStore =
PreferenceDataStoreFactory.create(
PreferenceDataStoreFactory.createWithPath(
scope = testScope,
produceFile = { tmpFolder.newFile("test.preferences_pb") },
produceFile = { tmpDir / "test.preferences_pb" },
)
dispatchers = CoroutineDispatchers(testDispatcher, testDispatcher, testDispatcher)
takPrefs = TakPrefsImpl(dataStore, dispatchers)
}
@AfterTest
fun tearDown() {
FileSystem.SYSTEM.deleteRecursively(tmpDir)
}
@Test
fun `isTakServerEnabled defaults to false`() = testScope.runTest { assertFalse(takPrefs.isTakServerEnabled.value) }

View file

@ -22,7 +22,10 @@ plugins {
kotlin {
@Suppress("UnstableApiUsage")
android { androidResources.enable = false }
android {
androidResources.enable = false
withHostTest {}
}
sourceSets {
commonMain.dependencies {

View file

@ -22,6 +22,7 @@ kotlin {
android {
namespace = "org.meshtastic.core.testing"
androidResources.enable = false
withHostTest {}
}
sourceSets {

View file

@ -181,10 +181,11 @@ Android uses `@Module`-annotated classes (`CoreDataModule`, `CoreBleAndroidModul
36 `commonTest` files exist but are concentrated in `core:domain` (22 files) and `core:data` (10 files). Limited or zero tests in:
- `core:service` (has `ServiceRepositoryImpl`, `DirectRadioControllerImpl`, `MeshServiceOrchestrator`)
- `core:network` (has `StreamFrameCodecTest` — 10 tests; `TcpTransport` untested)
- `core:prefs` (preference flows, default values)
- `core:ble` (connection state machine)
- `core:ui` (utility functions)
`core:prefs` now has 12 `commonTest` tests (3 files: `FilterPrefsTest`, `TakPrefsTest`, `NotificationPrefsTest`) migrated from `androidHostTest` using Okio + `PreferenceDataStoreFactory.createWithPath()` for KMP compatibility.
### D4. Desktop has 2 tests
`desktop/src/test/` contains `DesktopKoinTest.kt` and `DesktopTopLevelDestinationParityTest.kt`. Still needs:

View file

@ -24,6 +24,7 @@ kotlin {
android {
namespace = "org.meshtastic.feature.wifiprovision"
androidResources.enable = false
withHostTest {}
}
sourceSets {