xref: /aosp_15_r20/build/make/tools/releasetools/test_merge_ota.py (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
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