Home | History | Annotate | Download | only in platform_Vpd
      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 from autotest_lib.client.common_lib import error
      6 from autotest_lib.server import test
      7 
      8 
      9 class platform_Vpd(test.test):
     10     """Test that vpd's cache gets generated during the boot if missing.
     11 
     12     Clean the vpd cache file and check that the files are correctly generated
     13     at the next reboot.
     14     """
     15     version = 1
     16 
     17     _VPD_FILES = [
     18         ('/mnt/stateful_partition/unencrypted/cache/vpd/filtered.txt',
     19             'root', 'root', '644'),
     20         ('/mnt/stateful_partition/unencrypted/cache/vpd/echo/vpd_echo.txt',
     21             'root', 'chronos', '640'),
     22         ('/mnt/stateful_partition/unencrypted/cache/vpd/full-v2.txt',
     23             'root', 'root', '600')
     24     ]
     25 
     26     _VPD_LINKS = [
     27         '/var/log/vpd_2.0.txt',
     28         '/var/cache/vpd/full-v2.txt',
     29         '/var/cache/echo/vpd_echo.txt'
     30     ]
     31 
     32     # files used by older versions on vpd and that should not be here anymore
     33     _VPD_OLD_FILES = [
     34         '/var/cache/vpd/full.cache',
     35         '/var/cache/offers/vpd_echo.txt',
     36         '/var/cache/vpd/full-v2.cache'
     37     ]
     38 
     39     def get_stat(self, host, path):
     40         """Return user, group and permissions of file on host.
     41 
     42         @param host: the host machine to test
     43         @param path: path to the file that we are testing
     44 
     45         @return None if the file does not exist
     46                 (user, group, permissions) if it does.
     47         """
     48         if not self.file_exists(host, path):
     49             return None
     50 
     51         user = host.run('stat -c %U ' + path).stdout.strip()
     52         group = host.run('stat -c %G ' + path).stdout.strip()
     53         mode = host.run('stat -c %a ' + path).stdout.strip()
     54 
     55         return (user, group, mode)
     56 
     57     def file_exists(self, host, path):
     58         """Check if the path exists.
     59 
     60         @param host: the host machine
     61         @param path: path of the file to check
     62 
     63         @return True if the file exists
     64         """
     65         return host.run('[ -f %s ]' % path,
     66                         ignore_status=True).exit_status == 0
     67 
     68     def is_symlink(self, host, path):
     69         """Check if a file is a symlink.
     70 
     71         @param host: the host machine
     72         @param path: path to the file
     73 
     74         @return True is the file is a symlink
     75         """
     76         return host.run('[ -h %s ]' % path,
     77                         ignore_status=True).exit_status == 0
     78 
     79     def run_once(self, host):
     80         host.run('dump_vpd_log --clean')
     81 
     82         removed_files = [item[0] for item in self._VPD_FILES]
     83         removed_files += self._VPD_LINKS
     84         removed_files += self._VPD_OLD_FILES
     85 
     86         for vpdfile in removed_files:
     87             if self.file_exists(host, vpdfile):
     88                 raise error.TestFail('Vpd file %s was not removed by '
     89                     'dump_vpd_log --clean' % vpdfile)
     90 
     91         host.reboot()
     92 
     93         # check that the files exist and have the right permissions
     94         for (path, user, group, perm) in self._VPD_FILES:
     95             if self.is_symlink(host, path):
     96                 raise error.TestFail('File %s should not be a symlink' % path)
     97 
     98             stats = self.get_stat(host, path)
     99             if stats is None:
    100                 raise error.TestFail('File %s should be present' % path)
    101 
    102             if user != stats[0]:
    103                 raise error.TestFail('Wrong user (%s instead of %s) for %s' %
    104                       (stats[0], user, path))
    105 
    106             if group != stats[1]:
    107                 raise error.TestFail('Wrong group (%s instead of %s) for %s' %
    108                       (stats[1], group, path))
    109 
    110             if perm != stats[2]:
    111                 raise error.TestFail('Wrong permissions (%s instead of %s)'
    112                     ' for %s' % (stats[2], perm, path))
    113 
    114         # for symlinks, check that they exist and are symlinks
    115         for path in self._VPD_LINKS:
    116             if not self.is_symlink(host, path):
    117                 raise error.TestFail('%s should be a symlink' % path)
    118 
    119             if not self.file_exists(host, path):
    120                 raise error.TestFail('Symlink %s does not exist' % path)
    121 
    122         for path in self._VPD_OLD_FILES:
    123             if self.file_exists(host, path):
    124                 raise error.TestFail('Old vpd file %s installed' % path)
    125