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}