diff --git a/app/core/src/main/java/com/topjohnwu/magisk/test/Environment.kt b/app/core/src/main/java/com/topjohnwu/magisk/test/Environment.kt index 599b17fb8..bb67d97a3 100644 --- a/app/core/src/main/java/com/topjohnwu/magisk/test/Environment.kt +++ b/app/core/src/main/java/com/topjohnwu/magisk/test/Environment.kt @@ -14,12 +14,15 @@ import com.topjohnwu.magisk.core.tasks.FlashZip import com.topjohnwu.magisk.core.tasks.MagiskInstaller import com.topjohnwu.superuser.CallbackList import kotlinx.coroutines.runBlocking +import org.apache.commons.compress.archivers.zip.ZipFile +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue -import org.junit.Assume.assumeTrue import org.junit.BeforeClass import org.junit.Test import org.junit.runner.RunWith import timber.log.Timber +import java.io.File @Keep @RunWith(AndroidJUnit4::class) @@ -33,6 +36,12 @@ class Environment : BaseTest { fun lsposed(): Boolean { return Build.VERSION.SDK_INT >= 27 && Build.VERSION.SDK_INT <= 34 } + + private fun shamiko(): Boolean { + return Build.VERSION.SDK_INT >= 27 + } + + private const val MODULE_ERROR = "Module zip processing incorrect" } object TimberLog : CallbackList(Runnable::run) { @@ -41,6 +50,28 @@ class Environment : BaseTest { } } + private fun checkModuleZip(file: File) { + // Make sure module processing is correct + ZipFile.Builder().setFile(file).get().use { zip -> + val meta = zip.entries + .asSequence() + .filter { it.name.startsWith("META-INF") } + .toMutableList() + assertEquals(MODULE_ERROR, 6, meta.size) + + val binary = zip.getInputStream( + zip.getEntry("META-INF/com/google/android/update-binary") + ).use { it.readBytes() } + val ref = appContext.assets.open("module_installer.sh").use { it.readBytes() } + assertArrayEquals(MODULE_ERROR, ref, binary) + + val script = zip.getInputStream( + zip.getEntry("META-INF/com/google/android/updater-script") + ).use { it.readBytes() } + assertArrayEquals(MODULE_ERROR, "#MAGISK\n".toByteArray(), script) + } + } + @Test fun setupEnvironment() { runBlocking { @@ -50,20 +81,36 @@ class Environment : BaseTest { ) } - if (lsposed()) { - val notify = object : DownloadNotifier { - override val context = appContext - override fun notifyUpdate(id: Int, editor: (Notification.Builder) -> Unit) {} + val notify = object : DownloadNotifier { + override val context = appContext + override fun notifyUpdate(id: Int, editor: (Notification.Builder) -> Unit) {} + } + val processor = DownloadProcessor(notify) + + val shamiko = appContext.cachedFile("shamiko.zip") + runBlocking { + testContext.assets.open("shamiko.zip").use { + processor.handleModule(it, shamiko.toUri()) } - val processor = DownloadProcessor(notify) - val zip = appContext.cachedFile("lsposed.zip") - runBlocking { - testContext.assets.open("lsposed.zip").use { - processor.handleModule(it, zip.toUri()) - } + checkModuleZip(shamiko) + if (shamiko()) { + assertTrue( + "Shamiko installation failed", + FlashZip(shamiko.toUri(), TimberLog, TimberLog).exec() + ) + } + } + + val lsp = appContext.cachedFile("lsposed.zip") + runBlocking { + testContext.assets.open("lsposed.zip").use { + processor.handleModule(it, lsp.toUri()) + } + checkModuleZip(lsp) + if (lsposed()) { assertTrue( "LSPosed installation failed", - FlashZip(zip.toUri(), TimberLog, TimberLog).exec() + FlashZip(lsp.toUri(), TimberLog, TimberLog).exec() ) } } diff --git a/buildSrc/src/main/java/Setup.kt b/buildSrc/src/main/java/Setup.kt index 54af3c211..ad013fc85 100644 --- a/buildSrc/src/main/java/Setup.kt +++ b/buildSrc/src/main/java/Setup.kt @@ -472,6 +472,11 @@ const val LSPOSED_DOWNLOAD_URL = const val LSPOSED_CHECKSUM = "0ebc6bcb465d1c4b44b7220ab5f0252e6b4eb7fe43da74650476d2798bb29622" +const val SHAMIKO_DOWNLOAD_URL = + "https://github.com/LSPosed/LSPosed.github.io/releases/download/shamiko-383/Shamiko-v1.2.1-383-release.zip" +const val SHAMIKO_CHECKSUM = + "93754a038c2d8f0e985bad45c7303b96f70a93d8335060e50146f028d3a9b13f" + fun Project.setupTestApk() { setupAppCommon() @@ -481,6 +486,9 @@ fun Project.setupTestApk() { from(downloadFile(LSPOSED_DOWNLOAD_URL, LSPOSED_CHECKSUM)) { rename { "lsposed.zip" } } + from(downloadFile(SHAMIKO_DOWNLOAD_URL, SHAMIKO_CHECKSUM)) { + rename { "shamiko.zip" } + } into("src/${this@all.name}/assets") } mergeAssetsProvider.configure { dependsOn(dlTask) }