#!/usr/bin/python # Copyright (c) 2011 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import os import subprocess import pyauto_functional # Must be imported before pyauto import pyauto class ChromeosFirmwareVersionChecker(pyauto.PyUITest): """TestCases for verifying the firmware and EC versions. The chromeos-firmwareupdate is a shellball that will return what version of the firmware and EC is running. This test will check the versions against a whitelist to verify that these items don't change unexpectedly. """ def _GetWhitelistVersion(self, component): """Obtains the valid firmware or EC from a data file. Args: component: The component of which to return the version. There are currently only two supported types: "BIOS version" and "EC version". Returns: The version of the component in string form. """ firmware_info = os.path.join(pyauto.PyUITest.DataDir(), 'pyauto_private/chromeos/', 'chromeos_firmware_info.txt') assert os.path.exists(firmware_info), 'Data file does not exist.' return self.EvalDataFrom(firmware_info)[self.ChromeOSBoard()][component] def _GetSystemVersionMario(self, component, info): """ Returns the version of the component from the system. Mario has a legacy info format so this function does the parsing differently than the one below. Args: component: The component of which to return the version. info: The version information to be parsed. Returns: The version of the component in string form. """ items = info.strip().splitlines() # This is going to give us a list of lines, we are looking for the # following ones: # BIOS image: /board.xx.xx.xxx.xxx.xx # EC image: /board_xxx # Convert the passed component string into the format of the mario if component == 'BIOS version': component = 'BIOS' if component == 'EC version': component = 'EC' for line in items: line_components = line.split() if len(line_components) >= 4 and line_components[0].strip() == component: return os.path.basename(line_components[3]) self.fail('Could not locate the following item %s in the return value of ' 'chromeos-firmwareupdate.' % component) def _GetSystemVersion(self, component, info): """ Returns the version of the desired component. Args: component: The component of which to return the version of. info: The version information to be parsed. Returns: The version of the component in string form. """ # Check if we are on mario, then we need to use the legacy parser if self.ChromeOSBoard() == 'x86-mario': return self._GetSystemVersionMario(component, info) items = info.strip().splitlines() # This is going to give us a list of lines, we are looking for the # following ones: # BIOS version: board.xx.xx.xxx.xxx.xx # EC version: foobar for line in items: line_components = line.split(':') # The line we are looking for has at least 2 items if len(line_components) >= 2 and line_components[0] == component: return line_components[1].strip() self.fail('Could not locate the following item %s in the return value ' 'of chromeos-firmwareupdate.' % component) def _PerformCompare(self, component): """Performs a comparision between the component installed and the whitelist. Args: component: The component of which to return the version of. """ updater_commands = ['/usr/sbin/chromeos-firmwareupdate', '-V'] content = subprocess.Popen(updater_commands, stdout=subprocess.PIPE).stdout.read() system_version = self._GetSystemVersion(component, content) whitelist_version = self._GetWhitelistVersion(component) self.assertEqual(system_version, whitelist_version, msg='%s does not match' ' what is in the whitelist.\n\tSystem: %s\n\tWhitelist: ' '%s' % (component, system_version, whitelist_version)) def testFirmwareVersion(self): self._PerformCompare('BIOS version') def testECVersion(self): self._PerformCompare('EC version') if __name__ == '__main__': pyauto_functional.Main()