# Copyright (C) 2008 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 os import tempfile import test_utils import merge_ota import update_payload from update_metadata_pb2 import DynamicPartitionGroup from update_metadata_pb2 import DynamicPartitionMetadata from test_utils import SkipIfExternalToolsUnavailable, ReleaseToolsTestCase class MergeOtaTest(ReleaseToolsTestCase): def setUp(self) -> None: self.testdata_dir = test_utils.get_testdata_dir() return super().setUp() @SkipIfExternalToolsUnavailable() def test_MergeThreeOtas(self): ota1 = os.path.join(self.testdata_dir, "tuna_vbmeta.zip") ota2 = os.path.join(self.testdata_dir, "tuna_vbmeta_system.zip") ota3 = os.path.join(self.testdata_dir, "tuna_vbmeta_vendor.zip") payloads = [update_payload.Payload(ota) for ota in [ota1, ota2, ota3]] with tempfile.NamedTemporaryFile() as output_file: merge_ota.main(["merge_ota", "-v", ota1, ota2, ota3, "--output", output_file.name]) payload = update_payload.Payload(output_file.name) partition_names = [ part.partition_name for part in payload.manifest.partitions] self.assertEqual(partition_names, [ "vbmeta", "vbmeta_system", "vbmeta_vendor"]) payload.CheckDataHash() for i in range(3): self.assertEqual(payload.manifest.partitions[i].old_partition_info, payloads[i].manifest.partitions[0].old_partition_info) self.assertEqual(payload.manifest.partitions[i].new_partition_info, payloads[i].manifest.partitions[0].new_partition_info) def test_MergeDAPSnapshotDisabled(self): dap1 = DynamicPartitionMetadata() dap2 = DynamicPartitionMetadata() merged_dap = DynamicPartitionMetadata() dap1.snapshot_enabled = True dap2.snapshot_enabled = False merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap1) merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap2) self.assertFalse(merged_dap.snapshot_enabled) def test_MergeDAPSnapshotEnabled(self): dap1 = DynamicPartitionMetadata() dap2 = DynamicPartitionMetadata() merged_dap = DynamicPartitionMetadata() merged_dap.snapshot_enabled = True dap1.snapshot_enabled = True dap2.snapshot_enabled = True merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap1) merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap2) self.assertTrue(merged_dap.snapshot_enabled) def test_MergeDAPGroups(self): dap1 = DynamicPartitionMetadata() dap1.groups.append(DynamicPartitionGroup( name="abc", partition_names=["a", "b", "c"])) dap2 = DynamicPartitionMetadata() dap2.groups.append(DynamicPartitionGroup( name="abc", partition_names=["d", "e", "f"])) merged_dap = DynamicPartitionMetadata() merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap1) merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap2) self.assertEqual(len(merged_dap.groups), 1) self.assertEqual(merged_dap.groups[0].name, "abc") self.assertEqual(merged_dap.groups[0].partition_names, [ "a", "b", "c", "d", "e", "f"])