Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b4e597f authored by Jason Noguchi's avatar Jason Noguchi Committed by Android (Google) Code Review
Browse files

Merge "Adding camera scene mode stress test." into jb-mr1-dev

parents e30d31c4 bac86668
Loading
Loading
Loading
Loading
+135 −54
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@ import java.io.IOException;
import java.io.Writer;
import java.io.Writer;
import java.util.concurrent.Semaphore;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
import java.util.List;


import android.hardware.Camera;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.PictureCallback;
@@ -44,7 +45,7 @@ import com.android.mediaframeworktest.CameraStressTestRunner;
import junit.framework.Assert;
import junit.framework.Assert;


/**
/**
 * Junit / Instrumentation test case for the camera zoom api
 * Junit / Instrumentation test case for the camera zoom and scene mode APIs
 *
 *
 * adb shell am instrument
 * adb shell am instrument
 *  -e class com.android.mediaframeworktest.stress.CameraStressTest
 *  -e class com.android.mediaframeworktest.stress.CameraStressTest
@@ -54,18 +55,22 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram
    private String TAG = "CameraStressTest";
    private String TAG = "CameraStressTest";
    private Camera mCamera;
    private Camera mCamera;


    private static final int CAMERA_ID = 0;
    private static final int NUMBER_OF_ZOOM_LOOPS = 100;
    private static final int NUMBER_OF_ZOOM_LOOPS = 100;
    private static final int NUMBER_OF_SCENE_MODE_LOOPS = 10;
    private static final long WAIT_GENERIC = 3 * 1000; // 3 seconds
    private static final long WAIT_GENERIC = 3 * 1000; // 3 seconds
    private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds
    private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds
    private static final long WAIT_ZOOM_ANIMATION = 5 * 1000; // 5 seconds
    private static final long WAIT_ZOOM_ANIMATION = 5 * 1000; // 5 seconds
    private static final String CAMERA_STRESS_OUTPUT =
    private static final String CAMERA_STRESS_IMAGES_DIRECTORY = "cameraStressImages";
            "/sdcard/cameraStressOutput.txt";
    private static final String CAMERA_STRESS_IMAGES_PREFIX = "camera-stress-test";
    private static final int CAMERA_ID = 0;
    private static final String CAMERA_STRESS_OUTPUT = "cameraStressOutput.txt";
    private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback();
    private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback();


    private Thread mLooperThread;
    private Thread mLooperThread;
    private Handler mHandler;
    private Handler mHandler;


    private Writer mOutput;

    public CameraStressTest() {
    public CameraStressTest() {
        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
    }
    }
@@ -89,6 +94,20 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram
        }
        }
        getActivity();
        getActivity();
        super.setUp();
        super.setUp();

        File sdcard = Environment.getExternalStorageDirectory();

        // Create the test images directory if it doesn't exist
        File stressImagesDirectory = new File(String.format("%s/%s", sdcard,
                CAMERA_STRESS_IMAGES_DIRECTORY));
        if (!stressImagesDirectory.exists()) {
            stressImagesDirectory.mkdir();
        }

        // Start writing output file
        File stressOutFile = new File(String.format("%s/%s",sdcard, CAMERA_STRESS_OUTPUT));
        mOutput = new BufferedWriter(new FileWriter(stressOutFile, true));
        mOutput.write(this.getName() + ":\n");
    }
    }


    @Override
    @Override
@@ -105,6 +124,9 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram
            mLooperThread = null;
            mLooperThread = null;
        }
        }


        mOutput.write("\n\n");
        mOutput.close();

        super.tearDown();
        super.tearDown();
    }
    }


@@ -127,9 +149,7 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram


    private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback {
    private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback {
        public void onError(int error, android.hardware.Camera camera) {
        public void onError(int error, android.hardware.Camera camera) {
            if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) {
            fail(String.format("Camera error, code: %d", error));
                assertTrue("Camera test mediaserver died", false);
            }
        }
        }
    }
    }


@@ -154,49 +174,76 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram


            try {
            try {
                Log.v(TAG, "JPEG picture taken");
                Log.v(TAG, "JPEG picture taken");
                fos = new FileOutputStream(String.format("%s/zoom-test-%d.jpg",
                fos = new FileOutputStream(String.format("%s/%s/%s-%d.jpg",
                        Environment.getExternalStorageDirectory(), System.currentTimeMillis()));
                        Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY,
                        CAMERA_STRESS_IMAGES_PREFIX, System.currentTimeMillis()));
                fos.write(data);
                fos.write(data);
            }
            } catch (FileNotFoundException e) {
            catch (FileNotFoundException e) {
                Log.e(TAG, "File not found: " + e.toString());
                Log.v(TAG, "File not found: " + e.toString());
            } catch (IOException e) {
            }
                Log.e(TAG, "Error accessing file: " + e.toString());
            catch (IOException e) {
            } finally {
                Log.v(TAG, "Error accessing file: " + e.toString());
            }
            finally {
                try {
                try {
                    if (fos != null) {
                    if (fos != null) {
                        fos.close();
                        fos.close();
                    }
                    }
                }
                } catch (IOException e) {
                catch (IOException e) {
                    Log.e(TAG, "Error closing file: " + e.toString());
                    Log.v(TAG, "Error closing file: " + e.toString());
                }
                }
            }
            }
        }
        }
    };
    };


    // Helper method for cleaning up pics taken during testStressCameraZoom
    // Helper method for cleaning up pics taken during testStressCameraZoom
    private void cleanupZoomImages() {
    private void cleanupStressTestImages() {
        try {
        try {
            File sdcard = Environment.getExternalStorageDirectory();
            File stressImagesDirectory = new File(String.format("%s/%s",
                    Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY));
            File[] zoomImages = null;
            File[] zoomImages = null;


            FilenameFilter filter = new FilenameFilter() {
            FilenameFilter filter = new FilenameFilter() {
                public boolean accept(File dir, String name) {
                public boolean accept(File dir, String name) {
                    return name.startsWith("zoom-test-");
                    return name.startsWith(CAMERA_STRESS_IMAGES_PREFIX);
                }
                }
            };
            };


            zoomImages = sdcard.listFiles(filter);
            zoomImages = stressImagesDirectory.listFiles(filter);


            for (File f : zoomImages) {
            for (File f : zoomImages) {
                f.delete();
                f.delete();
            }
            }
        } catch (SecurityException e) {
            Log.e(TAG, "Security manager access violation: " + e.toString());
        }
        }
        catch (SecurityException e) {
    }
            Log.v(TAG, "Security manager access violation: " + e.toString());

    // Helper method for starting up the camera preview
    private void startCameraPreview(SurfaceHolder surfaceHolder) {
        try {
            mCamera.setErrorCallback(mCameraErrorCallback);
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
            Thread.sleep(WAIT_GENERIC);
        } catch (IOException e) {
            Log.e(TAG, "Error setting preview display: " + e.toString());
        } catch (InterruptedException e) {
            Log.e(TAG, "Error waiting for preview to come up: " + e.toString());
        } catch (Exception e) {
            Log.e(TAG, "Error starting up camera preview: " + e.toString());
        }
    }

    // Helper method for taking a photo
    private void capturePhoto() {
        try {
            mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
            Thread.sleep(WAIT_GENERIC);
            mCamera.stopPreview();
            mCamera.release();
        } catch (InterruptedException e) {
            Log.e(TAG, "Error waiting for photo to be taken: " + e.toString());
        } catch (Exception e) {
            Log.e(TAG, "Error capturing photo: " + e.toString());
        }
        }
    }
    }


@@ -205,14 +252,11 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram
    public void testStressCameraZoom() throws Exception {
    public void testStressCameraZoom() throws Exception {
        SurfaceHolder mSurfaceHolder;
        SurfaceHolder mSurfaceHolder;
        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
        File stressOutFile = new File(CAMERA_STRESS_OUTPUT);
        mOutput.write("Total number of loops: " + NUMBER_OF_ZOOM_LOOPS + "\n");
        Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
        output.write("Camera zoom stress:\n");
        output.write("Total number of loops: " +  NUMBER_OF_ZOOM_LOOPS + "\n");


        try {
        try {
            Log.v(TAG, "Start preview");
            Log.v(TAG, "Start preview");
            output.write("No of loop: ");
            mOutput.write("No of loop: ");


            mCamera = Camera.open(CAMERA_ID);
            mCamera = Camera.open(CAMERA_ID);
            Camera.Parameters params = mCamera.getParameters();
            Camera.Parameters params = mCamera.getParameters();
@@ -220,9 +264,8 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram


            if (!params.isSmoothZoomSupported() && !params.isZoomSupported()) {
            if (!params.isSmoothZoomSupported() && !params.isZoomSupported()) {
                Log.v(TAG, "Device camera does not support zoom");
                Log.v(TAG, "Device camera does not support zoom");
                assertTrue("Camera zoom stress test", false);
                fail("Camera zoom stress test failed");
            }
            } else {
            else {
                Log.v(TAG, "Device camera does support zoom");
                Log.v(TAG, "Device camera does support zoom");


                int nextZoomLevel = 0;
                int nextZoomLevel = 0;
@@ -235,11 +278,7 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram
                        }
                        }
                    });
                    });


                    mCamera.setErrorCallback(mCameraErrorCallback);
                    startCameraPreview(mSurfaceHolder);
                    mCamera.setPreviewDisplay(mSurfaceHolder);
                    mCamera.startPreview();
                    Thread.sleep(WAIT_GENERIC);

                    params = mCamera.getParameters();
                    params = mCamera.getParameters();
                    int currentZoomLevel = params.getZoom();
                    int currentZoomLevel = params.getZoom();


@@ -250,8 +289,7 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram


                    if (params.isSmoothZoomSupported()) {
                    if (params.isSmoothZoomSupported()) {
                        mCamera.startSmoothZoom(nextZoomLevel);
                        mCamera.startSmoothZoom(nextZoomLevel);
                    }
                    } else {
                    else {
                        params.setZoom(nextZoomLevel);
                        params.setZoom(nextZoomLevel);
                        mCamera.setParameters(params);
                        mCamera.setParameters(params);
                    }
                    }
@@ -259,23 +297,66 @@ public class CameraStressTest extends ActivityInstrumentationTestCase2<MediaFram


                    // sleep allows for zoom animation to finish
                    // sleep allows for zoom animation to finish
                    Thread.sleep(WAIT_ZOOM_ANIMATION);
                    Thread.sleep(WAIT_ZOOM_ANIMATION);
                    capturePhoto();


                    // take picture
                    if (i == 0) {
                    mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
                        mOutput.write(Integer.toString(i));
                    Thread.sleep(WAIT_GENERIC);
                    } else {
                    mCamera.stopPreview();
                        mOutput.write(", " + i);
                    mCamera.release();
                    }
                    output.write(" ," + i);
                }
                }
            }
            }
            cleanupStressTestImages();
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            fail("Camera zoom stress test Exception");
        }
    }

    // Test case for stressing the camera scene mode feature
    @LargeTest
    public void testStressCameraSceneModes() throws Exception {
        SurfaceHolder mSurfaceHolder;
        mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();

        try {
            mCamera = Camera.open(CAMERA_ID);
            Camera.Parameters params = mCamera.getParameters();
            mCamera.release();
            List<String> supportedSceneModes = params.getSupportedSceneModes();
            assertNotNull("No scene modes supported", supportedSceneModes);

            mOutput.write("Total number of loops: " +
                    (NUMBER_OF_SCENE_MODE_LOOPS * supportedSceneModes.size()) + "\n");
            Log.v(TAG, "Start preview");
            mOutput.write("No of loop: ");

            for (int i = 0; i < supportedSceneModes.size(); i++) {
                for (int j = 0; j < NUMBER_OF_SCENE_MODE_LOOPS; j++) {
                    runOnLooper(new Runnable() {
                        @Override
                        public void run() {
                            mCamera = Camera.open(CAMERA_ID);
                        }
                    });


            cleanupZoomImages();
                    startCameraPreview(mSurfaceHolder);
                    Log.v(TAG, "Setting mode to " + supportedSceneModes.get(i));
                    params.setSceneMode(supportedSceneModes.get(i));
                    mCamera.setParameters(params);
                    capturePhoto();

                    if ((i == 0) && (j == 0)) {
                        mOutput.write(Integer.toString(j + i * NUMBER_OF_SCENE_MODE_LOOPS));
                    } else {
                        mOutput.write(", " + (j + i * NUMBER_OF_SCENE_MODE_LOOPS));
                    }
                }
            }
            }
        catch (Exception e) {
            cleanupStressTestImages();
            assertTrue("Camera zoom stress test Exception", false);
        } catch (Exception e) {
            Log.v(TAG, e.toString());
            Log.e(TAG, e.toString());
            fail("Camera scene mode test Exception");
        }
        }
        output.write("\n\n");
        output.close();
    }
    }
}
}