Provides assertion blocks on Flicker

Enable tests ot be in presubmit, postsubmit or marked as flaky

Do not require flicker DSL changes

Bug: 162923992
Test: atest FlickerTests WMShellFlickerTests
Change-Id: I74fdadaf5f6f08d96973683682297200eec6658d
This commit is contained in:
Nataniel Borges
2021-01-26 16:33:09 +01:00
parent 277cfb354d
commit da5136ea43
10 changed files with 52 additions and 178 deletions

View File

@@ -18,7 +18,7 @@ android_test {
name: "WMShellFlickerTests",
srcs: ["src/**/*.java", "src/**/*.kt"],
manifest: "AndroidManifest.xml",
test_config: "AndroidTestPhysicalDevices.xml",
test_config: "AndroidTest.xml",
platform_apis: true,
certificate: "platform",
test_suites: ["device-tests"],
@@ -36,25 +36,3 @@ android_test {
"wmshell-flicker-test-components",
],
}
android_test {
name: "WMShellFlickerTestsVirtual",
srcs: ["src/**/*.java", "src/**/*.kt"],
manifest: "AndroidManifest.xml",
test_config: "AndroidTestVirtualDevices.xml",
platform_apis: true,
certificate: "platform",
libs: ["android.test.runner"],
static_libs: [
"androidx.test.ext.junit",
"flickerlib",
"truth-prebuilt",
"app-helpers-core",
"launcher-helper-lib",
"launcher-aosp-tapl",
"wm-flicker-common-assertions",
"wm-flicker-common-app-helpers",
"platform-test-annotations",
"wmshell-flicker-test-components",
],
}

View File

@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright 2020 Google Inc. All Rights Reserved.
-->
<configuration description="Runs WindowManager Shell Flicker Tests">
<option name="test-tag" value="FlickerTests" />
<target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
<!-- keeps the screen on during tests -->
<option name="screen-always-on" value="on" />
<!-- prevents the phone from restarting -->
<option name="force-skip-system-props" value="true" />
<!-- set WM tracing verbose level to all -->
<option name="run-command" value="cmd window tracing level all" />
<!-- inform WM to log all transactions -->
<option name="run-command" value="cmd window tracing transaction" />
<!-- restart launcher to activate TAPL -->
<option name="run-command" value="setprop ro.test_harness 1 ; am force-stop com.google.android.apps.nexuslauncher" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.DeviceCleaner">
<!-- reboot the device to teardown any crashed tests -->
<option name="cleanup-action" value="REBOOT" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true"/>
<option name="test-file-name" value="WMShellFlickerTests.apk"/>
<option name="test-file-name" value="WMShellFlickerTestApp.apk" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.wm.shell.flicker"/>
<option name="exclude-annotation" value="androidx.test.filters.RequiresDevice" />
<option name="exclude-annotation" value="androidx.test.filters.FlakyTest" />
<option name="shell-timeout" value="6600s" />
<option name="test-timeout" value="6000s" />
<option name="hidden-api-checks" value="false" />
</test>
<metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
<option name="directory-keys" value="/sdcard/flicker" />
<option name="collect-on-run-ended-only" value="true" />
<option name="clean-up" value="true" />
</metrics_collector>
</configuration>

View File

