Home | History | Annotate | Download | only in hardware_SsdDetection
      1 # Copyright (c) 2010 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 os
      6 import re
      7 
      8 from autotest_lib.client.bin import site_utils, test, utils
      9 from autotest_lib.client.common_lib import error
     10 
     11 class hardware_SsdDetection(test.test):
     12     version = 1
     13     # Keep a list of boards that are expected to ship with hard drive.
     14     boards_with_hdd = ['butterfly', 'kiev', 'parrot', 'stout']
     15 
     16     def setup(self):
     17         # create a empty srcdir to prevent the error that checks .version file
     18         if not os.path.exists(self.srcdir):
     19             utils.system('mkdir %s' % self.srcdir)
     20 
     21 
     22     def run_once(self, check_link_speed=()):
     23         # Use rootdev to find the underlying block device even if the
     24         # system booted to /dev/dm-0.
     25         device = site_utils.get_root_device()
     26 
     27         # Check the device is fixed
     28 
     29         def IsFixed(dev):
     30             sysfs_path = '/sys/block/%s/removable' % dev
     31             return (os.path.exists(sysfs_path) and
     32                     open(sysfs_path).read().strip() == '0')
     33 
     34         alpha_re = re.compile(r'^/dev/([a-zA-Z]+)$')
     35         alnum_re = re.compile(r'^/dev/([a-zA-Z]+[0-9]+)$')
     36         dev = alpha_re.findall(device) + alnum_re.findall(device)
     37         if len(dev) != 1 or not IsFixed(dev[0]):
     38             raise error.TestFail('The main disk %s is not fixed' % dev)
     39 
     40         # If it is an mmcblk device, then it is SSD.
     41         # Else run hdparm to check for SSD.
     42 
     43         if re.search("mmcblk", device):
     44             return
     45 
     46         hdparm = utils.run('/sbin/hdparm -I %s' % device)
     47 
     48         # Check if device is a SSD
     49         match = re.search(r'Nominal Media Rotation Rate: (.+)$',
     50                           hdparm.stdout, re.MULTILINE)
     51         if match and match.group(1):
     52             if match.group(1) != 'Solid State Device':
     53                 if utils.get_board() in self.boards_with_hdd:
     54                     return
     55                 raise error.TestFail('The main disk is not a SSD, '
     56                     'Rotation Rate: %s' % match.group(1))
     57         else:
     58             raise error.TestFail(
     59                 'Rotation Rate not reported from the device, '
     60                 'unable to ensure it is a SSD')
     61 
     62         # Check if SSD is > 8GB in size
     63         match = re.search("device size with M = 1000\*1000: (.+) MBytes",
     64                           hdparm.stdout, re.MULTILINE)
     65         if match and match.group(1):
     66             size = int(match.group(1))
     67             self.write_perf_keyval({"mb_ssd_device_size" : size})
     68         else:
     69             raise error.TestFail(
     70                 'Device size info missing from the device')
     71 
     72         # Check supported link speed.
     73         #
     74         # check_link_speed is an empty tuple by default, which does not perform
     75         # link speed checking.  You can run the test while specifying
     76         # check_link_speed=('1.5Gb/s', '3.0Gb/s') to check the 2 signaling
     77         # speeds are both supported.
     78         for link_speed in check_link_speed:
     79             if not re.search(r'Gen. signaling speed \(%s\)' % link_speed,
     80                              hdparm.stdout, re.MULTILINE):
     81                 raise error.TestFail('Link speed %s not supported' % link_speed)
     82