197 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Kotlin
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Kotlin
		
	
	
	
	
	
| import kotlinx.serialization.ExperimentalSerializationApi
 | |
| import kotlinx.serialization.json.Json
 | |
| import moe.rosa.planterette.hakurei.*
 | |
| import org.junit.jupiter.api.assertDoesNotThrow
 | |
| import kotlin.test.Test
 | |
| import kotlin.test.assertEquals
 | |
| import kotlin.test.assertFailsWith
 | |
| import kotlin.test.assertIs
 | |
| 
 | |
| class HakureiTest {
 | |
|     companion object {
 | |
|         val TEMPLATE_DATA = HakureiConfig(
 | |
|             id = "org.chromium.Chromium",
 | |
|             path = AbsolutePath("/run/current-system/sw/bin/chromium"),
 | |
|             args = listOf(
 | |
|                 "chromium",
 | |
|                 "--ignore-gpu-blocklist",
 | |
|                 "--disable-smooth-scrolling",
 | |
|                 "--enable-features=UseOzonePlatform",
 | |
|                 "--ozone-platform=wayland"
 | |
|             ),
 | |
|             enablements = Enablements(
 | |
|                 wayland = true,
 | |
|                 dbus = true,
 | |
|                 pulse = true
 | |
|             ),
 | |
|             sessionBus = DBusConfig(
 | |
|                 see = null,
 | |
|                 talk = listOf(
 | |
|                     "org.freedesktop.Notifications",
 | |
|                     "org.freedesktop.FileManager1",
 | |
|                     "org.freedesktop.ScreenSaver",
 | |
|                     "org.freedesktop.secrets",
 | |
|                     "org.kde.kwalletd5",
 | |
|                     "org.kde.kwalletd6",
 | |
|                     "org.gnome.SessionManager"
 | |
|                 ),
 | |
|                 own = listOf(
 | |
|                     "org.chromium.Chromium.*",
 | |
|                     "org.mpris.MediaPlayer2.org.chromium.Chromium.*",
 | |
|                     "org.mpris.MediaPlayer2.chromium.*"
 | |
|                 ),
 | |
|                 call = mapOf(
 | |
|                     "org.freedesktop.portal.*" to "*"
 | |
|                 ),
 | |
|                 broadcast = mapOf(
 | |
|                     "org.freedesktop.portal.*" to "@/org/freedesktop/portal/*"
 | |
|                 ),
 | |
|                 filter = true
 | |
|             ),
 | |
|             systemBus = DBusConfig(
 | |
|                 see = null,
 | |
|                 talk = listOf(
 | |
|                     "org.bluez",
 | |
|                     "org.freedesktop.Avahi",
 | |
|                     "org.freedesktop.UPower"
 | |
|                 ),
 | |
|                 own = null,
 | |
|                 call = null,
 | |
|                 broadcast = null,
 | |
|                 filter = true
 | |
|             ),
 | |
|             username = "chronos",
 | |
|             shell = AbsolutePath("/run/current-system/sw/bin/zsh"),
 | |
|             home = AbsolutePath("/data/data/org.chromium.Chromium"),
 | |
|             extraPerms = listOf(
 | |
|                 ExtraPermsConfig(
 | |
|                     ensure = true,
 | |
|                     path = AbsolutePath("/var/lib/hakurei/u0"),
 | |
|                     read = null,
 | |
|                     write = null,
 | |
|                     execute = true,
 | |
|                 ),
 | |
|                 ExtraPermsConfig(
 | |
|                     ensure = null,
 | |
|                     path = AbsolutePath("/var/lib/hakurei/u0/org.chromium.Chromium"),
 | |
|                     read = true,
 | |
|                     write = true,
 | |
|                     execute = true,
 | |
|                 ),
 | |
|             ),
 | |
|             identity = 9,
 | |
|             groups = listOf(
 | |
|                 "video",
 | |
|                 "dialout",
 | |
|                 "plugdev"
 | |
|             ),
 | |
|             container = ContainerConfig(
 | |
|                 hostname = "localhost",
 | |
|                 waitDelay = -1,
 | |
|                 seccompCompat = true,
 | |
|                 devel = true,
 | |
|                 userns = true,
 | |
|                 hostNet = true,
 | |
|                 hostAbstract = true,
 | |
|                 tty = true,
 | |
|                 multiarch = true,
 | |
|                 env = mapOf(
 | |
|                     "GOOGLE_API_KEY" to "AIzaSyBHDrl33hwRp4rMQY0ziRbj8K9LPA6vUCY",
 | |
|                     "GOOGLE_DEFAULT_CLIENT_ID" to "77185425430.apps.googleusercontent.com",
 | |
|                     "GOOGLE_DEFAULT_CLIENT_SECRET" to "OTJgUOQcT7lO7GsGZq2G4IlT"
 | |
|                 ),
 | |
|                 mapRealUid = true,
 | |
|                 device = true,
 | |
|                 filesystem = listOf(
 | |
|                     FSBind(
 | |
|                         target = AbsolutePath("/"),
 | |
|                         source = AbsolutePath("/var/lib/hakurei/base/org.debian"),
 | |
|                         write = true,
 | |
|                         special = true,
 | |
|                     ),
 | |
|                     FSBind(
 | |
|                         target = AbsolutePath("/etc/"),
 | |
|                         source = AbsolutePath("/etc/"),
 | |
|                         special = true,
 | |
|                     ),
 | |
|                     FSEphemeral(
 | |
|                         target = AbsolutePath("/tmp/"),
 | |
|                         write = true,
 | |
|                         perm = 493
 | |
|                     ),
 | |
|                     FSOverlay(
 | |
|                         target = AbsolutePath("/nix/store"),
 | |
|                         lower = listOf(
 | |
|                             AbsolutePath("/mnt-root/nix/.ro-store")
 | |
|                         ),
 | |
|                         upper = AbsolutePath("/mnt-root/nix/.rw-store/upper"),
 | |
|                         work = AbsolutePath("/mnt-root/nix/.rw-store/work")
 | |
|                     ),
 | |
|                     FSBind(
 | |
|                         source = AbsolutePath("/nix/store")
 | |
|                     ),
 | |
|                     FSLink(
 | |
|                         target = AbsolutePath("/run/current-system"),
 | |
|                         linkname = "/run/current-system",
 | |
|                         dereference = true
 | |
|                     ),
 | |
|                     FSLink(
 | |
|                         target = AbsolutePath("/run/opengl-driver"),
 | |
|                         linkname = "/run/opengl-driver",
 | |
|                         dereference = true
 | |
|                     ),
 | |
|                     FSBind(
 | |
|                         target = AbsolutePath("/data/data/org.chromium.Chromium"),
 | |
|                         source = AbsolutePath("/var/lib/hakurei/u0/org.chromium.Chromium"),
 | |
|                         write = true,
 | |
|                         ensure = true,
 | |
|                     ),
 | |
|                     FSBind(
 | |
|                         source = AbsolutePath("/dev/dri"),
 | |
|                         device = true,
 | |
|                         optional = true
 | |
|                     )
 | |
|                 )
 | |
|             )
 | |
|         )
 | |
|         val TEMPLATE_JSON = ProcessBuilder("hakurei", "template")
 | |
|             .start()
 | |
|             .inputStream
 | |
|             .readAllBytes()
 | |
|             .toString(Charsets.UTF_8)
 | |
|         val format = Json {
 | |
|             prettyPrint = true
 | |
|             ignoreUnknownKeys = true
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @OptIn(ExperimentalSerializationApi::class)
 | |
|     @Test
 | |
|     fun deserializeTest() {
 | |
| 
 | |
|         println(TEMPLATE_JSON)
 | |
|         val want = format.decodeFromString<HakureiConfig>(TEMPLATE_JSON)
 | |
|         assertEquals(TEMPLATE_DATA, want)
 | |
|     }
 | |
|     @OptIn(ExperimentalSerializationApi::class)
 | |
|     @Test
 | |
|     fun serializeTest() {
 | |
|         val encoded = format.encodeToString(TEMPLATE_DATA)
 | |
|         val decoded = format.decodeFromString<HakureiConfig>(encoded)
 | |
|         assertEquals(TEMPLATE_DATA, decoded)
 | |
|     }
 | |
|     @Test
 | |
|     fun absolutePathTest() {
 | |
|         assertDoesNotThrow {
 | |
|             AbsolutePath("/test/absolutepath")
 | |
|         }
 | |
|         assertFailsWith(AbsolutePathException::class) {
 | |
|             AbsolutePath("./../../../../")
 | |
|         }
 | |
|         assertEquals(AbsolutePath("/test/absolutepath"), AbsolutePath("/test/") + "absolutepath")
 | |
|     }
 | |
|     @Test
 | |
|     fun extraPermsTest() {
 | |
|         assertIs<String>(TEMPLATE_DATA.extraPerms.toString())
 | |
|     }
 | |
| } |