perf(extensions): validate JSON without allocating argument trees

This commit is contained in:
zarzet
2026-09-17 18:07:22 +07:00
parent 91ef538c87
commit 2c4e391643
3 changed files with 268 additions and 4 deletions
@@ -0,0 +1,28 @@
package com.zarz.spotiflac
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.spotiflac.backend.JsExtension
import com.spotiflac.backend.JsExtensionException
import org.json.JSONObject
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ExtensionInputValidationTest {
@Test
fun invalidArgumentsDoNotReachJavaScriptAndValidObjectsKeepTheirValues() {
val source = "let calls=0; registerExtension({echo(value){return {calls:++calls,value}}});"
JsExtension(source, "{}", 2000uL).use { runtime ->
for (input in listOf("{}", "[1e400]", "[\"\\uD800\"]", "[] true")) {
val failure = runCatching { runtime.call("echo", input, null, 2000uL) }.exceptionOrNull()
assertTrue(failure is JsExtensionException.InvalidInput)
}
val result = JSONObject(runtime.call("echo", "[{\"title\":\"音楽 🎵\",\"options\":[true,null,42]}]", null, 2000uL))
assertEquals(1, result.getInt("calls"))
assertEquals("音楽 🎵", result.getJSONObject("value").getString("title"))
assertEquals(42, result.getJSONObject("value").getJSONArray("options").getInt(2))
}
}
}