| /* |
| * Copyright (C) 2014 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.compatibility.common.util; |
| |
| import android.app.Instrumentation; |
| import android.os.Bundle; |
| import android.os.Environment; |
| import android.util.Log; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.List; |
| |
| /** |
| * Handles adding results to the report for device side tests. |
| * |
| * NOTE: tests MUST call {@link #submit(Instrumentation)} if and only if the test passes in order to |
| * send the results to the runner. |
| */ |
| public class DeviceReportLog extends ReportLog { |
| private static final String TAG = DeviceReportLog.class.getSimpleName(); |
| private static final String RESULT = "COMPATIBILITY_TEST_RESULT"; |
| private static final int INST_STATUS_ERROR = -1; |
| private static final int INST_STATUS_IN_PROGRESS = 2; |
| |
| private ReportLogDeviceInfoStore store; |
| |
| public DeviceReportLog(String reportLogName, String streamName) { |
| this(reportLogName, streamName, |
| new File(Environment.getExternalStorageDirectory(), "report-log-files")); |
| } |
| |
| public DeviceReportLog(String reportLogName, String streamName, File logDirectory) { |
| super(reportLogName, streamName); |
| try { |
| // dir value must match the src-dir value configured in ReportLogCollector target |
| // preparer in cts/harness/tools/cts-tradefed/res/config/cts-preconditions.xml |
| if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { |
| throw new IOException("External storage is not mounted"); |
| } else if ((!logDirectory.exists() && !logDirectory.mkdirs()) |
| || (logDirectory.exists() && !logDirectory.isDirectory())) { |
| throw new IOException("Cannot create directory for device info files"); |
| } else { |
| File jsonFile = new File(logDirectory, mReportLogName + ".reportlog.json"); |
| store = new ReportLogDeviceInfoStore(jsonFile, mStreamName); |
| store.open(); |
| } |
| } catch (Exception e) { |
| Log.e(TAG, "Could not create report log file.", e); |
| } |
| } |
| |
| /** |
| * Adds a double metric to the report. |
| */ |
| @Override |
| public void addValue(String source, String message, double value, ResultType type, |
| ResultUnit unit) { |
| super.addValue(source, message, value, type, unit); |
| try { |
| store.addResult(message, value); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a double metric to the report. |
| */ |
| @Override |
| public void addValue(String message, double value, ResultType type, ResultUnit unit) { |
| super.addValue(message, value, type, unit); |
| try { |
| store.addResult(message, value); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a double array of metrics to the report. |
| */ |
| @Override |
| public void addValues(String source, String message, double[] values, ResultType type, |
| ResultUnit unit) { |
| super.addValues(source, message, values, type, unit); |
| try { |
| store.addArrayResult(message, values); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a double array of metrics to the report. |
| */ |
| @Override |
| public void addValues(String message, double[] values, ResultType type, ResultUnit unit) { |
| super.addValues(message, values, type, unit); |
| try { |
| store.addArrayResult(message, values); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds an int metric to the report. |
| */ |
| @Override |
| public void addValue(String message, int value, ResultType type, ResultUnit unit) { |
| try { |
| store.addResult(message, value); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a long metric to the report. |
| */ |
| @Override |
| public void addValue(String message, long value, ResultType type, ResultUnit unit) { |
| try { |
| store.addResult(message, value); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a float metric to the report. |
| */ |
| @Override |
| public void addValue(String message, float value, ResultType type, ResultUnit unit) { |
| try { |
| store.addResult(message, value); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a boolean metric to the report. |
| */ |
| @Override |
| public void addValue(String message, boolean value, ResultType type, ResultUnit unit) { |
| try { |
| store.addResult(message, value); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a String metric to the report. |
| */ |
| @Override |
| public void addValue(String message, String value, ResultType type, ResultUnit unit) { |
| try { |
| store.addResult(message, value); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds an int array of metrics to the report. |
| */ |
| @Override |
| public void addValues(String message, int[] values, ResultType type, ResultUnit unit) { |
| try { |
| store.addArrayResult(message, values); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a long array of metrics to the report. |
| */ |
| @Override |
| public void addValues(String message, long[] values, ResultType type, ResultUnit unit) { |
| try { |
| store.addArrayResult(message, values); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a float array of metrics to the report. |
| */ |
| @Override |
| public void addValues(String message, float[] values, ResultType type, ResultUnit unit) { |
| try { |
| store.addArrayResult(message, values); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a boolean array of metrics to the report. |
| */ |
| @Override |
| public void addValues(String message, boolean[] values, ResultType type, ResultUnit unit) { |
| try { |
| store.addArrayResult(message, values); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Adds a String List of metrics to the report. |
| */ |
| @Override |
| public void addValues(String message, List<String> values, ResultType type, ResultUnit unit) { |
| try { |
| store.addListResult(message, values); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Sets the summary double metric of the report. |
| * |
| * NOTE: messages over {@value Metric#MAX_MESSAGE_LENGTH} chars will be trimmed. |
| */ |
| @Override |
| public void setSummary(String message, double value, ResultType type, ResultUnit unit) { |
| super.setSummary(message, value, type, unit); |
| try { |
| store.addResult(message, value); |
| } catch (Exception e) { |
| Log.e(TAG, "Could not log metric.", e); |
| } |
| } |
| |
| /** |
| * Closes report file and submits report to instrumentation. |
| */ |
| public void submit(Instrumentation instrumentation) { |
| try { |
| store.close(); |
| Bundle output = new Bundle(); |
| output.putString(RESULT, serialize(this)); |
| instrumentation.sendStatus(INST_STATUS_IN_PROGRESS, output); |
| } catch (Exception e) { |
| Log.e(TAG, "ReportLog Submit Failed", e); |
| instrumentation.sendStatus(INST_STATUS_ERROR, null); |
| } |
| } |
| |
| /** |
| * Closes report file. Static functions that do not have access to instrumentation can |
| * use this to close report logs. Summary, if present, is not reported to instrumentation, hence |
| * does not appear in the result XML. |
| */ |
| public void submit() { |
| try { |
| store.close(); |
| } catch (Exception e) { |
| Log.e(TAG, "ReportLog Submit Failed", e); |
| } |
| } |
| } |