package com.peachpasswords.vault import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test class VaultSlotRollbackTest { @Test fun triad_rollback_attempts_every_slot_after_a_failure() { val storage = RollbackStorage(failSlotA = true) val priorA = StoredVault(4, "salt", "a") val priorD = StoredVault(4, "salt", "d") val failures = VaultSlotRollback(storage).restoreTriad(priorA, "b", priorD) assertEquals(listOf("writeSlotA returned false"), failures) assertTrue(storage.slotBWritten) assertTrue(storage.decoyWritten) } @Test fun absent_prior_vault_clears_partial_state() { val storage = RollbackStorage() assertTrue(VaultSlotRollback(storage).restoreTriad(null, null, null).isEmpty()) assertTrue(storage.cleared) } } private class RollbackStorage(private val failSlotA: Boolean = false) : VaultStorage { var slotBWritten = false var decoyWritten = false var cleared = false override fun loadSlotA(): StoredVault? = null override fun hasVault() = false override fun writeSlotA(slot: StoredVault) = !failSlotA override fun writeSlotB(blobBase64: String): Boolean { slotBWritten = true; return true } override fun loadDecoySlot(): StoredVault? = null override fun writeDecoySlot(slot: StoredVault): Boolean { decoyWritten = true; return true } override fun hasDecoySlot() = false override fun clearDecoySlot() = Unit override fun version() = 0L override fun stampLocalMutation() = 0L override fun loadSettings() = VaultSettings() override fun writeSettings(settings: VaultSettings) = true override fun clearVault(): Boolean { cleared = true; return true } }