/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.mediaframeworktest.integration; import android.graphics.SurfaceTexture; import android.hardware.photography.CameraMetadata; import android.hardware.photography.CameraPropertiesKeys; import android.hardware.photography.CaptureRequest; import android.hardware.photography.ICameraDeviceCallbacks; import android.hardware.photography.ICameraDeviceUser; import android.os.RemoteException; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; import android.view.Surface; import static android.hardware.photography.CameraDevice.TEMPLATE_PREVIEW; import com.android.mediaframeworktest.MediaFrameworkIntegrationTestRunner; import com.android.mediaframeworktest.integration.CameraBinderTest.DummyBase; public class CameraDeviceBinderTest extends AndroidTestCase { private static String TAG = "CameraDeviceBinderTest"; private int mCameraId; private ICameraDeviceUser mCameraUser; private CameraBinderTestUtils mUtils; public CameraDeviceBinderTest() { } static class DummyCameraDeviceCallbacks extends DummyBase implements ICameraDeviceCallbacks { @Override public void notifyCallback(int msgType, int ext1, int ext2) throws RemoteException { } @Override public void onResultReceived(int frameId, CameraMetadata result) throws RemoteException { } } @Override protected void setUp() throws Exception { super.setUp(); mUtils = new CameraBinderTestUtils(getContext()); // This cannot be set in the constructor, since the onCreate isn't // called yet mCameraId = MediaFrameworkIntegrationTestRunner.mCameraId; ICameraDeviceCallbacks dummyCallbacks = new DummyCameraDeviceCallbacks(); String clientPackageName = getContext().getPackageName(); mCameraUser = mUtils.getCameraService().connectDevice(dummyCallbacks, mCameraId, clientPackageName, CameraBinderTestUtils.USE_CALLING_UID); assertNotNull(String.format("Camera %s was null", mCameraId), mCameraUser); Log.v(TAG, String.format("Camera %s connected", mCameraId)); } @Override protected void tearDown() throws Exception { mCameraUser.disconnect(); mCameraUser = null; } @SmallTest public void testCreateDefaultRequest() throws Exception { CameraMetadata metadata = new CameraMetadata(); assertTrue(metadata.isEmpty()); int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); assertEquals(CameraBinderTestUtils.NO_ERROR, status); assertFalse(metadata.isEmpty()); metadata.close(); } @SmallTest public void testCreateStream() throws Exception { SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); surfaceTexture.setDefaultBufferSize(640, 480); Surface surface = new Surface(surfaceTexture); int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, surface); assertEquals(0, streamId); assertEquals(CameraBinderTestUtils.ALREADY_EXISTS, mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface)); assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId)); } @SmallTest public void testDeleteInvalidStream() throws Exception { assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(-1)); assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0)); assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(1)); assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0xC0FFEE)); } @SmallTest public void testCreateStreamTwo() throws Exception { // Create first stream SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); surfaceTexture.setDefaultBufferSize(640, 480); Surface surface = new Surface(surfaceTexture); int streamId = mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface); assertEquals(0, streamId); assertEquals(CameraBinderTestUtils.ALREADY_EXISTS, mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface)); // Create second stream. SurfaceTexture surfaceTexture2 = new SurfaceTexture(/* ignored */0); surfaceTexture2.setDefaultBufferSize(640, 480); Surface surface2 = new Surface(surfaceTexture2); int streamId2 = mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface2); assertEquals(1, streamId2); // Clean up streams assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId)); assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId2)); } @SmallTest public void testSubmitBadRequest() throws Exception { CameraMetadata metadata = new CameraMetadata(); assertTrue(metadata.isEmpty()); CaptureRequest request = new CaptureRequest(); assertTrue(request.isEmpty()); int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); assertEquals(CameraBinderTestUtils.NO_ERROR, status); assertFalse(metadata.isEmpty()); request.swap(metadata); assertFalse(request.isEmpty()); assertTrue(metadata.isEmpty()); status = mCameraUser.submitRequest(request, /* streaming */false); assertEquals("Expected submitRequest to return BAD_VALUE " + "since we had 0 surface targets set.", CameraBinderTestUtils.BAD_VALUE, status); SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); surfaceTexture.setDefaultBufferSize(640, 480); Surface surface = new Surface(surfaceTexture); request.addTarget(surface); status = mCameraUser.submitRequest(request, /* streaming */false); assertEquals("Expected submitRequest to return BAD_VALUE since " + "the target surface wasn't registered with createStream.", CameraBinderTestUtils.BAD_VALUE, status); request.close(); metadata.close(); surface.release(); } @SmallTest public void testSubmitGoodRequest() throws Exception { CameraMetadata metadata = new CameraMetadata(); assertTrue(metadata.isEmpty()); CaptureRequest request = new CaptureRequest(); assertTrue(request.isEmpty()); // Create default request from template. int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); assertEquals(CameraBinderTestUtils.NO_ERROR, status); assertFalse(metadata.isEmpty()); request.swap(metadata); assertFalse(request.isEmpty()); assertTrue(metadata.isEmpty()); SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); surfaceTexture.setDefaultBufferSize(640, 480); Surface surface = new Surface(surfaceTexture); // Create stream first. Pre-requisite to submitting a request using that // stream. int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, surface); assertEquals(0, streamId); request.addTarget(surface); // Submit valid request twice. int requestId1; requestId1 = mCameraUser.submitRequest(request, /* streaming */false); assertTrue("Request IDs should be non-negative", requestId1 >= 0); int requestId2 = mCameraUser.submitRequest(request, /* streaming */false); assertTrue("Request IDs should be non-negative", requestId2 >= 0); assertNotSame("Request IDs should be unique for multiple requests", requestId1, requestId2); surface.release(); request.close(); metadata.close(); } @SmallTest public void testSubmitStreamingRequest() throws Exception { CameraMetadata metadata = new CameraMetadata(); assertTrue(metadata.isEmpty()); CaptureRequest request = new CaptureRequest(); assertTrue(request.isEmpty()); // Create default request from template. int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); assertEquals(CameraBinderTestUtils.NO_ERROR, status); assertFalse(metadata.isEmpty()); request.swap(metadata); assertFalse(request.isEmpty()); assertTrue(metadata.isEmpty()); SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); surfaceTexture.setDefaultBufferSize(640, 480); Surface surface = new Surface(surfaceTexture); // Create stream first. Pre-requisite to submitting a request using that // stream. int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, surface); assertEquals(0, streamId); request.addTarget(surface); // Submit valid request once (non-streaming), and another time // (streaming) int requestId1; requestId1 = mCameraUser.submitRequest(request, /* streaming */false); assertTrue("Request IDs should be non-negative", requestId1 >= 0); int requestIdStreaming = mCameraUser.submitRequest(request, /* streaming */true); assertTrue("Request IDs should be non-negative", requestIdStreaming >= 0); assertNotSame("Request IDs should be unique for multiple requests", requestId1, requestIdStreaming); status = mCameraUser.cancelRequest(-1); assertEquals("Invalid request IDs should not be cancellable", CameraBinderTestUtils.BAD_VALUE, status); status = mCameraUser.cancelRequest(requestId1); assertEquals("Non-streaming request IDs should not be cancellable", CameraBinderTestUtils.BAD_VALUE, status); status = mCameraUser.cancelRequest(requestIdStreaming); assertEquals("Streaming request IDs should be cancellable", CameraBinderTestUtils.NO_ERROR, status); surface.release(); request.close(); metadata.close(); } @SmallTest public void testCameraInfo() throws RemoteException { CameraMetadata info = new CameraMetadata(); int status = mCameraUser.getCameraInfo(/*out*/info); assertEquals(CameraBinderTestUtils.NO_ERROR, status); assertFalse(info.isEmpty()); assertNotNull(info.get(CameraPropertiesKeys.Scaler.AVAILABLE_FORMATS)); } @SmallTest public void testWaitUntilIdle() throws Exception { CameraMetadata metadata = new CameraMetadata(); assertTrue(metadata.isEmpty()); CaptureRequest request = new CaptureRequest(); assertTrue(request.isEmpty()); // Create default request from template. int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); assertEquals(CameraBinderTestUtils.NO_ERROR, status); assertFalse(metadata.isEmpty()); request.swap(metadata); assertFalse(request.isEmpty()); assertTrue(metadata.isEmpty()); SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); surfaceTexture.setDefaultBufferSize(640, 480); Surface surface = new Surface(surfaceTexture); // Create stream first. Pre-requisite to submitting a request using that // stream. int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, surface); assertEquals(0, streamId); request.addTarget(surface); int requestIdStreaming = mCameraUser.submitRequest(request, /* streaming */true); assertTrue("Request IDs should be non-negative", requestIdStreaming >= 0); // Test Bad case first: waitUntilIdle when there is active repeating request status = mCameraUser.waitUntilIdle(); assertEquals("waitUntilIdle is invalid operation when there is active repeating request", CameraBinderTestUtils.INVALID_OPERATION, status); // Test good case, waitUntilIdle when there is no active repeating request status = mCameraUser.cancelRequest(requestIdStreaming); assertEquals(CameraBinderTestUtils.NO_ERROR, status); status = mCameraUser.waitUntilIdle(); assertEquals(CameraBinderTestUtils.NO_ERROR, status); } }