blob: d48e9f6f4869869a7d26b6cf38fe3b0c9b017c27 [file] [log] [blame]
/*
* Copyright (C) 2015 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.tradefed.targetprep;
import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
import com.android.compatibility.common.tradefed.testtype.CompatibilityTest;
import com.android.compatibility.common.tradefed.util.CollectorUtil;
import com.android.compatibility.common.util.DevicePropertyInfo;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.config.Option;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.targetprep.BuildError;
import com.android.tradefed.targetprep.TargetSetupError;
import com.android.tradefed.util.FileUtil;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Map.Entry;
/**
* An {@link ApkInstrumentationPreparer} that collects device info.
*/
public class DeviceInfoCollector extends ApkInstrumentationPreparer {
private static final String ABI = "ro.product.cpu.abi";
private static final String ABI2 = "ro.product.cpu.abi2";
private static final String ABIS = "ro.product.cpu.abilist";
private static final String ABIS_32 = "ro.product.cpu.abilist32";
private static final String ABIS_64 = "ro.product.cpu.abilist64";
private static final String BOARD = "ro.product.board";
private static final String BRAND = "ro.product.brand";
private static final String DEVICE = "ro.product.device";
private static final String FINGERPRINT = "ro.build.fingerprint";
private static final String ID = "ro.build.id";
private static final String MANUFACTURER = "ro.product.manufacturer";
private static final String MODEL = "ro.product.model";
private static final String PRODUCT = "ro.product.name";
private static final String REFERENCE_FINGERPRINT = "ro.build.reference.fingerprint";
private static final String SERIAL = "ro.serialno";
private static final String TAGS = "ro.build.tags";
private static final String TYPE = "ro.build.type";
private static final String VERSION_BASE_OS = "ro.build.version.base_os";
private static final String VERSION_RELEASE = "ro.build.version.release";
private static final String VERSION_SDK = "ro.build.version.sdk";
private static final String VERSION_SECURITY_PATCH = "ro.build.version.security_patch";
private static final String VERSION_INCREMENTAL = "ro.build.version.incremental";
private static final String PREFIX_TAG = "cts:build_";
@Option(name = CompatibilityTest.SKIP_DEVICE_INFO_OPTION,
shortName = 'd',
description = "Whether device info collection should be skipped")
private boolean mSkipDeviceInfo = false;
@Option(name= "src-dir", description = "The directory to copy to the results dir")
private String mSrcDir;
@Option(name = "dest-dir", description = "The directory under the result to store the files")
private String mDestDir;
@Option(name = "temp-dir", description = "The directory containing host-side device info files")
private String mTempDir;
// Temp directory for host-side device info files.
private File mHostDir;
// Destination result directory for all device info files.
private File mResultDir;
public DeviceInfoCollector() {
mWhen = When.BOTH;
}
@Override
public void setUp(ITestDevice device, IBuildInfo buildInfo) throws TargetSetupError,
BuildError, DeviceNotAvailableException {
DevicePropertyInfo devicePropertyInfo = new DevicePropertyInfo(ABI, ABI2, ABIS, ABIS_32,
ABIS_64, BOARD, BRAND, DEVICE, FINGERPRINT, ID, MANUFACTURER, MODEL, PRODUCT,
REFERENCE_FINGERPRINT, SERIAL, TAGS, TYPE, VERSION_BASE_OS, VERSION_RELEASE,
VERSION_SDK, VERSION_SECURITY_PATCH, VERSION_INCREMENTAL);
// add device properties to the result with a prefix tag for each key
for (Entry<String, String> entry :
devicePropertyInfo.getPropertytMapWithPrefix(PREFIX_TAG).entrySet()) {
buildInfo.addBuildAttribute(
entry.getKey(), nullToEmpty(device.getProperty(entry.getValue())));
}
if (mSkipDeviceInfo) {
return;
}
createTempHostDir();
createResultDir(buildInfo);
run(device, buildInfo);
getDeviceInfoFiles(device);
}
@Override
public void tearDown(ITestDevice device, IBuildInfo buildInfo, Throwable e) {
if (mSkipDeviceInfo) {
return;
}
if (mHostDir != null && mHostDir.isDirectory() &&
mResultDir != null && mResultDir.isDirectory()) {
CollectorUtil.pullFromHost(mHostDir, mResultDir);
}
}
private void createTempHostDir() {
try {
mHostDir = FileUtil.createNamedTempDir(mTempDir);
if (!mHostDir.isDirectory()) {
CLog.e("%s is not a directory", mHostDir.getAbsolutePath());
return;
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void createResultDir(IBuildInfo buildInfo) {
CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(buildInfo);
try {
mResultDir = buildHelper.getResultDir();
if (mDestDir != null) {
mResultDir = new File(mResultDir, mDestDir);
}
mResultDir.mkdirs();
if (!mResultDir.isDirectory()) {
CLog.e("%s is not a directory", mResultDir.getAbsolutePath());
return;
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
}
private void getDeviceInfoFiles(ITestDevice device) {
if (mResultDir != null && mResultDir.isDirectory()) {
String mResultPath = mResultDir.getAbsolutePath();
CollectorUtil.pullFromDevice(device, mSrcDir, mResultPath);
}
}
private static String nullToEmpty(String value) {
return value == null ? "" : value;
}
}