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