Home | History | Annotate | Download | only in stress
      1 /*
      2  * Copyright (C) 2012 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.stress;
     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.List;
     30 
     31 import android.hardware.Camera;
     32 import android.hardware.Camera.Parameters;
     33 import android.os.Environment;
     34 import android.os.Handler;
     35 import android.os.Looper;
     36 import android.test.ActivityInstrumentationTestCase2;
     37 import android.test.suitebuilder.annotation.LargeTest;
     38 import android.util.Log;
     39 import android.view.SurfaceHolder;
     40 import com.android.mediaframeworktest.CameraStressTestRunner;
     41 
     42 import junit.framework.Assert;
     43 
     44 /**
     45  * Junit / Instrumentation test case for the following camera APIs:
     46  *  - camera zoom
     47  *  - scene mode
     48  *
     49  * adb shell am instrument
     50  *  -e class com.android.mediaframeworktest.stress.CameraStressTest
     51  *  -w com.android.mediaframeworktest/.CameraStressTestRunner
     52  */
     53 public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
     54 
     55     private static final int NUMBER_OF_SCENE_MODE_LOOPS = 10;
     56     private static final int NUMBER_OF_ZOOM_LOOPS = 100;
     57     private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds
     58     private static final String CAMERA_STRESS_OUTPUT = "cameraStressOutput.txt";
     59 
     60     private CameraTestHelper mCameraTestHelper;
     61     private Handler mHandler;
     62     private Thread mLooperThread;
     63     private Writer mOutput;
     64 
     65     private String TAG = "CameraStressTest";
     66 
     67     public CameraStressTest() {
     68         super("com.android.mediaframeworktest", MediaFrameworkTest.class);
     69     }
     70 
     71     protected void setUp() throws Exception {
     72         final Semaphore sem = new Semaphore(0);
     73         mLooperThread = new Thread() {
     74             @Override
     75             public void run() {
     76                 Log.v(TAG, "starting looper");
     77                 Looper.prepare();
     78                 mHandler = new Handler();
     79                 sem.release();
     80                 Looper.loop();
     81                 Log.v(TAG, "quit looper");
     82             }
     83         };
     84         mLooperThread.start();
     85         if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
     86             fail("Failed to start the looper.");
     87         }
     88         getActivity();
     89         super.setUp();
     90 
     91         mCameraTestHelper = new CameraTestHelper();
     92         File stressOutFile = new File(String.format("%s/%s",
     93                 Environment.getExternalStorageDirectory(), CAMERA_STRESS_OUTPUT));
     94         mOutput = new BufferedWriter(new FileWriter(stressOutFile, true));
     95         mOutput.write(this.getName() + "\n");
     96     }
     97 
     98     @Override
     99     protected void tearDown() throws Exception {
    100         if (mHandler != null) {
    101             mHandler.getLooper().quit();
    102             mHandler = null;
    103         }
    104         if (mLooperThread != null) {
    105             mLooperThread.join(WAIT_TIMEOUT);
    106             if (mLooperThread.isAlive()) {
    107                 fail("Failed to stop the looper.");
    108             }
    109             mLooperThread = null;
    110         }
    111         mOutput.write("\n\n");
    112         mOutput.close();
    113         super.tearDown();
    114     }
    115 
    116     private void runOnLooper(final Runnable command) throws InterruptedException {
    117         final Semaphore sem = new Semaphore(0);
    118         mHandler.post(new Runnable() {
    119             @Override
    120             public void run() {
    121                 try {
    122                     command.run();
    123                 } finally {
    124                     sem.release();
    125                 }
    126             }
    127         });
    128         if (!sem.tryAcquire(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
    129             fail("Failed to run the command on the looper.");
    130         }
    131     }
    132 
    133     /**
    134      * Stress test iterating on the various scene modes (action, night, party, etc.)
    135      */
    136     @LargeTest
    137     public void testStressCameraSceneModes() throws Exception {
    138         try {
    139             SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
    140             Parameters params = mCameraTestHelper.getCameraParameters();
    141             List<String> supportedSceneModes = params.getSupportedSceneModes();
    142             assertNotNull("No scene modes supported", supportedSceneModes);
    143 
    144             mOutput.write("Total number of loops: " +
    145                     (NUMBER_OF_SCENE_MODE_LOOPS * supportedSceneModes.size()) + "\n");
    146             Log.v(TAG, "Start preview");
    147             mOutput.write("No of loop: ");
    148 
    149             for (int i = 0; i < supportedSceneModes.size(); i++) {
    150                 for (int j = 0; j < NUMBER_OF_SCENE_MODE_LOOPS; j++) {
    151                     runOnLooper(new Runnable() {
    152                         @Override
    153                         public void run() {
    154                             mCameraTestHelper.setupCameraTest();
    155                         }
    156                     });
    157                     Log.v(TAG, "Setting scene mode to " + supportedSceneModes.get(i));
    158                     params.setSceneMode(supportedSceneModes.get(i));
    159                     mCameraTestHelper.setParameters(params);
    160                     mCameraTestHelper.startCameraPreview(surfaceHolder);
    161                     mCameraTestHelper.capturePhoto();
    162 
    163                     if (i == 0 && j == 0) {
    164                         mOutput.write(Integer.toString(j + i * NUMBER_OF_SCENE_MODE_LOOPS));
    165                     } else {
    166                         mOutput.write(", " + (j + i * NUMBER_OF_SCENE_MODE_LOOPS));
    167                     }
    168                 }
    169             }
    170             mCameraTestHelper.cleanupTestImages();
    171         } catch (Exception e) {
    172             Log.e(TAG, e.toString());
    173             fail("Camera scene mode test Exception");
    174         }
    175     }
    176 
    177     /**
    178      * Stress test iterating on the range of supported camera zoom levels
    179      */
    180     @LargeTest
    181     public void testStressCameraZoom() throws Exception {
    182         try {
    183             SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
    184             Parameters params = mCameraTestHelper.getCameraParameters();
    185 
    186             if (!params.isSmoothZoomSupported() && !params.isZoomSupported()) {
    187                 Log.v(TAG, "Device camera does not support zoom");
    188                 fail("Camera zoom stress test failed due to unsupported feature");
    189             } else {
    190                 Log.v(TAG, "Device camera does support zoom");
    191                 Log.v(TAG, "Start preview");
    192                 mOutput.write("Total number of loops: " + NUMBER_OF_ZOOM_LOOPS + "\n");
    193                 mOutput.write("No of loops: ");
    194 
    195                 int nextZoomLevel = 0;
    196 
    197                 for (int i = 0; i < NUMBER_OF_ZOOM_LOOPS; i++) {
    198                     runOnLooper(new Runnable() {
    199                         @Override
    200                         public void run() {
    201                             mCameraTestHelper.setupCameraTest();
    202                         }
    203                     });
    204 
    205                     mCameraTestHelper.startCameraPreview(surfaceHolder);
    206                     params = mCameraTestHelper.mCamera.getParameters();
    207                     int currentZoomLevel = params.getZoom();
    208 
    209                     if (nextZoomLevel >= params.getMaxZoom()) {
    210                         nextZoomLevel = 0;
    211                     }
    212                     ++nextZoomLevel;
    213 
    214                     if (params.isSmoothZoomSupported()) {
    215                         mCameraTestHelper.mCamera.startSmoothZoom(nextZoomLevel);
    216                     } else {
    217                         params.setZoom(nextZoomLevel);
    218                         mCameraTestHelper.setParameters(params);
    219                     }
    220                     mCameraTestHelper.capturePhoto();
    221 
    222                     if (i == 0) {
    223                         mOutput.write(Integer.toString(i));
    224                     } else {
    225                         mOutput.write(", " + i);
    226                     }
    227                 }
    228             }
    229             mCameraTestHelper.cleanupTestImages();
    230         } catch (Exception e) {
    231             Log.e(TAG, e.toString());
    232             fail("Camera zoom stress test Exception");
    233         }
    234     }
    235 }
    236