1*9e94795aSAndroid Build Coastguard Worker# Copyright (C) 2008 The Android Open Source Project 2*9e94795aSAndroid Build Coastguard Worker# 3*9e94795aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*9e94795aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*9e94795aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*9e94795aSAndroid Build Coastguard Worker# 7*9e94795aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*9e94795aSAndroid Build Coastguard Worker# 9*9e94795aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*9e94795aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*9e94795aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9e94795aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*9e94795aSAndroid Build Coastguard Worker# limitations under the License. 14*9e94795aSAndroid Build Coastguard Worker 15*9e94795aSAndroid Build Coastguard Worker 16*9e94795aSAndroid Build Coastguard Workerimport os 17*9e94795aSAndroid Build Coastguard Workerimport tempfile 18*9e94795aSAndroid Build Coastguard Workerimport test_utils 19*9e94795aSAndroid Build Coastguard Workerimport merge_ota 20*9e94795aSAndroid Build Coastguard Workerimport update_payload 21*9e94795aSAndroid Build Coastguard Workerfrom update_metadata_pb2 import DynamicPartitionGroup 22*9e94795aSAndroid Build Coastguard Workerfrom update_metadata_pb2 import DynamicPartitionMetadata 23*9e94795aSAndroid Build Coastguard Workerfrom test_utils import SkipIfExternalToolsUnavailable, ReleaseToolsTestCase 24*9e94795aSAndroid Build Coastguard Worker 25*9e94795aSAndroid Build Coastguard Worker 26*9e94795aSAndroid Build Coastguard Workerclass MergeOtaTest(ReleaseToolsTestCase): 27*9e94795aSAndroid Build Coastguard Worker def setUp(self) -> None: 28*9e94795aSAndroid Build Coastguard Worker self.testdata_dir = test_utils.get_testdata_dir() 29*9e94795aSAndroid Build Coastguard Worker return super().setUp() 30*9e94795aSAndroid Build Coastguard Worker 31*9e94795aSAndroid Build Coastguard Worker @SkipIfExternalToolsUnavailable() 32*9e94795aSAndroid Build Coastguard Worker def test_MergeThreeOtas(self): 33*9e94795aSAndroid Build Coastguard Worker ota1 = os.path.join(self.testdata_dir, "tuna_vbmeta.zip") 34*9e94795aSAndroid Build Coastguard Worker ota2 = os.path.join(self.testdata_dir, "tuna_vbmeta_system.zip") 35*9e94795aSAndroid Build Coastguard Worker ota3 = os.path.join(self.testdata_dir, "tuna_vbmeta_vendor.zip") 36*9e94795aSAndroid Build Coastguard Worker payloads = [update_payload.Payload(ota) for ota in [ota1, ota2, ota3]] 37*9e94795aSAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile() as output_file: 38*9e94795aSAndroid Build Coastguard Worker merge_ota.main(["merge_ota", "-v", ota1, ota2, ota3, 39*9e94795aSAndroid Build Coastguard Worker "--output", output_file.name]) 40*9e94795aSAndroid Build Coastguard Worker payload = update_payload.Payload(output_file.name) 41*9e94795aSAndroid Build Coastguard Worker partition_names = [ 42*9e94795aSAndroid Build Coastguard Worker part.partition_name for part in payload.manifest.partitions] 43*9e94795aSAndroid Build Coastguard Worker self.assertEqual(partition_names, [ 44*9e94795aSAndroid Build Coastguard Worker "vbmeta", "vbmeta_system", "vbmeta_vendor"]) 45*9e94795aSAndroid Build Coastguard Worker payload.CheckDataHash() 46*9e94795aSAndroid Build Coastguard Worker for i in range(3): 47*9e94795aSAndroid Build Coastguard Worker self.assertEqual(payload.manifest.partitions[i].old_partition_info, 48*9e94795aSAndroid Build Coastguard Worker payloads[i].manifest.partitions[0].old_partition_info) 49*9e94795aSAndroid Build Coastguard Worker self.assertEqual(payload.manifest.partitions[i].new_partition_info, 50*9e94795aSAndroid Build Coastguard Worker payloads[i].manifest.partitions[0].new_partition_info) 51*9e94795aSAndroid Build Coastguard Worker 52*9e94795aSAndroid Build Coastguard Worker def test_MergeDAPSnapshotDisabled(self): 53*9e94795aSAndroid Build Coastguard Worker dap1 = DynamicPartitionMetadata() 54*9e94795aSAndroid Build Coastguard Worker dap2 = DynamicPartitionMetadata() 55*9e94795aSAndroid Build Coastguard Worker merged_dap = DynamicPartitionMetadata() 56*9e94795aSAndroid Build Coastguard Worker dap1.snapshot_enabled = True 57*9e94795aSAndroid Build Coastguard Worker dap2.snapshot_enabled = False 58*9e94795aSAndroid Build Coastguard Worker merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap1) 59*9e94795aSAndroid Build Coastguard Worker merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap2) 60*9e94795aSAndroid Build Coastguard Worker self.assertFalse(merged_dap.snapshot_enabled) 61*9e94795aSAndroid Build Coastguard Worker 62*9e94795aSAndroid Build Coastguard Worker def test_MergeDAPSnapshotEnabled(self): 63*9e94795aSAndroid Build Coastguard Worker dap1 = DynamicPartitionMetadata() 64*9e94795aSAndroid Build Coastguard Worker dap2 = DynamicPartitionMetadata() 65*9e94795aSAndroid Build Coastguard Worker merged_dap = DynamicPartitionMetadata() 66*9e94795aSAndroid Build Coastguard Worker merged_dap.snapshot_enabled = True 67*9e94795aSAndroid Build Coastguard Worker dap1.snapshot_enabled = True 68*9e94795aSAndroid Build Coastguard Worker dap2.snapshot_enabled = True 69*9e94795aSAndroid Build Coastguard Worker merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap1) 70*9e94795aSAndroid Build Coastguard Worker merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap2) 71*9e94795aSAndroid Build Coastguard Worker self.assertTrue(merged_dap.snapshot_enabled) 72*9e94795aSAndroid Build Coastguard Worker 73*9e94795aSAndroid Build Coastguard Worker def test_MergeDAPGroups(self): 74*9e94795aSAndroid Build Coastguard Worker dap1 = DynamicPartitionMetadata() 75*9e94795aSAndroid Build Coastguard Worker dap1.groups.append(DynamicPartitionGroup( 76*9e94795aSAndroid Build Coastguard Worker name="abc", partition_names=["a", "b", "c"])) 77*9e94795aSAndroid Build Coastguard Worker dap2 = DynamicPartitionMetadata() 78*9e94795aSAndroid Build Coastguard Worker dap2.groups.append(DynamicPartitionGroup( 79*9e94795aSAndroid Build Coastguard Worker name="abc", partition_names=["d", "e", "f"])) 80*9e94795aSAndroid Build Coastguard Worker merged_dap = DynamicPartitionMetadata() 81*9e94795aSAndroid Build Coastguard Worker merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap1) 82*9e94795aSAndroid Build Coastguard Worker merge_ota.MergeDynamicPartitionMetadata(merged_dap, dap2) 83*9e94795aSAndroid Build Coastguard Worker self.assertEqual(len(merged_dap.groups), 1) 84*9e94795aSAndroid Build Coastguard Worker self.assertEqual(merged_dap.groups[0].name, "abc") 85*9e94795aSAndroid Build Coastguard Worker self.assertEqual(merged_dap.groups[0].partition_names, [ 86*9e94795aSAndroid Build Coastguard Worker "a", "b", "c", "d", "e", "f"]) 87