1 /* 2 * Copyright (C) 2024 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 com.android.cts.packagemanager.stats.host; 18 19 import static android.content.pm.Flags.FLAG_COMPONENT_STATE_CHANGED_METRICS; 20 21 import static com.android.os.packagemanager.ComponentStateChangedReported.ComponentState.COMPONENT_STATE_DEFAULT; 22 import static com.android.os.packagemanager.ComponentStateChangedReported.ComponentState.COMPONENT_STATE_DISABLED; 23 import static com.android.os.packagemanager.ComponentStateChangedReported.ComponentState.COMPONENT_STATE_ENABLED; 24 25 import static com.google.common.truth.Truth.assertThat; 26 27 import android.cts.statsdatom.lib.AtomTestUtils; 28 import android.cts.statsdatom.lib.ConfigUtils; 29 import android.cts.statsdatom.lib.DeviceUtils; 30 import android.cts.statsdatom.lib.ReportUtils; 31 import android.platform.test.annotations.AppModeFull; 32 import android.platform.test.annotations.RequiresFlagsEnabled; 33 import android.platform.test.flag.junit.CheckFlagsRule; 34 import android.platform.test.flag.junit.host.HostFlagsValueProvider; 35 36 import com.android.os.StatsLog; 37 import com.android.os.packagemanager.ComponentStateChangedReported; 38 import com.android.os.packagemanager.PackagemanagerExtensionAtoms; 39 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; 40 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; 41 import com.android.tradefed.util.RunUtil; 42 43 import com.google.protobuf.ExtensionRegistry; 44 45 import org.junit.After; 46 import org.junit.Before; 47 import org.junit.Rule; 48 import org.junit.Test; 49 import org.junit.runner.RunWith; 50 51 import java.util.ArrayList; 52 import java.util.List; 53 54 /** 55 * Tests for ComponentStateChangedReported logging. 56 */ 57 @RunWith(DeviceJUnit4ClassRunner.class) 58 @AppModeFull 59 public class ComponentStateChangedReportedStatsTests extends BaseHostJUnit4Test { 60 private static final String TEST_INSTALL_APK = "CtsStatsdAtomTestComponentStateApp.apk"; 61 private static final String TEST_INSTALL_PACKAGE = 62 "com.android.cts.packagemanager.stats.testcomponentstateapp"; 63 private static final String HELPER_PACKAGE = "com.android.cts.packagemanager.stats.device"; 64 private static final String HELPER_CLASS = 65 HELPER_PACKAGE + ".ComponentStateChangedReportedStatsTestsHelper"; 66 private static final String TEST_METHOD_SET_APPLICATION_ENABLED_SETTING = 67 "testSetApplicationEnabledSetting"; 68 private static final String TEST_METHOD_SET_COMPONENT_ENABLED_SETTING_FOR_LAUNCHER_ACTIVITY = 69 "testSetComponentEnabledSettingForLauncherActivity"; 70 private static final String TEST_METHOD_SET_COMPONENT_ENABLED_SETTING_FOR_NO_LAUNCHER_ACTIVITY = 71 "testSetComponentEnabledSettingForNoLauncherActivity"; 72 private static final String TEST_METHOD_SET_COMPONENT_ENABLED_SETTING_ENABLED_THEN_DISABLED = 73 "testSetComponentEnabledSettingEnabledThenDisabled"; 74 private static final String TEST_METHOD_SET_COMPONENT_ENABLED_SETTING_TWO_LAUNCHER_ACTIVITIES = 75 "testComponentStateChangedReportedForTwoDifferentStateLauncherActivities"; 76 private static final String TEST_METHOD_SET_APPLICATION_ENABLED_THEN_DISABLED = 77 "testComponentStateChangedReportedEnabledThenDisabledWholeApp"; 78 79 @Rule 80 public final CheckFlagsRule mCheckFlagsRule = 81 HostFlagsValueProvider.createCheckFlagsRule(this::getDevice); 82 83 @Before setUp()84 public void setUp() throws Exception { 85 installPackage("CtsStatsdAtomApp.apk"); 86 ConfigUtils.removeConfig(getDevice()); 87 ReportUtils.clearReports(getDevice()); 88 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG); 89 } 90 91 @After tearDown()92 public void tearDown() throws Exception { 93 getDevice().uninstallPackage(TEST_INSTALL_PACKAGE); 94 ConfigUtils.removeConfig(getDevice()); 95 ReportUtils.clearReports(getDevice()); 96 } 97 98 @RequiresFlagsEnabled(FLAG_COMPONENT_STATE_CHANGED_METRICS) 99 @Test testComponentStateChangedReportedForWholeApp()100 public void testComponentStateChangedReportedForWholeApp() throws Throwable { 101 ConfigUtils.uploadConfigForPushedAtom(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG, 102 PackagemanagerExtensionAtoms.COMPONENT_STATE_CHANGED_REPORTED_FIELD_NUMBER); 103 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT); 104 105 ExtensionRegistry registry = ExtensionRegistry.newInstance(); 106 PackagemanagerExtensionAtoms.registerAllExtensions(registry); 107 108 installPackage(TEST_INSTALL_APK); 109 assertThat(getDevice().isPackageInstalled(TEST_INSTALL_PACKAGE, 110 String.valueOf(getDevice().getCurrentUser()))).isTrue(); 111 112 // Run test in CTS package 113 runDeviceTests(getDevice(), HELPER_PACKAGE, HELPER_CLASS, 114 TEST_METHOD_SET_APPLICATION_ENABLED_SETTING); 115 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG); 116 117 List<StatsLog.EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice(), 118 registry); 119 data = retrieveEventMetricDataChangeFromTestComponentStateApp(data); 120 assertThat(data.isEmpty()).isFalse(); 121 122 ComponentStateChangedReported atom = data.get(0).getAtom().getExtension( 123 PackagemanagerExtensionAtoms.componentStateChangedReported); 124 assertThat(atom.getUid()).isEqualTo( 125 PackageManagerStatsTestsBase.getAppUid(getDevice(), TEST_INSTALL_PACKAGE)); 126 assertThat(atom.getComponentOldState()).isEqualTo(COMPONENT_STATE_DEFAULT); 127 assertThat(atom.getComponentNewState()).isEqualTo(COMPONENT_STATE_ENABLED); 128 assertThat(atom.getIsLauncher()).isFalse(); 129 assertThat(atom.getIsForWholeApp()).isTrue(); 130 assertThat(atom.getCallingUid()).isEqualTo( 131 PackageManagerStatsTestsBase.getAppUid(getDevice(), HELPER_PACKAGE)); 132 } 133 134 @RequiresFlagsEnabled(FLAG_COMPONENT_STATE_CHANGED_METRICS) 135 @Test testComponentStateChangedReportedForLauncherActivity()136 public void testComponentStateChangedReportedForLauncherActivity() throws Throwable { 137 ConfigUtils.uploadConfigForPushedAtom(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG, 138 PackagemanagerExtensionAtoms.COMPONENT_STATE_CHANGED_REPORTED_FIELD_NUMBER); 139 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT); 140 141 ExtensionRegistry registry = ExtensionRegistry.newInstance(); 142 PackagemanagerExtensionAtoms.registerAllExtensions(registry); 143 144 installPackage(TEST_INSTALL_APK); 145 assertThat(getDevice().isPackageInstalled(TEST_INSTALL_PACKAGE, 146 String.valueOf(getDevice().getCurrentUser()))).isTrue(); 147 148 // Run test in CTS package 149 runDeviceTests(getDevice(), HELPER_PACKAGE, HELPER_CLASS, 150 TEST_METHOD_SET_COMPONENT_ENABLED_SETTING_FOR_LAUNCHER_ACTIVITY); 151 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG); 152 153 List<StatsLog.EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice(), 154 registry); 155 data = retrieveEventMetricDataChangeFromTestComponentStateApp(data); 156 assertThat(data.isEmpty()).isFalse(); 157 158 ComponentStateChangedReported atom = data.get(0).getAtom().getExtension( 159 PackagemanagerExtensionAtoms.componentStateChangedReported); 160 assertThat(atom.getUid()).isEqualTo( 161 PackageManagerStatsTestsBase.getAppUid(getDevice(), TEST_INSTALL_PACKAGE)); 162 assertThat(atom.getComponentOldState()).isEqualTo(COMPONENT_STATE_DEFAULT); 163 assertThat(atom.getComponentNewState()).isEqualTo(COMPONENT_STATE_ENABLED); 164 assertThat(atom.getIsLauncher()).isTrue(); 165 assertThat(atom.getIsForWholeApp()).isFalse(); 166 assertThat(atom.getCallingUid()).isEqualTo( 167 PackageManagerStatsTestsBase.getAppUid(getDevice(), HELPER_PACKAGE)); 168 } 169 170 @RequiresFlagsEnabled(FLAG_COMPONENT_STATE_CHANGED_METRICS) 171 @Test testComponentStateChangedReportedForNoLauncherActivity()172 public void testComponentStateChangedReportedForNoLauncherActivity() throws Throwable { 173 ConfigUtils.uploadConfigForPushedAtom(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG, 174 PackagemanagerExtensionAtoms.COMPONENT_STATE_CHANGED_REPORTED_FIELD_NUMBER); 175 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT); 176 177 ExtensionRegistry registry = ExtensionRegistry.newInstance(); 178 PackagemanagerExtensionAtoms.registerAllExtensions(registry); 179 180 installPackage(TEST_INSTALL_APK); 181 assertThat(getDevice().isPackageInstalled(TEST_INSTALL_PACKAGE, 182 String.valueOf(getDevice().getCurrentUser()))).isTrue(); 183 184 // Run test in CTS package 185 runDeviceTests(getDevice(), HELPER_PACKAGE, HELPER_CLASS, 186 TEST_METHOD_SET_COMPONENT_ENABLED_SETTING_FOR_NO_LAUNCHER_ACTIVITY); 187 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG); 188 189 List<StatsLog.EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice(), 190 registry); 191 data = retrieveEventMetricDataChangeFromTestComponentStateApp(data); 192 assertThat(data.isEmpty()).isFalse(); 193 194 ComponentStateChangedReported atom = data.get(0).getAtom().getExtension( 195 PackagemanagerExtensionAtoms.componentStateChangedReported); 196 assertThat(atom.getUid()).isEqualTo( 197 PackageManagerStatsTestsBase.getAppUid(getDevice(), TEST_INSTALL_PACKAGE)); 198 assertThat(atom.getComponentOldState()).isEqualTo(COMPONENT_STATE_DEFAULT); 199 assertThat(atom.getComponentNewState()).isEqualTo(COMPONENT_STATE_ENABLED); 200 assertThat(atom.getIsLauncher()).isFalse(); 201 assertThat(atom.getIsForWholeApp()).isFalse(); 202 assertThat(atom.getCallingUid()).isEqualTo( 203 PackageManagerStatsTestsBase.getAppUid(getDevice(), HELPER_PACKAGE)); 204 } 205 206 @RequiresFlagsEnabled(FLAG_COMPONENT_STATE_CHANGED_METRICS) 207 @Test testComponentStateChangedReportedEnabledThenDisabled()208 public void testComponentStateChangedReportedEnabledThenDisabled() throws Throwable { 209 ConfigUtils.uploadConfigForPushedAtom(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG, 210 PackagemanagerExtensionAtoms.COMPONENT_STATE_CHANGED_REPORTED_FIELD_NUMBER); 211 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT); 212 213 ExtensionRegistry registry = ExtensionRegistry.newInstance(); 214 PackagemanagerExtensionAtoms.registerAllExtensions(registry); 215 216 installPackage(TEST_INSTALL_APK); 217 assertThat(getDevice().isPackageInstalled(TEST_INSTALL_PACKAGE, 218 String.valueOf(getDevice().getCurrentUser()))).isTrue(); 219 220 // Run test in CTS package 221 runDeviceTests(getDevice(), HELPER_PACKAGE, HELPER_CLASS, 222 TEST_METHOD_SET_COMPONENT_ENABLED_SETTING_ENABLED_THEN_DISABLED); 223 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG); 224 225 List<StatsLog.EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice(), 226 registry); 227 data = retrieveEventMetricDataChangeFromTestComponentStateApp(data); 228 assertThat(data.size()).isEqualTo(2); 229 230 ComponentStateChangedReported atom1 = data.get(0).getAtom().getExtension( 231 PackagemanagerExtensionAtoms.componentStateChangedReported); 232 assertThat(atom1.getUid()).isEqualTo( 233 PackageManagerStatsTestsBase.getAppUid(getDevice(), TEST_INSTALL_PACKAGE)); 234 assertThat(atom1.getComponentOldState()).isEqualTo(COMPONENT_STATE_DEFAULT); 235 assertThat(atom1.getComponentNewState()).isEqualTo(COMPONENT_STATE_ENABLED); 236 assertThat(atom1.getIsLauncher()).isFalse(); 237 assertThat(atom1.getIsForWholeApp()).isFalse(); 238 assertThat(atom1.getCallingUid()).isEqualTo( 239 PackageManagerStatsTestsBase.getAppUid(getDevice(), HELPER_PACKAGE)); 240 241 ComponentStateChangedReported atom2 = data.get(1).getAtom().getExtension( 242 PackagemanagerExtensionAtoms.componentStateChangedReported); 243 assertThat(atom2.getUid()).isEqualTo( 244 PackageManagerStatsTestsBase.getAppUid(getDevice(), TEST_INSTALL_PACKAGE)); 245 assertThat(atom2.getComponentOldState()).isEqualTo(COMPONENT_STATE_ENABLED); 246 assertThat(atom2.getComponentNewState()).isEqualTo(COMPONENT_STATE_DISABLED); 247 assertThat(atom2.getIsLauncher()).isFalse(); 248 assertThat(atom2.getIsForWholeApp()).isFalse(); 249 assertThat(atom2.getCallingUid()).isEqualTo( 250 PackageManagerStatsTestsBase.getAppUid(getDevice(), HELPER_PACKAGE)); 251 } 252 253 @RequiresFlagsEnabled(FLAG_COMPONENT_STATE_CHANGED_METRICS) 254 @Test testComponentStateChangedReportedEnabledThenDisabledWholeApp()255 public void testComponentStateChangedReportedEnabledThenDisabledWholeApp() throws Throwable { 256 ConfigUtils.uploadConfigForPushedAtom(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG, 257 PackagemanagerExtensionAtoms.COMPONENT_STATE_CHANGED_REPORTED_FIELD_NUMBER); 258 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT); 259 260 ExtensionRegistry registry = ExtensionRegistry.newInstance(); 261 PackagemanagerExtensionAtoms.registerAllExtensions(registry); 262 263 installPackage(TEST_INSTALL_APK); 264 assertThat(getDevice().isPackageInstalled(TEST_INSTALL_PACKAGE, 265 String.valueOf(getDevice().getCurrentUser()))).isTrue(); 266 267 // Run test in CTS package 268 runDeviceTests(getDevice(), HELPER_PACKAGE, HELPER_CLASS, 269 TEST_METHOD_SET_APPLICATION_ENABLED_THEN_DISABLED); 270 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG); 271 272 List<StatsLog.EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice(), 273 registry); 274 data = retrieveEventMetricDataChangeFromTestComponentStateApp(data); 275 assertThat(data.size()).isEqualTo(2); 276 277 ComponentStateChangedReported atom1 = data.get(0).getAtom().getExtension( 278 PackagemanagerExtensionAtoms.componentStateChangedReported); 279 assertThat(atom1.getUid()).isEqualTo( 280 PackageManagerStatsTestsBase.getAppUid(getDevice(), TEST_INSTALL_PACKAGE)); 281 assertThat(atom1.getComponentOldState()).isEqualTo(COMPONENT_STATE_DEFAULT); 282 assertThat(atom1.getComponentNewState()).isEqualTo(COMPONENT_STATE_ENABLED); 283 assertThat(atom1.getIsLauncher()).isFalse(); 284 assertThat(atom1.getIsForWholeApp()).isTrue(); 285 assertThat(atom1.getCallingUid()).isEqualTo( 286 PackageManagerStatsTestsBase.getAppUid(getDevice(), HELPER_PACKAGE)); 287 288 ComponentStateChangedReported atom2 = data.get(1).getAtom().getExtension( 289 PackagemanagerExtensionAtoms.componentStateChangedReported); 290 assertThat(atom2.getUid()).isEqualTo( 291 PackageManagerStatsTestsBase.getAppUid(getDevice(), TEST_INSTALL_PACKAGE)); 292 assertThat(atom2.getComponentOldState()).isEqualTo(COMPONENT_STATE_ENABLED); 293 assertThat(atom2.getComponentNewState()).isEqualTo(COMPONENT_STATE_DISABLED); 294 assertThat(atom2.getIsLauncher()).isFalse(); 295 assertThat(atom2.getIsForWholeApp()).isTrue(); 296 assertThat(atom2.getCallingUid()).isEqualTo( 297 PackageManagerStatsTestsBase.getAppUid(getDevice(), HELPER_PACKAGE)); 298 } 299 300 @RequiresFlagsEnabled(FLAG_COMPONENT_STATE_CHANGED_METRICS) 301 @Test testComponentStateChangedReportedForTwoDifferentStateLauncherActivities()302 public void testComponentStateChangedReportedForTwoDifferentStateLauncherActivities() 303 throws Throwable { 304 ConfigUtils.uploadConfigForPushedAtom(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG, 305 PackagemanagerExtensionAtoms.COMPONENT_STATE_CHANGED_REPORTED_FIELD_NUMBER); 306 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT); 307 308 ExtensionRegistry registry = ExtensionRegistry.newInstance(); 309 PackagemanagerExtensionAtoms.registerAllExtensions(registry); 310 311 installPackage(TEST_INSTALL_APK); 312 assertThat(getDevice().isPackageInstalled(TEST_INSTALL_PACKAGE, 313 String.valueOf(getDevice().getCurrentUser()))).isTrue(); 314 315 // Run test in CTS package 316 runDeviceTests(getDevice(), HELPER_PACKAGE, HELPER_CLASS, 317 TEST_METHOD_SET_COMPONENT_ENABLED_SETTING_TWO_LAUNCHER_ACTIVITIES); 318 RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG); 319 320 List<StatsLog.EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice(), 321 registry); 322 data = retrieveEventMetricDataChangeFromTestComponentStateApp(data); 323 assertThat(data.size()).isEqualTo(2); 324 325 ComponentStateChangedReported atom1 = data.get(0).getAtom().getExtension( 326 PackagemanagerExtensionAtoms.componentStateChangedReported); 327 assertThat(atom1.getUid()).isEqualTo( 328 PackageManagerStatsTestsBase.getAppUid(getDevice(), TEST_INSTALL_PACKAGE)); 329 assertThat(atom1.getComponentOldState()).isEqualTo(COMPONENT_STATE_DEFAULT); 330 assertThat(atom1.getComponentNewState()).isEqualTo(COMPONENT_STATE_DISABLED); 331 assertThat(atom1.getIsLauncher()).isTrue(); 332 assertThat(atom1.getIsForWholeApp()).isFalse(); 333 assertThat(atom1.getCallingUid()).isEqualTo( 334 PackageManagerStatsTestsBase.getAppUid(getDevice(), HELPER_PACKAGE)); 335 336 ComponentStateChangedReported atom2 = data.get(1).getAtom().getExtension( 337 PackagemanagerExtensionAtoms.componentStateChangedReported); 338 assertThat(atom2.getUid()).isEqualTo( 339 PackageManagerStatsTestsBase.getAppUid(getDevice(), TEST_INSTALL_PACKAGE)); 340 assertThat(atom2.getComponentOldState()).isEqualTo(COMPONENT_STATE_DEFAULT); 341 assertThat(atom2.getComponentNewState()).isEqualTo(COMPONENT_STATE_ENABLED); 342 assertThat(atom2.getIsLauncher()).isTrue(); 343 assertThat(atom2.getIsForWholeApp()).isFalse(); 344 assertThat(atom2.getCallingUid()).isEqualTo( 345 PackageManagerStatsTestsBase.getAppUid(getDevice(), HELPER_PACKAGE)); 346 } 347 retrieveEventMetricDataChangeFromTestComponentStateApp( List<StatsLog.EventMetricData> eventMetricData)348 List<StatsLog.EventMetricData> retrieveEventMetricDataChangeFromTestComponentStateApp( 349 List<StatsLog.EventMetricData> eventMetricData) throws Exception { 350 List<StatsLog.EventMetricData> dataList = new ArrayList<>(); 351 if (eventMetricData == null || eventMetricData.size() == 0) { 352 return dataList; 353 } 354 for (int i = 0; i < eventMetricData.size(); i++) { 355 ComponentStateChangedReported atom = eventMetricData.get(i).getAtom().getExtension( 356 PackagemanagerExtensionAtoms.componentStateChangedReported); 357 if (atom != null && atom.getUid() == PackageManagerStatsTestsBase.getAppUid(getDevice(), 358 TEST_INSTALL_PACKAGE)) { 359 dataList.add(eventMetricData.get(i)); 360 } 361 } 362 return dataList; 363 } 364 } 365