diff --git a/app/core/src/main/java/com/topjohnwu/magisk/test/AdditionalTest.kt b/app/core/src/main/java/com/topjohnwu/magisk/test/AdditionalTest.kt index d2c85f15c..46c378799 100644 --- a/app/core/src/main/java/com/topjohnwu/magisk/test/AdditionalTest.kt +++ b/app/core/src/main/java/com/topjohnwu/magisk/test/AdditionalTest.kt @@ -7,6 +7,11 @@ import androidx.test.uiautomator.By import androidx.test.uiautomator.Until import com.topjohnwu.magisk.core.model.module.LocalModule import com.topjohnwu.magisk.core.utils.RootUtils +import com.topjohnwu.magisk.test.Environment.Companion.EMPTY_ZYGISK +import com.topjohnwu.magisk.test.Environment.Companion.INVALID_ZYGISK +import com.topjohnwu.magisk.test.Environment.Companion.MOUNT_TEST +import com.topjohnwu.magisk.test.Environment.Companion.REMOVE_TEST +import com.topjohnwu.magisk.test.Environment.Companion.SEPOLICY_RULE import com.topjohnwu.superuser.Shell import kotlinx.coroutines.runBlocking import org.junit.After @@ -50,8 +55,9 @@ class AdditionalTest : BaseTest { @Test fun testModuleCount() { - var expected = 0 - if (Environment.testModules()) expected +=2 + var expected = 2 + if (Environment.mount()) expected++ + if (Environment.preinit()) expected++ if (Environment.lsposed()) expected++ if (Environment.shamiko()) expected++ assertEquals("Module count incorrect", expected, modules.size) @@ -79,11 +85,10 @@ class AdditionalTest : BaseTest { } @Test - fun testModule01() { - assumeTrue(Environment.testModules()) + fun testModuleMount() { + assumeTrue(Environment.mount()) - val module = modules.find { it.id == "test_01" } - assertNotNull("test_01 is not installed", module) + assertNotNull("$MOUNT_TEST is not installed", modules.find { it.id == MOUNT_TEST }) assertTrue( "/system/etc/newfile should exist", RootUtils.fs.getFile("/system/etc/newfile").exists() @@ -97,28 +102,37 @@ class AdditionalTest : BaseTest { "/system/app/EasterEgg should be empty", egg.isEmpty() ) + } + + @Test + fun testSepolicyRule() { + assumeTrue(Environment.preinit()) + + assertNotNull("$SEPOLICY_RULE is not installed", modules.find { it.id == SEPOLICY_RULE }) assertTrue( "Module sepolicy.rule is not applied", Shell.cmd("magiskpolicy --print-rules | grep -q magisk_test").exec().isSuccess ) - module!! - assertTrue("test_01 should be zygisk unloaded", module.zygiskUnloaded) } @Test - fun testModule02() { - assumeTrue(Environment.testModules()) - - val module = modules.find { it.id == "test_02" } - assertNotNull("test_02 is not installed", module) + fun testEmptyZygiskModule() { + val module = modules.find { it.id == EMPTY_ZYGISK } + assertNotNull("$EMPTY_ZYGISK is not installed", module) module!! - assertTrue("test_02 should be zygisk unloaded", module.zygiskUnloaded) + assertTrue("$EMPTY_ZYGISK should be zygisk unloaded", module.zygiskUnloaded) } @Test - fun testModule03() { - assumeTrue(Environment.testModules()) + fun testInvalidZygiskModule() { + val module = modules.find { it.id == INVALID_ZYGISK } + assertNotNull("$INVALID_ZYGISK is not installed", module) + module!! + assertTrue("$INVALID_ZYGISK should be zygisk unloaded", module.zygiskUnloaded) + } - assertNull("test_03 should be removed", modules.find { it.id == "test_03" }) + @Test + fun testRemoveModule() { + assertNull("$REMOVE_TEST should be removed", modules.find { it.id == REMOVE_TEST }) } } 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 90b0e16b3..d279c6034 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 @@ -40,11 +40,16 @@ class Environment : BaseTest { fun before() = BaseTest.prerequisite() // The kernel running on emulators < API 26 does not play well with - // magic mount. Skip module tests on those legacy platforms. - fun testModules(): Boolean { + // magic mount. Skip mount_test on those legacy platforms. + fun mount(): Boolean { return Build.VERSION.SDK_INT >= 26 } + // It is possible that there are no suitable preinit partition to use + fun preinit(): Boolean { + return Shell.cmd("magisk --preinit-device").exec().isSuccess + } + fun lsposed(): Boolean { return Build.VERSION.SDK_INT in 27..34 } @@ -54,6 +59,11 @@ class Environment : BaseTest { } private const val MODULE_ERROR = "Module zip processing incorrect" + const val MOUNT_TEST = "mount_test" + const val SEPOLICY_RULE = "sepolicy_rule" + const val INVALID_ZYGISK = "invalid_zygisk" + const val REMOVE_TEST = "remove_test" + const val EMPTY_ZYGISK = "empty_zygisk" } object TimberLog : CallbackList(Runnable::run) { @@ -84,9 +94,9 @@ class Environment : BaseTest { } } - private fun setupModule01(root: ExtendedFile) { - val error = "test_01 setup failed" - val path = root.getChildFile("test_01") + private fun setupMountTest(root: ExtendedFile) { + val error = "$MOUNT_TEST setup failed" + val path = root.getChildFile(MOUNT_TEST) // Create /system/etc/newfile val etc = path.getChildFile("system").getChildFile("etc") @@ -103,9 +113,13 @@ class Environment : BaseTest { assertTrue(error, bin.mkdirs()) assertTrue(error, Shell.cmd("mknod $bin/screenrecord c 0 0").exec().isSuccess) - // Create an empty zygisk folder - val module = LocalModule(path) - assertTrue(error, module.zygiskFolder.mkdir()) + assertTrue(error, Shell.cmd("set_default_perm $path").exec().isSuccess) + } + + private fun setupSepolicyRuleModule(root: ExtendedFile) { + val error = "$SEPOLICY_RULE setup failed" + val path = root.getChildFile(SEPOLICY_RULE) + assertTrue(error, path.mkdirs()) // Add sepolicy patch PrintStream(path.getChildFile("sepolicy.rule").newOutputStream()).use { @@ -118,9 +132,18 @@ class Environment : BaseTest { ).exec().isSuccess) } - private fun setupModule02(root: ExtendedFile) { - val error = "test_02 setup failed" - val path = root.getChildFile("test_02") + private fun setupEmptyZygiskModule(root: ExtendedFile) { + val error = "$EMPTY_ZYGISK setup failed" + val path = root.getChildFile(EMPTY_ZYGISK) + + // Create an empty zygisk folder + val module = LocalModule(path) + assertTrue(error, module.zygiskFolder.mkdirs()) + } + + private fun setupInvalidZygiskModule(root: ExtendedFile) { + val error = "$INVALID_ZYGISK setup failed" + val path = root.getChildFile(INVALID_ZYGISK) // Create invalid zygisk libraries val module = LocalModule(path) @@ -133,9 +156,9 @@ class Environment : BaseTest { assertTrue(error, Shell.cmd("set_default_perm $path").exec().isSuccess) } - private fun setupModule03(root: ExtendedFile) { - val error = "test_03 setup failed" - val path = root.getChildFile("test_03") + private fun setupRemoveModule(root: ExtendedFile) { + val error = "$REMOVE_TEST setup failed" + val path = root.getChildFile(REMOVE_TEST) // Create a new module but mark is as "remove" val module = LocalModule(path) @@ -189,12 +212,12 @@ class Environment : BaseTest { } } - if (testModules()) { - val root = RootUtils.fs.getFile(Const.MODULE_PATH) - setupModule01(root) - setupModule02(root) - setupModule03(root) - } + val root = RootUtils.fs.getFile(Const.MODULE_PATH) + if (mount()) { setupMountTest(root) } + if (preinit()) { setupSepolicyRuleModule(root) } + setupEmptyZygiskModule(root) + setupInvalidZygiskModule(root) + setupRemoveModule(root) } @Test