1ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu/*
2ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * Copyright (C) 2009 The Android Open Source Project
3ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu *
4ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * Licensed under the Apache License, Version 2.0 (the "License");
5ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * you may not use this file except in compliance with the License.
6ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * You may obtain a copy of the License at
7ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu *
8ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu *      http://www.apache.org/licenses/LICENSE-2.0
9ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu *
10ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * Unless required by applicable law or agreed to in writing, software
11ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * distributed under the License is distributed on an "AS IS" BASIS,
12ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * See the License for the specific language governing permissions and
14ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * limitations under the License.
15ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu */
16ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
17ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liupackage com.android.camera.stress;
18ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
19ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport com.android.camera.CameraActivity;
20ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
21ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.app.Instrumentation;
22ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.os.Environment;
23ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.test.ActivityInstrumentationTestCase2;
24ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.test.suitebuilder.annotation.LargeTest;
25ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.util.Log;
26ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport android.view.KeyEvent;
27ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
28ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport java.io.BufferedWriter;
29ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liuimport java.io.FileWriter;
30ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
31ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu/**
32ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu * Junit / Instrumentation test case for camera test
33ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu *
34ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu */
35ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
36ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liupublic class CameraLatency extends ActivityInstrumentationTestCase2 <CameraActivity> {
37ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private String TAG = "CameraLatency";
38ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private static final int TOTAL_NUMBER_OF_IMAGECAPTURE = 20;
39ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private static final long WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN = 4000;
40ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private static final String CAMERA_TEST_OUTPUT_FILE =
41ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            Environment.getExternalStorageDirectory().toString() + "/mediaStressOut.txt";
42ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
43ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mTotalAutoFocusTime;
44ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mTotalShutterLag;
45ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mTotalShutterToPictureDisplayedTime;
46ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mTotalPictureDisplayedToJpegCallbackTime;
47ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mTotalJpegCallbackFinishTime;
48ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mAvgAutoFocusTime;
49ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mAvgShutterLag = mTotalShutterLag;
50ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mAvgShutterToPictureDisplayedTime;
51ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mAvgPictureDisplayedToJpegCallbackTime;
52ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    private long mAvgJpegCallbackFinishTime;
53ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
54ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    public CameraLatency() {
55ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        super(CameraActivity.class);
56ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    }
57ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
58ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    @Override
59ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    protected void setUp() throws Exception {
60ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        getActivity();
61ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        super.setUp();
62ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    }
63ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
64ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    @Override
65ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    protected void tearDown() throws Exception {
66ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        super.tearDown();
67ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    }
68ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
69ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    @LargeTest
70ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    public void testImageCapture() {
71ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        Log.v(TAG, "start testImageCapture test");
72ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        Instrumentation inst = getInstrumentation();
73ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
74ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        try {
75ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            for (int i = 0; i < TOTAL_NUMBER_OF_IMAGECAPTURE; i++) {
76ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN);
77ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
78ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN);
79ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                //skip the first measurement
80ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                if (i != 0) {
81ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    CameraActivity c = getActivity();
82ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
83ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    // if any of the latency var accessor methods return -1 then the
84ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    // camera is set to a different module other than PhotoModule so
85ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    // skip the shot and try again
86ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    if (c.getAutoFocusTime() != -1) {
87ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                        mTotalAutoFocusTime += c.getAutoFocusTime();
88ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                        mTotalShutterLag += c.getShutterLag();
89ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                        mTotalShutterToPictureDisplayedTime +=
90ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                                c.getShutterToPictureDisplayedTime();
91ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                        mTotalPictureDisplayedToJpegCallbackTime +=
92ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                                c.getPictureDisplayedToJpegCallbackTime();
93ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                        mTotalJpegCallbackFinishTime += c.getJpegCallbackFinishTime();
94ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    }
95ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    else {
96ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                        i--;
97ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                        continue;
98ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    }
99ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                }
100ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            }
101ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        } catch (Exception e) {
102ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            Log.v(TAG, "Got exception", e);
103ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        }
104ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        //ToDO: yslau
105ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        //1) Need to get the baseline from the cupcake so that we can add the
106ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        //failure condition of the camera latency.
107ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        //2) Only count those number with succesful capture. Set the timer to invalid
108ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        //before capture and ignore them if the value is invalid
109ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        int numberofRun = TOTAL_NUMBER_OF_IMAGECAPTURE - 1;
110ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        mAvgAutoFocusTime = mTotalAutoFocusTime / numberofRun;
111ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        mAvgShutterLag = mTotalShutterLag / numberofRun;
112ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        mAvgShutterToPictureDisplayedTime =
113ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                mTotalShutterToPictureDisplayedTime / numberofRun;
114ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        mAvgPictureDisplayedToJpegCallbackTime =
115ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                mTotalPictureDisplayedToJpegCallbackTime / numberofRun;
116ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        mAvgJpegCallbackFinishTime =
117ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                mTotalJpegCallbackFinishTime / numberofRun;
118ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
119ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        try {
120ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            FileWriter fstream = null;
121ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            fstream = new FileWriter(CAMERA_TEST_OUTPUT_FILE, true);
122ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            BufferedWriter out = new BufferedWriter(fstream);
123ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            out.write("Camera Latency : \n");
124ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            out.write("Number of loop: " + TOTAL_NUMBER_OF_IMAGECAPTURE + "\n");
125ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            out.write("Avg AutoFocus = " + mAvgAutoFocusTime + "\n");
126ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            out.write("Avg mShutterLag = " + mAvgShutterLag + "\n");
127ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            out.write("Avg mShutterToPictureDisplayedTime = "
128ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    + mAvgShutterToPictureDisplayedTime + "\n");
129ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            out.write("Avg mPictureDisplayedToJpegCallbackTime = "
130ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    + mAvgPictureDisplayedToJpegCallbackTime + "\n");
131ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            out.write("Avg mJpegCallbackFinishTime = " +
132ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                    mAvgJpegCallbackFinishTime + "\n");
133ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            out.close();
134ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            fstream.close();
135ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        } catch (Exception e) {
136ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            fail("Camera Latency write output to file");
137ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        }
138ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        Log.v(TAG, "The Image capture wait time = " +
139ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu            WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN);
140ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        Log.v(TAG, "Avg AutoFocus = " + mAvgAutoFocusTime);
141ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        Log.v(TAG, "Avg mShutterLag = " + mAvgShutterLag);
142ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        Log.v(TAG, "Avg mShutterToPictureDisplayedTime = "
143ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                + mAvgShutterToPictureDisplayedTime);
144ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        Log.v(TAG, "Avg mPictureDisplayedToJpegCallbackTime = "
145ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu                + mAvgPictureDisplayedToJpegCallbackTime);
146ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu        Log.v(TAG, "Avg mJpegCallbackFinishTime = " + mAvgJpegCallbackFinishTime);
147ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu    }
148ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu}
149ffa6237aed496373cd578ccdb9d2a47cde90e25dDoris Liu
150