1 /* 2 * Copyright (C) 2013 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.mediaframeworktest.integration; 18 19 import android.hardware.CameraInfo; 20 import android.hardware.ICamera; 21 import android.hardware.ICameraClient; 22 import android.hardware.ICameraServiceListener; 23 import android.hardware.IProCameraCallbacks; 24 import android.hardware.IProCameraUser; 25 import android.hardware.camera2.CameraMetadata; 26 import android.hardware.camera2.ICameraDeviceCallbacks; 27 import android.hardware.camera2.ICameraDeviceUser; 28 import android.hardware.camera2.impl.CameraMetadataNative; 29 import android.hardware.camera2.utils.BinderHolder; 30 import android.hardware.camera2.utils.CameraBinderDecorator; 31 import android.os.Binder; 32 import android.os.IBinder; 33 import android.os.RemoteException; 34 import android.test.AndroidTestCase; 35 import android.test.suitebuilder.annotation.SmallTest; 36 import android.util.Log; 37 38 /** 39 * <p> 40 * Junit / Instrumentation test case for the camera2 api 41 * </p> 42 * <p> 43 * To run only tests in this class: 44 * </p> 45 * 46 * <pre> 47 * adb shell am instrument \ 48 * -e class com.android.mediaframeworktest.integration.CameraBinderTest \ 49 * -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner 50 * </pre> 51 */ 52 public class CameraBinderTest extends AndroidTestCase { 53 static String TAG = "CameraBinderTest"; 54 55 protected CameraBinderTestUtils mUtils; 56 57 public CameraBinderTest() { 58 } 59 60 @Override 61 protected void setUp() throws Exception { 62 super.setUp(); 63 64 mUtils = new CameraBinderTestUtils(getContext()); 65 } 66 67 @SmallTest 68 public void testNumberOfCameras() throws Exception { 69 70 int numCameras = mUtils.getCameraService().getNumberOfCameras(); 71 assertTrue("At least this many cameras: " + mUtils.getGuessedNumCameras(), 72 numCameras >= mUtils.getGuessedNumCameras()); 73 Log.v(TAG, "Number of cameras " + numCameras); 74 } 75 76 @SmallTest 77 public void testCameraInfo() throws Exception { 78 for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 79 80 CameraInfo info = new CameraInfo(); 81 info.info.facing = -1; 82 info.info.orientation = -1; 83 84 assertTrue( 85 "Camera service returned info for camera " + cameraId, 86 mUtils.getCameraService().getCameraInfo(cameraId, info) == 87 CameraBinderTestUtils.NO_ERROR); 88 assertTrue("Facing was not set for camera " + cameraId, info.info.facing != -1); 89 assertTrue("Orientation was not set for camera " + cameraId, 90 info.info.orientation != -1); 91 92 Log.v(TAG, "Camera " + cameraId + " info: facing " + info.info.facing 93 + ", orientation " + info.info.orientation); 94 } 95 } 96 97 static abstract class DummyBase extends Binder implements android.os.IInterface { 98 @Override 99 public IBinder asBinder() { 100 return this; 101 } 102 } 103 104 static class DummyCameraClient extends DummyBase implements ICameraClient { 105 } 106 107 @SmallTest 108 public void testConnect() throws Exception { 109 for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 110 111 ICameraClient dummyCallbacks = new DummyCameraClient(); 112 113 String clientPackageName = getContext().getPackageName(); 114 115 BinderHolder holder = new BinderHolder(); 116 CameraBinderDecorator.newInstance(mUtils.getCameraService()) 117 .connect(dummyCallbacks, cameraId, clientPackageName, 118 CameraBinderTestUtils.USE_CALLING_UID, holder); 119 ICamera cameraUser = ICamera.Stub.asInterface(holder.getBinder()); 120 assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); 121 122 Log.v(TAG, String.format("Camera %s connected", cameraId)); 123 124 cameraUser.disconnect(); 125 } 126 } 127 128 static class DummyProCameraCallbacks extends DummyBase implements IProCameraCallbacks { 129 } 130 131 @SmallTest 132 public void testConnectPro() throws Exception { 133 for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 134 135 IProCameraCallbacks dummyCallbacks = new DummyProCameraCallbacks(); 136 137 String clientPackageName = getContext().getPackageName(); 138 139 BinderHolder holder = new BinderHolder(); 140 CameraBinderDecorator.newInstance(mUtils.getCameraService()) 141 .connectPro(dummyCallbacks, cameraId, 142 clientPackageName, CameraBinderTestUtils.USE_CALLING_UID, holder); 143 IProCameraUser cameraUser = IProCameraUser.Stub.asInterface(holder.getBinder()); 144 assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); 145 146 Log.v(TAG, String.format("Camera %s connected", cameraId)); 147 148 cameraUser.disconnect(); 149 } 150 } 151 152 static class DummyCameraDeviceCallbacks extends ICameraDeviceCallbacks.Stub { 153 154 @Override 155 public void onCameraError(int errorCode) { 156 } 157 158 @Override 159 public void onCameraIdle() { 160 } 161 162 @Override 163 public void onCaptureStarted(int requestId, long timestamp) { 164 } 165 166 @Override 167 public void onResultReceived(int frameId, CameraMetadataNative result) 168 throws RemoteException { 169 } 170 } 171 172 @SmallTest 173 public void testConnectDevice() throws Exception { 174 for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 175 176 ICameraDeviceCallbacks dummyCallbacks = new DummyCameraDeviceCallbacks(); 177 178 String clientPackageName = getContext().getPackageName(); 179 180 BinderHolder holder = new BinderHolder(); 181 CameraBinderDecorator.newInstance(mUtils.getCameraService()) 182 .connectDevice(dummyCallbacks, cameraId, 183 clientPackageName, CameraBinderTestUtils.USE_CALLING_UID, holder); 184 ICameraDeviceUser cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder()); 185 assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); 186 187 Log.v(TAG, String.format("Camera %s connected", cameraId)); 188 189 cameraUser.disconnect(); 190 } 191 } 192 193 static class DummyCameraServiceListener extends ICameraServiceListener.Stub { 194 @Override 195 public void onStatusChanged(int status, int cameraId) 196 throws RemoteException { 197 Log.v(TAG, String.format("Camera %d has status changed to 0x%x", cameraId, status)); 198 } 199 } 200 201 /** 202 * <pre> 203 * adb shell am instrument \ 204 * -e class 'com.android.mediaframeworktest.integration.CameraBinderTest#testAddRemoveListeners' \ 205 * -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner 206 * </pre> 207 */ 208 @SmallTest 209 public void testAddRemoveListeners() throws Exception { 210 for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 211 212 ICameraServiceListener listener = new DummyCameraServiceListener(); 213 214 assertTrue( 215 "Listener was removed before added", 216 mUtils.getCameraService().removeListener(listener) == 217 CameraBinderTestUtils.BAD_VALUE); 218 219 assertTrue("Listener was not added", 220 mUtils.getCameraService().addListener(listener) == 221 CameraBinderTestUtils.NO_ERROR); 222 assertTrue( 223 "Listener was wrongly added again", 224 mUtils.getCameraService().addListener(listener) == 225 CameraBinderTestUtils.ALREADY_EXISTS); 226 227 assertTrue( 228 "Listener was not removed", 229 mUtils.getCameraService().removeListener(listener) == 230 CameraBinderTestUtils.NO_ERROR); 231 assertTrue( 232 "Listener was wrongly removed again", 233 mUtils.getCameraService().removeListener(listener) == 234 CameraBinderTestUtils.BAD_VALUE); 235 } 236 } 237 } 238