/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.media.tests; import com.android.ddmlib.IDevice; import com.android.tradefed.device.DeviceNotAvailableException; import com.android.tradefed.device.ITestDevice; import com.android.tradefed.log.LogUtil.CLog; import com.android.tradefed.result.ITestInvocationListener; import com.android.tradefed.result.InputStreamSource; import com.android.tradefed.result.LogDataType; import com.android.tradefed.testtype.IDeviceTest; import com.android.tradefed.testtype.IRemoteTest; import com.android.tradefed.util.proto.TfMetricProtoUtil; import org.junit.Assert; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Standalone panoramic photo processing benchmark test. */ public class PanoramaBenchMarkTest implements IDeviceTest, IRemoteTest { private ITestDevice mTestDevice = null; private static final Pattern ELAPSED_TIME_PATTERN = Pattern.compile("(Total elapsed time:)\\s+(\\d+\\.\\d*)\\s+(seconds)"); private static final String PANORAMA_TEST_KEY = "PanoramaElapsedTime"; private static final String TEST_TAG = "CameraLatency"; /** * {@inheritDoc} */ @Override public void run(ITestInvocationListener listener) throws DeviceNotAvailableException { Assert.assertNotNull(mTestDevice); String dataStore = mTestDevice.getMountPoint(IDevice.MNT_DATA); String externalStore = mTestDevice.getMountPoint(IDevice.MNT_EXTERNAL_STORAGE); mTestDevice.executeShellCommand(String.format("chmod 777 %s/local/tmp/panorama_bench", dataStore)); String shellOutput = mTestDevice.executeShellCommand( String.format("%s/local/tmp/panorama_bench %s/panorama_input/test %s/panorama.ppm", dataStore, externalStore, externalStore)); String[] lines = shellOutput.split("\n"); Map metrics = new HashMap(); for (String line : lines) { Matcher m = ELAPSED_TIME_PATTERN.matcher(line.trim()); if (m.matches()) { CLog.d(String.format("Found elapsed time \"%s seconds\" from line %s", m.group(2), line)); metrics.put(PANORAMA_TEST_KEY, m.group(2)); break; } else { CLog.d(String.format("Unabled to find elapsed time from line: %s", line)); } } reportMetrics(listener, TEST_TAG, metrics); cleanupDevice(); } /** * {@inheritDoc} */ @Override public void setDevice(ITestDevice device) { mTestDevice = device; } /** * {@inheritDoc} */ @Override public ITestDevice getDevice() { return mTestDevice; } /** * Removes image files used to mock panorama stitching. * * @throws DeviceNotAvailableException If the device is unavailable or * something happened while deleting files */ private void cleanupDevice() throws DeviceNotAvailableException { String externalStore = mTestDevice.getMountPoint(IDevice.MNT_EXTERNAL_STORAGE); mTestDevice.executeShellCommand(String.format("rm -r %s/panorama_input", externalStore)); } /** * Report run metrics by creating an empty test run to stick them in. * * @param listener The {@link ITestInvocationListener} of test results * @param runName The test name * @param metrics The {@link Map} that contains metrics for the given test */ private void reportMetrics(ITestInvocationListener listener, String runName, Map metrics) { InputStreamSource bugreport = mTestDevice.getBugreport(); listener.testLog("bugreport", LogDataType.BUGREPORT, bugreport); bugreport.close(); CLog.d(String.format("About to report metrics: %s", metrics)); listener.testRunStarted(runName, 0); listener.testRunEnded(0, TfMetricProtoUtil.upgradeConvert(metrics)); } }