Merge "releasetools: Consolidate the codes that generate metadata dict."
This commit is contained in:
commit
676c20f285
2 changed files with 231 additions and 38 deletions
|
@ -527,12 +527,7 @@ def WriteFullOTAPackage(input_zip, output_zip):
|
|||
if target_info.oem_props and not OPTIONS.oem_no_mount:
|
||||
target_info.WriteMountOemScript(script)
|
||||
|
||||
metadata = {
|
||||
"post-build": target_info.fingerprint,
|
||||
"pre-device": target_info.device,
|
||||
"post-timestamp": target_info.GetBuildProp("ro.build.date.utc"),
|
||||
"ota-type" : "BLOCK",
|
||||
}
|
||||
metadata = GetPackageMetadata(target_info)
|
||||
|
||||
device_specific = common.DeviceSpecificParams(
|
||||
input_zip=input_zip,
|
||||
|
@ -711,6 +706,57 @@ def HandleDowngradeMetadata(metadata, target_info, source_info):
|
|||
metadata["post-timestamp"] = post_timestamp
|
||||
|
||||
|
||||
def GetPackageMetadata(target_info, source_info=None):
|
||||
"""Generates and returns the metadata dict.
|
||||
|
||||
It generates a dict() that contains the info to be written into an OTA
|
||||
package (META-INF/com/android/metadata). It also handles the detection of
|
||||
downgrade / timestamp override / data wipe based on the global options.
|
||||
|
||||
Args:
|
||||
target_info: The BuildInfo instance that holds the target build info.
|
||||
source_info: The BuildInfo instance that holds the source build info, or
|
||||
None if generating full OTA.
|
||||
|
||||
Returns:
|
||||
A dict to be written into package metadata entry.
|
||||
"""
|
||||
assert isinstance(target_info, BuildInfo)
|
||||
assert source_info is None or isinstance(source_info, BuildInfo)
|
||||
|
||||
metadata = {
|
||||
'post-build' : target_info.fingerprint,
|
||||
'post-build-incremental' : target_info.GetBuildProp(
|
||||
'ro.build.version.incremental'),
|
||||
}
|
||||
|
||||
if target_info.is_ab:
|
||||
metadata['ota-type'] = 'AB'
|
||||
metadata['ota-required-cache'] = '0'
|
||||
else:
|
||||
metadata['ota-type'] = 'BLOCK'
|
||||
|
||||
if OPTIONS.wipe_user_data:
|
||||
metadata['ota-wipe'] = 'yes'
|
||||
|
||||
is_incremental = source_info is not None
|
||||
if is_incremental:
|
||||
metadata['pre-build'] = source_info.fingerprint
|
||||
metadata['pre-build-incremental'] = source_info.GetBuildProp(
|
||||
'ro.build.version.incremental')
|
||||
metadata['pre-device'] = source_info.device
|
||||
else:
|
||||
metadata['pre-device'] = target_info.device
|
||||
|
||||
# Detect downgrades, or fill in the post-timestamp.
|
||||
if is_incremental:
|
||||
HandleDowngradeMetadata(metadata, target_info, source_info)
|
||||
else:
|
||||
metadata['post-timestamp'] = target_info.GetBuildProp('ro.build.date.utc')
|
||||
|
||||
return metadata
|
||||
|
||||
|
||||
def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
||||
target_info = BuildInfo(OPTIONS.target_info_dict, OPTIONS.oem_dicts)
|
||||
source_info = BuildInfo(OPTIONS.source_info_dict, OPTIONS.oem_dicts)
|
||||
|
@ -728,12 +774,7 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
|||
if not OPTIONS.oem_no_mount:
|
||||
source_info.WriteMountOemScript(script)
|
||||
|
||||
metadata = {
|
||||
"pre-device": source_info.device,
|
||||
"ota-type": "BLOCK",
|
||||
}
|
||||
|
||||
HandleDowngradeMetadata(metadata, target_info, source_info)
|
||||
metadata = GetPackageMetadata(target_info, source_info)
|
||||
|
||||
device_specific = common.DeviceSpecificParams(
|
||||
source_zip=source_zip,
|
||||
|
@ -745,13 +786,6 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
|||
metadata=metadata,
|
||||
info_dict=source_info)
|
||||
|
||||
metadata["pre-build"] = source_info.fingerprint
|
||||
metadata["post-build"] = target_info.fingerprint
|
||||
metadata["pre-build-incremental"] = source_info.GetBuildProp(
|
||||
"ro.build.version.incremental")
|
||||
metadata["post-build-incremental"] = target_info.GetBuildProp(
|
||||
"ro.build.version.incremental")
|
||||
|
||||
source_boot = common.GetBootableImage(
|
||||
"/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT", source_info)
|
||||
target_boot = common.GetBootableImage(
|
||||
|
@ -1070,24 +1104,7 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file,
|
|||
source_info = None
|
||||
|
||||
# Metadata to comply with Android OTA package format.
|
||||
metadata = {
|
||||
"post-build" : target_info.fingerprint,
|
||||
"post-build-incremental" : target_info.GetBuildProp(
|
||||
"ro.build.version.incremental"),
|
||||
"ota-required-cache" : "0",
|
||||
"ota-type" : "AB",
|
||||
}
|
||||
|
||||
if source_file is not None:
|
||||
metadata["pre-device"] = source_info.device
|
||||
metadata["pre-build"] = source_info.fingerprint
|
||||
metadata["pre-build-incremental"] = source_info.GetBuildProp(
|
||||
"ro.build.version.incremental")
|
||||
|
||||
HandleDowngradeMetadata(metadata, target_info, source_info)
|
||||
else:
|
||||
metadata["pre-device"] = target_info.device
|
||||
metadata["post-timestamp"] = target_info.GetBuildProp("ro.build.date.utc")
|
||||
metadata = GetPackageMetadata(target_info, source_info)
|
||||
|
||||
# 1. Generate payload.
|
||||
payload_file = common.MakeTempFile(prefix="payload-", suffix=".bin")
|
||||
|
|
|
@ -19,7 +19,7 @@ import unittest
|
|||
|
||||
import common
|
||||
from ota_from_target_files import (
|
||||
_LoadOemDicts, BuildInfo, WriteFingerprintAssertion)
|
||||
_LoadOemDicts, BuildInfo, GetPackageMetadata, WriteFingerprintAssertion)
|
||||
|
||||
|
||||
class MockScriptWriter(object):
|
||||
|
@ -300,3 +300,179 @@ class LoadOemDictsTest(unittest.TestCase):
|
|||
self.assertEqual('foo', oem_dict['xyz'])
|
||||
self.assertEqual('bar', oem_dict['a.b.c'])
|
||||
self.assertEqual('{}'.format(i), oem_dict['ro.build.index'])
|
||||
|
||||
|
||||
class OtaFromTargetFilesTest(unittest.TestCase):
|
||||
|
||||
TEST_TARGET_INFO_DICT = {
|
||||
'build.prop' : {
|
||||
'ro.product.device' : 'product-device',
|
||||
'ro.build.fingerprint' : 'build-fingerprint-target',
|
||||
'ro.build.version.incremental' : 'build-version-incremental-target',
|
||||
'ro.build.date.utc' : '1500000000',
|
||||
},
|
||||
}
|
||||
|
||||
TEST_SOURCE_INFO_DICT = {
|
||||
'build.prop' : {
|
||||
'ro.product.device' : 'product-device',
|
||||
'ro.build.fingerprint' : 'build-fingerprint-source',
|
||||
'ro.build.version.incremental' : 'build-version-incremental-source',
|
||||
'ro.build.date.utc' : '1400000000',
|
||||
},
|
||||
}
|
||||
|
||||
def setUp(self):
|
||||
# Reset the global options as in ota_from_target_files.py.
|
||||
common.OPTIONS.incremental_source = None
|
||||
common.OPTIONS.downgrade = False
|
||||
common.OPTIONS.timestamp = False
|
||||
common.OPTIONS.wipe_user_data = False
|
||||
|
||||
def test_GetPackageMetadata_abOta_full(self):
|
||||
target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT)
|
||||
target_info_dict['ab_update'] = 'true'
|
||||
target_info = BuildInfo(target_info_dict, None)
|
||||
metadata = GetPackageMetadata(target_info)
|
||||
self.assertDictEqual(
|
||||
{
|
||||
'ota-type' : 'AB',
|
||||
'ota-required-cache' : '0',
|
||||
'post-build' : 'build-fingerprint-target',
|
||||
'post-build-incremental' : 'build-version-incremental-target',
|
||||
'post-timestamp' : '1500000000',
|
||||
'pre-device' : 'product-device',
|
||||
},
|
||||
metadata)
|
||||
|
||||
def test_GetPackageMetadata_abOta_incremental(self):
|
||||
target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT)
|
||||
target_info_dict['ab_update'] = 'true'
|
||||
target_info = BuildInfo(target_info_dict, None)
|
||||
source_info = BuildInfo(self.TEST_SOURCE_INFO_DICT, None)
|
||||
common.OPTIONS.incremental_source = ''
|
||||
metadata = GetPackageMetadata(target_info, source_info)
|
||||
self.assertDictEqual(
|
||||
{
|
||||
'ota-type' : 'AB',
|
||||
'ota-required-cache' : '0',
|
||||
'post-build' : 'build-fingerprint-target',
|
||||
'post-build-incremental' : 'build-version-incremental-target',
|
||||
'post-timestamp' : '1500000000',
|
||||
'pre-device' : 'product-device',
|
||||
'pre-build' : 'build-fingerprint-source',
|
||||
'pre-build-incremental' : 'build-version-incremental-source',
|
||||
},
|
||||
metadata)
|
||||
|
||||
def test_GetPackageMetadata_nonAbOta_full(self):
|
||||
target_info = BuildInfo(self.TEST_TARGET_INFO_DICT, None)
|
||||
metadata = GetPackageMetadata(target_info)
|
||||
self.assertDictEqual(
|
||||
{
|
||||
'ota-type' : 'BLOCK',
|
||||
'post-build' : 'build-fingerprint-target',
|
||||
'post-build-incremental' : 'build-version-incremental-target',
|
||||
'post-timestamp' : '1500000000',
|
||||
'pre-device' : 'product-device',
|
||||
},
|
||||
metadata)
|
||||
|
||||
def test_GetPackageMetadata_nonAbOta_incremental(self):
|
||||
target_info = BuildInfo(self.TEST_TARGET_INFO_DICT, None)
|
||||
source_info = BuildInfo(self.TEST_SOURCE_INFO_DICT, None)
|
||||
common.OPTIONS.incremental_source = ''
|
||||
metadata = GetPackageMetadata(target_info, source_info)
|
||||
self.assertDictEqual(
|
||||
{
|
||||
'ota-type' : 'BLOCK',
|
||||
'post-build' : 'build-fingerprint-target',
|
||||
'post-build-incremental' : 'build-version-incremental-target',
|
||||
'post-timestamp' : '1500000000',
|
||||
'pre-device' : 'product-device',
|
||||
'pre-build' : 'build-fingerprint-source',
|
||||
'pre-build-incremental' : 'build-version-incremental-source',
|
||||
},
|
||||
metadata)
|
||||
|
||||
def test_GetPackageMetadata_wipe(self):
|
||||
target_info = BuildInfo(self.TEST_TARGET_INFO_DICT, None)
|
||||
common.OPTIONS.wipe_user_data = True
|
||||
metadata = GetPackageMetadata(target_info)
|
||||
self.assertDictEqual(
|
||||
{
|
||||
'ota-type' : 'BLOCK',
|
||||
'ota-wipe' : 'yes',
|
||||
'post-build' : 'build-fingerprint-target',
|
||||
'post-build-incremental' : 'build-version-incremental-target',
|
||||
'post-timestamp' : '1500000000',
|
||||
'pre-device' : 'product-device',
|
||||
},
|
||||
metadata)
|
||||
|
||||
@staticmethod
|
||||
def _test_GetPackageMetadata_swapBuildTimestamps(target_info, source_info):
|
||||
(target_info['build.prop']['ro.build.date.utc'],
|
||||
source_info['build.prop']['ro.build.date.utc']) = (
|
||||
source_info['build.prop']['ro.build.date.utc'],
|
||||
target_info['build.prop']['ro.build.date.utc'])
|
||||
|
||||
def test_GetPackageMetadata_unintentionalDowngradeDetected(self):
|
||||
target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT)
|
||||
source_info_dict = copy.deepcopy(self.TEST_SOURCE_INFO_DICT)
|
||||
self._test_GetPackageMetadata_swapBuildTimestamps(
|
||||
target_info_dict, source_info_dict)
|
||||
|
||||
target_info = BuildInfo(target_info_dict, None)
|
||||
source_info = BuildInfo(source_info_dict, None)
|
||||
common.OPTIONS.incremental_source = ''
|
||||
self.assertRaises(RuntimeError, GetPackageMetadata, target_info,
|
||||
source_info)
|
||||
|
||||
def test_GetPackageMetadata_downgrade(self):
|
||||
target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT)
|
||||
source_info_dict = copy.deepcopy(self.TEST_SOURCE_INFO_DICT)
|
||||
self._test_GetPackageMetadata_swapBuildTimestamps(
|
||||
target_info_dict, source_info_dict)
|
||||
|
||||
target_info = BuildInfo(target_info_dict, None)
|
||||
source_info = BuildInfo(source_info_dict, None)
|
||||
common.OPTIONS.incremental_source = ''
|
||||
common.OPTIONS.downgrade = True
|
||||
common.OPTIONS.wipe_user_data = True
|
||||
metadata = GetPackageMetadata(target_info, source_info)
|
||||
self.assertDictEqual(
|
||||
{
|
||||
'ota-downgrade' : 'yes',
|
||||
'ota-type' : 'BLOCK',
|
||||
'ota-wipe' : 'yes',
|
||||
'post-build' : 'build-fingerprint-target',
|
||||
'post-build-incremental' : 'build-version-incremental-target',
|
||||
'pre-device' : 'product-device',
|
||||
'pre-build' : 'build-fingerprint-source',
|
||||
'pre-build-incremental' : 'build-version-incremental-source',
|
||||
},
|
||||
metadata)
|
||||
|
||||
def test_GetPackageMetadata_overrideTimestamp(self):
|
||||
target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT)
|
||||
source_info_dict = copy.deepcopy(self.TEST_SOURCE_INFO_DICT)
|
||||
self._test_GetPackageMetadata_swapBuildTimestamps(
|
||||
target_info_dict, source_info_dict)
|
||||
|
||||
target_info = BuildInfo(target_info_dict, None)
|
||||
source_info = BuildInfo(source_info_dict, None)
|
||||
common.OPTIONS.incremental_source = ''
|
||||
common.OPTIONS.timestamp = True
|
||||
metadata = GetPackageMetadata(target_info, source_info)
|
||||
self.assertDictEqual(
|
||||
{
|
||||
'ota-type' : 'BLOCK',
|
||||
'post-build' : 'build-fingerprint-target',
|
||||
'post-build-incremental' : 'build-version-incremental-target',
|
||||
'post-timestamp' : '1500000001',
|
||||
'pre-device' : 'product-device',
|
||||
'pre-build' : 'build-fingerprint-source',
|
||||
'pre-build-incremental' : 'build-version-incremental-source',
|
||||
},
|
||||
metadata)
|
||||
|
|
Loading…
Reference in a new issue