1 /* 2 * Copyright (C) 2015 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 17 package com.android.media.tests; 18 19 import com.android.tradefed.config.OptionClass; 20 import com.android.tradefed.device.DeviceNotAvailableException; 21 import com.android.tradefed.invoker.TestInformation; 22 import com.android.tradefed.log.LogUtil.CLog; 23 import com.android.tradefed.result.ITestInvocationListener; 24 import com.android.tradefed.result.TestDescription; 25 26 import java.util.HashMap; 27 import java.util.Map; 28 import java.util.regex.Matcher; 29 import java.util.regex.Pattern; 30 31 /** 32 * Camera shot latency test 33 * 34 * Runs Camera device performance test to measure time from taking a shot to saving a file on disk 35 * and time from shutter to shutter in fully saturated case. 36 */ 37 @OptionClass(alias = "camera-shot-latency") 38 public class CameraShotLatencyTest extends CameraTestBase { 39 40 private static final Pattern STATS_REGEX = Pattern.compile( 41 "^(?<average>[0-9.]+)\\|(?<values>[0-9 .-]+)"); 42 CameraShotLatencyTest()43 public CameraShotLatencyTest() { 44 setTestPackage("com.google.android.camera"); 45 setTestClass("com.android.camera.latency.CameraShotLatencyTest"); 46 setTestRunner("android.test.InstrumentationTestRunner"); 47 setRuKey("CameraShotLatency"); 48 setTestTimeoutMs(60 * 60 * 1000); // 1 hour 49 } 50 51 /** {@inheritDoc} */ 52 @Override run(TestInformation testInfo, ITestInvocationListener listener)53 public void run(TestInformation testInfo, ITestInvocationListener listener) 54 throws DeviceNotAvailableException { 55 runInstrumentationTest(testInfo, listener, new CollectingListener(listener)); 56 } 57 58 /** 59 * A listener to collect the output from test run and fatal errors 60 */ 61 private class CollectingListener extends CameraTestMetricsCollectionListener.DefaultCollectingListener { 62 CollectingListener(ITestInvocationListener listener)63 public CollectingListener(ITestInvocationListener listener) { 64 super(listener); 65 } 66 67 @Override handleMetricsOnTestEnded(TestDescription test, Map<String, String> testMetrics)68 public void handleMetricsOnTestEnded(TestDescription test, Map<String, String> testMetrics) { 69 // Test metrics accumulated will be posted at the end of test run. 70 getAggregatedMetrics().putAll(parseResults(test.getTestName(), testMetrics)); 71 } 72 parseResults(String testName, Map<String, String> testMetrics)73 public Map<String, String> parseResults(String testName, Map<String, String> testMetrics) { 74 // Parse shot latency stats from the instrumentation result. 75 // Format : <metric_key>=<average_of_latency>|<raw_data> 76 // Example: 77 // ElapsedTimeMs=1805|1725 1747 ... 2078 78 Map<String, String> parsed = new HashMap<String, String>(); 79 for (Map.Entry<String, String> metric : testMetrics.entrySet()) { 80 Matcher matcher = STATS_REGEX.matcher(metric.getValue()); 81 if (matcher.matches()) { 82 // Key name consists of a pair of test name and metric name. 83 String keyName = String.format("%s_%s", testName, metric.getKey()); 84 parsed.put(keyName, matcher.group("average")); 85 } else { 86 CLog.w(String.format("Stats not in correct format: %s", metric.getValue())); 87 } 88 } 89 return parsed; 90 } 91 } 92 } 93