• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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