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