TP-12345 | Macrobenchmarking for app startup and homepage scroll [CICD] (#11461)
Co-authored-by: Ujjwal Kumar <ujjwal.kumar@navi.com> Co-authored-by: Anupam Kumar <anupam.kumar@navi.com> Co-authored-by: Shivam Goyal <shivam.goyal@navi.com>
This commit is contained in:
@@ -10,13 +10,17 @@ package com.naviapp.benchmark.baselineprofile
|
||||
import android.os.Build
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.benchmark.macro.junit4.BaselineProfileRule
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import com.naviapp.benchmark.utils.PACKAGE_NAME
|
||||
import com.naviapp.benchmark.utils.performLogin
|
||||
import com.naviapp.benchmark.utils.scrollHomePage
|
||||
import com.naviapp.benchmark.utils.startActivityAndAllowNotifications
|
||||
import com.naviapp.benchmark.utils.startActivityAndAllowPermissions
|
||||
import com.naviapp.benchmark.utils.waitForHomePage
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class HomePageScrollBaselineProfile {
|
||||
@RequiresApi(Build.VERSION_CODES.P) @get:Rule val baselineProfileRule = BaselineProfileRule()
|
||||
|
||||
@@ -24,7 +28,8 @@ class HomePageScrollBaselineProfile {
|
||||
@Test
|
||||
fun generate() =
|
||||
baselineProfileRule.collect(PACKAGE_NAME) {
|
||||
startActivityAndAllowNotifications()
|
||||
startActivityAndAllowPermissions()
|
||||
performLogin()
|
||||
waitForHomePage()
|
||||
scrollHomePage()
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import com.naviapp.benchmark.utils.PACKAGE_NAME
|
||||
import com.naviapp.benchmark.utils.performLogin
|
||||
import com.naviapp.benchmark.utils.scrollHomePage
|
||||
import com.naviapp.benchmark.utils.startActivityAndAllowNotifications
|
||||
import com.naviapp.benchmark.utils.startActivityAndAllowPermissions
|
||||
import com.naviapp.benchmark.utils.waitForHomePage
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
@@ -35,12 +35,12 @@ class HomePageScrollBenchmark {
|
||||
benchmarkRule.measureRepeated(
|
||||
packageName = PACKAGE_NAME,
|
||||
metrics = listOf(FrameTimingMetric()),
|
||||
iterations = 10,
|
||||
iterations = 3,
|
||||
startupMode = StartupMode.WARM,
|
||||
compilationMode = compilationMode,
|
||||
setupBlock = {
|
||||
pressHome()
|
||||
startActivityAndAllowNotifications()
|
||||
startActivityAndAllowPermissions()
|
||||
}
|
||||
) {
|
||||
performLogin()
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
package com.naviapp.benchmark.startup
|
||||
|
||||
import androidx.benchmark.macro.BaselineProfileMode.Disable
|
||||
import androidx.benchmark.macro.BaselineProfileMode.Require
|
||||
import androidx.benchmark.macro.CompilationMode
|
||||
import androidx.benchmark.macro.StartupMode
|
||||
@@ -16,7 +15,7 @@ import androidx.benchmark.macro.junit4.MacrobenchmarkRule
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import com.naviapp.benchmark.utils.PACKAGE_NAME
|
||||
import com.naviapp.benchmark.utils.performLogin
|
||||
import com.naviapp.benchmark.utils.startActivityAndAllowNotifications
|
||||
import com.naviapp.benchmark.utils.startActivityAndAllowPermissions
|
||||
import com.naviapp.benchmark.utils.waitForHomePageLoad
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
@@ -28,28 +27,20 @@ class StartupBenchmark {
|
||||
|
||||
@Test fun startupWithoutPreCompilation() = startup(CompilationMode.None())
|
||||
|
||||
@Test
|
||||
fun startupWithPartialCompilationAndDisabledBaselineProfile() =
|
||||
startup(
|
||||
CompilationMode.Partial(baselineProfileMode = Disable, warmupIterations = 1),
|
||||
)
|
||||
|
||||
@Test
|
||||
fun startupPrecompiledWithBaselineProfile() =
|
||||
startup(CompilationMode.Partial(baselineProfileMode = Require))
|
||||
|
||||
@Test fun startupFullyPrecompiled() = startup(CompilationMode.Full())
|
||||
|
||||
private fun startup(compilationMode: CompilationMode) =
|
||||
benchmarkRule.measureRepeated(
|
||||
packageName = PACKAGE_NAME,
|
||||
metrics = listOf(StartupTimingMetric()),
|
||||
compilationMode = compilationMode,
|
||||
iterations = 5,
|
||||
iterations = 3,
|
||||
startupMode = StartupMode.COLD,
|
||||
setupBlock = { pressHome() },
|
||||
) {
|
||||
startActivityAndAllowNotifications()
|
||||
startActivityAndAllowPermissions()
|
||||
performLogin()
|
||||
waitForHomePageLoad()
|
||||
}
|
||||
|
||||
@@ -7,19 +7,19 @@
|
||||
|
||||
package com.naviapp.benchmark.utils
|
||||
|
||||
import android.Manifest.permission
|
||||
import android.Manifest
|
||||
import android.os.Build.VERSION.SDK_INT
|
||||
import android.os.Build.VERSION_CODES.TIRAMISU
|
||||
import androidx.benchmark.macro.MacrobenchmarkScope
|
||||
|
||||
fun MacrobenchmarkScope.allowNotifications() {
|
||||
if (SDK_INT >= TIRAMISU) {
|
||||
val command = "pm grant $packageName ${permission.POST_NOTIFICATIONS}"
|
||||
device.executeShellCommand(command)
|
||||
}
|
||||
fun MacrobenchmarkScope.allowPermission(permission: String) {
|
||||
val command = "pm grant $packageName $permission"
|
||||
device.executeShellCommand(command)
|
||||
}
|
||||
|
||||
fun MacrobenchmarkScope.startActivityAndAllowNotifications() {
|
||||
fun MacrobenchmarkScope.startActivityAndAllowPermissions() {
|
||||
startActivityAndWait()
|
||||
allowNotifications()
|
||||
if (SDK_INT >= TIRAMISU) {
|
||||
allowPermission(Manifest.permission.POST_NOTIFICATIONS)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,19 @@ import androidx.test.uiautomator.Until
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
fun MacrobenchmarkScope.waitForHomePage() {
|
||||
device.wait(Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(5))
|
||||
val okButton = By.text("OK")
|
||||
val dialog = device.wait(Until.findObject(okButton), TimeUnit.SECONDS.toMillis(20))
|
||||
dialog?.let {
|
||||
it.click()
|
||||
device.wait(Until.gone(okButton), TimeUnit.SECONDS.toMillis(5))
|
||||
}
|
||||
// Sometime location popup coming two times so adding one more check
|
||||
val dialog2 = device.wait(Until.findObject(okButton), TimeUnit.SECONDS.toMillis(20))
|
||||
dialog2?.let {
|
||||
it.click()
|
||||
device.wait(Until.gone(okButton), TimeUnit.SECONDS.toMillis(5))
|
||||
}
|
||||
device.wait(Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(10))
|
||||
}
|
||||
|
||||
fun MacrobenchmarkScope.performLogin() {
|
||||
@@ -53,7 +65,7 @@ fun MacrobenchmarkScope.scrollHomePage() {
|
||||
}
|
||||
|
||||
fun MacrobenchmarkScope.waitForHomePageLoad() {
|
||||
device.wait(Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(10))
|
||||
waitForHomePage()
|
||||
val list =
|
||||
device.waitAndFindObject(By.res("homeScreenWidgetsList"), TimeUnit.SECONDS.toMillis(10))
|
||||
list.wait(untilHasChildren(), 5000)
|
||||
|
||||
Reference in New Issue
Block a user