TOTPGeneratorTest.kt

1.3 KB · raw

1package com.peachpasswords.vault23import org.junit.Assert.assertEquals4import org.junit.Assert.assertNull5import org.junit.Test67class TOTPGeneratorTest {8    // RFC 6238 test secret "12345678901234567890" (ASCII) in base32.9    private val SECRET = "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ"1011    @Test fun rfc6238_vector_sha1_6digits() {12        // T = 59s -> counter 1 -> 8-digit 94287082 -> 6-digit 287082.13        assertEquals("287082", TOTPGenerator.generateCode(SECRET, nowMillis = 59_000L))14        // T = 1111111109s -> 8-digit 07081804 -> 6-digit 081804.15        assertEquals("081804", TOTPGenerator.generateCode(SECRET, nowMillis = 1_111_111_109_000L))16    }1718    @Test fun parses_otpauth_uri() {19        val uri = "otpauth://totp/Example:[email protected]?secret=$SECRET&issuer=Example&period=30"20        assertEquals("287082", TOTPGenerator.generateCode(uri, nowMillis = 59_000L))21    }2223    @Test fun remaining_and_progress_track_period() {24        // 10s into a period: 20s remaining, 1/3 elapsed.25        assertEquals(20, TOTPGenerator.remainingSeconds(10_000L))26        assertEquals(10f / 30f, TOTPGenerator.periodProgress(10_000L), 0.001f)27    }2829    @Test fun invalid_secret_returns_null() {30        assertNull(TOTPGenerator.generateCode("not!base32!"))31        assertNull(TOTPGenerator.generateCode(""))32    }33}