Device Data¶
A module to manipulate device manufacturing information.
The “Device Data” is a set of mapping data storing manufacturing information for DUT (device under test), including peripheral information (for example if touchscreen should be available or not), per-device provisioned data (also known as Vital Product Data - VPD; for example serial number or shipping region), test status (has passed SMT, FATP, or other stations).
The Device Data is shared by tests in Chrome OS Factory Software, the test harness “Goofy” and the “Shopfloor Service API”. The values usually come from pre-defined values, shopfloor backend, or set by tests using manual selection or barcode scanner (especially serial numbers).
Device Data can be considered as a mapping or dictionary, with following keys:
serials
: A dictionary for serial numbers of device, components, and mainboard. All serial numbers here will be logged by testlog, including:serial_number
: The serial number of “device” itself (printed on device panel).mlb_serial_number
: The serial number of main logic board (mainboard).
component
: A dictionary to indicate what peripherals should exist, for example:has_touchscreen=True
: A touch screen should be available.has_dram=2
: Two DRAM components should be available.
vpd
: A dict for what VPD values need to be set, including:ro
: VPD values in RO section (RO_VPD), usually including:region
: Region code as defined in http://go/cros-regions.
rw
: VPD values in RW section (RW_VPD), usually including:ubind_attribute
: User registration code.gbind_attribute
: Group registration code.
hwid
: A value of probed Hardware ID.factory
: A dict for manufacturing flow control, used by shopfloor backends. See Shopfloor Service API for more details.feature management
: A dictionary for what feature management will be reading, including:feature management
: boolean value specifying if panel A contains logo.hw_compliance_version
: Int value representing the version in factory?
For example, a typical device usually has both device serial number and main board serial number, region VPD, registration codes, thus the device data will be set to:
{
'serials': {
'serial_number': 'SN1234567890',
'mlb_serial_number': 'MLB1234567890'
},
'vpd': {
'ro': {
'region': 'us'
},
'rw': {
'ubind_attribute': '12345',
'gbind_attribute': '54321',
}
}
}
Using Device Data¶
Device Data is internally stored as Python dict inside shelves, and provided by cros.factory.test.state module via RPC calls.
To get all data as single dict,
use GetAllDeviceData
. To get partial data, use GetDeviceData
with key
names joined using dot. For example, to fetch only the ro
values inside
vpd
:
GetDeviceData('vpd.ro')
The key names are also defined in this module. All constants starting with
KEY_
are complete key names for GetDeviceData
to use. Constants starting
with NAME_
are key names (no dot) of the single dict. For example, following
calls are equivalent if vpd.ro.region
exists:
GetDeviceData('vpd.ro.region')
GetDeviceData('vpd').get('ro').get('region')
GetDeviceData(KEY_VPD).get(NAME_RO).get(NAME_REGION)
GetDeviceData(KEY_VPD_RO).get(NAME_REGION)
GetDeviceData(KEY_VPD_REGION)
If vpd.ro
does not exist, get('ro')
will return None so you can’t invoke
another get('region')
on it. So using the complete key path
(vpd.ro.region
) provides an easier way to retrieve single value without
worrying if the intermediate dictionaries exist or not.
Using Serial Number¶
There are some special helpers to access serial number. GetSerialNumber
and
SetSerialNumber
expect names of serial numbers (NAME_*
). But as a syntax
sugar, they will also accept keys with KEY_SERIALS
prefixed. For example,
following calls are equivalent:
GetSerialNumber('serial_number')
GetSerialNumber(NAME_SERIAL_NUMBER)
GetSerialNumber(KEY_SERIAL_NUMBER)
GetDeviceData(KEY_SERIAL_NUMBER)
Note when setting serial numbers (SetSerialNumber
), a value evaluates to
false (None, false, empty string…) will delete the stored serial number.
API Spec¶
- cros.factory.test.device_data.CheckValidDeviceDataKey(key, key_prefix=None)¶
Checks if given key is a valid device data key.
- Parameters
key – A string of key for device data.
key_prefix – Key must start with this token.
- Raises
KeyError if the key is not valid. –
- cros.factory.test.device_data.GetDeviceData(key: str, default=None, data_type: Optional[Union[int, str]] = None, throw_if_none: bool = False)¶
Returns the device data associated by key.
- Parameters
key – A string of key to access device data.
default – The default value if key does not exist.
data_type – The returned type of the function. We may save integer as an hex string in the device data. Use data_type to convert it into int. Do no conversion if data_type is None.
throw_if_none – If set, throw a KeyError if the key is not found.
- Returns
Associated value if key exists in device data, otherwise the value specified by default. Defaults to None.
- cros.factory.test.device_data.GetAllDeviceData()¶
Returns all device data in a single dict.
- cros.factory.test.device_data.GetDeviceDataSelector()¶
Returns the data shelf selector rooted at device data.
This is primarily used by invocation module to resolve TestListArgs.
- cros.factory.test.device_data.DeleteDeviceData(delete_keys, optional=False)¶
Deletes given keys from device data.
- Parameters
delete_keys – A list of keys (or a single string) to be deleted.
optional – False to raise a KeyError if not found.
- Returns
The updated dictionary.
- cros.factory.test.device_data.VerifyDeviceData(device_data)¶
Verifies whether all fields in the device data dictionary are valid.
- Parameters
device_data – A dict with key/value pairs to verify.
- Raises
ValueError –
- cros.factory.test.device_data.UpdateDeviceData(new_device_data)¶
Updates existing device data with given new dict data.
- Parameters
new_device_data – A dict with key/value pairs to update. Old values are overwritten.
- Returns
The updated dictionary.
- cros.factory.test.device_data.GetAllSerialNumbers()¶
Returns all serial numbers available in device data as dict.
- cros.factory.test.device_data.ClearAllSerialNumbers()¶
Clears all serial numbers stored in device data.
- cros.factory.test.device_data.GetSerialNumber(name='serial_number')¶
Returns a serial number (default to device serial number).
- cros.factory.test.device_data.SetSerialNumber(name, value)¶
Sets a serial number to give nvalue.
- Parameters
name – A string to indicate serial number name.
value – A string representing the serial number, or anything evaluated as False to delete the serial number.
- cros.factory.test.device_data.UpdateSerialNumbers(dict_)¶
Updates stored serial numbers by given dict.
- Parameters
dict – A mapping of serial number names and values to change. A value evaluated as False will delete the serial number from device data.
- cros.factory.test.device_data.GetOEMName()¶
Returns OEM name in device data.
- cros.factory.test.device_data.FlattenData(data, parent='')¶
An helper utility to flatten multiple layers of dict into one dict.
For example, {‘a’: {‘b’: ‘c’}} => {‘a.b’: ‘c’}
- Parameters
data – The dict type data to be flattened.
parent – A string to encode as key prefix for recursion.
- Returns
A flattened dict.
- cros.factory.test.device_data.LoadConfig(config_name=None)¶
Helper utility to load a JSON config that represents device data.
- Parameters
config_name – A string for name to be passed to config_utils.LoadConfig.
- Returns
A dictionary as device data (already flattened).
- cros.factory.test.device_data.UpdateDeviceDataFromVPD(key_map, vpd_data)¶
Update device data from VPD data.
Please see pytest read_device_data_from_vpd for more details. For both key_map and vpd_data, they should be a dictionary, with at most two keys: ‘ro’ and ‘rw’ (NAME_RO and NAME_RW). key_map[‘ro’] and key_map[‘rw’] should follow the format of ro_key_map and rw_key_map in read_device_data_from_vpd. If key_map is None, a default key_map will be used.
- exception cros.factory.test.device_data.InvalidFeatureData¶
Exception to raise when data is incorrect
- exception cros.factory.test.device_data.InconsistentFeatureData¶
Raised when data is not matching with existing device_data
- cros.factory.test.device_data.GetFeatureDeviceData() Dict[str, Union[int, bool]] ¶
Returns Feature Management
- cros.factory.test.device_data.VerifyFeatureData(data: dict) bool ¶
- cros.factory.test.device_data.SetFeatureDeviceData(new_data: Dict) None ¶
Sets the data of feature device.
- cros.factory.test.device_data.SetBrandedChassisData(branded: bool) None ¶
- cros.factory.test.device_data.SetHWComplianceVersionData(version: int) None ¶