| # Copyright (c) 2014 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. |
| |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.server import test |
| |
| |
| class platform_Vpd(test.test): |
| """Test that vpd's cache gets generated during the boot if missing. |
| |
| Clean the vpd cache file and check that the files are correctly generated |
| at the next reboot. |
| """ |
| version = 1 |
| |
| _VPD_FILES = [ |
| ('/mnt/stateful_partition/unencrypted/cache/vpd/filtered.txt', |
| 'root', 'root', '644'), |
| ('/mnt/stateful_partition/unencrypted/cache/vpd/echo/vpd_echo.txt', |
| 'root', 'chronos', '640'), |
| ('/mnt/stateful_partition/unencrypted/cache/vpd/full-v2.txt', |
| 'root', 'root', '600') |
| ] |
| |
| _VPD_LINKS = [ |
| '/var/log/vpd_2.0.txt', |
| '/var/cache/vpd/full-v2.txt', |
| '/var/cache/echo/vpd_echo.txt' |
| ] |
| |
| # files used by older versions on vpd and that should not be here anymore |
| _VPD_OLD_FILES = [ |
| '/var/cache/vpd/full.cache', |
| '/var/cache/offers/vpd_echo.txt', |
| '/var/cache/vpd/full-v2.cache' |
| ] |
| |
| def get_stat(self, host, path): |
| """Return user, group and permissions of file on host. |
| |
| @param host: the host machine to test |
| @param path: path to the file that we are testing |
| |
| @return None if the file does not exist |
| (user, group, permissions) if it does. |
| """ |
| if not self.file_exists(host, path): |
| return None |
| |
| user = host.run('stat -c %U ' + path).stdout.strip() |
| group = host.run('stat -c %G ' + path).stdout.strip() |
| mode = host.run('stat -c %a ' + path).stdout.strip() |
| |
| return (user, group, mode) |
| |
| def file_exists(self, host, path): |
| """Check if the path exists. |
| |
| @param host: the host machine |
| @param path: path of the file to check |
| |
| @return True if the file exists |
| """ |
| return host.run('[ -f %s ]' % path, |
| ignore_status=True).exit_status == 0 |
| |
| def is_symlink(self, host, path): |
| """Check if a file is a symlink. |
| |
| @param host: the host machine |
| @param path: path to the file |
| |
| @return True is the file is a symlink |
| """ |
| return host.run('[ -h %s ]' % path, |
| ignore_status=True).exit_status == 0 |
| |
| def run_once(self, host): |
| host.run('dump_vpd_log --clean') |
| |
| removed_files = [item[0] for item in self._VPD_FILES] |
| removed_files += self._VPD_LINKS |
| removed_files += self._VPD_OLD_FILES |
| |
| for vpdfile in removed_files: |
| if self.file_exists(host, vpdfile): |
| raise error.TestFail('Vpd file %s was not removed by ' |
| 'dump_vpd_log --clean' % vpdfile) |
| |
| host.reboot() |
| |
| # check that the files exist and have the right permissions |
| for (path, user, group, perm) in self._VPD_FILES: |
| if self.is_symlink(host, path): |
| raise error.TestFail('File %s should not be a symlink' % path) |
| |
| stats = self.get_stat(host, path) |
| if stats is None: |
| raise error.TestFail('File %s should be present' % path) |
| |
| if user != stats[0]: |
| raise error.TestFail('Wrong user (%s instead of %s) for %s' % |
| (stats[0], user, path)) |
| |
| if group != stats[1]: |
| raise error.TestFail('Wrong group (%s instead of %s) for %s' % |
| (stats[1], group, path)) |
| |
| if perm != stats[2]: |
| raise error.TestFail('Wrong permissions (%s instead of %s)' |
| ' for %s' % (stats[2], perm, path)) |
| |
| # for symlinks, check that they exist and are symlinks |
| for path in self._VPD_LINKS: |
| if not self.is_symlink(host, path): |
| raise error.TestFail('%s should be a symlink' % path) |
| |
| if not self.file_exists(host, path): |
| raise error.TestFail('Symlink %s does not exist' % path) |
| |
| for path in self._VPD_OLD_FILES: |
| if self.file_exists(host, path): |
| raise error.TestFail('Old vpd file %s installed' % path) |