1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.content.pm; 18 19 import static android.provider.DeviceConfig.NAMESPACE_CONSTRAIN_DISPLAY_APIS; 20 21 import static org.junit.Assert.assertEquals; 22 23 import android.annotation.Nullable; 24 import android.platform.test.annotations.Presubmit; 25 import android.provider.DeviceConfig; 26 import android.provider.DeviceConfig.Properties; 27 28 import androidx.test.filters.SmallTest; 29 30 import org.junit.After; 31 import org.junit.Before; 32 import org.junit.Ignore; 33 import org.junit.Test; 34 35 /** 36 * Test for {@link ConstrainDisplayApisConfig}. 37 * 38 * Build/Install/Run: 39 * atest FrameworksCoreTests:ConstrainDisplayApisConfigTest 40 */ 41 @SmallTest 42 @Presubmit 43 public final class ConstrainDisplayApisConfigTest { 44 45 private Properties mInitialConstrainDisplayApisFlags; 46 47 @Before setUp()48 public void setUp() throws Exception { 49 mInitialConstrainDisplayApisFlags = DeviceConfig.getProperties( 50 NAMESPACE_CONSTRAIN_DISPLAY_APIS); 51 DeviceConfig.setProperties( 52 new Properties.Builder(NAMESPACE_CONSTRAIN_DISPLAY_APIS).build()); 53 } 54 55 @After tearDown()56 public void tearDown() throws Exception { 57 DeviceConfig.setProperties(mInitialConstrainDisplayApisFlags); 58 } 59 60 @Test neverConstrainDisplayApis_allPackagesFlagTrue_returnsTrue()61 public void neverConstrainDisplayApis_allPackagesFlagTrue_returnsTrue() { 62 setNeverConstrainDisplayApisAllPackagesFlag("true"); 63 // Setting 'never_constrain_display_apis' as well to make sure it is ignored. 64 setNeverConstrainDisplayApisFlag("com.android.other:1:2,com.android.other2::"); 65 66 testNeverConstrainDisplayApis("com.android.test", /* version= */ 5, /* expected= */ true); 67 testNeverConstrainDisplayApis("com.android.other", /* version= */ 0, /* expected= */ true); 68 testNeverConstrainDisplayApis("com.android.other", /* version= */ 3, /* expected= */ true); 69 } 70 71 @Test neverConstrainDisplayApis_flagsNoSet_returnsFalse()72 public void neverConstrainDisplayApis_flagsNoSet_returnsFalse() { 73 testNeverConstrainDisplayApis("com.android.test", /* version= */ 1, /* expected= */ false); 74 } 75 76 @Ignore("b/257375674") 77 @Test neverConstrainDisplayApis_flagsHasSingleEntry_returnsTrueForPackageWithinRange()78 public void neverConstrainDisplayApis_flagsHasSingleEntry_returnsTrueForPackageWithinRange() { 79 setNeverConstrainDisplayApisFlag("com.android.test:1:1"); 80 81 testNeverConstrainDisplayApis("com.android.other", /* version= */ 5, /* expected= */ false); 82 testNeverConstrainDisplayApis("com.android.test", /* version= */ 0, /* expected= */ false); 83 testNeverConstrainDisplayApis("com.android.test", /* version= */ 1, /* expected= */ true); 84 testNeverConstrainDisplayApis("com.android.test", /* version= */ 2, /* expected= */ false); 85 } 86 87 @Test neverConstrainDisplayApis_flagHasEntries_returnsTrueForPackagesWithinRange()88 public void neverConstrainDisplayApis_flagHasEntries_returnsTrueForPackagesWithinRange() { 89 setNeverConstrainDisplayApisFlag("com.android.test1::,com.android.test2:1:3," 90 + "com.android.test3:5:,com.android.test4::8"); 91 92 // Package 'com.android.other' 93 testNeverConstrainDisplayApis("com.android.other", /* version= */ 5, /* expected= */ false); 94 // Package 'com.android.test1' 95 testNeverConstrainDisplayApis("com.android.test1", /* version= */ 5, /* expected= */ true); 96 // Package 'com.android.test2' 97 testNeverConstrainDisplayApis("com.android.test2", /* version= */ 0, /* expected= */ false); 98 testNeverConstrainDisplayApis("com.android.test2", /* version= */ 1, /* expected= */ true); 99 testNeverConstrainDisplayApis("com.android.test2", /* version= */ 2, /* expected= */ true); 100 testNeverConstrainDisplayApis("com.android.test2", /* version= */ 3, /* expected= */ true); 101 testNeverConstrainDisplayApis("com.android.test2", /* version= */ 4, /* expected= */ false); 102 // Package 'com.android.test3' 103 testNeverConstrainDisplayApis("com.android.test3", /* version= */ 4, /* expected= */ false); 104 testNeverConstrainDisplayApis("com.android.test3", /* version= */ 5, /* expected= */ true); 105 testNeverConstrainDisplayApis("com.android.test3", /* version= */ 6, /* expected= */ true); 106 // Package 'com.android.test4' 107 testNeverConstrainDisplayApis("com.android.test4", /* version= */ 7, /* expected= */ true); 108 testNeverConstrainDisplayApis("com.android.test4", /* version= */ 8, /* expected= */ true); 109 testNeverConstrainDisplayApis("com.android.test4", /* version= */ 9, /* expected= */ false); 110 } 111 112 @Ignore("b/257375674") 113 @Test neverConstrainDisplayApis_flagHasInvalidEntries_ignoresInvalidEntries()114 public void neverConstrainDisplayApis_flagHasInvalidEntries_ignoresInvalidEntries() { 115 // We add a valid entry before and after the invalid ones to make sure they are applied. 116 setNeverConstrainDisplayApisFlag("com.android.test1::,com.android.test2:1," 117 + "com.android.test3:5:ten,com.android.test4:5::,com.android.test5::"); 118 119 testNeverConstrainDisplayApis("com.android.test1", /* version= */ 5, /* expected= */ true); 120 testNeverConstrainDisplayApis("com.android.test2", /* version= */ 2, /* expected= */ false); 121 testNeverConstrainDisplayApis("com.android.test3", /* version= */ 7, /* expected= */ false); 122 testNeverConstrainDisplayApis("com.android.test4", /* version= */ 7, /* expected= */ false); 123 testNeverConstrainDisplayApis("com.android.test5", /* version= */ 5, /* expected= */ true); 124 } 125 126 @Test alwaysConstrainDisplayApis_flagsNoSet_returnsFalse()127 public void alwaysConstrainDisplayApis_flagsNoSet_returnsFalse() { 128 testAlwaysConstrainDisplayApis("com.android.test", /* version= */ 1, /* expected= */ false); 129 } 130 131 @Test alwaysConstrainDisplayApis_flagHasEntries_returnsTrueForPackagesWithinRange()132 public void alwaysConstrainDisplayApis_flagHasEntries_returnsTrueForPackagesWithinRange() { 133 setAlwaysConstrainDisplayApisFlag("com.android.test1::,com.android.test2:1:2"); 134 135 // Package 'com.android.other' 136 testAlwaysConstrainDisplayApis("com.android.other", /* version= */ 5, /* expected= */ 137 false); 138 // Package 'com.android.test1' 139 testAlwaysConstrainDisplayApis("com.android.test1", /* version= */ 5, /* expected= */ true); 140 // Package 'com.android.test2' 141 testAlwaysConstrainDisplayApis("com.android.test2", /* version= */ 0, /* expected= */ 142 false); 143 testAlwaysConstrainDisplayApis("com.android.test2", /* version= */ 1, /* expected= */ true); 144 testAlwaysConstrainDisplayApis("com.android.test2", /* version= */ 2, /* expected= */ true); 145 testAlwaysConstrainDisplayApis("com.android.test2", /* version= */ 3, /* expected= */ 146 false); 147 } 148 testNeverConstrainDisplayApis(String packageName, long version, boolean expected)149 private static void testNeverConstrainDisplayApis(String packageName, long version, 150 boolean expected) { 151 ConstrainDisplayApisConfig config = new ConstrainDisplayApisConfig(); 152 assertEquals(expected, 153 config.getNeverConstrainDisplayApis(buildApplicationInfo(packageName, version))); 154 } 155 testAlwaysConstrainDisplayApis(String packageName, long version, boolean expected)156 private static void testAlwaysConstrainDisplayApis(String packageName, long version, 157 boolean expected) { 158 ConstrainDisplayApisConfig config = new ConstrainDisplayApisConfig(); 159 160 assertEquals(expected, 161 config.getAlwaysConstrainDisplayApis(buildApplicationInfo(packageName, version))); 162 } 163 buildApplicationInfo(String packageName, long version)164 private static ApplicationInfo buildApplicationInfo(String packageName, long version) { 165 ApplicationInfo applicationInfo = new ApplicationInfo(); 166 applicationInfo.packageName = packageName; 167 applicationInfo.longVersionCode = version; 168 return applicationInfo; 169 } 170 setNeverConstrainDisplayApisFlag(@ullable String value)171 private static void setNeverConstrainDisplayApisFlag(@Nullable String value) { 172 DeviceConfig.setProperty(NAMESPACE_CONSTRAIN_DISPLAY_APIS, "never_constrain_display_apis", 173 value, /* makeDefault= */ false); 174 } 175 setNeverConstrainDisplayApisAllPackagesFlag(@ullable String value)176 private static void setNeverConstrainDisplayApisAllPackagesFlag(@Nullable String value) { 177 DeviceConfig.setProperty(NAMESPACE_CONSTRAIN_DISPLAY_APIS, 178 "never_constrain_display_apis_all_packages", 179 value, /* makeDefault= */ false); 180 } 181 setAlwaysConstrainDisplayApisFlag(@ullable String value)182 private static void setAlwaysConstrainDisplayApisFlag(@Nullable String value) { 183 DeviceConfig.setProperty(NAMESPACE_CONSTRAIN_DISPLAY_APIS, "always_constrain_display_apis", 184 value, /* makeDefault= */ false); 185 } 186 } 187