Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2017 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.log.LogUtil.CLog;
     22 import com.android.tradefed.result.ITestInvocationListener;
     23 import com.android.tradefed.result.TestDescription;
     24 
     25 import java.util.HashMap;
     26 import java.util.Map;
     27 import java.util.regex.Matcher;
     28 import java.util.regex.Pattern;
     29 
     30 /**
     31  * Camera burst startup test
     32  *
     33  * <p>Runs Camera device performance test to measure time for taking a burst shot.
     34  */
     35 @OptionClass(alias = "camera-burst-shot")
     36 public class CameraBurstStartupTest extends CameraTestBase {
     37 
     38     private static final Pattern STATS_REGEX = Pattern.compile("^(?<average>[0-9.]+)");
     39 
     40     public CameraBurstStartupTest() {
     41         setTestPackage("com.google.android.camera");
     42         setTestClass("com.android.camera.latency.BurstStartupTest");
     43         setTestRunner("android.test.InstrumentationTestRunner");
     44         setRuKey("CameraBurstStartup");
     45         setTestTimeoutMs(60 * 60 * 1000); // 1 hour
     46     }
     47 
     48     /** {@inheritDoc} */
     49     @Override
     50     public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
     51         runInstrumentationTest(listener, new CollectingListener(listener));
     52     }
     53 
     54     /** A listener to collect the output from test run and fatal errors */
     55     private class CollectingListener extends DefaultCollectingListener {
     56 
     57         public CollectingListener(ITestInvocationListener listener) {
     58             super(listener);
     59         }
     60 
     61         @Override
     62         public void handleMetricsOnTestEnded(TestDescription test, Map<String, String> testMetrics) {
     63             // Test metrics accumulated will be posted at the end of test run.
     64             getAggregatedMetrics().putAll(parseResults(test.getTestName(), testMetrics));
     65         }
     66 
     67         public Map<String, String> parseResults(String testName, Map<String, String> testMetrics) {
     68             // Parse burst startup stats from the instrumentation result.
     69             Map<String, String> parsed = new HashMap<String, String>();
     70             for (Map.Entry<String, String> metric : testMetrics.entrySet()) {
     71                 Matcher matcher = STATS_REGEX.matcher(metric.getValue());
     72 
     73                 if (matcher.matches()) {
     74                     // Key name consists of a pair of test name and metric name.
     75                     String keyName = String.format("%s_%s", testName, metric.getKey());
     76                     parsed.put(keyName, matcher.group("average"));
     77                 } else {
     78                     CLog.w(String.format("Stats not in correct format: %s", metric.getValue()));
     79                 }
     80             }
     81             return parsed;
     82         }
     83     }
     84 }
     85