Home | History | Annotate | Download | only in integration
      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