blob: a19b45292d007a064f7e965cca98dec951b8dea2 [file] [log] [blame]
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Test chromite.lib.cgpt"""
from chromite.lib import cgpt
from chromite.lib import cros_test_lib
from chromite.lib import osutils
from chromite.lib import path_util
CGPT_SHOW_OUTPUT = """start size part contents
0 1 PMBR (Boot GUID: E32D9819-048F-8E41-B743-2A8102897F1B)
1 1 Pri GPT header
2 32 Pri GPT table
5455872 8401017 1 Label: "STATE"
Type: 0FC63DAF-8483-4772-8E79-3D69D8477DE4
UUID: 31CD4A3B-C504-354B-AC37-0852D2E0A44C
Attr: [0]
405504 65536 2 Label: "KERN-A"
Type: FE3A2A5D-4F32-41A7-B725-ACCC3285A309
UUID: 1F94CE4D-7EF3-AE4C-A0F3-03FBB81699B8
Attr: [1ff]
471040 4915200 3 Label: "ROOT-A"
Type: 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC
UUID: FC606456-D6E0-C64D-A82E-BA7B027D2B20
Attr: [0]
5386240 65536 4 Label: "KERN-B"
Type: FE3A2A5D-4F32-41A7-B725-ACCC3285A309
UUID: 2B2D493A-22B8-0742-A56A-D31944B15271
Attr: [0]
5451776 4096 5 Label: "ROOT-B"
Type: 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC
UUID: D3B939D0-01DB-C84E-8E3B-7DCF861F2321
Attr: [0]
262208 1 6 Label: "KERN-C"
Type: FE3A2A5D-4F32-41A7-B725-ACCC3285A309
UUID: AA93D568-6AF0-0B4E-88E8-FBF3B0E54F0F
Attr: [0]
262209 1 7 Label: "ROOT-C"
Type: 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC
UUID: A5DFEF3B-58F0-0F48-B326-5BF6DAE2E503
Attr: [0]
266240 8192 8 Label: "OEM"
Type: 0FC63DAF-8483-4772-8E79-3D69D8477DE4
UUID: 18A64E9D-FF35-A248-B6D4-AE943A93386D
Attr: [0]
64 262144 9 Label: "MINIOS-A"
Type: 09845860-705F-4BB5-B16C-8A8A099CAF52
UUID: 0A379155-6C27-1A45-AC83-EF96F0588734
Attr: [0]
13856889 4096 10 Label: "reserved"
Type: 2E0A753D-9E48-43B0-8337-B15192CB1B5E
UUID: F31ACAD0-CDA0-4041-91FD-663C0F9693CF
Attr: [0]
13856889 4096 11 Label: "reserved"
Type: 2E0A753D-9E48-43B0-8337-B15192CB1B5E
UUID: 2697A3F2-37A1-1348-8A90-52B83C812B69
Attr: [0]
274432 131072 12 Label: "EFI-SYSTEM"
Type: C12A7328-F81F-11D2-BA4B-00A0C93EC93B
UUID: E32D9819-048F-8E41-B743-2A8102897F1B
Attr: [0]
13861000 32 Sec GPT table
13861032 1 Sec GPT header"""
class TestDisk(cros_test_lib.RunCommandTestCase):
"""Test Disk class."""
def getMockDisk(self):
"""Returns new Disk based on CGPT_SHOW_OUTPUT."""
self.rc.SetDefaultCmdResult(output=CGPT_SHOW_OUTPUT)
return cgpt.Disk.FromImage('foo')
def testDiskFromImageEmpty(self):
"""Test ReadGpt when cgpt doesn't return an expected list."""
with self.assertRaises(cgpt.Error):
cgpt.Disk.FromImage('foo')
def testDiskFromImage(self):
"""Test ReadGpt with mock cgpt output."""
which_mock = self.PatchObject(osutils, 'Which', return_value='/path/foo')
disk = self.getMockDisk()
which_mock.assert_called_once()
self.assertCommandCalled(['cgpt', 'show', '-n', 'foo'],
enter_chroot=False, capture_output=True,
encoding='utf-8')
self.assertEqual(len(disk.partitions), 12)
self.assertEqual(disk.partitions[3],
cgpt.Partition(part_num=3,
label='ROOT-A',
start=471040,
size=4915200,
part_type='3CB8E202-3B7E-47DD-'
'8A3C-7FF2A13CFCEC',
uuid='FC606456-D6E0-C64D-A82E-BA7B027D2B20',
attr='[0]'))
def testDiskFromImageCgptMissing(self):
"""Test ReadGpt with mock cgpt output when cpgt is missing."""
which_mock = self.PatchObject(osutils, 'Which', return_value=None)
to_chroot_path_mock = self.PatchObject(path_util, 'ToChrootPath',
return_value='foo')
disk = self.getMockDisk()
which_mock.assert_called_once()
to_chroot_path_mock.assert_called_once()
self.assertCommandCalled(['cgpt', 'show', '-n', 'foo'], enter_chroot=True,
capture_output=True, encoding='utf-8')
self.assertEqual(len(disk.partitions), 12)
self.assertEqual(disk.partitions[3],
cgpt.Partition(part_num=3,
label='ROOT-A',
start=471040,
size=4915200,
part_type='3CB8E202-3B7E-47DD-'
'8A3C-7FF2A13CFCEC',
uuid='FC606456-D6E0-C64D-A82E-BA7B027D2B20',
attr='[0]'))
def testGetPartitionByLabel(self):
"""Test that mocked disk has all expected partitions."""
disk = self.getMockDisk()
for label, part_num in (('STATE', 1),
('KERN-A', 2),
('ROOT-A', 3),
('KERN-B', 4),
('ROOT-B', 5),
('KERN-C', 6),
('ROOT-C', 7),
('OEM', 8),
('MINIOS-A', 9),
('EFI-SYSTEM', 12)):
self.assertEqual(disk.GetPartitionByLabel(label).part_num, part_num)
def testGetPartitionByLabelMulitpleLabels(self):
"""Test MultiplePartitionLabel is raised on duplicate label 'reserved'."""
disk = self.getMockDisk()
with self.assertRaises(cgpt.MultiplePartitionLabel):
disk.GetPartitionByLabel('reserved')
def testGetPartitionByLabelMissingKey(self):
"""Test KeyError is raised on a non-existent label."""
disk = self.getMockDisk()
with self.assertRaises(KeyError):
disk.GetPartitionByLabel('bar')
def testGetPartitionsByTypeGuid(self):
"""Test that mocked disk has all expected partitions."""
disk = self.getMockDisk()
self.assertEqual([p.part_num for p in disk.GetPartitionByTypeGuid(
'09845860-705F-4BB5-B16C-8A8A099CAF52')], [9])
def testGetPartitionsByTypeGuidMulti(self):
"""Test that mocked disk has all expected partitions."""
disk = self.getMockDisk()
self.assertEqual([p.part_num for p in disk.GetPartitionByTypeGuid(
'2E0A753D-9E48-43B0-8337-B15192CB1B5E')], [10, 11])