diff options
| author | 2023-02-06 21:31:44 -0800 | |
|---|---|---|
| committer | 2023-02-17 20:02:10 +0000 | |
| commit | 8397111c0234fa1ea639c85677065482a4c34727 (patch) | |
| tree | 4fb9e2d902d2ada8f692435774f6e29d680a2062 /java/tests/src | |
| parent | f1576aeb415af53da75ca7dbc9413b04c43dee54 (diff) | |
Run Chooser integration tests for the new features
Add a new test parameter, feature flag set, and run Chooser tests for
two set values: all flags are off and all flags are on. This ensures
that our integration tests cover the new features.
A new test rule is added to ignore tests that were designed for a
specific flag values when running in a set that does not have those
values set.
Bug: 258838272
Test: the modified test itself
Change-Id: If646ef123a383e801fda55d601e10b186c6c5c1f
(cherry picked from commit 880417ed82485d63c87737d38a270a3367d27594)
Merged-In: If646ef123a383e801fda55d601e10b186c6c5c1f
Diffstat (limited to 'java/tests/src')
4 files changed, 158 insertions, 44 deletions
diff --git a/java/tests/src/com/android/intentresolver/FeatureFlagRule.kt b/java/tests/src/com/android/intentresolver/FeatureFlagRule.kt new file mode 100644 index 00000000..3fa01bcc --- /dev/null +++ b/java/tests/src/com/android/intentresolver/FeatureFlagRule.kt @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.intentresolver + +import com.android.systemui.flags.BooleanFlag +import org.junit.rules.TestRule +import org.junit.runner.Description +import org.junit.runners.model.Statement + +/** + * Ignores tests annotated with [RequireFeatureFlags] which flag requirements does not + * meet in the active flag set. + * @param flags active flag set + */ +internal class FeatureFlagRule(flags: Map<BooleanFlag, Boolean>) : TestRule { + private val flags = flags.entries.fold(HashMap<String, Boolean>()) { map, (key, value) -> + map.apply { + put(key.name, value) + } + } + private val skippingStatement = object : Statement() { + override fun evaluate() = Unit + } + + override fun apply(base: Statement, description: Description): Statement { + val annotation = description.annotations.firstOrNull { + it is RequireFeatureFlags + } as? RequireFeatureFlags + ?: return base + + if (annotation.flags.size != annotation.values.size) { + error("${description.className}#${description.methodName}: inconsistent number of" + + " flags and values in $annotation") + } + for (i in annotation.flags.indices) { + val flag = annotation.flags[i] + val value = annotation.values[i] + if (flags.getOrDefault(flag, !value) != value) return skippingStatement + } + return base + } +} diff --git a/java/tests/src/com/android/intentresolver/RequireFeatureFlags.kt b/java/tests/src/com/android/intentresolver/RequireFeatureFlags.kt new file mode 100644 index 00000000..1ddf7462 --- /dev/null +++ b/java/tests/src/com/android/intentresolver/RequireFeatureFlags.kt @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.intentresolver + +/** + * Specifies expected feature flag values for a test. + */ +@Target(AnnotationTarget.FUNCTION) +annotation class RequireFeatureFlags(val flags: Array<String>, val values: BooleanArray) diff --git a/java/tests/src/com/android/intentresolver/TestFeatureFlagRepository.kt b/java/tests/src/com/android/intentresolver/TestFeatureFlagRepository.kt index abc24efb..5a159d24 100644 --- a/java/tests/src/com/android/intentresolver/TestFeatureFlagRepository.kt +++ b/java/tests/src/com/android/intentresolver/TestFeatureFlagRepository.kt @@ -17,14 +17,15 @@ package com.android.intentresolver import com.android.intentresolver.flags.FeatureFlagRepository +import com.android.systemui.flags.BooleanFlag import com.android.systemui.flags.ReleasedFlag import com.android.systemui.flags.UnreleasedFlag internal class TestFeatureFlagRepository( - private val overrides: Map<UnreleasedFlag, Boolean> + private val overrides: Map<BooleanFlag, Boolean> ) : FeatureFlagRepository { - override fun isEnabled(flag: UnreleasedFlag): Boolean = - overrides.getOrDefault(flag, flag.default) + override fun isEnabled(flag: UnreleasedFlag): Boolean = getValue(flag) + override fun isEnabled(flag: ReleasedFlag): Boolean = getValue(flag) - override fun isEnabled(flag: ReleasedFlag): Boolean = flag.default + private fun getValue(flag: BooleanFlag) = overrides.getOrDefault(flag, flag.default) } diff --git a/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java b/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java index 17fd5bd9..82a635dd 100644 --- a/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java +++ b/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java @@ -107,6 +107,7 @@ import com.android.intentresolver.flags.Flags; import com.android.intentresolver.shortcuts.ShortcutLoader; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.flags.BooleanFlag; import org.hamcrest.Description; import org.hamcrest.Matcher; @@ -115,6 +116,8 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.RuleChain; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.mockito.ArgumentCaptor; @@ -123,7 +126,6 @@ import org.mockito.Mockito; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -162,14 +164,40 @@ public class UnbundledChooserActivityTest { return mock; }; + private static final List<BooleanFlag> ALL_FLAGS = + Arrays.asList( + Flags.SHARESHEET_CUSTOM_ACTIONS, + Flags.SHARESHEET_RESELECTION_ACTION, + Flags.SHARESHEET_IMAGE_AND_TEXT_PREVIEW, + Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW); + + private static final Map<BooleanFlag, Boolean> ALL_FLAGS_OFF = + createAllFlagsOverride(false); + private static final Map<BooleanFlag, Boolean> ALL_FLAGS_ON = + createAllFlagsOverride(true); + @Parameterized.Parameters public static Collection packageManagers() { return Arrays.asList(new Object[][] { - {0, "Default PackageManager", DEFAULT_PM}, - {1, "No App Prediction Service", NO_APP_PREDICTION_SERVICE_PM} + // Default PackageManager and all flags off + { DEFAULT_PM, ALL_FLAGS_OFF }, + // Default PackageManager and all flags on + { DEFAULT_PM, ALL_FLAGS_ON }, + // No App Prediction Service and all flags off + { NO_APP_PREDICTION_SERVICE_PM, ALL_FLAGS_OFF }, + // No App Prediction Service and all flags on + { NO_APP_PREDICTION_SERVICE_PM, ALL_FLAGS_ON } }); } + private static Map<BooleanFlag, Boolean> createAllFlagsOverride(boolean value) { + HashMap<BooleanFlag, Boolean> overrides = new HashMap<>(ALL_FLAGS.size()); + for (BooleanFlag flag : ALL_FLAGS) { + overrides.put(flag, value); + } + return overrides; + } + /* -------- * Subclasses can override the following methods to customize test behavior. * -------- @@ -189,6 +217,8 @@ public class UnbundledChooserActivityTest { .adoptShellPermissionIdentity(); cleanOverrideData(); + ChooserActivityOverrideData.getInstance().featureFlagRepository = + new TestFeatureFlagRepository(mFlags); } /** @@ -221,11 +251,13 @@ public class UnbundledChooserActivityTest { * -------- */ + @Rule + public final TestRule mRule; + // Shared test code references the activity under test as ChooserActivity, the common ancestor // of any (inheritance-based) chooser implementation. For testing purposes, that activity will // usually be cast to IChooserWrapper to expose instrumentation. - @Rule - public ActivityTestRule<ChooserActivity> mActivityRule = + private ActivityTestRule<ChooserActivity> mActivityRule = new ActivityTestRule<>(ChooserActivity.class, false, false) { @Override public ChooserActivity launchActivity(Intent clientIntent) { @@ -252,16 +284,20 @@ public class UnbundledChooserActivityTest { private static final int CONTENT_PREVIEW_IMAGE = 1; private static final int CONTENT_PREVIEW_FILE = 2; private static final int CONTENT_PREVIEW_TEXT = 3; - private Function<PackageManager, PackageManager> mPackageManagerOverride; - private int mTestNum; + + private final Function<PackageManager, PackageManager> mPackageManagerOverride; + private final Map<BooleanFlag, Boolean> mFlags; public UnbundledChooserActivityTest( - int testNum, - String testName, - Function<PackageManager, PackageManager> packageManagerOverride) { + Function<PackageManager, PackageManager> packageManagerOverride, + Map<BooleanFlag, Boolean> flags) { mPackageManagerOverride = packageManagerOverride; - mTestNum = testNum; + mFlags = flags; + + mRule = RuleChain + .outerRule(new FeatureFlagRule(flags)) + .around(mActivityRule); } private void setDeviceConfigProperty( @@ -757,10 +793,10 @@ public class UnbundledChooserActivityTest { } @Test + @RequireFeatureFlags( + flags = { Flags.SHARESHEET_IMAGE_AND_TEXT_PREVIEW_NAME }, + values = { true }) public void testImagePlusTextSharing_ExcludeText() { - ChooserActivityOverrideData.getInstance().featureFlagRepository = - new TestFeatureFlagRepository( - Collections.singletonMap(Flags.SHARESHEET_IMAGE_AND_TEXT_PREVIEW, true)); Intent sendIntent = createSendImageIntent( Uri.parse("android.resource://com.android.frameworks.coretests/" + R.drawable.test320x240)); @@ -809,10 +845,10 @@ public class UnbundledChooserActivityTest { } @Test + @RequireFeatureFlags( + flags = { Flags.SHARESHEET_IMAGE_AND_TEXT_PREVIEW_NAME }, + values = { true }) public void testImagePlusTextSharing_RemoveAndAddBackText() { - ChooserActivityOverrideData.getInstance().featureFlagRepository = - new TestFeatureFlagRepository( - Collections.singletonMap(Flags.SHARESHEET_IMAGE_AND_TEXT_PREVIEW, true)); Intent sendIntent = createSendImageIntent( Uri.parse("android.resource://com.android.frameworks.coretests/" + R.drawable.test320x240)); @@ -865,10 +901,10 @@ public class UnbundledChooserActivityTest { } @Test + @RequireFeatureFlags( + flags = { Flags.SHARESHEET_IMAGE_AND_TEXT_PREVIEW_NAME }, + values = { true }) public void testImagePlusTextSharing_TextExclusionDoesNotAffectAlternativeIntent() { - ChooserActivityOverrideData.getInstance().featureFlagRepository = - new TestFeatureFlagRepository( - Collections.singletonMap(Flags.SHARESHEET_IMAGE_AND_TEXT_PREVIEW, true)); Intent sendIntent = createSendImageIntent( Uri.parse("android.resource://com.android.frameworks.coretests/" + R.drawable.test320x240)); @@ -1070,10 +1106,10 @@ public class UnbundledChooserActivityTest { } @Test + @RequireFeatureFlags( + flags = { Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW_NAME }, + values = { false }) public void twoVisibleImagePreview() { - ChooserActivityOverrideData.getInstance().featureFlagRepository = - new TestFeatureFlagRepository( - Collections.singletonMap(Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW, false)); Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" + R.drawable.test320x240); @@ -1110,11 +1146,10 @@ public class UnbundledChooserActivityTest { } @Test + @RequireFeatureFlags( + flags = { Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW_NAME }, + values = { false }) public void threeOrMoreVisibleImagePreview() { - ChooserActivityOverrideData.getInstance().featureFlagRepository = - new TestFeatureFlagRepository( - Collections.singletonMap( - Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW, false)); Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" + R.drawable.test320x240); @@ -1154,11 +1189,10 @@ public class UnbundledChooserActivityTest { } @Test + @RequireFeatureFlags( + flags = { Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW_NAME }, + values = { true }) public void testManyVisibleImagePreview_ScrollableImagePreview() { - ChooserActivityOverrideData.getInstance().featureFlagRepository = - new TestFeatureFlagRepository( - Collections.singletonMap( - Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW, true)); Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" + R.drawable.test320x240); @@ -1204,10 +1238,10 @@ public class UnbundledChooserActivityTest { } @Test + @RequireFeatureFlags( + flags = { Flags.SHARESHEET_IMAGE_AND_TEXT_PREVIEW_NAME }, + values = { true }) public void testImageAndTextPreview() { - ChooserActivityOverrideData.getInstance().featureFlagRepository = - new TestFeatureFlagRepository( - Collections.singletonMap(Flags.SHARESHEET_IMAGE_AND_TEXT_PREVIEW, true)); final Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" + R.drawable.test320x240); final String sharedText = "text-" + System.currentTimeMillis(); @@ -1943,10 +1977,10 @@ public class UnbundledChooserActivityTest { } @Test + @RequireFeatureFlags( + flags = { Flags.SHARESHEET_CUSTOM_ACTIONS_NAME }, + values = { true }) public void testLaunchWithCustomAction() throws InterruptedException { - ChooserActivityOverrideData.getInstance().featureFlagRepository = - new TestFeatureFlagRepository( - Collections.singletonMap(Flags.SHARESHEET_CUSTOM_ACTIONS, true)); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); when( ChooserActivityOverrideData @@ -1998,10 +2032,10 @@ public class UnbundledChooserActivityTest { } @Test + @RequireFeatureFlags( + flags = { Flags.SHARESHEET_RESELECTION_ACTION_NAME }, + values = { true }) public void testLaunchWithShareModification() throws InterruptedException { - ChooserActivityOverrideData.getInstance().featureFlagRepository = - new TestFeatureFlagRepository( - Collections.singletonMap(Flags.SHARESHEET_RESELECTION_ACTION, true)); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); when( ChooserActivityOverrideData |