1 /* 2 * Copyright (C) 2019 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.car.vms; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.Mockito.mock; 22 import static org.mockito.Mockito.times; 23 import static org.mockito.Mockito.verify; 24 import static org.mockito.Mockito.when; 25 26 import android.car.vms.IVmsSubscriberClient; 27 import android.car.vms.VmsLayer; 28 import android.content.pm.PackageManager; 29 import android.os.Binder; 30 import android.os.Process; 31 32 import androidx.test.filters.MediumTest; 33 34 import org.junit.Test; 35 36 import java.util.function.IntSupplier; 37 38 @MediumTest 39 public class VmsBrokerServiceTest { 40 41 class MockIntProvider implements IntSupplier { 42 private int[] mInts; 43 private int mIdx; 44 MockIntProvider(int... ints)45 MockIntProvider(int... ints) { 46 mInts = ints; 47 mIdx = 0; 48 } 49 getAsInt()50 public int getAsInt() { 51 int ret = mInts[mIdx]; 52 mIdx++; 53 return ret; 54 } 55 } 56 57 /** 58 * Test that adding a subscriber to VmsBrokerService also keeps track of the package name for 59 * a given subscriber. Also checks that if we remove a dead subscriber, we no longer track the 60 * package name associated with it. 61 */ 62 @Test testAddSubscription()63 public void testAddSubscription() { 64 PackageManager packageManager = mock(PackageManager.class); 65 IVmsSubscriberClient subscriberClient = mock(IVmsSubscriberClient.class); 66 Binder binder = mock(Binder.class); 67 VmsLayer layer = mock(VmsLayer.class); 68 when(packageManager.getNameForUid(0)).thenReturn("test.package1"); 69 when(subscriberClient.asBinder()).thenReturn(binder); 70 71 VmsBrokerService broker = new VmsBrokerService(packageManager, () -> 200, () -> 0); 72 broker.addSubscription(subscriberClient); 73 assertThat(broker.getPackageName(subscriberClient)).isEqualTo("test.package1"); 74 broker.removeDeadSubscriber(subscriberClient); 75 assertThat(broker.getPackageName(subscriberClient)).isNull(); 76 } 77 78 @Test testAddSubscriptionLayer()79 public void testAddSubscriptionLayer() { 80 PackageManager packageManager = mock(PackageManager.class); 81 IVmsSubscriberClient subscriberClient = mock(IVmsSubscriberClient.class); 82 Binder binder = mock(Binder.class); 83 VmsLayer layer = mock(VmsLayer.class); 84 when(packageManager.getNameForUid(0)).thenReturn("test.package2"); 85 when(subscriberClient.asBinder()).thenReturn(binder); 86 87 VmsBrokerService broker = new VmsBrokerService(packageManager, () -> 200, () -> 0); 88 broker.addSubscription(subscriberClient, layer); 89 assertThat(broker.getPackageName(subscriberClient)).isEqualTo("test.package2"); 90 broker.removeDeadSubscriber(subscriberClient); 91 assertThat(broker.getPackageName(subscriberClient)).isNull(); 92 } 93 94 @Test testAddSubscriptionLayerVersion()95 public void testAddSubscriptionLayerVersion() { 96 PackageManager packageManager = mock(PackageManager.class); 97 IVmsSubscriberClient subscriberClient = mock(IVmsSubscriberClient.class); 98 Binder binder = mock(Binder.class); 99 VmsLayer layer = mock(VmsLayer.class); 100 when(packageManager.getNameForUid(0)).thenReturn("test.package3"); 101 when(subscriberClient.asBinder()).thenReturn(binder); 102 103 VmsBrokerService broker = new VmsBrokerService(packageManager, () -> 200, () -> 0); 104 broker.addSubscription(subscriberClient, layer, 1234); 105 assertThat(broker.getPackageName(subscriberClient)).isEqualTo("test.package3"); 106 broker.removeDeadSubscriber(subscriberClient); 107 assertThat(broker.getPackageName(subscriberClient)).isNull(); 108 } 109 110 @Test testMultipleSubscriptionsSameClientCallsPackageManagerOnce()111 public void testMultipleSubscriptionsSameClientCallsPackageManagerOnce() { 112 PackageManager packageManager = mock(PackageManager.class); 113 IVmsSubscriberClient subscriberClient = mock(IVmsSubscriberClient.class); 114 Binder binder = mock(Binder.class); 115 when(subscriberClient.asBinder()).thenReturn(binder); 116 when(packageManager.getNameForUid(0)).thenReturn("test.package3"); 117 118 VmsBrokerService broker = new VmsBrokerService(packageManager, () -> 0, () -> 0); 119 broker.addSubscription(subscriberClient); 120 broker.addSubscription(subscriberClient); 121 // The second argument isn't necessary but is here for clarity. 122 verify(packageManager, times(1)).getNameForUid(0); 123 } 124 125 @Test testUnknownPackageName()126 public void testUnknownPackageName() { 127 PackageManager packageManager = mock(PackageManager.class); 128 IVmsSubscriberClient subscriberClient = mock(IVmsSubscriberClient.class); 129 Binder binder = mock(Binder.class); 130 when(subscriberClient.asBinder()).thenReturn(binder); 131 when(packageManager.getNameForUid(0)).thenReturn(null); 132 133 VmsBrokerService broker = new VmsBrokerService(packageManager, () -> 0, () -> 0); 134 broker.addSubscription(subscriberClient); 135 assertThat(broker.getPackageName(subscriberClient)).isEqualTo( 136 VmsBrokerService.UNKNOWN_PACKAGE); 137 } 138 139 /** 140 * Tests that if the HAL is a subscriber, we record its package name as HalClient. 141 */ 142 @Test testAddingHalSubscriberSavesPackageName()143 public void testAddingHalSubscriberSavesPackageName() { 144 PackageManager packageManager = mock(PackageManager.class); 145 IVmsSubscriberClient subscriberClient = mock(IVmsSubscriberClient.class); 146 147 VmsBrokerService broker = new VmsBrokerService(packageManager, () -> Process.myPid(), 148 () -> Process.SYSTEM_UID); 149 broker.addSubscription(subscriberClient); 150 assertThat(broker.getPackageName(subscriberClient)).isEqualTo(VmsBrokerService.HAL_CLIENT); 151 } 152 153 @Test testMultipleSubscriptionsPackageManager()154 public void testMultipleSubscriptionsPackageManager() { 155 PackageManager packageManager = mock(PackageManager.class); 156 157 IVmsSubscriberClient subscriberClient1 = mock(IVmsSubscriberClient.class); 158 Binder binder1 = mock(Binder.class); 159 when(subscriberClient1.asBinder()).thenReturn(binder1); 160 161 IVmsSubscriberClient subscriberClient2 = mock(IVmsSubscriberClient.class); 162 Binder binder2 = mock(Binder.class); 163 when(subscriberClient2.asBinder()).thenReturn(binder2); 164 165 IVmsSubscriberClient subscriberClient3 = mock(IVmsSubscriberClient.class); 166 Binder binder3 = mock(Binder.class); 167 when(subscriberClient3.asBinder()).thenReturn(binder3); 168 169 // Tests a client with a different UID but the same package as subscriberClient1 170 IVmsSubscriberClient subscriberClient4 = mock(IVmsSubscriberClient.class); 171 Binder binder4 = mock(Binder.class); 172 when(subscriberClient4.asBinder()).thenReturn(binder4); 173 174 when(packageManager.getNameForUid(0)).thenReturn("test.package0"); 175 when(packageManager.getNameForUid(1)).thenReturn("test.package1"); 176 when(packageManager.getNameForUid(2)).thenReturn("test.package2"); 177 when(packageManager.getNameForUid(3)).thenReturn("test.package0"); 178 179 VmsBrokerService broker = new VmsBrokerService(packageManager, () -> 10, 180 new MockIntProvider(0, 1, 2, 3)); 181 182 broker.addSubscription(subscriberClient1); 183 broker.addSubscription(subscriberClient2); 184 broker.addSubscription(subscriberClient3); 185 broker.addSubscription(subscriberClient4); 186 187 verify(packageManager).getNameForUid(0); 188 verify(packageManager).getNameForUid(1); 189 verify(packageManager).getNameForUid(2); 190 verify(packageManager).getNameForUid(3); 191 192 assertThat(broker.getPackageName(subscriberClient1)).isEqualTo("test.package0"); 193 assertThat(broker.getPackageName(subscriberClient2)).isEqualTo("test.package1"); 194 assertThat(broker.getPackageName(subscriberClient3)).isEqualTo("test.package2"); 195 assertThat(broker.getPackageName(subscriberClient4)).isEqualTo("test.package0"); 196 } 197 } 198