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