| # Copyright (c) 2011 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. |
| """ |
| Runs the piglit OpenGL suite of tests. |
| """ |
| |
| import logging, os, re |
| from autotest_lib.client.bin import test, utils |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.cros.graphics import graphics_utils |
| from optparse import OptionParser |
| |
| class graphics_Piglit(test.test): |
| """ |
| Collection of automated tests for OpenGL implementations. |
| |
| The binaries are pulled into test images via media-lib/piglit. |
| http://piglit.freedesktop.org |
| """ |
| version = 2 |
| preserve_srcdir = True |
| GSC = None |
| piglit_path = '/usr/local/piglit' |
| |
| def initialize(self): |
| self.GSC = graphics_utils.GraphicsStateChecker() |
| |
| def cleanup(self): |
| if self.GSC: |
| keyvals = self.GSC.get_memory_keyvals() |
| for key, val in keyvals.iteritems(): |
| self.output_perf_value(description=key, value=val, |
| units='bytes', higher_is_better=False) |
| self.GSC.finalize() |
| self.write_perf_keyval(keyvals) |
| |
| def run_once(self, test='cros-driver.py', args=[]): |
| parser = OptionParser() |
| parser.add_option('-t', |
| '--test-name', |
| dest='testName', |
| default='', |
| help='Run a specific piglit test.') |
| options, args = parser.parse_args(args) |
| gpu_family = utils.get_gpu_family() |
| logging.info('Detected gpu family %s.', gpu_family) |
| # TODO(djkurtz): Delete this once piglit runs on mali/tegra. |
| if gpu_family in ['mali', 'tegra']: |
| logging.info('Not running any tests, passing by default.') |
| return |
| |
| # Keep a copy of stdout in piglit-run.log. |
| log_path = os.path.join(self.outputdir, 'piglit-run.log') |
| # Keep the html results in the cros-driver directory. |
| results_path = os.path.join(self.outputdir, 'cros-driver') |
| # The location of the piglit executable script. |
| run_path = os.path.join(self.piglit_path, 'bin/piglit') |
| summary = '' |
| if not (os.path.exists(run_path)): |
| raise error.TestError('piglit not found at %s' % self.piglit_path) |
| |
| os.chdir(self.piglit_path) |
| logging.info('cd %s', os.getcwd()) |
| # Piglit by default wants to run multiple tests in separate processes |
| # concurrently. Strictly serialize this using --no-concurrency. |
| # Now --dmesg also implies no concurrency but we want to be explicit. |
| flags = 'run -v --dmesg --no-concurrency' |
| if (options.testName != ''): |
| flags = flags + ' -t ' + options.testName |
| cmd = 'python %s %s %s %s' % (run_path, flags, test, self.outputdir) |
| # Pipe stdout and stderr into piglit-run.log for later analysis. |
| cmd = cmd + ' | tee ' + log_path |
| cmd = graphics_utils.xcommand(cmd) |
| logging.info(cmd) |
| utils.run(cmd, |
| stderr_is_expected = False, |
| stdout_tee = utils.TEE_TO_LOGS, |
| stderr_tee = utils.TEE_TO_LOGS) |
| |
| # Make sure logs get written before continuing. |
| utils.run('sync') |
| # Convert results.json file to human readable html. |
| cmd = ('python %s summary html --overwrite -e all %s %s/results.json' % |
| (run_path, results_path, self.outputdir)) |
| utils.run(cmd, |
| stderr_is_expected = False, |
| stdout_tee = utils.TEE_TO_LOGS, |
| stderr_tee = utils.TEE_TO_LOGS) |
| # Make sure logs get written before continuing. |
| utils.run('sync') |
| |
| # Count number of pass, fail, warn and skip in piglit-run.log (could |
| # also use results.json) |
| f = open(log_path, 'r') |
| summary = f.read() |
| f.close() |
| if not summary: |
| raise error.TestError('Test summary was empty') |
| |
| # Output counts for future processing. |
| keyvals = {} |
| for k in ['pass', 'fail', 'crash', 'warn', 'skip']: |
| num = len(re.findall(r'' + k + ' :: ', summary)) |
| keyvals['count_subtests_' + k] = num |
| logging.info('Piglit: %d ' + k, num) |
| self.output_perf_value(description=k, value=num, |
| units='count', higher_is_better=(k=='pass')) |
| |
| self.write_perf_keyval(keyvals) |