11ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling/*
21ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * Copyright (C) 2009 The Android Open Source Project
31ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling *
41ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * Licensed under the Apache License, Version 2.0 (the "License");
51ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * you may not use this file except in compliance with the License.
61ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * You may obtain a copy of the License at
71ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling *
81ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling *      http://www.apache.org/licenses/LICENSE-2.0
91ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling *
101ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * Unless required by applicable law or agreed to in writing, software
111ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * distributed under the License is distributed on an "AS IS" BASIS,
121ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * See the License for the specific language governing permissions and
141ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * limitations under the License.
151ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling */
161ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
173189c037886fda47be73da9885e6760df50efd71Jason Noguchipackage com.android.camera.stress;
181ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
191ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport com.android.camera.CameraActivity;
201ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
211ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.app.Activity;
221ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.app.Instrumentation;
231ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.content.Intent;
241ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.os.Environment;
251ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.provider.MediaStore;
261ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.test.InstrumentationTestCase;
271ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.test.suitebuilder.annotation.LargeTest;
281ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport android.util.Log;
291ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
301ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport java.io.FileWriter;
311ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingimport java.io.BufferedWriter;
321ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
331ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling/**
341ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling * Test cases to measure the camera and video recorder startup time.
351ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling */
361ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberlingpublic class CameraStartUp extends InstrumentationTestCase {
371ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
381ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    private static final int TOTAL_NUMBER_OF_STARTUP = 20;
391ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
401ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    private String TAG = "CameraStartUp";
411ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    private static final String CAMERA_TEST_OUTPUT_FILE =
421ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Environment.getExternalStorageDirectory().toString() + "/mediaStressOut.txt";
431ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    private static int WAIT_TIME_FOR_PREVIEW = 1500; //1.5 second
441ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
451ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    private long launchCamera() {
461ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        long startupTime = 0;
471ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        try {
481ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Intent intent = new Intent(Intent.ACTION_MAIN);
491ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            intent.setClass(getInstrumentation().getTargetContext(), CameraActivity.class);
501ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
511ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            long beforeStart = System.currentTimeMillis();
521ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Instrumentation inst = getInstrumentation();
531ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Activity cameraActivity = inst.startActivitySync(intent);
541ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            long cameraStarted = System.currentTimeMillis();
551ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Thread.sleep(WAIT_TIME_FOR_PREVIEW);
561ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            cameraActivity.finish();
571ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            startupTime = cameraStarted - beforeStart;
581ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Thread.sleep(1000);
591ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Log.v(TAG, "camera startup time: " + startupTime);
601ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        } catch (Exception e) {
611ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Log.v(TAG, "Got exception", e);
621ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            fail("Fails to get the output file");
631ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        }
641ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        return startupTime;
651ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    }
661ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
671ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    private long launchVideo() {
681ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        long startupTime = 0;
691ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
701ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        try {
711ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
721ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            intent.setClass(getInstrumentation().getTargetContext(), CameraActivity.class);
731ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
741ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            long beforeStart = System.currentTimeMillis();
751ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Instrumentation inst = getInstrumentation();
761ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Activity recorderActivity = inst.startActivitySync(intent);
771ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            long cameraStarted = System.currentTimeMillis();
781ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            recorderActivity.finish();
791ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            startupTime = cameraStarted - beforeStart;
801ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Log.v(TAG, "Video Startup Time = " + startupTime);
811ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            // wait for 1s to make sure it reach a clean stage
821ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Thread.sleep(WAIT_TIME_FOR_PREVIEW);
831ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Log.v(TAG, "video startup time: " + startupTime);
841ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        } catch (Exception e) {
851ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            Log.v(TAG, "Got exception", e);
861ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            fail("Fails to launch video output file");
871ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        }
881ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        return startupTime;
891ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    }
901ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
911ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    private void writeToOutputFile(long totalStartupTime,
921ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            String individualStartupTime, boolean firstStartUp, String Type) throws Exception {
931ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        // TODO (yslau) : Need to integrate the output data with central
941ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        // dashboard
951ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        try {
961ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            FileWriter fstream = null;
971ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            fstream = new FileWriter(CAMERA_TEST_OUTPUT_FILE, true);
981ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            BufferedWriter out = new BufferedWriter(fstream);
991ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            if (firstStartUp) {
1001ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                out.write("First " + Type + " Startup: " + totalStartupTime + "\n");
1011ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            } else {
1021ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                long averageStartupTime = totalStartupTime / (TOTAL_NUMBER_OF_STARTUP -1);
1031ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                out.write(Type + "startup time: " + "\n");
1041ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                out.write("Number of loop: " + (TOTAL_NUMBER_OF_STARTUP -1)  + "\n");
1051ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                out.write(individualStartupTime + "\n\n");
1061ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                out.write(Type + " average startup time: " + averageStartupTime + " ms\n\n");
1071ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            }
1081ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            out.close();
1091ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            fstream.close();
1101ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        } catch (Exception e) {
1111ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            fail("Camera write output to file");
1121ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        }
1131ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    }
1141ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
1151ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    public void testLaunchVideo() throws Exception {
1161ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        String individualStartupTime;
1171ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        individualStartupTime = "Individual Video Startup Time = ";
1181ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        long totalStartupTime = 0;
1191ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        long startupTime = 0;
1201ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        for (int i = 0; i < TOTAL_NUMBER_OF_STARTUP; i++) {
1211ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            if (i == 0) {
1221ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                // Capture the first startup time individually
1231ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                long firstStartUpTime = launchVideo();
1241ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                writeToOutputFile(firstStartUpTime, "na", true, "Video");
1251ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            } else {
1261ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                startupTime = launchVideo();
1271ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                totalStartupTime += startupTime;
1281ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                individualStartupTime += startupTime + " ,";
1291ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            }
1301ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        }
1311ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        Log.v(TAG, "totalStartupTime =" + totalStartupTime);
1321ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        writeToOutputFile(totalStartupTime, individualStartupTime, false, "Video");
1331ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    }
1341ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling
1351ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    public void testLaunchCamera() throws Exception {
1361ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        String individualStartupTime;
1371ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        individualStartupTime = "Individual Camera Startup Time = ";
1381ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        long totalStartupTime = 0;
1391ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        long startupTime = 0;
1401ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        for (int i = 0; i < TOTAL_NUMBER_OF_STARTUP; i++) {
1411ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            if (i == 0) {
1421ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                // Capture the first startup time individually
1431ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                long firstStartUpTime = launchCamera();
1441ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                writeToOutputFile(firstStartUpTime, "na", true, "Camera");
1451ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            } else {
1461ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                startupTime = launchCamera();
1471ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                totalStartupTime += startupTime;
1481ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                individualStartupTime += startupTime + " ,";
1491ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling            }
1501ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        }
1511ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        Log.v(TAG, "totalStartupTime =" + totalStartupTime);
1521ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling        writeToOutputFile(totalStartupTime,
1531ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling                individualStartupTime, false, "Camera");
1541ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling    }
1551ac5817f362f6f8262bf00191e1e419996475380Sascha Haeberling}
156