• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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.os.lib.app;
18 
19 import static android.Manifest.permission.INSTALL_PACKAGES;
20 
21 import static com.google.common.truth.Truth.assertThat;
22 import static com.google.common.truth.Truth.assertWithMessage;
23 
24 import android.content.Context;
25 import android.content.Intent;
26 import android.content.IntentFilter;
27 
28 import com.android.bedstead.harrier.BedsteadJUnit4;
29 import com.android.bedstead.harrier.DeviceState;
30 import com.android.bedstead.permissions.annotations.EnsureHasPermission;
31 import com.android.bedstead.harrier.annotations.RequireRunOnAdditionalUser;
32 import com.android.bedstead.nene.TestApis;
33 import com.android.bedstead.nene.exceptions.AdbException;
34 import com.android.bedstead.nene.users.UserReference;
35 import com.android.bedstead.nene.utils.ShellCommand;
36 import com.android.bedstead.nene.utils.ShellCommandUtils;
37 import com.android.bedstead.nene.utils.BlockingBroadcastReceiver;
38 
39 import org.junit.Before;
40 import org.junit.ClassRule;
41 import org.junit.Rule;
42 import org.junit.Test;
43 import org.junit.runner.RunWith;
44 
45 /**
46  * On-device tests driven by StaticSharedLibsHostTests. Specifically tests multi user scenarios.
47  */
48 @RunWith(BedsteadJUnit4.class)
49 public class StaticSharedLibsMultiUserTests {
50 
51     private static final String APK_BASE_PATH = "/data/local/tmp/cts/hostside/os/";
52     private static final String STATIC_LIB_PROVIDER3_APK = APK_BASE_PATH
53             + "CtsStaticSharedLibProviderApp3.apk";
54     private static final String STATIC_LIB_PROVIDER3_PKG = "android.os.lib.provider";
55 
56     private static final long TIMEOUT_MS = 10000L;
57 
58     private UserReference mInitialUser;
59     private UserReference mAdditionalUser;
60 
61     Context mContextInitial;
62     Context mContextAdditional;
63 
64     @Rule
65     @ClassRule
66     public static final DeviceState sDeviceState = new DeviceState();
67 
68     @Before
setUp()69     public void setUp() throws Exception {
70         mInitialUser = sDeviceState.initialUser();
71         mAdditionalUser = sDeviceState.additionalUser();
72 
73         mContextInitial = TestApis.context().androidContextAsUser(mInitialUser);
74         mContextAdditional = TestApis.context().androidContextAsUser(mAdditionalUser);
75     }
76 
installPackageAsUser(String apkPath, String installerName, UserReference user)77     private boolean installPackageAsUser(String apkPath, String installerName, UserReference user) {
78         ShellCommand.Builder cmd = ShellCommand.builderForUser(user, "pm install");
79         if (installerName != null) {
80             cmd.addOption("i", installerName);
81         }
82         cmd.addOperand(apkPath);
83         try {
84             return ShellCommandUtils.startsWithSuccess(cmd.execute());
85         } catch (AdbException e) {
86             return false;
87         }
88     }
89 
uninstallPackage(String packageName)90     private boolean uninstallPackage(String packageName) {
91         ShellCommand.Builder cmd = ShellCommand.builder("pm uninstall");
92         cmd.addOperand(packageName);
93         try {
94             return ShellCommandUtils.startsWithSuccess(cmd.execute());
95         } catch (AdbException e) {
96             return false;
97         }
98     }
99 
100     @Test
101     @RequireRunOnAdditionalUser
102     @EnsureHasPermission(INSTALL_PACKAGES)
testStaticSharedLibInstallOnSecondaryUser_broadcastReceivedByAllUsers()103     public void testStaticSharedLibInstallOnSecondaryUser_broadcastReceivedByAllUsers() {
104         IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
105         filter.addDataScheme("package");
106         BlockingBroadcastReceiver initialReceiver =
107                 sDeviceState.registerBroadcastReceiverForUser(mInitialUser, filter);
108         BlockingBroadcastReceiver additionalReceiver =
109                 sDeviceState.registerBroadcastReceiverForUser(mAdditionalUser, filter);
110 
111         assertThat(installPackageAsUser(STATIC_LIB_PROVIDER3_APK,
112                 mContextAdditional.getPackageName(), mAdditionalUser)).isTrue();
113 
114         Intent intent = initialReceiver.awaitForBroadcast(TIMEOUT_MS);
115         assertWithMessage("Initial user should get the broadcast.")
116                 .that(intent).isNotNull();
117         assertWithMessage("Incorrect broadcast action in initial user")
118                 .that(intent.getAction()).isEqualTo(Intent.ACTION_PACKAGE_ADDED);
119 
120         intent = additionalReceiver.awaitForBroadcast(TIMEOUT_MS);
121         assertWithMessage("Additional user should get the broadcast.")
122                 .that(intent).isNotNull();
123         assertWithMessage("Incorrect broadcast action in additional user")
124                 .that(intent.getAction()).isEqualTo(Intent.ACTION_PACKAGE_ADDED);
125 
126         initialReceiver.unregisterQuietly();
127         additionalReceiver.unregisterQuietly();
128         uninstallPackage(STATIC_LIB_PROVIDER3_PKG);
129     }
130 
131     @Test
132     @RequireRunOnAdditionalUser
133     @EnsureHasPermission(INSTALL_PACKAGES)
testStaticSharedLibUninstallOnAllUsers_broadcastReceivedByAllUsers()134     public void testStaticSharedLibUninstallOnAllUsers_broadcastReceivedByAllUsers() {
135         IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
136         filter.addDataScheme("package");
137         BlockingBroadcastReceiver initialReceiver =
138                 sDeviceState.registerBroadcastReceiverForUser(mInitialUser, filter);
139         BlockingBroadcastReceiver additionalReceiver =
140                 sDeviceState.registerBroadcastReceiverForUser(mAdditionalUser, filter);
141 
142         assertThat(installPackageAsUser(STATIC_LIB_PROVIDER3_APK,
143                 mContextAdditional.getPackageName(), mAdditionalUser)).isTrue();
144         assertThat(uninstallPackage(STATIC_LIB_PROVIDER3_PKG)).isTrue();
145 
146         Intent intent = initialReceiver.awaitForBroadcast(TIMEOUT_MS);
147         assertWithMessage("Initial user should get the broadcast")
148                 .that(intent).isNotNull();
149         assertWithMessage("Incorrect broadcast action in initial user")
150                 .that(intent.getAction()).isEqualTo(Intent.ACTION_PACKAGE_REMOVED);
151 
152         intent = additionalReceiver.awaitForBroadcast(TIMEOUT_MS);
153         assertWithMessage("Additional user should get the broadcast")
154                 .that(intent).isNotNull();
155         assertWithMessage("Incorrect broadcast action in additional user")
156                 .that(intent.getAction()).isEqualTo(Intent.ACTION_PACKAGE_REMOVED);
157 
158         initialReceiver.unregisterQuietly();
159         additionalReceiver.unregisterQuietly();
160     }
161 }
162