forked from openkylin/platform_build
Rename care map in pb format to care_map.pb
The new suffix distinguishes the new care_map from the ones in plain text format; and thus the old update_verifier won't report an error upon parsing failures. Bug: 115740187 Test: Generate OTA files for Pixels Change-Id: Ia782afd8cbb0f4bb8c363edaa00e92ab302d5d1b
This commit is contained in:
parent
15f4979639
commit
4c05f4a41e
|
@ -72,7 +72,7 @@ OPTIONS.replace_verity_public_key = False
|
|||
OPTIONS.replace_verity_private_key = False
|
||||
OPTIONS.is_signing = False
|
||||
|
||||
# Partitions that should have their care_map added to META/care_map.txt.
|
||||
# Partitions that should have their care_map added to META/care_map.pb
|
||||
PARTITIONS_WITH_CARE_MAP = ('system', 'vendor', 'product', 'product_services',
|
||||
'odm')
|
||||
# Use a fixed timestamp (01/01/2009 00:00:00 UTC) for files when packaging
|
||||
|
@ -542,12 +542,12 @@ def CheckAbOtaImages(output_zip, ab_partitions):
|
|||
assert available, "Failed to find " + img_name
|
||||
|
||||
|
||||
def AddCareMapTxtForAbOta(output_zip, ab_partitions, image_paths):
|
||||
"""Generates and adds care_map.txt for system and vendor partitions.
|
||||
def AddCareMapForAbOta(output_zip, ab_partitions, image_paths):
|
||||
"""Generates and adds care_map.pb for system and vendor partitions.
|
||||
|
||||
Args:
|
||||
output_zip: The output zip file (needs to be already open), or None to
|
||||
write care_map.txt to OPTIONS.input_tmp/.
|
||||
write care_map.pb to OPTIONS.input_tmp/.
|
||||
ab_partitions: The list of A/B partitions.
|
||||
image_paths: A map from the partition name to the image path.
|
||||
"""
|
||||
|
@ -580,11 +580,11 @@ def AddCareMapTxtForAbOta(output_zip, ab_partitions, image_paths):
|
|||
p = common.Run(care_map_gen_cmd, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT)
|
||||
output, _ = p.communicate()
|
||||
assert p.returncode == 0, "Failed to generate the care_map proto message."
|
||||
assert p.returncode == 0, "Failed to generate the care_map.pb message."
|
||||
if OPTIONS.verbose:
|
||||
print(output.rstrip())
|
||||
|
||||
care_map_path = "META/care_map.txt"
|
||||
care_map_path = "META/care_map.pb"
|
||||
if output_zip and care_map_path not in output_zip.namelist():
|
||||
common.ZipWrite(output_zip, temp_care_map, arcname=care_map_path)
|
||||
else:
|
||||
|
@ -644,7 +644,7 @@ def AddSuperEmpty(output_zip):
|
|||
def ReplaceUpdatedFiles(zip_filename, files_list):
|
||||
"""Updates all the ZIP entries listed in files_list.
|
||||
|
||||
For now the list includes META/care_map.txt, and the related files under
|
||||
For now the list includes META/care_map.pb, and the related files under
|
||||
SYSTEM/ after rebuilding recovery.
|
||||
"""
|
||||
common.ZipDelete(zip_filename, files_list)
|
||||
|
@ -693,8 +693,8 @@ def AddImagesToTargetFiles(filename):
|
|||
os.path.exists(os.path.join(OPTIONS.input_tmp, "IMAGES",
|
||||
"vendor.img")))
|
||||
has_odm = (os.path.isdir(os.path.join(OPTIONS.input_tmp, "ODM")) or
|
||||
os.path.exists(os.path.join(OPTIONS.input_tmp, "IMAGES",
|
||||
"odm.img")))
|
||||
os.path.exists(os.path.join(OPTIONS.input_tmp, "IMAGES",
|
||||
"odm.img")))
|
||||
has_product = (os.path.isdir(os.path.join(OPTIONS.input_tmp, "PRODUCT")) or
|
||||
os.path.exists(os.path.join(OPTIONS.input_tmp, "IMAGES",
|
||||
"product.img")))
|
||||
|
@ -824,9 +824,9 @@ def AddImagesToTargetFiles(filename):
|
|||
# ready under IMAGES/ or RADIO/.
|
||||
CheckAbOtaImages(output_zip, ab_partitions)
|
||||
|
||||
# Generate care_map.txt for system and vendor partitions (if present), then
|
||||
# write this file to target_files package.
|
||||
AddCareMapTxtForAbOta(output_zip, ab_partitions, partitions)
|
||||
# Generate care_map.pb for system and vendor partitions (if present),
|
||||
# then write this file to target_files package.
|
||||
AddCareMapForAbOta(output_zip, ab_partitions, partitions)
|
||||
|
||||
# Radio images that need to be packed into IMAGES/, and product-img.zip.
|
||||
pack_radioimages_txt = os.path.join(
|
||||
|
|
|
@ -1167,7 +1167,8 @@ class StreamingPropertyFiles(PropertyFiles):
|
|||
'payload_properties.txt',
|
||||
)
|
||||
self.optional = (
|
||||
# care_map.txt is available only if dm-verity is enabled.
|
||||
# care_map is available only if dm-verity is enabled.
|
||||
'care_map.pb',
|
||||
'care_map.txt',
|
||||
# compatibility.zip is available only if target supports Treble.
|
||||
'compatibility.zip',
|
||||
|
@ -1786,13 +1787,16 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file,
|
|||
target_zip = zipfile.ZipFile(target_file, "r")
|
||||
if (target_info.get("verity") == "true" or
|
||||
target_info.get("avb_enable") == "true"):
|
||||
care_map_path = "META/care_map.txt"
|
||||
namelist = target_zip.namelist()
|
||||
if care_map_path in namelist:
|
||||
care_map_data = target_zip.read(care_map_path)
|
||||
# In order to support streaming, care_map.txt needs to be packed as
|
||||
care_map_list = [x for x in ["care_map.pb", "care_map.txt"] if
|
||||
"META/" + x in target_zip.namelist()]
|
||||
|
||||
# Adds care_map if either the protobuf format or the plain text one exists.
|
||||
if care_map_list:
|
||||
care_map_name = care_map_list[0]
|
||||
care_map_data = target_zip.read("META/" + care_map_name)
|
||||
# In order to support streaming, care_map needs to be packed as
|
||||
# ZIP_STORED.
|
||||
common.ZipWriteStr(output_zip, "care_map.txt", care_map_data,
|
||||
common.ZipWriteStr(output_zip, care_map_name, care_map_data,
|
||||
compress_type=zipfile.ZIP_STORED)
|
||||
else:
|
||||
print("Warning: cannot find care map file in target_file package")
|
||||
|
|
|
@ -395,7 +395,7 @@ def ProcessTargetFiles(input_tf_zip, output_tf_zip, misc_info,
|
|||
pass
|
||||
|
||||
# Skip the care_map as we will regenerate the system/vendor images.
|
||||
elif filename == "META/care_map.txt":
|
||||
elif filename == "META/care_map.pb" or filename == "META/care_map.txt":
|
||||
pass
|
||||
|
||||
# A non-APK file; copy it verbatim.
|
||||
|
|
|
@ -23,7 +23,7 @@ import zipfile
|
|||
import common
|
||||
import test_utils
|
||||
from add_img_to_target_files import (
|
||||
AddCareMapTxtForAbOta, AddPackRadioImages, AppendVBMetaArgsForPartition,
|
||||
AddCareMapForAbOta, AddPackRadioImages, AppendVBMetaArgsForPartition,
|
||||
CheckAbOtaImages, GetCareMap)
|
||||
from rangelib import RangeSet
|
||||
|
||||
|
@ -40,7 +40,7 @@ class AddImagesToTargetFilesTest(unittest.TestCase):
|
|||
common.Cleanup()
|
||||
|
||||
def _verifyCareMap(self, expected, file_name):
|
||||
"""Parses the care_map proto; and checks the content in plain text."""
|
||||
"""Parses the care_map.pb; and checks the content in plain text."""
|
||||
text_file = common.MakeTempFile(prefix="caremap-", suffix=".txt")
|
||||
|
||||
# Calls an external binary to convert the proto message.
|
||||
|
@ -139,8 +139,8 @@ class AddImagesToTargetFilesTest(unittest.TestCase):
|
|||
images + ['baz'])
|
||||
|
||||
@staticmethod
|
||||
def _test_AddCareMapTxtForAbOta():
|
||||
"""Helper function to set up the test for test_AddCareMapTxtForAbOta()."""
|
||||
def _test_AddCareMapForAbOta():
|
||||
"""Helper function to set up the test for test_AddCareMapForAbOta()."""
|
||||
OPTIONS.info_dict = {
|
||||
'system_verity_block_device' : '/dev/block/system',
|
||||
'vendor_verity_block_device' : '/dev/block/vendor',
|
||||
|
@ -164,71 +164,71 @@ class AddImagesToTargetFilesTest(unittest.TestCase):
|
|||
}
|
||||
return image_paths
|
||||
|
||||
def test_AddCareMapTxtForAbOta(self):
|
||||
image_paths = self._test_AddCareMapTxtForAbOta()
|
||||
def test_AddCareMapForAbOta(self):
|
||||
image_paths = self._test_AddCareMapForAbOta()
|
||||
|
||||
AddCareMapTxtForAbOta(None, ['system', 'vendor'], image_paths)
|
||||
AddCareMapForAbOta(None, ['system', 'vendor'], image_paths)
|
||||
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.txt')
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.pb')
|
||||
expected = ['system', RangeSet("0-5 10-15").to_string_raw(), 'vendor',
|
||||
RangeSet("0-9").to_string_raw()]
|
||||
|
||||
self._verifyCareMap(expected, care_map_file)
|
||||
|
||||
def test_AddCareMapTxtForAbOta_withNonCareMapPartitions(self):
|
||||
def test_AddCareMapForAbOta_withNonCareMapPartitions(self):
|
||||
"""Partitions without care_map should be ignored."""
|
||||
image_paths = self._test_AddCareMapTxtForAbOta()
|
||||
image_paths = self._test_AddCareMapForAbOta()
|
||||
|
||||
AddCareMapTxtForAbOta(
|
||||
AddCareMapForAbOta(
|
||||
None, ['boot', 'system', 'vendor', 'vbmeta'], image_paths)
|
||||
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.txt')
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.pb')
|
||||
expected = ['system', RangeSet("0-5 10-15").to_string_raw(), 'vendor',
|
||||
RangeSet("0-9").to_string_raw()]
|
||||
|
||||
self._verifyCareMap(expected, care_map_file)
|
||||
|
||||
def test_AddCareMapTxtForAbOta_withAvb(self):
|
||||
def test_AddCareMapForAbOta_withAvb(self):
|
||||
"""Tests the case for device using AVB."""
|
||||
image_paths = self._test_AddCareMapTxtForAbOta()
|
||||
image_paths = self._test_AddCareMapForAbOta()
|
||||
OPTIONS.info_dict = {
|
||||
'avb_system_hashtree_enable' : 'true',
|
||||
'avb_vendor_hashtree_enable' : 'true',
|
||||
}
|
||||
|
||||
AddCareMapTxtForAbOta(None, ['system', 'vendor'], image_paths)
|
||||
AddCareMapForAbOta(None, ['system', 'vendor'], image_paths)
|
||||
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.txt')
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.pb')
|
||||
expected = ['system', RangeSet("0-5 10-15").to_string_raw(), 'vendor',
|
||||
RangeSet("0-9").to_string_raw()]
|
||||
|
||||
self._verifyCareMap(expected, care_map_file)
|
||||
|
||||
def test_AddCareMapTxtForAbOta_verityNotEnabled(self):
|
||||
"""No care_map.txt should be generated if verity not enabled."""
|
||||
image_paths = self._test_AddCareMapTxtForAbOta()
|
||||
def test_AddCareMapForAbOta_verityNotEnabled(self):
|
||||
"""No care_map.pb should be generated if verity not enabled."""
|
||||
image_paths = self._test_AddCareMapForAbOta()
|
||||
OPTIONS.info_dict = {}
|
||||
AddCareMapTxtForAbOta(None, ['system', 'vendor'], image_paths)
|
||||
AddCareMapForAbOta(None, ['system', 'vendor'], image_paths)
|
||||
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.txt')
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.pb')
|
||||
self.assertFalse(os.path.exists(care_map_file))
|
||||
|
||||
def test_AddCareMapTxtForAbOta_missingImageFile(self):
|
||||
def test_AddCareMapForAbOta_missingImageFile(self):
|
||||
"""Missing image file should be considered fatal."""
|
||||
image_paths = self._test_AddCareMapTxtForAbOta()
|
||||
image_paths = self._test_AddCareMapForAbOta()
|
||||
image_paths['vendor'] = ''
|
||||
self.assertRaises(AssertionError, AddCareMapTxtForAbOta, None,
|
||||
self.assertRaises(AssertionError, AddCareMapForAbOta, None,
|
||||
['system', 'vendor'], image_paths)
|
||||
|
||||
def test_AddCareMapTxtForAbOta_zipOutput(self):
|
||||
def test_AddCareMapForAbOta_zipOutput(self):
|
||||
"""Tests the case with ZIP output."""
|
||||
image_paths = self._test_AddCareMapTxtForAbOta()
|
||||
image_paths = self._test_AddCareMapForAbOta()
|
||||
|
||||
output_file = common.MakeTempFile(suffix='.zip')
|
||||
with zipfile.ZipFile(output_file, 'w') as output_zip:
|
||||
AddCareMapTxtForAbOta(output_zip, ['system', 'vendor'], image_paths)
|
||||
AddCareMapForAbOta(output_zip, ['system', 'vendor'], image_paths)
|
||||
|
||||
care_map_name = "META/care_map.txt"
|
||||
care_map_name = "META/care_map.pb"
|
||||
temp_dir = common.MakeTempDir()
|
||||
with zipfile.ZipFile(output_file, 'r') as verify_zip:
|
||||
self.assertTrue(care_map_name in verify_zip.namelist())
|
||||
|
@ -238,27 +238,28 @@ class AddImagesToTargetFilesTest(unittest.TestCase):
|
|||
RangeSet("0-9").to_string_raw()]
|
||||
self._verifyCareMap(expected, os.path.join(temp_dir, care_map_name))
|
||||
|
||||
def test_AddCareMapTxtForAbOta_zipOutput_careMapEntryExists(self):
|
||||
def test_AddCareMapForAbOta_zipOutput_careMapEntryExists(self):
|
||||
"""Tests the case with ZIP output which already has care_map entry."""
|
||||
image_paths = self._test_AddCareMapTxtForAbOta()
|
||||
image_paths = self._test_AddCareMapForAbOta()
|
||||
|
||||
output_file = common.MakeTempFile(suffix='.zip')
|
||||
with zipfile.ZipFile(output_file, 'w') as output_zip:
|
||||
# Create an existing META/care_map.txt entry.
|
||||
common.ZipWriteStr(output_zip, 'META/care_map.txt', 'dummy care_map.txt')
|
||||
# Create an existing META/care_map.pb entry.
|
||||
common.ZipWriteStr(output_zip, 'META/care_map.pb',
|
||||
'dummy care_map.pb')
|
||||
|
||||
# Request to add META/care_map.txt again.
|
||||
AddCareMapTxtForAbOta(output_zip, ['system', 'vendor'], image_paths)
|
||||
# Request to add META/care_map.pb again.
|
||||
AddCareMapForAbOta(output_zip, ['system', 'vendor'], image_paths)
|
||||
|
||||
# The one under OPTIONS.input_tmp must have been replaced.
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.txt')
|
||||
care_map_file = os.path.join(OPTIONS.input_tmp, 'META', 'care_map.pb')
|
||||
expected = ['system', RangeSet("0-5 10-15").to_string_raw(), 'vendor',
|
||||
RangeSet("0-9").to_string_raw()]
|
||||
|
||||
self._verifyCareMap(expected, care_map_file)
|
||||
|
||||
# The existing entry should be scheduled to be replaced.
|
||||
self.assertIn('META/care_map.txt', OPTIONS.replace_updated_files_list)
|
||||
self.assertIn('META/care_map.pb', OPTIONS.replace_updated_files_list)
|
||||
|
||||
def test_AppendVBMetaArgsForPartition(self):
|
||||
OPTIONS.info_dict = {}
|
||||
|
|
|
@ -889,6 +889,7 @@ class StreamingPropertyFilesTest(PropertyFilesTest):
|
|||
property_files.required)
|
||||
self.assertEqual(
|
||||
(
|
||||
'care_map.pb',
|
||||
'care_map.txt',
|
||||
'compatibility.zip',
|
||||
),
|
||||
|
@ -984,6 +985,7 @@ class AbOtaPropertyFilesTest(PropertyFilesTest):
|
|||
property_files.required)
|
||||
self.assertEqual(
|
||||
(
|
||||
'care_map.pb',
|
||||
'care_map.txt',
|
||||
'compatibility.zip',
|
||||
),
|
||||
|
|
Loading…
Reference in New Issue