From 667c7534ed1ec0a2f91cee280c2d16205b62932c Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Fri, 6 Jul 2018 10:13:59 -0700 Subject: [PATCH] releasetools: Add dict-like setter to BuildInfo. BuildInfo already has dict-like getters. This CL adds the matching setter method to keep it backward compatible with device-specific scripts that expect a dict. It also adds items() method that allows iterating the items. Bug: 111087332 Test: python -m unittest test_ota_from_target_files.BuildInfoTest Test: Generate an incremental OTA that sets info_dict in device-specific releasetools script. Change-Id: Idd033f98a9186740f9da1a300d4c2bdddd9c1345 --- tools/releasetools/ota_from_target_files.py | 10 +++++++++- tools/releasetools/test_ota_from_target_files.py | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index a8c821f6c7..0e25c7e46c 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -250,12 +250,14 @@ class BuildInfo(object): def __init__(self, info_dict, oem_dicts): """Initializes a BuildInfo instance with the given dicts. + Note that it only wraps up the given dicts, without making copies. + Arguments: info_dict: The build-time info dict. oem_dicts: A list of OEM dicts (which is parsed from --oem_settings). Note that it always uses the first dict to calculate the fingerprint or the device name. The rest would be used for asserting OEM properties only - (e.g. one package can be installed on one of these devices). + (e.g. one package can be installed on one of these devices). """ self.info_dict = info_dict self.oem_dicts = oem_dicts @@ -289,9 +291,15 @@ class BuildInfo(object): def __getitem__(self, key): return self.info_dict[key] + def __setitem__(self, key, value): + self.info_dict[key] = value + def get(self, key, default=None): return self.info_dict.get(key, default) + def items(self): + return self.info_dict.items() + def GetBuildProp(self, prop): """Returns the inquired build property.""" try: diff --git a/tools/releasetools/test_ota_from_target_files.py b/tools/releasetools/test_ota_from_target_files.py index e472363ad9..7c34b7e998 100644 --- a/tools/releasetools/test_ota_from_target_files.py +++ b/tools/releasetools/test_ota_from_target_files.py @@ -190,6 +190,16 @@ class BuildInfoTest(unittest.TestCase): self.assertRaises(KeyError, lambda: target_info['build.prop']['ro.build.foo']) + def test___setitem__(self): + target_info = BuildInfo(copy.deepcopy(self.TEST_INFO_DICT), None) + self.assertEqual('value1', target_info['property1']) + target_info['property1'] = 'value2' + self.assertEqual('value2', target_info['property1']) + + self.assertEqual('build-foo', target_info['build.prop']['ro.build.foo']) + target_info['build.prop']['ro.build.foo'] = 'build-bar' + self.assertEqual('build-bar', target_info['build.prop']['ro.build.foo']) + def test_get(self): target_info = BuildInfo(self.TEST_INFO_DICT, None) self.assertEqual('value1', target_info.get('property1')) @@ -209,6 +219,12 @@ class BuildInfoTest(unittest.TestCase): self.assertRaises(KeyError, lambda: target_info.get('build.prop')['ro.build.foo']) + def test_items(self): + target_info = BuildInfo(self.TEST_INFO_DICT, None) + items = target_info.items() + self.assertIn(('property1', 'value1'), items) + self.assertIn(('property2', 4096), items) + def test_GetBuildProp(self): target_info = BuildInfo(self.TEST_INFO_DICT, None) self.assertEqual('build-foo', target_info.GetBuildProp('ro.build.foo'))