FaviconsTest.kt

1.8 KB · raw

1package com.peachpasswords.ui.components23import java.io.File4import org.junit.Assert.assertArrayEquals5import org.junit.Assert.assertEquals6import org.junit.Assert.assertNull7import org.junit.Test89class FaviconsTest {1011    @Test fun unwraps_png_inside_ico_container() {12        val png = byteArrayOf(0x89.toByte(), 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 1, 2, 3)13        val ico = ByteArray(22 + png.size)14        ico[2] = 1 // ICO type15        ico[18] = 22 // data offset, little-endian16        png.copyInto(ico, 22)17        assertArrayEquals(png, decodeOrUnwrapIco(ico))18    }1920    @Test fun passes_non_ico_bytes_through_and_rejects_ico_without_png() {21        val png = byteArrayOf(0x89.toByte(), 0x50, 0x4E, 0x47, 1, 2, 3)22        assertArrayEquals(png, decodeOrUnwrapIco(png))2324        val icoBmp = ByteArray(22 + 4)25        icoBmp[2] = 126        icoBmp[18] = 2227        assertNull(decodeOrUnwrapIco(icoBmp))28    }2930    @Test fun canonical_cache_file_stays_inside_favicon_directory() {31        val dir = File("/tmp/peach-favicon-test")3233        assertEquals(34            File(dir, "example.com.png").canonicalPath,35            faviconCacheFile(dir, "EXAMPLE.com", ".png")?.path,36        )37        assertEquals(38            File(dir, "xn--bcher-kva.de.miss").canonicalPath,39            faviconCacheFile(dir, "bücher.de", ".miss")?.path,40        )41    }4243    @Test fun invalid_host_material_never_becomes_a_cache_path() {44        listOf(45            "../vault",46            "example.com/../../vault",47            "example.com\\..\\vault",48            "/absolute.example",49            "example.com?x=y",50            "[email protected]",51            "example.com:443",52            "localhost",53            "127.0.0.1",54            "exa\u0000mple.com",55            "evil.com.",56        ).forEach { assertNull(it, faviconCacheFile(File("/tmp/cache"), it, ".png")) }57    }58}