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