blob: abf4597f105ed07c9cf4096b664472f27ce47f6a [file] [log] [blame]
# -*- coding: utf-8 -*-
# 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 __future__ import print_function
import sys
from chromite.lib import cgpt
from chromite.lib import cros_test_lib
assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
CGPT_SHOW_OUTPUT = """ start size part contents
0 1 PMBR (Boot GUID: A3707625-23E2-2140-B798-94F309618569)
1 1 Pri GPT header
2 32 Pri GPT table
5234688 4194304 1 Label: "STATE"
Type: EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
UUID: 9B03635E-BD25-6E4F-91BE-141B60600DC6
Attr: [0]
20480 32768 2 Label: "KERN-A"
Type: FE3A2A5D-4F32-41A7-B725-ACCC3285A309
UUID: 3A975D8F-7D4D-F047-B9A5-8D8C0745798E
Attr: [1ff]
319488 4915200 3 Label: "ROOT-A"
Type: 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC
UUID: 3E167F70-198B-E947-8924-6812593E9BD9
Attr: [0]
53248 32768 4 Label: "KERN-B"
Type: FE3A2A5D-4F32-41A7-B725-ACCC3285A309
UUID: 15ADD9BD-05BE-434A-BB2D-3CB2D344F033
Attr: [0]
315392 4096 5 Label: "ROOT-B"
Type: 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC
UUID: 453443DB-E022-CA4F-A3A6-A92EC82A5EEE
Attr: [0]
16448 1 6 Label: "KERN-C"
Type: FE3A2A5D-4F32-41A7-B725-ACCC3285A309
UUID: 75BD5787-A268-FD42-BFA4-33BB7406723A
Attr: [0]
16449 1 7 Label: "ROOT-C"
Type: 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC
UUID: C4FBFA62-7AB2-144D-84A1-604EF03D5B4A
Attr: [0]
86016 32768 8 Label: "OEM"
Type: EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
UUID: BF7488C0-C6B0-D446-B3D1-7A5D1A8DDB90
Attr: [0]
16450 1 9 Label: "reserved"
Type: 2E0A753D-9E48-43B0-8337-B15192CB1B5E
UUID: 2697A3F2-37A1-1348-8A90-52B83C812B69
Attr: [0]
16451 1 10 Label: "reserved"
Type: 2E0A753D-9E48-43B0-8337-B15192CB1B5E
UUID: D711DDF7-0456-BB41-8C74-B166151A3B45
Attr: [0]
64 16384 11 Label: "RWFW"
Type: CAB6E88E-ABF3-4102-A07A-D4BB9BE3C1D3
UUID: 27313CD1-E158-9D41-AD82-F13D2468C44C
Attr: [0]
249856 65536 12 Label: "EFI-SYSTEM"
Type: C12A7328-F81F-11D2-BA4B-00A0C93EC93B
UUID: A3707625-23E2-2140-B798-94F309618569
Attr: [0]
9428992 32 Sec GPT table
9429024 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."""
disk = self.getMockDisk()
self.assertCommandCalled(['cgpt', 'show', '-n', 'foo'], 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=319488,
size=4915200,
part_type='3CB8E202-3B7E-47DD-'
'8A3C-7FF2A13CFCEC',
uuid='3E167F70-198B-E947-8924-6812593E9BD9',
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),
('RWFW', 11),
('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')