# # Copyright (C) 2020 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. # import copy import zipfile import common import test_utils from non_ab_ota import NonAbOtaPropertyFiles, WriteFingerprintAssertion from test_utils import PropertyFilesTestCase class NonAbOtaPropertyFilesTest(PropertyFilesTestCase): """Additional validity checks specialized for NonAbOtaPropertyFiles.""" def setUp(self): common.OPTIONS.no_signing = False def test_init(self): property_files = NonAbOtaPropertyFiles() self.assertEqual('ota-property-files', property_files.name) self.assertEqual((), property_files.required) self.assertEqual((), property_files.optional) def test_Compute(self): entries = () zip_file = self.construct_zip_package(entries) property_files = NonAbOtaPropertyFiles() with zipfile.ZipFile(zip_file) as zip_fp: property_files_string = property_files.Compute(zip_fp) tokens = self._parse_property_files_string(property_files_string) self.assertEqual(2, len(tokens)) self._verify_entries(zip_file, tokens, entries) def test_Finalize(self): entries = [ 'META-INF/com/android/metadata', 'META-INF/com/android/metadata.pb', ] zip_file = self.construct_zip_package(entries) property_files = NonAbOtaPropertyFiles() with zipfile.ZipFile(zip_file) as zip_fp: raw_metadata = property_files.GetPropertyFilesString( zip_fp, reserve_space=False) property_files_string = property_files.Finalize(zip_fp, len(raw_metadata)) tokens = self._parse_property_files_string(property_files_string) self.assertEqual(2, len(tokens)) # 'META-INF/com/android/metadata' will be key'd as 'metadata'. entries[0] = 'metadata' entries[1] = 'metadata.pb' self._verify_entries(zip_file, tokens, entries) def test_Verify(self): entries = ( 'META-INF/com/android/metadata', 'META-INF/com/android/metadata.pb', ) zip_file = self.construct_zip_package(entries) property_files = NonAbOtaPropertyFiles() with zipfile.ZipFile(zip_file) as zip_fp: raw_metadata = property_files.GetPropertyFilesString( zip_fp, reserve_space=False) property_files.Verify(zip_fp, raw_metadata) class NonAbOTATest(test_utils.ReleaseToolsTestCase): TEST_TARGET_INFO_DICT = { 'build.prop': common.PartitionBuildProps.FromDictionary( 'system', { 'ro.product.device': 'product-device', 'ro.build.fingerprint': 'build-fingerprint-target', 'ro.build.version.incremental': 'build-version-incremental-target', 'ro.build.version.sdk': '27', 'ro.build.version.security_patch': '2017-12-01', 'ro.build.date.utc': '1500000000'} ) } TEST_INFO_DICT_USES_OEM_PROPS = { 'build.prop': common.PartitionBuildProps.FromDictionary( 'system', { 'ro.product.name': 'product-name', 'ro.build.thumbprint': 'build-thumbprint', 'ro.build.bar': 'build-bar'} ), 'vendor.build.prop': common.PartitionBuildProps.FromDictionary( 'vendor', { 'ro.vendor.build.fingerprint': 'vendor-build-fingerprint'} ), 'property1': 'value1', 'property2': 4096, 'oem_fingerprint_properties': 'ro.product.device ro.product.brand', } TEST_OEM_DICTS = [ { 'ro.product.brand': 'brand1', 'ro.product.device': 'device1', }, { 'ro.product.brand': 'brand2', 'ro.product.device': 'device2', }, { 'ro.product.brand': 'brand3', 'ro.product.device': 'device3', }, ] def test_WriteFingerprintAssertion_without_oem_props(self): target_info = common.BuildInfo(self.TEST_TARGET_INFO_DICT, None) source_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) source_info_dict['build.prop'].build_props['ro.build.fingerprint'] = ( 'source-build-fingerprint') source_info = common.BuildInfo(source_info_dict, None) script_writer = test_utils.MockScriptWriter() WriteFingerprintAssertion(script_writer, target_info, source_info) self.assertEqual( [('AssertSomeFingerprint', 'source-build-fingerprint', 'build-fingerprint-target')], script_writer.lines) def test_WriteFingerprintAssertion_with_source_oem_props(self): target_info = common.BuildInfo(self.TEST_TARGET_INFO_DICT, None) source_info = common.BuildInfo(self.TEST_INFO_DICT_USES_OEM_PROPS, self.TEST_OEM_DICTS) script_writer = test_utils.MockScriptWriter() WriteFingerprintAssertion(script_writer, target_info, source_info) self.assertEqual( [('AssertFingerprintOrThumbprint', 'build-fingerprint-target', 'build-thumbprint')], script_writer.lines) def test_WriteFingerprintAssertion_with_target_oem_props(self): target_info = common.BuildInfo(self.TEST_INFO_DICT_USES_OEM_PROPS, self.TEST_OEM_DICTS) source_info = common.BuildInfo(self.TEST_TARGET_INFO_DICT, None) script_writer = test_utils.MockScriptWriter() WriteFingerprintAssertion(script_writer, target_info, source_info) self.assertEqual( [('AssertFingerprintOrThumbprint', 'build-fingerprint-target', 'build-thumbprint')], script_writer.lines) def test_WriteFingerprintAssertion_with_both_oem_props(self): target_info = common.BuildInfo(self.TEST_INFO_DICT_USES_OEM_PROPS, self.TEST_OEM_DICTS) source_info_dict = copy.deepcopy(self.TEST_INFO_DICT_USES_OEM_PROPS) source_info_dict['build.prop'].build_props['ro.build.thumbprint'] = ( 'source-build-thumbprint') source_info = common.BuildInfo(source_info_dict, self.TEST_OEM_DICTS) script_writer = test_utils.MockScriptWriter() WriteFingerprintAssertion(script_writer, target_info, source_info) self.assertEqual( [('AssertSomeThumbprint', 'build-thumbprint', 'source-build-thumbprint')], script_writer.lines)