blob: 1a2eabe8f78c456b18276e5bf31fa44034e1cc30 [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.testtype.CompatibilityTest;
import com.android.compatibility.common.util.DeviceInfo;
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.ITestLogger;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.FileInputStreamSource;
import com.android.tradefed.result.ITestLoggerReceiver;
import com.android.tradefed.result.LogDataType;
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.IOException;
import java.util.Map.Entry;
/**
* An {@link ApkInstrumentationPreparer} that collects device info.
*/
public class DeviceInfoCollector extends ApkInstrumentationPreparer implements ITestLoggerReceiver {
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_";
private static final String DEVICE_INFO_DIR = "device_info_dir";
@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 = DeviceInfo.RESULT_DIR_NAME;
@Deprecated
@Option(name = "temp-dir", description = "The directory containing host-side device info files")
private String mTempDir;
private ITestLogger mLogger;
private File deviceInfoDir = null;
public DeviceInfoCollector() {
mWhen = When.BEFORE;
}
@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;
}
run(device, buildInfo);
try {
deviceInfoDir = FileUtil.createTempDir(DeviceInfo.RESULT_DIR_NAME);
if (device.pullDir(mSrcDir, deviceInfoDir)) {
for (File deviceInfoFile : deviceInfoDir.listFiles()) {
try (FileInputStreamSource source = new FileInputStreamSource(deviceInfoFile)) {
mLogger.testLog(deviceInfoFile.getName(), LogDataType.TEXT, source);
}
}
buildInfo.addBuildAttribute(DEVICE_INFO_DIR, deviceInfoDir.getAbsolutePath());
} else {
CLog.e("Failed to pull device-info files from device %s", device.getSerialNumber());
}
} catch (IOException e) {
CLog.e("Failed to pull device-info files from device %s", device.getSerialNumber());
CLog.e(e);
}
}
@Override
public void tearDown(ITestDevice device, IBuildInfo buildInfo, Throwable e)
throws DeviceNotAvailableException {
FileUtil.recursiveDelete(deviceInfoDir);
super.tearDown(device, buildInfo, e);
}
@Override
public void setTestLogger(ITestLogger testLogger) {
mLogger = testLogger;
}
private static String nullToEmpty(String value) {
return value == null ? "" : value;
}
}