revanced-patches-tasker/src/test/kotlin/app/revanced/patches/SignatureChecker.kt

49 lines
2 KiB
Kotlin

package app.revanced.patches
import app.revanced.patcher.Patcher
import app.revanced.patcher.signature.MethodSignature
import app.revanced.patcher.signature.PatternScanMethod
import org.junit.Test
import java.io.File
internal class SignatureChecker {
@Test
fun checkSignatures() {
val file = File("stock.apk")
if (!file.exists()) {
throw IllegalStateException("Missing stock.apk! To run this test, please place stock.apk here: ${file.absolutePath}")
}
val patcher = Patcher(file)
patcher.addPatches(Index.patches.map { it() })
val unresolved = mutableListOf<MethodSignature>()
for (signature in patcher.resolveSignatures()) {
if (!signature.resolved) {
unresolved.add(signature)
continue
}
val patternScanMethod = signature.metadata.patternScanMethod
if (patternScanMethod is PatternScanMethod.Fuzzy) {
val warnings = patternScanMethod.warnings!!
println("Signature ${signature.metadata.name} had ${warnings.size} warnings!")
for (warning in warnings) {
val instructions = signature.result!!.method.implementation!!.instructions
for (i in warning.expectedIndex - 5 until warning.expectedIndex) {
println(instructions[i].opcode)
}
println(warning.toString())
for (i in warning.expectedIndex - 5 .. warning.expectedIndex + 1) {
println(instructions[i].opcode)
}
}
}
}
if (unresolved.isNotEmpty()) {
val base = Exception("${unresolved.size} signatures were not resolved.")
for (signature in unresolved) {
base.addSuppressed(Exception("Signature ${signature.metadata.name} was not resolved!"))
}
throw base
}
}
}