mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
Part A — runBlocking → runTest - Migrated all 5 runBlocking sites in core/database MigrationTest (@Before + 4 @Test bodies) to kotlinx.coroutines.test.runTest so test dispatchers are virtual-time aware and cancellation semantics match the rest of the suite. - Left DatabaseManagerLegacyCleanupTest on runBlocking: it polls with delay(100) for async cleanup that runs on Dispatchers.IO. runTest's virtual-time delay would collapse instantly and race the real IO cleanup, so runBlocking is the correct choice there. Part B — missing repository fakes Added five in-memory fakes in core:testing (pure Kotlin, MutableStateFlow backed) that implement their repository interface exactly: - FakeDeviceHardwareRepository (DeviceHardwareRepository) - FakeFirmwareReleaseRepository (FirmwareReleaseRepository) - FakeQuickChatActionRepository (QuickChatActionRepository) - FakeTracerouteSnapshotRepository (TracerouteSnapshotRepository) - FakeRadioConfigRepository (RadioConfigRepository) Each fake is exercised by a new test in core/testing/src/commonTest/kotlin/.../RepositoryFakesTest.kt: upsert/delete/reorder flows for quick-chat, seeded lookups + call-recording for device hardware, stable/alpha emission for firmware releases, snapshot round-trips for traceroute, and channel-set mutations for radio config. PacketRepository was skipped — 40+ members and a FakePacketRepository helper already exists for informal use; left for a focused follow-up. Validation (all green): ./gradlew spotlessApply spotlessCheck ./gradlew :core:testing:jvmTest :core:database:testAndroid ./gradlew detekt kmpSmokeCompile Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|---|---|---|
| .. | ||
| schemas/org.meshtastic.core.database.MeshtasticDatabase | ||
| src | ||
| build.gradle.kts | ||
| detekt-baseline.xml | ||
| README.md | ||
:core:database
This module provides the local Room database persistence layer for the application using Room Kotlin Multiplatform (KMP).
Key Components
MeshtasticDatabase: The main Room database class, defined incommonMain.- DAOs (Data Access Objects):
NodeInfoDao: Manages storage and retrieval of node information (NodeEntity). Contains critical logic for handling Public Key Conflict (PKC) resolution and preventing identity wiping attacks.PacketDao: Handles storage of mesh packets, including text messages, waypoints, and reactions.
- Entities:
NodeEntity: Represents a node on the mesh.Packet: Represents a stored packet.ReactionEntity: Represents emoji reactions to packets.
Security Considerations
Public Key Conflict (PKC) Handling
The NodeInfoDao implements specific logic to protect against impersonation and "wipe" attacks:
- Wipe Protection: Receiving an
is_licensed=truepacket (which normally clears the public key for compliance) will not clear an existing valid public key if one is already known. This prevents attackers from sending fake licensed packets to wipe keys from the DB. - Conflict Detection: If a new key arrives for an existing node ID that conflicts with a known valid key, the key is set to
ERROR_BYTE_STRINGto flag the potential impersonation.
Module dependency graph
graph TB
:core:database[database]:::kmp-library
classDef android-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-application-compose fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef compose-desktop-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
classDef android-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef android-library fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-library-compose fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
classDef android-test fill:#A0C4FF,stroke:#000,stroke-width:2px,color:#000;
classDef jvm-library fill:#BDB2FF,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library-compose fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef kmp-library fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
classDef unknown fill:#FFADAD,stroke:#000,stroke-width:2px,color:#000;