1package com.peachpasswords.vault23import org.junit.Assert.assertEquals4import org.junit.Assert.assertTrue5import org.junit.Test67class VaultSlotRollbackTest {8 @Test fun triad_rollback_attempts_every_slot_after_a_failure() {9 val storage = RollbackStorage(failSlotA = true)10 val priorA = StoredVault(4, "salt", "a")11 val priorD = StoredVault(4, "salt", "d")1213 val failures = VaultSlotRollback(storage).restoreTriad(priorA, "b", priorD)1415 assertEquals(listOf("writeSlotA returned false"), failures)16 assertTrue(storage.slotBWritten)17 assertTrue(storage.decoyWritten)18 }1920 @Test fun absent_prior_vault_clears_partial_state() {21 val storage = RollbackStorage()2223 assertTrue(VaultSlotRollback(storage).restoreTriad(null, null, null).isEmpty())24 assertTrue(storage.cleared)25 }26}2728private class RollbackStorage(private val failSlotA: Boolean = false) : VaultStorage {29 var slotBWritten = false30 var decoyWritten = false31 var cleared = false32 override fun loadSlotA(): StoredVault? = null33 override fun hasVault() = false34 override fun writeSlotA(slot: StoredVault) = !failSlotA35 override fun writeSlotB(blobBase64: String): Boolean { slotBWritten = true; return true }36 override fun loadDecoySlot(): StoredVault? = null37 override fun writeDecoySlot(slot: StoredVault): Boolean { decoyWritten = true; return true }38 override fun hasDecoySlot() = false39 override fun clearDecoySlot() = Unit40 override fun version() = 0L41 override fun stampLocalMutation() = 0L42 override fun loadSettings() = VaultSettings()43 override fun writeSettings(settings: VaultSettings) = true44 override fun clearVault(): Boolean { cleared = true; return true }45}