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