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 android.adservices.ondevicepersonalization; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.junit.Assert.assertFalse; 22 import static org.junit.Assert.assertNotNull; 23 import static org.junit.Assert.assertTrue; 24 25 import android.adservices.ondevicepersonalization.aidl.IExecuteCallback; 26 import android.adservices.ondevicepersonalization.aidl.IIsFeatureEnabledCallback; 27 import android.adservices.ondevicepersonalization.aidl.IOnDevicePersonalizationManagingService; 28 import android.adservices.ondevicepersonalization.aidl.IRegisterMeasurementEventCallback; 29 import android.adservices.ondevicepersonalization.aidl.IRequestSurfacePackageCallback; 30 import android.content.ComponentName; 31 import android.content.Context; 32 import android.os.Bundle; 33 import android.os.IBinder; 34 import android.os.RemoteException; 35 import android.os.SystemClock; 36 37 import androidx.test.core.app.ApplicationProvider; 38 39 import com.android.compatibility.common.util.ShellUtils; 40 import com.android.federatedcompute.internal.util.AbstractServiceBinder; 41 import com.android.modules.utils.build.SdkLevel; 42 import com.android.ondevicepersonalization.internal.util.LoggerFactory; 43 import com.android.ondevicepersonalization.testing.utils.ResultReceiver; 44 45 import org.junit.Before; 46 import org.junit.Test; 47 import org.mockito.MockitoAnnotations; 48 49 import java.util.concurrent.Executor; 50 import java.util.concurrent.Executors; 51 52 public class OnDevicePersonalizationQueryFeatureAvailabilityManagerTest { 53 private static final LoggerFactory.Logger sLogger = LoggerFactory.getLogger(); 54 private static final String TAG = "OnDevicePersonalizationIsFeatureEnabledManagerTest"; 55 private final Context mContext = ApplicationProvider.getApplicationContext(); 56 private final TestServiceBinder mTestBinder = new TestServiceBinder( 57 IOnDevicePersonalizationManagingService.Stub.asInterface(new TestService())); 58 private final OnDevicePersonalizationManager mManager = 59 new OnDevicePersonalizationManager(mContext, mTestBinder); 60 61 private volatile boolean mLogApiStatsCalled = false; 62 63 @Before setUp()64 public void setUp() throws Exception { 65 mLogApiStatsCalled = false; 66 MockitoAnnotations.initMocks(this); 67 ShellUtils.runShellCommand( 68 "device_config put on_device_personalization " 69 + "shared_isolated_process_feature_enabled " 70 + SdkLevel.isAtLeastU()); 71 } 72 73 @Test queryFeatureAvailabilitySuccess()74 public void queryFeatureAvailabilitySuccess() throws Exception { 75 var receiver = new ResultReceiver<Integer>(); 76 77 mManager.queryFeatureAvailability( 78 "success", Executors.newSingleThreadExecutor(), receiver); 79 assertTrue(receiver.isSuccess()); 80 assertFalse(receiver.isError()); 81 assertNotNull(receiver.getResult()); 82 assertTrue(mLogApiStatsCalled); 83 assertThat(receiver.getResult()).isEqualTo(OnDevicePersonalizationManager.FEATURE_DISABLED); 84 } 85 86 @Test queryFeatureAvailabilityException()87 public void queryFeatureAvailabilityException() throws Exception { 88 var receiver = new ResultReceiver<Integer>(); 89 90 mManager.queryFeatureAvailability( 91 "error", Executors.newSingleThreadExecutor(), receiver); 92 assertFalse(receiver.isSuccess()); 93 assertTrue(receiver.isError()); 94 assertTrue(receiver.getException() instanceof IllegalStateException); 95 assertTrue(mLogApiStatsCalled); 96 } 97 98 private class TestService extends IOnDevicePersonalizationManagingService.Stub { 99 @Override getVersion()100 public String getVersion() { 101 return "1.0"; 102 } 103 104 @Override execute( String callingPackageName, ComponentName handler, Bundle wrappedParams, CallerMetadata metadata, ExecuteOptionsParcel options, IExecuteCallback callback)105 public void execute( 106 String callingPackageName, 107 ComponentName handler, 108 Bundle wrappedParams, 109 CallerMetadata metadata, 110 ExecuteOptionsParcel options, 111 IExecuteCallback callback) { 112 throw new UnsupportedOperationException(); 113 } 114 115 @Override requestSurfacePackage( String surfacePackageToken, IBinder hostToken, int displayId, int width, int height, CallerMetadata metadata, IRequestSurfacePackageCallback callback)116 public void requestSurfacePackage( 117 String surfacePackageToken, 118 IBinder hostToken, 119 int displayId, 120 int width, 121 int height, 122 CallerMetadata metadata, 123 IRequestSurfacePackageCallback callback) { 124 throw new UnsupportedOperationException(); 125 } 126 127 @Override registerMeasurementEvent( int eventType, Bundle params, CallerMetadata metadata, IRegisterMeasurementEventCallback callback)128 public void registerMeasurementEvent( 129 int eventType, 130 Bundle params, 131 CallerMetadata metadata, 132 IRegisterMeasurementEventCallback callback) { 133 throw new UnsupportedOperationException(); 134 } 135 136 @Override isFeatureEnabled( String featureName, CallerMetadata metadata, IIsFeatureEnabledCallback callback)137 public void isFeatureEnabled( 138 String featureName, 139 CallerMetadata metadata, 140 IIsFeatureEnabledCallback callback) throws RemoteException { 141 if (featureName.equals("success")) { 142 callback.onResult(OnDevicePersonalizationManager.FEATURE_DISABLED, 143 new CalleeMetadata.Builder() 144 .setCallbackInvokeTimeMillis(SystemClock.elapsedRealtime()) 145 .build()); 146 } else if (featureName.equals("error")) { 147 throw new IllegalStateException(); 148 } else { 149 throw new UnsupportedOperationException(); 150 } 151 } 152 153 @Override logApiCallStats( String sdkPackageName, int apiName, long latencyMillis, long rpcCallLatencyMillis, long rpcReturnLatencyMillis, int responseCode)154 public void logApiCallStats( 155 String sdkPackageName, 156 int apiName, 157 long latencyMillis, 158 long rpcCallLatencyMillis, 159 long rpcReturnLatencyMillis, 160 int responseCode) { 161 mLogApiStatsCalled = true; 162 } 163 } 164 private static class TestServiceBinder 165 extends AbstractServiceBinder<IOnDevicePersonalizationManagingService> { 166 private final IOnDevicePersonalizationManagingService mService; 167 TestServiceBinder(IOnDevicePersonalizationManagingService service)168 TestServiceBinder(IOnDevicePersonalizationManagingService service) { 169 mService = service; 170 } 171 172 @Override getService(Executor executor)173 public IOnDevicePersonalizationManagingService getService(Executor executor) { 174 return mService; 175 } 176 177 @Override unbindFromService()178 public void unbindFromService() {} 179 } 180 181 } 182