AdoptVaultSafetyTest.kt

3.0 KB · raw

1package com.peachpasswords.ui.pairing23import com.peachpasswords.sync.DeviceRevocation4import com.peachpasswords.sync.PairedDevice5import org.junit.Assert.assertEquals6import org.junit.Assert.assertThrows7import org.junit.Test89class AdoptVaultSafetyTest {10    @Test fun same_vault_identity_may_repair_without_mutation() {11        val id = "ab".repeat(32)1213        assertEquals(id, requireSameVaultForPopulatedRePair(id, id))14    }1516    @Test fun different_populated_vaults_are_never_merged_by_pairing() {17        val error = assertThrows(IllegalStateException::class.java) {18            requireSameVaultForPopulatedRePair("ab".repeat(32), "cd".repeat(32))19        }2021        assertEquals("JOIN_POPULATED_VAULT_BLOCKED", error.message)22    }2324    @Test fun locked_populated_vault_cannot_be_repaired() {25        val error = assertThrows(IllegalStateException::class.java) {26            requireSameVaultForPopulatedRePair(null, "cd".repeat(32))27        }2829        assertEquals("vault_locked", error.message)30    }3132    @Test fun first_contact_is_blocked_even_when_human_visible_vault_matches() {33        val error = assertThrows(IllegalStateException::class.java) {34            requireKnownPeerForPopulatedRePair(35                sourceDeviceId = "new-source",36                sourcePublicKeyHex = "ab".repeat(32),37                pairedDevices = emptyList(),38                revocations = emptyList(),39            )40        }4142        assertEquals("JOIN_POPULATED_VAULT_BLOCKED", error.message)43    }4445    @Test fun exact_direct_peer_may_repair() {46        requireKnownPeerForPopulatedRePair(47            sourceDeviceId = "known-source",48            sourcePublicKeyHex = "ab".repeat(32),49            pairedDevices = listOf(50                PairedDevice(51                    deviceId = "known-source",52                    deviceName = "Extension",53                    deviceType = "extension",54                    longTermPublicKeyHex = "ab".repeat(32),55                    pairedAt = 1L,56                ),57            ),58            revocations = emptyList(),59        )60    }6162    @Test fun exact_revoked_peer_may_be_repaired_but_key_mismatch_is_blocked() {63        val revocation = DeviceRevocation(64            deviceId = "known-source",65            longTermPublicKeyHex = "ab".repeat(32),66            revokedAt = 2L,67            revokedByDeviceId = "android",68        )69        requireKnownPeerForPopulatedRePair(70            sourceDeviceId = "known-source",71            sourcePublicKeyHex = "ab".repeat(32),72            pairedDevices = emptyList(),73            revocations = listOf(revocation),74        )7576        val error = assertThrows(IllegalStateException::class.java) {77            requireKnownPeerForPopulatedRePair(78                sourceDeviceId = "known-source",79                sourcePublicKeyHex = "cd".repeat(32),80                pairedDevices = emptyList(),81                revocations = listOf(revocation),82            )83        }84        assertEquals("JOIN_POPULATED_VAULT_BLOCKED", error.message)85    }86}