Skip to content

Commit 6ba7053

Browse files
committed
fix: keep trezor forget cleanup
1 parent 0c1890c commit 6ba7053

2 files changed

Lines changed: 58 additions & 4 deletions

File tree

app/src/main/java/to/bitkit/repositories/TrezorRepo.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -462,16 +462,21 @@ class TrezorRepo @Inject constructor(
462462
suspend fun forgetDevice(deviceId: String): Result<Unit> = withContext(ioDispatcher) {
463463
runCatching {
464464
TrezorDebugLog.log("FORGET", "forgetDevice called for: $deviceId")
465-
if (_state.value.connectedDeviceId == deviceId) {
466-
trezorService.disconnect()
467-
_state.update { it.copy(connectedDevice = null, connectedDeviceId = null) }
465+
val disconnectResult = if (_state.value.connectedDeviceId == deviceId) {
466+
runCatching { trezorService.disconnect() }.also {
467+
_state.update { it.copy(connectedDevice = null, connectedDeviceId = null) }
468+
}
469+
} else {
470+
Result.success(Unit)
468471
}
469472
TrezorDebugLog.log("FORGET", "Clearing credentials...")
470473
trezorTransport.clearDeviceCredential(deviceId)
471-
trezorService.clearCredentials(deviceId)
474+
val clearCredentialsResult = runCatching { trezorService.clearCredentials(deviceId) }
472475
val updated = _state.value.knownDevices.filter { it.id != deviceId }
473476
saveKnownDevices(updated)
474477
_state.update { it.copy(knownDevices = updated.toImmutableList()) }
478+
disconnectResult.getOrThrow()
479+
clearCredentialsResult.getOrThrow()
475480
TrezorDebugLog.log("FORGET", "Device forgotten successfully")
476481
Logger.info("Forgot device: '$deviceId'", context = TAG)
477482
}.onFailure { e ->

app/src/test/java/to/bitkit/repositories/TrezorRepoTest.kt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import org.junit.rules.TemporaryFolder
1717
import org.mockito.kotlin.any
1818
import org.mockito.kotlin.anyOrNull
1919
import org.mockito.kotlin.mock
20+
import org.mockito.kotlin.verify
2021
import org.mockito.kotlin.whenever
2122
import to.bitkit.data.TrezorStore
2223
import to.bitkit.env.Env
@@ -102,6 +103,22 @@ class TrezorRepoTest : BaseUnitTest() {
102103
on { this.model }.thenReturn(model)
103104
}
104105

106+
private fun mockKnownDevice(
107+
id: String = DEVICE_ID,
108+
name: String? = DEVICE_NAME,
109+
path: String = DEVICE_PATH,
110+
label: String? = DEVICE_LABEL,
111+
model: String? = DEVICE_MODEL,
112+
) = KnownDevice(
113+
id = id,
114+
name = name,
115+
path = path,
116+
transportType = "usb",
117+
label = label,
118+
model = model,
119+
lastConnectedAt = 123L,
120+
)
121+
105122
// region initialize
106123

107124
@Test
@@ -425,6 +442,38 @@ class TrezorRepoTest : BaseUnitTest() {
425442

426443
// endregion
427444

445+
// region forgetDevice
446+
447+
@Test
448+
fun `forgetDevice should remove known device when service cleanup fails`() = test {
449+
val knownDevice = mockKnownDevice()
450+
val features = mockFeatures()
451+
val device = mockDeviceInfo()
452+
whenever(trezorStore.loadKnownDevices()).thenReturn(listOf(knownDevice))
453+
whenever(trezorService.connect(DEVICE_ID)).thenReturn(features)
454+
whenever(trezorService.scan()).thenReturn(listOf(device))
455+
sut = createSut()
456+
457+
sut.initialize()
458+
sut.scan()
459+
sut.connect(DEVICE_ID)
460+
whenever(trezorService.disconnect()).thenThrow(RuntimeException("disconnect failed"))
461+
whenever(trezorService.clearCredentials(DEVICE_ID)).thenThrow(RuntimeException("clear failed"))
462+
463+
val result = sut.forgetDevice(DEVICE_ID)
464+
465+
assertTrue(result.isFailure)
466+
assertTrue(sut.state.value.knownDevices.isEmpty())
467+
assertNull(sut.state.value.connectedDevice)
468+
assertNull(sut.state.value.connectedDeviceId)
469+
assertEquals("disconnect failed", sut.state.value.error)
470+
verify(trezorTransport).clearDeviceCredential(DEVICE_ID)
471+
verify(trezorService).clearCredentials(DEVICE_ID)
472+
verify(trezorStore).saveKnownDevices(emptyList())
473+
}
474+
475+
// endregion
476+
428477
// region initial state
429478

430479
@Test

0 commit comments

Comments
 (0)