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 15 ico[18] = 22 16 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}