| /* |
| * Copyright (C) 2016 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.mediaframeworktest.helpers; |
| |
| import android.app.Instrumentation; |
| import android.os.Bundle; |
| import android.os.Environment; |
| import android.util.Log; |
| |
| import java.io.BufferedWriter; |
| import java.io.File; |
| import java.io.FileWriter; |
| |
| public class CameraTestResultPrinter { |
| |
| private static final String TAG = CameraTestResultPrinter.class.getSimpleName(); |
| private static final String RESULT_DIR = Environment.getExternalStorageDirectory() + |
| "/camera-out/"; |
| private static final String RESULT_FILE_FORMAT = "fwk-stress_camera_%s.txt"; |
| private static final String RESULT_SWAP_FILE = "fwk-stress.swp"; |
| private static final String KEY_NUM_ATTEMPTS = "numAttempts"; // Total number of iterations |
| private static final String KEY_ITERATION = "iteration"; |
| private static final String KEY_CAMERA_ID = "cameraId"; |
| private static final int INST_STATUS_IN_PROGRESS = 2; |
| |
| private Instrumentation mInst = null; |
| private boolean mWriteToFile = true; |
| |
| |
| public CameraTestResultPrinter(Instrumentation instrumentation, boolean writeToFile) { |
| mInst = instrumentation; |
| mWriteToFile = writeToFile; |
| |
| // Create a log directory if not exists. |
| File baseDir = new File(RESULT_DIR); |
| if (!baseDir.exists() && !baseDir.mkdirs()) { |
| throw new IllegalStateException("Couldn't create directory for logs: " + baseDir); |
| } |
| Log.v(TAG, String.format("Saving test results under: %s", baseDir.getAbsolutePath())); |
| // Remove all logs but not the base directory before a test run. |
| purgeFiles(baseDir); |
| } |
| |
| public void printStatus(int numAttempts, int iteration, String cameraId) throws Exception { |
| Log.v(TAG, String.format("Print status: numAttempts=%d iteration=%d cameraId=%s", |
| numAttempts, iteration, cameraId)); |
| // Write stats to instrumentation results. |
| sendInstrumentationStatus(numAttempts, iteration, cameraId); |
| |
| if (mWriteToFile) { |
| writeToFile(numAttempts, iteration, cameraId); |
| } |
| } |
| |
| /** |
| * Report the test results to instrumentation status or a file. |
| */ |
| public void printStatus(int numAttempts, int iteration) throws Exception { |
| printStatus(numAttempts, iteration, ""); |
| } |
| |
| /** |
| * Write stats to instrumentation results. |
| */ |
| private void sendInstrumentationStatus(int numAttempts, int iteration, String cameraId) |
| throws Exception { |
| Bundle output = new Bundle(); |
| output.putString(KEY_NUM_ATTEMPTS, String.valueOf(numAttempts)); |
| output.putString(KEY_ITERATION, String.valueOf(iteration)); |
| if (!"".equals(cameraId)) { |
| output.putString(KEY_CAMERA_ID, cameraId); |
| } |
| mInst.sendStatus(INST_STATUS_IN_PROGRESS, output); |
| } |
| |
| private void writeToFile(final int numAttempts, final int iteration, String cameraId) { |
| // Format output in a form of pairs of key and value |
| // eg, "numAttempts=500|iteration=400[|cameraId=0]" |
| String results = String.format("%s=%d|%s=%d", KEY_NUM_ATTEMPTS, numAttempts, |
| KEY_ITERATION, iteration); |
| if (!"".equals(cameraId)) { |
| results += String.format("|%s=%s", KEY_CAMERA_ID, cameraId); |
| } |
| Log.v(TAG, String.format("Writing result to a file: %s", results)); |
| |
| // Write results to a swap file temporarily, then rename it to a text file when writing |
| // has successfully completed, so that process crash during file writing would |
| // not corrupt the file. |
| File swapFile = new File(RESULT_DIR, RESULT_SWAP_FILE); |
| BufferedWriter out = null; |
| try { |
| out = new BufferedWriter(new FileWriter(swapFile)); |
| out.write(results); |
| out.flush(); |
| } catch (Exception e) { |
| Log.w(TAG, String.format("Failed to write results to a file: %s", e)); |
| } finally { |
| if (out != null) { |
| try { |
| out.close(); |
| // Delete an old file just before renaming, instead of overwriting. |
| String resultFileName = String.format(RESULT_FILE_FORMAT, cameraId); |
| File txtFile = new File(RESULT_DIR, resultFileName); |
| txtFile.delete(); |
| swapFile.renameTo(txtFile); |
| } catch (Exception e) { |
| Log.w(TAG, String.format("Failed to write results to a file: %s", e)); |
| } |
| } |
| } |
| } |
| |
| // Remove sub directories and their contents, but not given directory. |
| private void purgeFiles(File path) { |
| File[] files = path.listFiles(); |
| if (files != null) { |
| for (File child : files) { |
| if (path.isDirectory()) { |
| purgeFiles(child); |
| } |
| child.delete(); |
| } |
| } |
| } |
| } |