@@ -18,14 +18,14 @@ package com.android.wm.shell.flicker
import android.graphics.Region
import android.view.Surface
import com.android.server.wm.flicker.dsl.LayersAssertionBuilderLegacy
import com.android.server.wm.flicker.APP_PAIR_SPLIT_DIVIDER
import com.android.server.wm.flicker.DOCKED_STACK_DIVIDER
import com.android.server.wm.flicker.dsl.LayersAssertionBuilder
import com.android.server.wm.flicker.helpers.WindowUtils
import com.android.server.wm.flicker.traces.layers.getVisibleBounds
@JvmOverloads
fun LayersAssertionBuilder.appPairsDividerIsVisible(
fun LayersAssertionBuilderLegacy.appPairsDividerIsVisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -35,7 +35,7 @@ fun LayersAssertionBuilder.appPairsDividerIsVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.appPairsDividerIsInvisible(
fun LayersAssertionBuilderLegacy.appPairsDividerIsInvisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -45,7 +45,7 @@ fun LayersAssertionBuilder.appPairsDividerIsInvisible(
}
@JvmOverloads
fun LayersAssertionBuilder.appPairsDividerBecomesVisible(
fun LayersAssertionBuilderLegacy.appPairsDividerBecomesVisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -57,7 +57,7 @@ fun LayersAssertionBuilder.appPairsDividerBecomesVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.dockedStackDividerIsVisible(
fun LayersAssertionBuilderLegacy.dockedStackDividerIsVisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -67,7 +67,7 @@ fun LayersAssertionBuilder.dockedStackDividerIsVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.dockedStackDividerBecomesVisible(
fun LayersAssertionBuilderLegacy.dockedStackDividerBecomesVisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -79,7 +79,7 @@ fun LayersAssertionBuilder.dockedStackDividerBecomesVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.dockedStackDividerBecomesInvisible(
fun LayersAssertionBuilderLegacy.dockedStackDividerBecomesInvisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -91,7 +91,7 @@ fun LayersAssertionBuilder.dockedStackDividerBecomesInvisible(
}
@JvmOverloads
fun LayersAssertionBuilder.dockedStackDividerIsInvisible(
fun LayersAssertionBuilderLegacy.dockedStackDividerIsInvisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -101,7 +101,7 @@ fun LayersAssertionBuilder.dockedStackDividerIsInvisible(
}
@JvmOverloads
fun LayersAssertionBuilder.appPairsPrimaryBoundsIsVisible(
fun LayersAssertionBuilderLegacy.appPairsPrimaryBoundsIsVisible(
rotation: Int,
primaryLayerName: String,
bugId: Int = 0,
@@ -114,7 +114,7 @@ fun LayersAssertionBuilder.appPairsPrimaryBoundsIsVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.appPairsSecondaryBoundsIsVisible(
fun LayersAssertionBuilderLegacy.appPairsSecondaryBoundsIsVisible(
rotation: Int,
secondaryLayerName: String,
bugId: Int = 0,
@@ -127,7 +127,7 @@ fun LayersAssertionBuilder.appPairsSecondaryBoundsIsVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.dockedStackPrimaryBoundsIsVisible(
fun LayersAssertionBuilderLegacy.dockedStackPrimaryBoundsIsVisible(
rotation: Int,
primaryLayerName: String,
bugId: Int = 0,
@@ -140,7 +140,7 @@ fun LayersAssertionBuilder.dockedStackPrimaryBoundsIsVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.dockedStackSecondaryBoundsIsVisible(
fun LayersAssertionBuilderLegacy.dockedStackSecondaryBoundsIsVisible(
rotation: Int,
secondaryLayerName: String,
bugId: Int = 0,

View File

@@ -18,28 +18,7 @@ android_test {
name: "FlickerTests",
srcs: ["src/**/*.java", "src/**/*.kt"],
manifest: "AndroidManifest.xml",
test_config: "AndroidTestPhysicalDevices.xml",
platform_apis: true,
certificate: "platform",
test_suites: ["device-tests"],
libs: ["android.test.runner"],
static_libs: [
"androidx.test.ext.junit",
"flickertestapplib",
"flickerlib",
"truth-prebuilt",
"launcher-helper-lib",
"launcher-aosp-tapl",
"platform-test-annotations",
],
}
android_test {
name: "FlickerTestsVirtual",
srcs: ["src/**/*.java", "src/**/*.kt"],
manifest: "AndroidManifest.xml",
test_config: "AndroidTestVirtualDevices.xml",
test_config: "AndroidTest.xml",
platform_apis: true,
certificate: "platform",
test_suites: ["device-tests"],

View File

@@ -25,7 +25,6 @@
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.server.wm.flicker"/>
<option name="include-annotation" value="androidx.test.filters.RequiresDevice" />
<option name="exclude-annotation" value="androidx.test.filters.FlakyTest" />
<option name="shell-timeout" value="6600s" />
<option name="test-timeout" value="6600s" />

View File

@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright 2018 Google Inc. All Rights Reserved.
-->
<configuration description="Runs WindowManager Flicker Tests">
<option name="test-tag" value="FlickerTests" />
<target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
<!-- keeps the screen on during tests -->
<option name="screen-always-on" value="on" />
<!-- prevents the phone from restarting -->
<option name="force-skip-system-props" value="true" />
<!-- set WM tracing verbose level to all -->
<option name="run-command" value="cmd window tracing level all" />
<!-- inform WM to log all transactions -->
<option name="run-command" value="cmd window tracing transaction" />
<!-- restart launcher to activate TAPL -->
<option name="run-command" value="setprop ro.test_harness 1 ; am force-stop com.google.android.apps.nexuslauncher" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.DeviceCleaner">
<!-- reboot the device to teardown any crashed tests -->
<option name="cleanup-action" value="REBOOT" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true"/>
<option name="test-file-name" value="FlickerTests.apk"/>
<option name="test-file-name" value="FlickerTestApp.apk" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.server.wm.flicker"/>
<option name="exclude-annotation" value="androidx.test.filters.RequiresDevice" />
<option name="exclude-annotation" value="androidx.test.filters.FlakyTest" />
<option name="shell-timeout" value="6600s" />
<option name="test-timeout" value="6000s" />
<option name="hidden-api-checks" value="false" />
</test>
<metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
<option name="directory-keys" value="/sdcard/flicker" />
<option name="collect-on-run-ended-only" value="true" />
<option name="clean-up" value="true" />
</metrics_collector>
</configuration>

View File

@@ -17,9 +17,9 @@
package com.android.server.wm.flicker
import android.platform.helpers.IAppHelper
import com.android.server.wm.flicker.dsl.EventLogAssertionBuilder
import com.android.server.wm.flicker.dsl.LayersAssertionBuilder
import com.android.server.wm.flicker.dsl.WmAssertionBuilder
import com.android.server.wm.flicker.dsl.EventLogAssertionBuilderLegacy
import com.android.server.wm.flicker.dsl.LayersAssertionBuilderLegacy
import com.android.server.wm.flicker.dsl.WmAssertionBuilderLegacy
import com.android.server.wm.flicker.helpers.WindowUtils
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper.Companion.NAV_BAR_LAYER_NAME
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper.Companion.NAV_BAR_WINDOW_NAME
@@ -31,7 +31,7 @@ const val DOCKED_STACK_DIVIDER = "DockedStackDivider"
const val WALLPAPER_TITLE = "Wallpaper"
@JvmOverloads
fun WmAssertionBuilder.statusBarWindowIsAlwaysVisible(
fun WmAssertionBuilderLegacy.statusBarWindowIsAlwaysVisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -41,7 +41,7 @@ fun WmAssertionBuilder.statusBarWindowIsAlwaysVisible(
}
@JvmOverloads
fun WmAssertionBuilder.navBarWindowIsAlwaysVisible(
fun WmAssertionBuilderLegacy.navBarWindowIsAlwaysVisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -50,7 +50,7 @@ fun WmAssertionBuilder.navBarWindowIsAlwaysVisible(
}
}
fun WmAssertionBuilder.visibleWindowsShownMoreThanOneConsecutiveEntry(
fun WmAssertionBuilderLegacy.visibleWindowsShownMoreThanOneConsecutiveEntry(
ignoreWindows: List<String> = emptyList(),
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -60,7 +60,7 @@ fun WmAssertionBuilder.visibleWindowsShownMoreThanOneConsecutiveEntry(
}
}
fun WmAssertionBuilder.launcherReplacesAppWindowAsTopWindow(
fun WmAssertionBuilderLegacy.launcherReplacesAppWindowAsTopWindow(
testApp: IAppHelper,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -72,7 +72,7 @@ fun WmAssertionBuilder.launcherReplacesAppWindowAsTopWindow(
}
}
fun WmAssertionBuilder.wallpaperWindowBecomesVisible(
fun WmAssertionBuilderLegacy.wallpaperWindowBecomesVisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -83,7 +83,7 @@ fun WmAssertionBuilder.wallpaperWindowBecomesVisible(
}
}
fun WmAssertionBuilder.wallpaperWindowBecomesInvisible(
fun WmAssertionBuilderLegacy.wallpaperWindowBecomesInvisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -94,7 +94,7 @@ fun WmAssertionBuilder.wallpaperWindowBecomesInvisible(
}
}
fun WmAssertionBuilder.appWindowAlwaysVisibleOnTop(
fun WmAssertionBuilderLegacy.appWindowAlwaysVisibleOnTop(
packageName: String,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -104,7 +104,7 @@ fun WmAssertionBuilder.appWindowAlwaysVisibleOnTop(
}
}
fun WmAssertionBuilder.appWindowBecomesVisible(
fun WmAssertionBuilderLegacy.appWindowBecomesVisible(
appName: String,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -116,7 +116,7 @@ fun WmAssertionBuilder.appWindowBecomesVisible(
}
}
fun WmAssertionBuilder.appWindowBecomesInVisible(
fun WmAssertionBuilderLegacy.appWindowBecomesInVisible(
appName: String,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -129,7 +129,7 @@ fun WmAssertionBuilder.appWindowBecomesInVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.noUncoveredRegions(
fun LayersAssertionBuilderLegacy.noUncoveredRegions(
beginRotation: Int,
endRotation: Int = beginRotation,
allStates: Boolean = true,
@@ -159,7 +159,7 @@ fun LayersAssertionBuilder.noUncoveredRegions(
}
@JvmOverloads
fun LayersAssertionBuilder.navBarLayerIsAlwaysVisible(
fun LayersAssertionBuilderLegacy.navBarLayerIsAlwaysVisible(
rotatesScreen: Boolean = false,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -180,7 +180,7 @@ fun LayersAssertionBuilder.navBarLayerIsAlwaysVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.statusBarLayerIsAlwaysVisible(
fun LayersAssertionBuilderLegacy.statusBarLayerIsAlwaysVisible(
rotatesScreen: Boolean = false,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -201,7 +201,7 @@ fun LayersAssertionBuilder.statusBarLayerIsAlwaysVisible(
}
@JvmOverloads
fun LayersAssertionBuilder.navBarLayerRotatesAndScales(
fun LayersAssertionBuilderLegacy.navBarLayerRotatesAndScales(
beginRotation: Int,
endRotation: Int = beginRotation,
bugId: Int = 0,
@@ -225,7 +225,7 @@ fun LayersAssertionBuilder.navBarLayerRotatesAndScales(
}
@JvmOverloads
fun LayersAssertionBuilder.statusBarLayerRotatesScales(
fun LayersAssertionBuilderLegacy.statusBarLayerRotatesScales(
beginRotation: Int,
endRotation: Int = beginRotation,
bugId: Int = 0,
@@ -242,7 +242,7 @@ fun LayersAssertionBuilder.statusBarLayerRotatesScales(
}
}
fun LayersAssertionBuilder.visibleLayersShownMoreThanOneConsecutiveEntry(
fun LayersAssertionBuilderLegacy.visibleLayersShownMoreThanOneConsecutiveEntry(
ignoreLayers: List<String> = emptyList(),
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -252,7 +252,7 @@ fun LayersAssertionBuilder.visibleLayersShownMoreThanOneConsecutiveEntry(
}
}
fun LayersAssertionBuilder.appLayerReplacesWallpaperLayer(
fun LayersAssertionBuilderLegacy.appLayerReplacesWallpaperLayer(
appName: String,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -264,7 +264,7 @@ fun LayersAssertionBuilder.appLayerReplacesWallpaperLayer(
}
}
fun LayersAssertionBuilder.wallpaperLayerReplacesAppLayer(
fun LayersAssertionBuilderLegacy.wallpaperLayerReplacesAppLayer(
testApp: IAppHelper,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -276,7 +276,7 @@ fun LayersAssertionBuilder.wallpaperLayerReplacesAppLayer(
}
}
fun LayersAssertionBuilder.layerAlwaysVisible(
fun LayersAssertionBuilderLegacy.layerAlwaysVisible(
packageName: String,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -286,7 +286,7 @@ fun LayersAssertionBuilder.layerAlwaysVisible(
}
}
fun LayersAssertionBuilder.layerBecomesVisible(
fun LayersAssertionBuilderLegacy.layerBecomesVisible(
packageName: String,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -298,7 +298,7 @@ fun LayersAssertionBuilder.layerBecomesVisible(
}
}
fun LayersAssertionBuilder.layerBecomesInvisible(
fun LayersAssertionBuilderLegacy.layerBecomesInvisible(
packageName: String,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -310,7 +310,7 @@ fun LayersAssertionBuilder.layerBecomesInvisible(
}
}
fun EventLogAssertionBuilder.focusChanges(
fun EventLogAssertionBuilderLegacy.focusChanges(
vararg windows: String,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -320,7 +320,7 @@ fun EventLogAssertionBuilder.focusChanges(
}
}
fun EventLogAssertionBuilder.focusDoesNotChange(
fun EventLogAssertionBuilderLegacy.focusDoesNotChange(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {

View File

@@ -17,13 +17,13 @@
package com.android.server.wm.flicker.ime
import android.platform.helpers.IAppHelper
import com.android.server.wm.flicker.dsl.LayersAssertionBuilder
import com.android.server.wm.flicker.dsl.WmAssertionBuilder
import com.android.server.wm.flicker.dsl.LayersAssertionBuilderLegacy
import com.android.server.wm.flicker.dsl.WmAssertionBuilderLegacy
const val IME_WINDOW_TITLE = "InputMethod"
@JvmOverloads
fun LayersAssertionBuilder.imeLayerBecomesVisible(
fun LayersAssertionBuilderLegacy.imeLayerBecomesVisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -34,7 +34,7 @@ fun LayersAssertionBuilder.imeLayerBecomesVisible(
}
}
fun LayersAssertionBuilder.imeLayerBecomesInvisible(
fun LayersAssertionBuilderLegacy.imeLayerBecomesInvisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -45,7 +45,7 @@ fun LayersAssertionBuilder.imeLayerBecomesInvisible(
}
}
fun LayersAssertionBuilder.imeAppLayerIsAlwaysVisible(
fun LayersAssertionBuilderLegacy.imeAppLayerIsAlwaysVisible(
testApp: IAppHelper,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -55,7 +55,7 @@ fun LayersAssertionBuilder.imeAppLayerIsAlwaysVisible(
}
}
fun WmAssertionBuilder.imeAppWindowIsAlwaysVisible(
fun WmAssertionBuilderLegacy.imeAppWindowIsAlwaysVisible(
testApp: IAppHelper,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -65,7 +65,7 @@ fun WmAssertionBuilder.imeAppWindowIsAlwaysVisible(
}
}
fun WmAssertionBuilder.imeWindowBecomesVisible(
fun WmAssertionBuilderLegacy.imeWindowBecomesVisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -76,7 +76,7 @@ fun WmAssertionBuilder.imeWindowBecomesVisible(
}
}
fun WmAssertionBuilder.imeWindowBecomesInvisible(
fun WmAssertionBuilderLegacy.imeWindowBecomesInvisible(
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
@@ -87,7 +87,7 @@ fun WmAssertionBuilder.imeWindowBecomesInvisible(
}
}
fun WmAssertionBuilder.imeAppWindowBecomesVisible(
fun WmAssertionBuilderLegacy.imeAppWindowBecomesVisible(
windowName: String,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -99,7 +99,7 @@ fun WmAssertionBuilder.imeAppWindowBecomesVisible(
}
}
fun WmAssertionBuilder.imeAppWindowBecomesInvisible(
fun WmAssertionBuilderLegacy.imeAppWindowBecomesInvisible(
testApp: IAppHelper,
bugId: Int = 0,
enabled: Boolean = bugId == 0
@@ -111,7 +111,7 @@ fun WmAssertionBuilder.imeAppWindowBecomesInvisible(
}
}
fun LayersAssertionBuilder.imeAppLayerBecomesInvisible(
fun LayersAssertionBuilderLegacy.imeAppLayerBecomesInvisible(
testApp: IAppHelper,
bugId: Int = 0,
enabled: Boolean = bugId == 0

View File

@@ -17,9 +17,9 @@
package com.android.server.wm.flicker.launch
import android.platform.helpers.IAppHelper
import com.android.server.wm.flicker.dsl.WmAssertionBuilder
import com.android.server.wm.flicker.dsl.WmAssertionBuilderLegacy
fun WmAssertionBuilder.appWindowReplacesLauncherAsTopWindow(
fun WmAssertionBuilderLegacy.appWindowReplacesLauncherAsTopWindow(
testApp: IAppHelper,
bugId: Int = 0,
enabled: Boolean = bugId == 0