blob: 088114a0495b81f7b833c8b8ee3e81654c31c9b6 [file] [log] [blame]
/*
* 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.tradefed.build;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.DeviceProperties;
import com.android.tradefed.device.ITestDevice;
/**
* A wrapper class for a {@link IBuildInfo}, that contains helper methods to retrieve device
* platform build information.
* <p/>
* Intended to be use for "unbundled" aka not device builds {@link IBuildInfo}, that desire
* metadata about what device the build was run on.
*/
public class DeviceBuildDescriptor {
public static final String DEVICE_BUILD_ID = "device_build_id";
public static final String DEVICE_BUILD_ALIAS = "device_build_alias";
public static final String DEVICE_BUILD_FLAVOR = "device_build_flavor";
public static final String DEVICE_DESC = "device_description";
public static final String DEVICE_PRODUCT = "device_product";
private final IBuildInfo mBuild;
public DeviceBuildDescriptor(IBuildInfo build) {
mBuild = build;
}
/**
* Determines if given {@link IBuildInfo} contains device build metadata
*
* @param build
* @return True if the {@link IBuildInfo} contains the device build metadata, false otherwise
*/
public static boolean describesDeviceBuild(IBuildInfo build) {
return build.getBuildAttributes().containsKey(DEVICE_BUILD_ID);
}
/**
* Gets the device build ID. Maps to the ro.build.incremental.id property on device.
*/
public String getDeviceBuildId() {
return mBuild.getBuildAttributes().get(DEVICE_BUILD_ID);
}
/**
* Gets the device build alias. Maps to the ro.build.id property on device. Typically follows
* format IMM76.
*/
public String getDeviceBuildAlias() {
return mBuild.getBuildAttributes().get(DEVICE_BUILD_ALIAS);
}
/**
* Gets the device build flavor eg yakju-userdebug.
*/
public String getDeviceBuildFlavor() {
return mBuild.getBuildAttributes().get(DEVICE_BUILD_FLAVOR);
}
/**
* Gets a description of the device and build. This is typically a more end-user friendly
* description compared with {@link #getDeviceBuildAlias()} and {@link #getDeviceBuildFlavor()}
* but with the possible penalty of being less precise.
* eg. it wouldn't be possible to distinguish the GSM (yakju) and CDMA (mysid) variants of
* Google Galaxy Nexus using this string.
*/
public String getDeviceUserDescription() {
return mBuild.getBuildAttributes().get(DEVICE_DESC);
}
/**
* Get the product and variant of the device, in product:variant format.
*/
public String getDeviceProduct() {
return mBuild.getBuildAttributes().get(DEVICE_PRODUCT);
}
/**
* Inserts attributes from device into build.
*
* @param device
* @throws DeviceNotAvailableException
*/
public static void injectDeviceAttributes(ITestDevice device, IBuildInfo b)
throws DeviceNotAvailableException {
b.addBuildAttribute(DEVICE_BUILD_ID, device.getBuildId());
b.addBuildAttribute(DEVICE_BUILD_ALIAS, device.getBuildAlias());
String buildFlavor =
String.format(
"%s-%s",
device.getProperty(DeviceProperties.PRODUCT),
device.getProperty(DeviceProperties.BUILD_TYPE));
b.addBuildAttribute(DEVICE_BUILD_FLAVOR, buildFlavor);
b.addBuildAttribute(DEVICE_DESC, generateDeviceDesc(device));
b.addBuildAttribute(DEVICE_PRODUCT, generateDeviceProduct(device));
}
/**
* Generate the device description string from device properties.
* <p/>
* Description should follow this format: eg
* Google Galaxy Nexus 4.2
*
* @param device
* @return The device description string
* @throws DeviceNotAvailableException
*/
public static String generateDeviceDesc(ITestDevice device)
throws DeviceNotAvailableException {
// brand is typically all lower case. Capitalize it
String brand = device.getProperty(DeviceProperties.BRAND);
if (brand.length() > 1) {
brand = String.format("%s%s", brand.substring(0, 1).toUpperCase(), brand.substring(1));
}
return String.format(
"%s %s %s",
brand,
device.getProperty("ro.product.model"),
device.getProperty(DeviceProperties.RELEASE_VERSION));
}
/**
* Query the product and variant of the device, in product:variant format.
* @throws DeviceNotAvailableException
*/
public static String generateDeviceProduct(ITestDevice device)
throws DeviceNotAvailableException {
return String.format("%s:%s", device.getProductType(), device.getProductVariant());
}
}