CameraDeviceBinderTest.java revision 7f4d3147d1851d2f0c544e45390c139bda9fd9aa
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 17package com.android.mediaframeworktest.integration; 18 19import android.graphics.SurfaceTexture; 20import android.hardware.photography.CameraMetadata; 21import android.hardware.photography.CameraPropertiesKeys; 22import android.hardware.photography.CaptureRequest; 23import android.hardware.photography.ICameraDeviceCallbacks; 24import android.hardware.photography.ICameraDeviceUser; 25import android.os.RemoteException; 26import android.test.AndroidTestCase; 27import android.test.suitebuilder.annotation.SmallTest; 28import android.util.Log; 29import android.view.Surface; 30 31import static android.hardware.photography.CameraDevice.TEMPLATE_PREVIEW; 32 33import com.android.mediaframeworktest.MediaFrameworkIntegrationTestRunner; 34import com.android.mediaframeworktest.integration.CameraBinderTest.DummyBase; 35 36public class CameraDeviceBinderTest extends AndroidTestCase { 37 private static String TAG = "CameraDeviceBinderTest"; 38 39 private int mCameraId; 40 private ICameraDeviceUser mCameraUser; 41 private CameraBinderTestUtils mUtils; 42 43 public CameraDeviceBinderTest() { 44 } 45 46 static class DummyCameraDeviceCallbacks extends DummyBase implements ICameraDeviceCallbacks { 47 48 @Override 49 public void notifyCallback(int msgType, int ext1, int ext2) throws RemoteException { 50 } 51 52 @Override 53 public void onResultReceived(int frameId, CameraMetadata result) throws RemoteException { 54 } 55 } 56 57 @Override 58 protected void setUp() throws Exception { 59 super.setUp(); 60 61 mUtils = new CameraBinderTestUtils(getContext()); 62 63 // This cannot be set in the constructor, since the onCreate isn't 64 // called yet 65 mCameraId = MediaFrameworkIntegrationTestRunner.mCameraId; 66 67 ICameraDeviceCallbacks dummyCallbacks = new DummyCameraDeviceCallbacks(); 68 69 String clientPackageName = getContext().getPackageName(); 70 71 mCameraUser = mUtils.getCameraService().connectDevice(dummyCallbacks, mCameraId, 72 clientPackageName, CameraBinderTestUtils.USE_CALLING_UID); 73 assertNotNull(String.format("Camera %s was null", mCameraId), mCameraUser); 74 75 Log.v(TAG, String.format("Camera %s connected", mCameraId)); 76 } 77 78 @Override 79 protected void tearDown() throws Exception { 80 mCameraUser.disconnect(); 81 mCameraUser = null; 82 } 83 84 @SmallTest 85 public void testCreateDefaultRequest() throws Exception { 86 CameraMetadata metadata = new CameraMetadata(); 87 assertTrue(metadata.isEmpty()); 88 89 int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); 90 assertEquals(CameraBinderTestUtils.NO_ERROR, status); 91 assertFalse(metadata.isEmpty()); 92 93 metadata.close(); 94 } 95 96 @SmallTest 97 public void testCreateStream() throws Exception { 98 SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); 99 surfaceTexture.setDefaultBufferSize(640, 480); 100 Surface surface = new Surface(surfaceTexture); 101 102 int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, 103 surface); 104 105 assertEquals(0, streamId); 106 107 assertEquals(CameraBinderTestUtils.ALREADY_EXISTS, 108 mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface)); 109 110 assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId)); 111 } 112 113 @SmallTest 114 public void testDeleteInvalidStream() throws Exception { 115 assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(-1)); 116 assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0)); 117 assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(1)); 118 assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0xC0FFEE)); 119 } 120 121 @SmallTest 122 public void testCreateStreamTwo() throws Exception { 123 124 // Create first stream 125 126 SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); 127 surfaceTexture.setDefaultBufferSize(640, 480); 128 Surface surface = new Surface(surfaceTexture); 129 130 int streamId = mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, 131 surface); 132 133 assertEquals(0, streamId); 134 135 assertEquals(CameraBinderTestUtils.ALREADY_EXISTS, 136 mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface)); 137 138 // Create second stream. 139 140 SurfaceTexture surfaceTexture2 = new SurfaceTexture(/* ignored */0); 141 surfaceTexture2.setDefaultBufferSize(640, 480); 142 Surface surface2 = new Surface(surfaceTexture2); 143 144 int streamId2 = mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, 145 surface2); 146 147 assertEquals(1, streamId2); 148 149 // Clean up streams 150 151 assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId)); 152 assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId2)); 153 } 154 155 @SmallTest 156 public void testSubmitBadRequest() throws Exception { 157 158 CameraMetadata metadata = new CameraMetadata(); 159 assertTrue(metadata.isEmpty()); 160 161 CaptureRequest request = new CaptureRequest(); 162 assertTrue(request.isEmpty()); 163 164 int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); 165 assertEquals(CameraBinderTestUtils.NO_ERROR, status); 166 assertFalse(metadata.isEmpty()); 167 168 request.swap(metadata); 169 assertFalse(request.isEmpty()); 170 assertTrue(metadata.isEmpty()); 171 172 status = mCameraUser.submitRequest(request, /* streaming */false); 173 assertEquals("Expected submitRequest to return BAD_VALUE " + 174 "since we had 0 surface targets set.", CameraBinderTestUtils.BAD_VALUE, status); 175 176 SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); 177 surfaceTexture.setDefaultBufferSize(640, 480); 178 Surface surface = new Surface(surfaceTexture); 179 request.addTarget(surface); 180 181 status = mCameraUser.submitRequest(request, /* streaming */false); 182 assertEquals("Expected submitRequest to return BAD_VALUE since " + 183 "the target surface wasn't registered with createStream.", 184 CameraBinderTestUtils.BAD_VALUE, status); 185 186 request.close(); 187 metadata.close(); 188 surface.release(); 189 } 190 191 @SmallTest 192 public void testSubmitGoodRequest() throws Exception { 193 194 CameraMetadata metadata = new CameraMetadata(); 195 assertTrue(metadata.isEmpty()); 196 197 CaptureRequest request = new CaptureRequest(); 198 assertTrue(request.isEmpty()); 199 200 // Create default request from template. 201 202 int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); 203 assertEquals(CameraBinderTestUtils.NO_ERROR, status); 204 assertFalse(metadata.isEmpty()); 205 206 request.swap(metadata); 207 assertFalse(request.isEmpty()); 208 assertTrue(metadata.isEmpty()); 209 210 SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); 211 surfaceTexture.setDefaultBufferSize(640, 480); 212 Surface surface = new Surface(surfaceTexture); 213 214 // Create stream first. Pre-requisite to submitting a request using that 215 // stream. 216 217 int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, 218 surface); 219 assertEquals(0, streamId); 220 221 request.addTarget(surface); 222 223 // Submit valid request twice. 224 225 int requestId1; 226 requestId1 = mCameraUser.submitRequest(request, /* streaming */false); 227 assertTrue("Request IDs should be non-negative", requestId1 >= 0); 228 229 int requestId2 = mCameraUser.submitRequest(request, /* streaming */false); 230 assertTrue("Request IDs should be non-negative", requestId2 >= 0); 231 assertNotSame("Request IDs should be unique for multiple requests", requestId1, requestId2); 232 233 surface.release(); 234 request.close(); 235 metadata.close(); 236 } 237 238 @SmallTest 239 public void testSubmitStreamingRequest() throws Exception { 240 241 CameraMetadata metadata = new CameraMetadata(); 242 assertTrue(metadata.isEmpty()); 243 244 CaptureRequest request = new CaptureRequest(); 245 assertTrue(request.isEmpty()); 246 247 // Create default request from template. 248 249 int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); 250 assertEquals(CameraBinderTestUtils.NO_ERROR, status); 251 assertFalse(metadata.isEmpty()); 252 253 request.swap(metadata); 254 assertFalse(request.isEmpty()); 255 assertTrue(metadata.isEmpty()); 256 257 SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); 258 surfaceTexture.setDefaultBufferSize(640, 480); 259 Surface surface = new Surface(surfaceTexture); 260 261 // Create stream first. Pre-requisite to submitting a request using that 262 // stream. 263 264 int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, 265 surface); 266 assertEquals(0, streamId); 267 268 request.addTarget(surface); 269 270 // Submit valid request once (non-streaming), and another time 271 // (streaming) 272 273 int requestId1; 274 requestId1 = mCameraUser.submitRequest(request, /* streaming */false); 275 assertTrue("Request IDs should be non-negative", requestId1 >= 0); 276 277 int requestIdStreaming = mCameraUser.submitRequest(request, /* streaming */true); 278 assertTrue("Request IDs should be non-negative", requestIdStreaming >= 0); 279 assertNotSame("Request IDs should be unique for multiple requests", requestId1, 280 requestIdStreaming); 281 282 status = mCameraUser.cancelRequest(-1); 283 assertEquals("Invalid request IDs should not be cancellable", 284 CameraBinderTestUtils.BAD_VALUE, status); 285 286 status = mCameraUser.cancelRequest(requestId1); 287 assertEquals("Non-streaming request IDs should not be cancellable", 288 CameraBinderTestUtils.BAD_VALUE, status); 289 290 status = mCameraUser.cancelRequest(requestIdStreaming); 291 assertEquals("Streaming request IDs should be cancellable", CameraBinderTestUtils.NO_ERROR, 292 status); 293 294 surface.release(); 295 request.close(); 296 metadata.close(); 297 } 298 299 @SmallTest 300 public void testCameraInfo() throws RemoteException { 301 CameraMetadata info = new CameraMetadata(); 302 303 int status = mCameraUser.getCameraInfo(/*out*/info); 304 assertEquals(CameraBinderTestUtils.NO_ERROR, status); 305 306 assertFalse(info.isEmpty()); 307 assertNotNull(info.get(CameraPropertiesKeys.Scaler.AVAILABLE_FORMATS)); 308 } 309 310 @SmallTest 311 public void testWaitUntilIdle() throws Exception { 312 CameraMetadata metadata = new CameraMetadata(); 313 assertTrue(metadata.isEmpty()); 314 315 CaptureRequest request = new CaptureRequest(); 316 assertTrue(request.isEmpty()); 317 318 // Create default request from template. 319 int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); 320 assertEquals(CameraBinderTestUtils.NO_ERROR, status); 321 assertFalse(metadata.isEmpty()); 322 323 request.swap(metadata); 324 assertFalse(request.isEmpty()); 325 assertTrue(metadata.isEmpty()); 326 327 SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); 328 surfaceTexture.setDefaultBufferSize(640, 480); 329 Surface surface = new Surface(surfaceTexture); 330 331 // Create stream first. Pre-requisite to submitting a request using that 332 // stream. 333 334 int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, 335 surface); 336 assertEquals(0, streamId); 337 338 request.addTarget(surface); 339 340 int requestIdStreaming = mCameraUser.submitRequest(request, /* streaming */true); 341 assertTrue("Request IDs should be non-negative", requestIdStreaming >= 0); 342 343 // Test Bad case first: waitUntilIdle when there is active repeating request 344 status = mCameraUser.waitUntilIdle(); 345 assertEquals("waitUntilIdle is invalid operation when there is active repeating request", 346 CameraBinderTestUtils.INVALID_OPERATION, status); 347 348 // Test good case, waitUntilIdle when there is no active repeating request 349 status = mCameraUser.cancelRequest(requestIdStreaming); 350 assertEquals(CameraBinderTestUtils.NO_ERROR, status); 351 status = mCameraUser.waitUntilIdle(); 352 assertEquals(CameraBinderTestUtils.NO_ERROR, status); 353 } 354 355} 356