1 /* 2 * Copyright 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 org.junit.Assert.assertFalse; 20 import static org.junit.Assert.assertThrows; 21 import static org.junit.Assert.assertTrue; 22 23 import android.adservices.ondevicepersonalization.aidl.IExecuteCallback; 24 import android.adservices.ondevicepersonalization.aidl.IIsFeatureEnabledCallback; 25 import android.adservices.ondevicepersonalization.aidl.IOnDevicePersonalizationManagingService; 26 import android.adservices.ondevicepersonalization.aidl.IRegisterMeasurementEventCallback; 27 import android.adservices.ondevicepersonalization.aidl.IRequestSurfacePackageCallback; 28 import android.content.ComponentName; 29 import android.content.Context; 30 import android.net.Uri; 31 import android.os.Bundle; 32 import android.os.IBinder; 33 import android.os.RemoteException; 34 import android.os.SystemClock; 35 import android.util.Log; 36 37 import androidx.test.core.app.ApplicationProvider; 38 import androidx.test.ext.junit.runners.AndroidJUnit4; 39 40 import com.android.federatedcompute.internal.util.AbstractServiceBinder; 41 import com.android.ondevicepersonalization.testing.utils.ResultReceiver; 42 43 import org.junit.Test; 44 import org.junit.runner.RunWith; 45 46 import java.util.concurrent.Executor; 47 import java.util.concurrent.Executors; 48 49 @RunWith(AndroidJUnit4.class) 50 public final class OnDevicePersonalizationSystemEventManagerTest { 51 private static final String TAG = "OnDevicePersonalizationManagerTest"; 52 private static final String KEY_OP = "op"; 53 private Context mContext = ApplicationProvider.getApplicationContext(); 54 private TestServiceBinder mTestBinder = new TestServiceBinder( 55 IOnDevicePersonalizationManagingService.Stub.asInterface(new TestService())); 56 private OnDevicePersonalizationSystemEventManager mManager = 57 new OnDevicePersonalizationSystemEventManager(mContext, mTestBinder); 58 59 @Test testnotifyMeasurementEventSuccess()60 public void testnotifyMeasurementEventSuccess() throws Exception { 61 var receiver = new ResultReceiver<Void>(); 62 mManager.notifyMeasurementEvent( 63 new MeasurementWebTriggerEventParams.Builder( 64 Uri.parse("http://ok"), 65 "com.example.browser", 66 ComponentName.createRelative("com.example", ".Example")) 67 .build(), 68 Executors.newSingleThreadExecutor(), 69 receiver); 70 assertTrue(receiver.isSuccess()); 71 assertFalse(receiver.isError()); 72 } 73 74 @Test testnotifyMeasurementEventError()75 public void testnotifyMeasurementEventError() throws Exception { 76 var receiver = new ResultReceiver<Void>(); 77 mManager.notifyMeasurementEvent( 78 new MeasurementWebTriggerEventParams.Builder( 79 Uri.parse("http://error"), 80 "com.example.browser", 81 ComponentName.createRelative("com.example", ".Example")) 82 .build(), 83 Executors.newSingleThreadExecutor(), 84 receiver); 85 assertFalse(receiver.isSuccess()); 86 assertTrue(receiver.isError()); 87 } 88 89 @Test testnotifyMeasurementEventPropagatesIae()90 public void testnotifyMeasurementEventPropagatesIae() throws Exception { 91 assertThrows( 92 IllegalArgumentException.class, 93 () -> mManager.notifyMeasurementEvent( 94 new MeasurementWebTriggerEventParams.Builder( 95 Uri.parse("http://iae"), 96 "com.example.browser", 97 ComponentName.createRelative("com.example", ".Example")) 98 .build(), 99 Executors.newSingleThreadExecutor(), 100 new ResultReceiver<Void>())); 101 } 102 103 @Test testnotifyMeasurementEventPropagatesNpe()104 public void testnotifyMeasurementEventPropagatesNpe() throws Exception { 105 assertThrows( 106 NullPointerException.class, 107 () -> mManager.notifyMeasurementEvent( 108 new MeasurementWebTriggerEventParams.Builder( 109 Uri.parse("http://npe"), 110 "com.example.browser", 111 ComponentName.createRelative("com.example", ".Example")) 112 .build(), 113 Executors.newSingleThreadExecutor(), 114 new ResultReceiver<Void>())); 115 } 116 117 @Test testnotifyMeasurementEventCatchesExceptions()118 public void testnotifyMeasurementEventCatchesExceptions() throws Exception { 119 var receiver = new ResultReceiver<Void>(); 120 mManager.notifyMeasurementEvent( 121 new MeasurementWebTriggerEventParams.Builder( 122 Uri.parse("http://ise"), 123 "com.example.browser", 124 ComponentName.createRelative("com.example", ".Example")) 125 .build(), 126 Executors.newSingleThreadExecutor(), 127 receiver); 128 assertFalse(receiver.isSuccess()); 129 assertTrue(receiver.isError()); 130 assertTrue(receiver.getException() instanceof IllegalStateException); 131 } 132 133 class TestService extends IOnDevicePersonalizationManagingService.Stub { 134 @Override getVersion()135 public String getVersion() { 136 return "1.0"; 137 } 138 139 @Override execute( String callingPackageName, ComponentName handler, Bundle params, CallerMetadata metadata, ExecuteOptionsParcel options, IExecuteCallback callback)140 public void execute( 141 String callingPackageName, 142 ComponentName handler, 143 Bundle params, 144 CallerMetadata metadata, 145 ExecuteOptionsParcel options, 146 IExecuteCallback callback) { 147 throw new UnsupportedOperationException(); 148 } 149 150 @Override requestSurfacePackage( String surfacePackageToken, IBinder hostToken, int displayId, int width, int height, CallerMetadata metadata, IRequestSurfacePackageCallback callback)151 public void requestSurfacePackage( 152 String surfacePackageToken, 153 IBinder hostToken, 154 int displayId, 155 int width, 156 int height, 157 CallerMetadata metadata, 158 IRequestSurfacePackageCallback callback) { 159 throw new UnsupportedOperationException(); 160 } 161 162 @Override registerMeasurementEvent( int eventType, Bundle params, CallerMetadata metadata, IRegisterMeasurementEventCallback callback)163 public void registerMeasurementEvent( 164 int eventType, 165 Bundle params, 166 CallerMetadata metadata, 167 IRegisterMeasurementEventCallback callback) { 168 try { 169 MeasurementWebTriggerEventParamsParcel wtparams = params.getParcelable( 170 Constants.EXTRA_MEASUREMENT_WEB_TRIGGER_PARAMS, 171 MeasurementWebTriggerEventParamsParcel.class); 172 String url = wtparams.getDestinationUrl().toString(); 173 if (url.equals("http://error")) { 174 callback.onError(Constants.STATUS_INTERNAL_ERROR, 175 new CalleeMetadata.Builder().setCallbackInvokeTimeMillis( 176 SystemClock.elapsedRealtime()).build()); 177 } else if (url.equals("http://iae")) { 178 throw new IllegalArgumentException(); 179 } else if (url.equals("http://npe")) { 180 throw new NullPointerException(); 181 } else if (url.equals("http://ise")) { 182 throw new IllegalStateException(); 183 } else { 184 callback.onSuccess( 185 new CalleeMetadata.Builder().setCallbackInvokeTimeMillis( 186 SystemClock.elapsedRealtime()).build()); 187 } 188 } catch (RemoteException e) { 189 Log.e(TAG, "callback error", e); 190 } 191 } 192 193 @Override isFeatureEnabled( String featureName, CallerMetadata metadata, IIsFeatureEnabledCallback callback)194 public void isFeatureEnabled( 195 String featureName, 196 CallerMetadata metadata, 197 IIsFeatureEnabledCallback callback) { 198 throw new UnsupportedOperationException(); 199 } 200 201 @Override logApiCallStats( String sdkPackageName, int apiName, long latencyMillis, long rpcCallLatencyMillis, long rpcReturnLatencyMillis, int responseCode)202 public void logApiCallStats( 203 String sdkPackageName, 204 int apiName, 205 long latencyMillis, 206 long rpcCallLatencyMillis, 207 long rpcReturnLatencyMillis, 208 int responseCode) { 209 } 210 } 211 212 class TestServiceBinder 213 extends AbstractServiceBinder<IOnDevicePersonalizationManagingService> { 214 private final IOnDevicePersonalizationManagingService mService; TestServiceBinder(IOnDevicePersonalizationManagingService service)215 TestServiceBinder(IOnDevicePersonalizationManagingService service) { 216 mService = service; 217 } 218 219 @Override getService(Executor executor)220 public IOnDevicePersonalizationManagingService getService(Executor executor) { 221 return mService; 222 } 223 224 @Override unbindFromService()225 public void unbindFromService() {} 226 } 227 } 228