13ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen/*
23ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * Copyright (C) 2009 The Android Open Source Project
33ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen *
43ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * Licensed under the Apache License, Version 2.0 (the "License");
53ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * you may not use this file except in compliance with the License.
63ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * You may obtain a copy of the License at
73ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen *
83ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen *      http://www.apache.org/licenses/LICENSE-2.0
93ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen *
103ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * Unless required by applicable law or agreed to in writing, software
113ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * distributed under the License is distributed on an "AS IS" BASIS,
123ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * See the License for the specific language governing permissions and
143ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * limitations under the License.
153ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen */
163ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
173ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenpackage com.android.camera.stress;
183ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
193ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport com.android.camera.Camera;
203ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
213ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.app.Instrumentation;
223e2d95456def6a6d6e716af77e4708a15747d2edRay Chenimport android.os.Environment;
233ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.test.ActivityInstrumentationTestCase2;
243ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.test.suitebuilder.annotation.LargeTest;
253ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.util.Log;
263ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenimport android.view.KeyEvent;
273ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
283e2d95456def6a6d6e716af77e4708a15747d2edRay Chenimport java.io.BufferedWriter;
293e2d95456def6a6d6e716af77e4708a15747d2edRay Chenimport java.io.FileWriter;
303e2d95456def6a6d6e716af77e4708a15747d2edRay Chen
313ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen/**
323ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen * Junit / Instrumentation test case for camera test
333ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen *
343ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen */
353ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
363ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chenpublic class CameraLatency extends ActivityInstrumentationTestCase2 <Camera> {
373ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    private String TAG = "CameraLatency";
3811cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau    private static final int TOTAL_NUMBER_OF_IMAGECAPTURE = 20;
39154d112a5ac848e986ed9c13f97b195f004bc151Yu Shan Emily Lau    private static final long WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN = 4000;
403e2d95456def6a6d6e716af77e4708a15747d2edRay Chen    private static final String CAMERA_TEST_OUTPUT_FILE =
413e2d95456def6a6d6e716af77e4708a15747d2edRay Chen            Environment.getExternalStorageDirectory().toString() + "/mediaStressOut.txt";
423ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
4311cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau    private long mTotalAutoFocusTime;
4411cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau    private long mTotalShutterLag;
459324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li    private long mTotalShutterToPictureDisplayedTime;
469324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li    private long mTotalPictureDisplayedToJpegCallbackTime;
47e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li    private long mTotalJpegCallbackFinishTime;
4811cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau    private long mAvgAutoFocusTime;
4911cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau    private long mAvgShutterLag = mTotalShutterLag;
509324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li    private long mAvgShutterToPictureDisplayedTime;
519324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li    private long mAvgPictureDisplayedToJpegCallbackTime;
52e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li    private long mAvgJpegCallbackFinishTime;
5311cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau
543ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    public CameraLatency() {
55559f5cf9f42c4983eaef9e6e55ff3ba7c406426aWu-cheng Li        super(Camera.class);
563ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    }
573ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
583ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    @Override
593ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    protected void setUp() throws Exception {
603ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen        getActivity();
613ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen        super.setUp();
623ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    }
633ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
643ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    @Override
653ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    protected void tearDown() throws Exception {
663ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen        super.tearDown();
673ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    }
683ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
693ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    @LargeTest
703ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    public void testImageCapture() {
7156e1db465a1726f2dd0e0b4ad0624c14b797d313Yu Shan Emily Lau        Log.v(TAG, "start testImageCapture test");
723ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen        Instrumentation inst = getInstrumentation();
73d3ccb366eee12a802d94515974545e6414a61aa8Yu Shan Emily Lau        inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
743ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen        try {
753ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen            for (int i = 0; i < TOTAL_NUMBER_OF_IMAGECAPTURE; i++) {
763ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen                Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN);
773ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen                inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
783ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen                Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN);
7911cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau                //skip the first measurement
8011cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau                if (i != 0) {
810a28549a7e6db0307b2cb5d2df7444909fb03a48Chih-Chung Chang                    Camera c = getActivity();
820a28549a7e6db0307b2cb5d2df7444909fb03a48Chih-Chung Chang                    mTotalAutoFocusTime += c.mAutoFocusTime;
830a28549a7e6db0307b2cb5d2df7444909fb03a48Chih-Chung Chang                    mTotalShutterLag += c.mShutterLag;
849324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                    mTotalShutterToPictureDisplayedTime +=
859324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                            c.mShutterToPictureDisplayedTime;
869324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                    mTotalPictureDisplayedToJpegCallbackTime +=
879324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                            c.mPictureDisplayedToJpegCallbackTime;
88e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li                    mTotalJpegCallbackFinishTime += c.mJpegCallbackFinishTime;
8911cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau                }
903ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen            }
913ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen        } catch (Exception e) {
922ff6c061fe55ad46b192961f27379853c20362bcWu-cheng Li            Log.v(TAG, "Got exception", e);
933ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen        }
9411cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        //ToDO: yslau
9511cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        //1) Need to get the baseline from the cupcake so that we can add the
9611cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        //failure condition of the camera latency.
9711cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        //2) Only count those number with succesful capture. Set the timer to invalid
9811cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        //before capture and ignore them if the value is invalid
9911cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        int numberofRun = TOTAL_NUMBER_OF_IMAGECAPTURE - 1;
10011cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        mAvgAutoFocusTime = mTotalAutoFocusTime / numberofRun;
10111cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        mAvgShutterLag = mTotalShutterLag / numberofRun;
1029324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li        mAvgShutterToPictureDisplayedTime =
1039324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                mTotalShutterToPictureDisplayedTime / numberofRun;
1049324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li        mAvgPictureDisplayedToJpegCallbackTime =
1059324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                mTotalPictureDisplayedToJpegCallbackTime / numberofRun;
106e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li        mAvgJpegCallbackFinishTime =
107e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li                mTotalJpegCallbackFinishTime / numberofRun;
10811cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau
1098160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau        try {
1108160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            FileWriter fstream = null;
1118160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            fstream = new FileWriter(CAMERA_TEST_OUTPUT_FILE, true);
1128160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            BufferedWriter out = new BufferedWriter(fstream);
1138160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            out.write("Camera Latency : \n");
1148160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            out.write("Number of loop: " + TOTAL_NUMBER_OF_IMAGECAPTURE + "\n");
1158160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            out.write("Avg AutoFocus = " + mAvgAutoFocusTime + "\n");
1168160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            out.write("Avg mShutterLag = " + mAvgShutterLag + "\n");
1179324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li            out.write("Avg mShutterToPictureDisplayedTime = "
1189324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                    + mAvgShutterToPictureDisplayedTime + "\n");
1199324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li            out.write("Avg mPictureDisplayedToJpegCallbackTime = "
1209324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                    + mAvgPictureDisplayedToJpegCallbackTime + "\n");
121e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li            out.write("Avg mJpegCallbackFinishTime = " +
122e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li                    mAvgJpegCallbackFinishTime + "\n");
1238160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            out.close();
1248160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            fstream.close();
1258160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau        } catch (Exception e) {
1268160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau            fail("Camera Latency write output to file");
1278160f6f935dd6ef65554dfbaf6886f8d899911a4Yu Shan Emily Lau        }
128154d112a5ac848e986ed9c13f97b195f004bc151Yu Shan Emily Lau        Log.v(TAG, "The Image capture wait time = " +
129154d112a5ac848e986ed9c13f97b195f004bc151Yu Shan Emily Lau            WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN);
13011cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        Log.v(TAG, "Avg AutoFocus = " + mAvgAutoFocusTime);
13111cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau        Log.v(TAG, "Avg mShutterLag = " + mAvgShutterLag);
1329324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li        Log.v(TAG, "Avg mShutterToPictureDisplayedTime = "
1339324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                + mAvgShutterToPictureDisplayedTime);
1349324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li        Log.v(TAG, "Avg mPictureDisplayedToJpegCallbackTime = "
1359324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li                + mAvgPictureDisplayedToJpegCallbackTime);
136e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li        Log.v(TAG, "Avg mJpegCallbackFinishTime = " + mAvgJpegCallbackFinishTime);
1373ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen    }
1383ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen}
1393ec4b6040078fc26b09defd55e3f5f9ac84aba28Ray Chen
140