| import os, re, logging |
| from autotest_lib.client.bin import test, utils |
| from autotest_lib.client.common_lib import error |
| |
| class tsc(test.test): |
| version = 3 |
| |
| preserve_srcdir = True |
| |
| def setup(self): |
| os.chdir(self.srcdir) |
| utils.make() |
| |
| |
| def initialize(self): |
| self.job.require_gcc() |
| |
| |
| def run_once(self, args = '-t 650'): |
| result = utils.run(self.srcdir + '/checktsc ' + args, |
| stdout_tee=open(os.path.join(self.resultsdir, |
| 'checktsc.log'), 'w'), |
| ignore_status=True) |
| if result.exit_status != 0: |
| logging.error('Program checktsc exit status is %s', |
| result.exit_status) |
| default_reason = ("UNKNOWN FAILURE: rc=%d from %s" % |
| (result.exit_status, result.command)) |
| ## Analyze result.stdout to see if it is possible to form qualified |
| ## reason of failure and to raise an appropriate exception. |
| ## For this test we qualify the reason of failure if the |
| ## following conditions are met: |
| ## (i) result.exit_status = 1 |
| ## (ii) result.stdout ends with 'FAIL' |
| ## (iii) "FAIL" is preceeded by one or more |
| ## lines in the following format: |
| ## CPU x - CPU y = <delta> |
| ## Set as a reason the line that contains max abs(delta) |
| if result.exit_status == 1: |
| if result.stdout.strip('\n').endswith('FAIL'): |
| ## find all lines |
| ## CPU x - CPU y = <delta> |
| ## and parse out delta of max abs value |
| max_delta = 0 |
| reason = '' |
| threshold = int(args.split()[1]) |
| latencies = re.findall("CPU \d+ - CPU \d+ =\s+-*\d+", |
| result.stdout) |
| for ln in latencies: |
| cur_delta = int(ln.split('=', 2)[1]) |
| if abs(cur_delta) > max_delta: |
| max_delta = abs(cur_delta) |
| reason = ln |
| if max_delta > threshold: |
| reason = "Latency %s exceeds threshold %d" % (reason, |
| threshold) |
| raise error.TestFail(reason) |
| |
| ## If we are here, we failed to qualify the reason of test failre |
| ## Consider it as a test error |
| raise error.TestError(default_reason) |