1/*
2 * Copyright (C) 2009 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
17package com.android.camera.stress;
18
19import com.android.camera.CameraActivity;
20
21import android.app.Activity;
22import android.app.Instrumentation;
23import android.content.Intent;
24import android.os.Environment;
25import android.provider.MediaStore;
26import android.test.InstrumentationTestCase;
27import android.test.suitebuilder.annotation.LargeTest;
28import android.util.Log;
29
30import java.io.FileWriter;
31import java.io.BufferedWriter;
32
33/**
34 * Test cases to measure the camera and video recorder startup time.
35 */
36public class CameraStartUp extends InstrumentationTestCase {
37
38    private static final int TOTAL_NUMBER_OF_STARTUP = 20;
39
40    private String TAG = "CameraStartUp";
41    private static final String CAMERA_TEST_OUTPUT_FILE =
42            Environment.getExternalStorageDirectory().toString() + "/mediaStressOut.txt";
43    private static int WAIT_TIME_FOR_PREVIEW = 1500; //1.5 second
44
45    private long launchCamera() {
46        long startupTime = 0;
47        try {
48            Intent intent = new Intent(Intent.ACTION_MAIN);
49            intent.setClass(getInstrumentation().getTargetContext(), CameraActivity.class);
50            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
51            long beforeStart = System.currentTimeMillis();
52            Instrumentation inst = getInstrumentation();
53            Activity cameraActivity = inst.startActivitySync(intent);
54            long cameraStarted = System.currentTimeMillis();
55            Thread.sleep(WAIT_TIME_FOR_PREVIEW);
56            cameraActivity.finish();
57            startupTime = cameraStarted - beforeStart;
58            Thread.sleep(1000);
59            Log.v(TAG, "camera startup time: " + startupTime);
60        } catch (Exception e) {
61            Log.v(TAG, "Got exception", e);
62            fail("Fails to get the output file");
63        }
64        return startupTime;
65    }
66
67    private long launchVideo() {
68        long startupTime = 0;
69
70        try {
71            Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
72            intent.setClass(getInstrumentation().getTargetContext(), CameraActivity.class);
73            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
74            long beforeStart = System.currentTimeMillis();
75            Instrumentation inst = getInstrumentation();
76            Activity recorderActivity = inst.startActivitySync(intent);
77            long cameraStarted = System.currentTimeMillis();
78            recorderActivity.finish();
79            startupTime = cameraStarted - beforeStart;
80            Log.v(TAG, "Video Startup Time = " + startupTime);
81            // wait for 1s to make sure it reach a clean stage
82            Thread.sleep(WAIT_TIME_FOR_PREVIEW);
83            Log.v(TAG, "video startup time: " + startupTime);
84        } catch (Exception e) {
85            Log.v(TAG, "Got exception", e);
86            fail("Fails to launch video output file");
87        }
88        return startupTime;
89    }
90
91    private void writeToOutputFile(long totalStartupTime,
92            String individualStartupTime, boolean firstStartUp, String Type) throws Exception {
93        // TODO (yslau) : Need to integrate the output data with central
94        // dashboard
95        try {
96            FileWriter fstream = null;
97            fstream = new FileWriter(CAMERA_TEST_OUTPUT_FILE, true);
98            BufferedWriter out = new BufferedWriter(fstream);
99            if (firstStartUp) {
100                out.write("First " + Type + " Startup: " + totalStartupTime + "\n");
101            } else {
102                long averageStartupTime = totalStartupTime / (TOTAL_NUMBER_OF_STARTUP -1);
103                out.write(Type + "startup time: " + "\n");
104                out.write("Number of loop: " + (TOTAL_NUMBER_OF_STARTUP -1)  + "\n");
105                out.write(individualStartupTime + "\n\n");
106                out.write(Type + " average startup time: " + averageStartupTime + " ms\n\n");
107            }
108            out.close();
109            fstream.close();
110        } catch (Exception e) {
111            fail("Camera write output to file");
112        }
113    }
114
115    public void testLaunchVideo() throws Exception {
116        String individualStartupTime;
117        individualStartupTime = "Individual Video Startup Time = ";
118        long totalStartupTime = 0;
119        long startupTime = 0;
120        for (int i = 0; i < TOTAL_NUMBER_OF_STARTUP; i++) {
121            if (i == 0) {
122                // Capture the first startup time individually
123                long firstStartUpTime = launchVideo();
124                writeToOutputFile(firstStartUpTime, "na", true, "Video");
125            } else {
126                startupTime = launchVideo();
127                totalStartupTime += startupTime;
128                individualStartupTime += startupTime + " ,";
129            }
130        }
131        Log.v(TAG, "totalStartupTime =" + totalStartupTime);
132        writeToOutputFile(totalStartupTime, individualStartupTime, false, "Video");
133    }
134
135    public void testLaunchCamera() throws Exception {
136        String individualStartupTime;
137        individualStartupTime = "Individual Camera Startup Time = ";
138        long totalStartupTime = 0;
139        long startupTime = 0;
140        for (int i = 0; i < TOTAL_NUMBER_OF_STARTUP; i++) {
141            if (i == 0) {
142                // Capture the first startup time individually
143                long firstStartUpTime = launchCamera();
144                writeToOutputFile(firstStartUpTime, "na", true, "Camera");
145            } else {
146                startupTime = launchCamera();
147                totalStartupTime += startupTime;
148                individualStartupTime += startupTime + " ,";
149            }
150        }
151        Log.v(TAG, "totalStartupTime =" + totalStartupTime);
152        writeToOutputFile(totalStartupTime,
153                individualStartupTime, false, "Camera");
154    }
155}
156