mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-04-30 06:24:26 +02:00
Cleanup test code
This commit is contained in:
parent
9e2b59060d
commit
231a5d1853
@ -1,16 +1,13 @@
|
|||||||
package com.topjohnwu.magisk.test
|
package com.topjohnwu.magisk.test
|
||||||
|
|
||||||
import android.app.UiAutomation
|
import android.os.ParcelFileDescriptor.AutoCloseInputStream
|
||||||
import androidx.annotation.Keep
|
import androidx.annotation.Keep
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
|
||||||
import androidx.test.uiautomator.By
|
import androidx.test.uiautomator.By
|
||||||
import androidx.test.uiautomator.UiDevice
|
|
||||||
import androidx.test.uiautomator.Until
|
import androidx.test.uiautomator.Until
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Assert.assertNotNull
|
import org.junit.Assert.assertNotNull
|
||||||
import org.junit.Assume.assumeTrue
|
import org.junit.Assume.assumeTrue
|
||||||
import org.junit.Before
|
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
@ -18,7 +15,7 @@ import java.util.regex.Pattern
|
|||||||
|
|
||||||
@Keep
|
@Keep
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
class AdditionalTest {
|
class AdditionalTest : BaseTest {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val SHELL_PKG = "com.android.shell"
|
private const val SHELL_PKG = "com.android.shell"
|
||||||
@ -26,16 +23,6 @@ class AdditionalTest {
|
|||||||
private const val LSPOSED_PKG = "org.lsposed.manager"
|
private const val LSPOSED_PKG = "org.lsposed.manager"
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var uiAutomation: UiAutomation
|
|
||||||
private lateinit var device: UiDevice
|
|
||||||
|
|
||||||
@Before
|
|
||||||
fun setup() {
|
|
||||||
val inst = InstrumentationRegistry.getInstrumentation()
|
|
||||||
uiAutomation = inst.uiAutomation
|
|
||||||
device = UiDevice.getInstance(inst)
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
@After
|
||||||
fun teardown() {
|
fun teardown() {
|
||||||
device.pressHome()
|
device.pressHome()
|
||||||
@ -47,7 +34,8 @@ class AdditionalTest {
|
|||||||
|
|
||||||
uiAutomation.executeShellCommand(
|
uiAutomation.executeShellCommand(
|
||||||
"am start -c $LSPOSED_CATEGORY $SHELL_PKG/.BugreportWarningActivity"
|
"am start -c $LSPOSED_CATEGORY $SHELL_PKG/.BugreportWarningActivity"
|
||||||
)
|
).let { pfd -> AutoCloseInputStream(pfd).use { it.readBytes() } }
|
||||||
|
|
||||||
val pattern = Pattern.compile("$LSPOSED_PKG:id/.*")
|
val pattern = Pattern.compile("$LSPOSED_PKG:id/.*")
|
||||||
assertNotNull(
|
assertNotNull(
|
||||||
"LSPosed manager launch failed",
|
"LSPosed manager launch failed",
|
||||||
|
26
app/core/src/main/java/com/topjohnwu/magisk/test/BaseTest.kt
Normal file
26
app/core/src/main/java/com/topjohnwu/magisk/test/BaseTest.kt
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package com.topjohnwu.magisk.test
|
||||||
|
|
||||||
|
import android.app.Instrumentation
|
||||||
|
import android.app.UiAutomation
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
|
import androidx.test.uiautomator.UiDevice
|
||||||
|
import com.topjohnwu.magisk.core.utils.RootUtils
|
||||||
|
import com.topjohnwu.superuser.Shell
|
||||||
|
import org.junit.Assert.assertTrue
|
||||||
|
|
||||||
|
interface BaseTest {
|
||||||
|
val instrumentation: Instrumentation
|
||||||
|
get() = InstrumentationRegistry.getInstrumentation()
|
||||||
|
val context: Context get() = instrumentation.targetContext
|
||||||
|
val uiAutomation: UiAutomation get() = instrumentation.uiAutomation
|
||||||
|
val device: UiDevice get() = UiDevice.getInstance(instrumentation)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun prerequisite() {
|
||||||
|
assertTrue("Should have root access", Shell.getShell().isRoot)
|
||||||
|
// Make sure the root service is running
|
||||||
|
RootUtils.Connection.await()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,12 +1,10 @@
|
|||||||
package com.topjohnwu.magisk.test
|
package com.topjohnwu.magisk.test
|
||||||
|
|
||||||
import android.app.Notification
|
import android.app.Notification
|
||||||
import android.content.Context
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.annotation.Keep
|
import androidx.annotation.Keep
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
|
||||||
import com.topjohnwu.magisk.core.BuildConfig.APP_PACKAGE_NAME
|
import com.topjohnwu.magisk.core.BuildConfig.APP_PACKAGE_NAME
|
||||||
import com.topjohnwu.magisk.core.di.ServiceLocator
|
import com.topjohnwu.magisk.core.di.ServiceLocator
|
||||||
import com.topjohnwu.magisk.core.download.DownloadNotifier
|
import com.topjohnwu.magisk.core.download.DownloadNotifier
|
||||||
@ -15,13 +13,10 @@ import com.topjohnwu.magisk.core.ktx.cachedFile
|
|||||||
import com.topjohnwu.magisk.core.tasks.AppMigration
|
import com.topjohnwu.magisk.core.tasks.AppMigration
|
||||||
import com.topjohnwu.magisk.core.tasks.FlashZip
|
import com.topjohnwu.magisk.core.tasks.FlashZip
|
||||||
import com.topjohnwu.magisk.core.tasks.MagiskInstaller
|
import com.topjohnwu.magisk.core.tasks.MagiskInstaller
|
||||||
import com.topjohnwu.magisk.core.utils.RootUtils
|
|
||||||
import com.topjohnwu.superuser.CallbackList
|
import com.topjohnwu.superuser.CallbackList
|
||||||
import com.topjohnwu.superuser.Shell
|
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Assume.assumeTrue
|
import org.junit.Assume.assumeTrue
|
||||||
import org.junit.Before
|
|
||||||
import org.junit.BeforeClass
|
import org.junit.BeforeClass
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
@ -29,16 +24,12 @@ import timber.log.Timber
|
|||||||
|
|
||||||
@Keep
|
@Keep
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
class Environment {
|
class Environment : BaseTest {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun before() {
|
fun before() = BaseTest.prerequisite()
|
||||||
assertTrue("Should have root access", Shell.getShell().isRoot)
|
|
||||||
// Make sure the root service is running
|
|
||||||
RootUtils.Connection.await()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun lsposed(): Boolean {
|
fun lsposed(): Boolean {
|
||||||
return Build.VERSION.SDK_INT >= 27 && Build.VERSION.SDK_INT <= 34
|
return Build.VERSION.SDK_INT >= 27 && Build.VERSION.SDK_INT <= 34
|
||||||
@ -54,13 +45,6 @@ class Environment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var mContext: Context
|
|
||||||
|
|
||||||
@Before
|
|
||||||
fun setup() {
|
|
||||||
mContext = InstrumentationRegistry.getInstrumentation().targetContext
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun setupMagisk() {
|
fun setupMagisk() {
|
||||||
runBlocking {
|
runBlocking {
|
||||||
@ -76,11 +60,11 @@ class Environment {
|
|||||||
assumeTrue(lsposed())
|
assumeTrue(lsposed())
|
||||||
|
|
||||||
val notify = object : DownloadNotifier {
|
val notify = object : DownloadNotifier {
|
||||||
override val context = mContext
|
override val context = this@Environment.context
|
||||||
override fun notifyUpdate(id: Int, editor: (Notification.Builder) -> Unit) {}
|
override fun notifyUpdate(id: Int, editor: (Notification.Builder) -> Unit) {}
|
||||||
}
|
}
|
||||||
val processor = DownloadProcessor(notify)
|
val processor = DownloadProcessor(notify)
|
||||||
val zip = mContext.cachedFile("lsposed.zip")
|
val zip = context.cachedFile("lsposed.zip")
|
||||||
runBlocking {
|
runBlocking {
|
||||||
ServiceLocator.networkService.fetchFile(LSPOSED_URL).byteStream().use {
|
ServiceLocator.networkService.fetchFile(LSPOSED_URL).byteStream().use {
|
||||||
processor.handleModule(it, zip.toUri())
|
processor.handleModule(it, zip.toUri())
|
||||||
@ -98,7 +82,7 @@ class Environment {
|
|||||||
assertTrue(
|
assertTrue(
|
||||||
"App hiding failed",
|
"App hiding failed",
|
||||||
AppMigration.patchAndHide(
|
AppMigration.patchAndHide(
|
||||||
context = mContext,
|
context = context,
|
||||||
label = "Settings",
|
label = "Settings",
|
||||||
pkg = "repackaged.$APP_PACKAGE_NAME"
|
pkg = "repackaged.$APP_PACKAGE_NAME"
|
||||||
)
|
)
|
||||||
@ -111,7 +95,7 @@ class Environment {
|
|||||||
runBlocking {
|
runBlocking {
|
||||||
assertTrue(
|
assertTrue(
|
||||||
"App restoration failed",
|
"App restoration failed",
|
||||||
AppMigration.restoreApp(mContext)
|
AppMigration.restoreApp(context)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
package com.topjohnwu.magisk.test
|
package com.topjohnwu.magisk.test
|
||||||
|
|
||||||
import android.app.Instrumentation
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.os.ParcelFileDescriptor.AutoCloseInputStream
|
||||||
import androidx.annotation.Keep
|
import androidx.annotation.Keep
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
|
||||||
import com.topjohnwu.magisk.core.Config
|
import com.topjohnwu.magisk.core.Config
|
||||||
import com.topjohnwu.magisk.core.Info
|
import com.topjohnwu.magisk.core.Info
|
||||||
import com.topjohnwu.magisk.core.di.ServiceLocator
|
import com.topjohnwu.magisk.core.di.ServiceLocator
|
||||||
@ -15,29 +14,19 @@ import kotlinx.coroutines.runBlocking
|
|||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertNotNull
|
import org.junit.Assert.assertNotNull
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Before
|
|
||||||
import org.junit.BeforeClass
|
import org.junit.BeforeClass
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import java.io.FileInputStream
|
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
@Keep
|
@Keep
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
class MagiskAppTest {
|
class MagiskAppTest : BaseTest {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun before() = Environment.before()
|
fun before() = BaseTest.prerequisite()
|
||||||
}
|
|
||||||
|
|
||||||
private lateinit var inst: Instrumentation
|
|
||||||
private val uiAutomation get() = inst.uiAutomation
|
|
||||||
|
|
||||||
@Before
|
|
||||||
fun setup() {
|
|
||||||
inst = InstrumentationRegistry.getInstrumentation()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -64,7 +53,7 @@ class MagiskAppTest {
|
|||||||
|
|
||||||
val filter = IntentFilter(Intent.ACTION_VIEW)
|
val filter = IntentFilter(Intent.ACTION_VIEW)
|
||||||
filter.addCategory(Intent.CATEGORY_DEFAULT)
|
filter.addCategory(Intent.CATEGORY_DEFAULT)
|
||||||
val monitor = inst.addMonitor(filter, null, false)
|
val monitor = instrumentation.addMonitor(filter, null, false)
|
||||||
|
|
||||||
// Try to call su from ADB shell
|
// Try to call su from ADB shell
|
||||||
val cmd = if (Build.VERSION.SDK_INT < 24) {
|
val cmd = if (Build.VERSION.SDK_INT < 24) {
|
||||||
@ -80,10 +69,10 @@ class MagiskAppTest {
|
|||||||
assertNotNull("SuRequestActivity is not launched", suRequest)
|
assertNotNull("SuRequestActivity is not launched", suRequest)
|
||||||
|
|
||||||
// Check that the request went through
|
// Check that the request went through
|
||||||
FileInputStream(pfd.fileDescriptor).use {
|
AutoCloseInputStream(pfd).reader().use {
|
||||||
assertTrue(
|
assertTrue(
|
||||||
"Cannot grant root permission from shell",
|
"Cannot grant root permission from shell",
|
||||||
it.reader().readText().contains("uid=0")
|
it.readText().contains("uid=0")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,9 +59,10 @@ run_setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
run_tests() {
|
run_tests() {
|
||||||
local self='com.topjohnwu.magisk.test/com.topjohnwu.magisk.test.TestRunner'
|
local pkg='com.topjohnwu.magisk.test'
|
||||||
local app='com.topjohnwu.magisk.test/com.topjohnwu.magisk.test.AppTestRunner'
|
local self="$pkg/$pkg.TestRunner"
|
||||||
local stub='repackaged.com.topjohnwu.magisk.test/com.topjohnwu.magisk.test.AppTestRunner'
|
local app="$pkg/$pkg.AppTestRunner"
|
||||||
|
local stub="repackaged.$pkg/$pkg.AppTestRunner"
|
||||||
|
|
||||||
# Run app tests
|
# Run app tests
|
||||||
am_instrument '.MagiskAppTest,.AdditionalTest' $app
|
am_instrument '.MagiskAppTest,.AdditionalTest' $app
|
||||||
|
Loading…
x
Reference in New Issue
Block a user