Home | History | Annotate | Download | only in camera
      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.functional.camera;
     18 
     19 import com.android.mediaframeworktest.MediaFrameworkTest;
     20 import com.android.mediaframeworktest.CameraTestHelper;
     21 
     22 import java.io.BufferedWriter;
     23 import java.io.File;
     24 import java.io.FileWriter;
     25 import java.io.IOException;
     26 import java.io.Writer;
     27 import java.util.concurrent.Semaphore;
     28 import java.util.concurrent.TimeUnit;
     29 import java.util.HashMap;
     30 import java.util.List;
     31 import java.util.Map;
     32 
     33 import android.hardware.Camera;
     34 import android.hardware.Camera.Parameters;
     35 import android.os.Environment;
     36 import android.os.Handler;
     37 import android.os.Looper;
     38 import android.test.ActivityInstrumentationTestCase2;
     39 import android.test.suitebuilder.annotation.LargeTest;
     40 import android.util.Log;
     41 import android.view.SurfaceHolder;
     42 import com.android.mediaframeworktest.CameraStressTestRunner;
     43 
     44 import junit.framework.Assert;
     45 
     46 /**
     47  * Junit / Instrumentation test case for the following camera APIs:
     48  * - flash
     49  * - exposure compensation
     50  * - white balance
     51  * - focus mode
     52  *
     53  * adb shell am instrument
     54  *  -e class com.android.mediaframeworktest.functional.camera.CameraFunctionalTest
     55  *  -w com.android.mediaframework/.CameraStressTestRunner
     56  */
     57 public class CameraFunctionalTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
     58     private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds
     59     private CameraTestHelper mCameraTestHelper;
     60     private Handler mHandler;
     61     private Thread mLooperThread;
     62     private Writer mOutput;
     63 
     64     private String TAG = "CameraFunctionalTest";
     65 
     66     public CameraFunctionalTest() {
     67         super("com.android.mediaframeworktest", MediaFrameworkTest.class);
     68     }
     69 
     70     protected void setUp() throws Exception {
     71         final Semaphore sem = new Semaphore(0);
     72         mLooperThread = new Thread() {
     73             @Override
     74             public void run() {
     75                 Log.v(TAG, "starting looper");
     76                 Looper.prepare();
     77                 mHandler = new Handler();
     78                 sem.release();
     79                 Looper.loop();
     80                 Log.v(TAG, "quit looper");
     81             }
     82         };
     83         mLooperThread.start();
     84         if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
     85             fail("Failed to start the looper.");
     86         }
     87         getActivity();
     88         super.setUp();
     89 
     90         mCameraTestHelper = new CameraTestHelper();
     91     }
     92 
     93     @Override
     94     protected void tearDown() throws Exception {
     95         if (mHandler != null) {
     96             mHandler.getLooper().quit();
     97             mHandler = null;
     98         }
     99         if (mLooperThread != null) {
    100             mLooperThread.join(WAIT_TIMEOUT);
    101             if (mLooperThread.isAlive()) {
    102                 fail("Failed to stop the looper.");
    103             }
    104             mLooperThread = null;
    105         }
    106         super.tearDown();
    107     }
    108 
    109     private void runOnLooper(final Runnable command) throws InterruptedException {
    110         final Semaphore sem = new Semaphore(0);
    111         mHandler.post(new Runnable() {
    112             @Override
    113             public void run() {
    114                 try {
    115                     command.run();
    116                 } finally {
    117                     sem.release();
    118                 }
    119             }
    120         });
    121         if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
    122             fail("Failed to run the command on the looper.");
    123         }
    124     }
    125 
    126     /**
    127      * Functional test iterating on the range of supported exposure compensation levels
    128      */
    129     @LargeTest
    130     public void testFunctionalCameraExposureCompensation() throws Exception {
    131         try {
    132             SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
    133             Parameters params = mCameraTestHelper.getCameraParameters();
    134 
    135             int min = params.getMinExposureCompensation();
    136             int max = params.getMaxExposureCompensation();
    137             assertFalse("Adjusting exposure not supported", (max == 0 && min == 0));
    138             float step = params.getExposureCompensationStep();
    139             int stepsPerEV = (int) Math.round(Math.pow((double) step, -1));
    140 
    141             // only get integer values for exposure compensation
    142             for (int i = min; i <= max; i += stepsPerEV) {
    143                 runOnLooper(new Runnable() {
    144                     @Override
    145                     public void run() {
    146                         mCameraTestHelper.setupCameraTest();
    147                     }
    148                 });
    149                 Log.v(TAG, "Setting exposure compensation index to " + i);
    150                 params.setExposureCompensation(i);
    151                 mCameraTestHelper.setParameters(params);
    152                 mCameraTestHelper.startCameraPreview(surfaceHolder);
    153                 mCameraTestHelper.capturePhoto();
    154             }
    155             mCameraTestHelper.cleanupTestImages();
    156         } catch (Exception e) {
    157             Log.e(TAG, e.toString());
    158             fail("Camera exposure compensation test Exception");
    159         }
    160     }
    161 
    162     /**
    163      * Functional test iterating on the various flash modes (on, off, auto, torch)
    164      */
    165     @LargeTest
    166     public void testFunctionalCameraFlashModes() throws Exception {
    167         try {
    168             SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
    169             Parameters params = mCameraTestHelper.getCameraParameters();
    170             List<String> supportedFlashModes = params.getSupportedFlashModes();
    171             assertNotNull("No flash modes supported", supportedFlashModes);
    172 
    173             for (int i = 0; i < supportedFlashModes.size(); i++) {
    174                 runOnLooper(new Runnable() {
    175                     @Override
    176                     public void run() {
    177                         mCameraTestHelper.setupCameraTest();
    178                     }
    179                 });
    180                 Log.v(TAG, "Setting flash mode to " + supportedFlashModes.get(i));
    181                 params.setFlashMode(supportedFlashModes.get(i));
    182                 mCameraTestHelper.setParameters(params);
    183                 mCameraTestHelper.startCameraPreview(surfaceHolder);
    184                 mCameraTestHelper.capturePhoto();
    185             }
    186             mCameraTestHelper.cleanupTestImages();
    187         } catch (Exception e) {
    188             Log.e(TAG, e.toString());
    189             fail("Camera flash mode test Exception");
    190         }
    191     }
    192 
    193     /**
    194      * Functional test iterating on the various focus modes (auto, infinitiy, macro, etc.)
    195      */
    196     @LargeTest
    197     public void testFunctionalCameraFocusModes() throws Exception {
    198         try {
    199             SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
    200             Parameters params = mCameraTestHelper.getCameraParameters();
    201             List<String> supportedFocusModes = params.getSupportedFocusModes();
    202             assertNotNull("No focus modes supported", supportedFocusModes);
    203 
    204             for (int i = 0; i < supportedFocusModes.size(); i++) {
    205                 runOnLooper(new Runnable() {
    206                     @Override
    207                     public void run() {
    208                         mCameraTestHelper.setupCameraTest();
    209                     }
    210                 });
    211                 Log.v(TAG, "Setting focus mode to: " + supportedFocusModes.get(i));
    212                 params.setFocusMode(supportedFocusModes.get(i));
    213                 mCameraTestHelper.setParameters(params);
    214                 mCameraTestHelper.startCameraPreview(surfaceHolder);
    215                 mCameraTestHelper.capturePhoto();
    216             }
    217             mCameraTestHelper.cleanupTestImages();
    218         } catch (Exception e) {
    219             Log.e(TAG, e.toString());
    220             fail("Camera focus modes test Exception");
    221         }
    222     }
    223 
    224     /**
    225      * Functional test iterating on the various white balances (auto, daylight, cloudy, etc.)
    226      */
    227     @LargeTest
    228     public void testFunctionalCameraWhiteBalance() throws Exception {
    229         try {
    230             SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
    231             Parameters params = mCameraTestHelper.getCameraParameters();
    232             List<String> supportedWhiteBalance = params.getSupportedWhiteBalance();
    233             assertNotNull("No white balance modes supported", supportedWhiteBalance);
    234 
    235             for (int i = 0; i < supportedWhiteBalance.size(); i++) {
    236                 runOnLooper(new Runnable() {
    237                     @Override
    238                     public void run() {
    239                         mCameraTestHelper.setupCameraTest();
    240                     }
    241                 });
    242                 Log.v(TAG, "Setting white balance to: " + supportedWhiteBalance.get(i));
    243                 params.setWhiteBalance(supportedWhiteBalance.get(i));
    244                 mCameraTestHelper.setParameters(params);
    245                 mCameraTestHelper.startCameraPreview(surfaceHolder);
    246                 mCameraTestHelper.capturePhoto();
    247             }
    248             mCameraTestHelper.cleanupTestImages();
    249         } catch (Exception e) {
    250             Log.e(TAG, e.toString());
    251             fail("Camera focus modes test Exception");
    252         }
    253     }
    254 }
    255