Home | History | Annotate | Download | only in platform_PartitionCheck
      1 # Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging
      6 import os
      7 
      8 from autotest_lib.client.bin import test, utils
      9 from autotest_lib.client.common_lib import error
     10 
     11 ROOTFS_SIZE_2G = 2 * 1024 * 1024 * 1024
     12 ROOTFS_SIZE_4G = 4 * 1024 * 1024 * 1024
     13 
     14 class platform_PartitionCheck(test.test):
     15     """
     16     Verify partition size is correct.
     17     """
     18     version = 1
     19 
     20     def get_block_size(self, device):
     21         """
     22         Check the block size of a block device.
     23 
     24         Args:
     25             @param device: string, name of the block device.
     26 
     27         Returns:
     28             int, size of block in bytes.
     29         """
     30 
     31         # Construct a pathname to find the logic block size for this device
     32         sysfs_path = os.path.join('/sys', 'block', device,
     33                                   'queue', 'logical_block_size')
     34 
     35         return int(utils.read_one_line(sysfs_path))
     36 
     37     def get_partition_size(self, device, partition):
     38         """
     39         Get the number of blocks in the partition.
     40 
     41         Args:
     42             @param device: string, name of the block device.
     43             @param partition: string, partition name
     44 
     45         Returns:
     46             int, number of blocks
     47         """
     48 
     49         part_file = os.path.join('/sys', 'block', device, partition, 'size')
     50         part_blocks = int(utils.read_one_line(part_file))
     51         return part_blocks
     52 
     53     def run_once(self):
     54         errors = []
     55         device = os.path.basename(utils.get_fixed_dst_drive())
     56         partitions = [utils.concat_partition(device, i) for i in (3, 5)]
     57         block_size = self.get_block_size(device)
     58 
     59         for p in partitions:
     60             pblocks = self.get_partition_size(device, p)
     61             psize = pblocks * block_size
     62             if psize != ROOTFS_SIZE_2G and psize != ROOTFS_SIZE_4G:
     63                 errmsg = ('%s is %d bytes, expected %d or %d' %
     64                           (p, psize, ROOTFS_SIZE_2G, ROOTFS_SIZE_4G))
     65                 logging.warning(errmsg)
     66                 errors.append(errmsg)
     67 
     68         # If self.error is not zero, there were errors.
     69         if errors:
     70             raise error.TestFail('There were %d partition errors: %s' %
     71                                  (len(errors), ': '.join(errors)))
     72