• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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