lmr | 4c607f2 | 2009-06-02 11:50:38 +0000 | [diff] [blame] | 1 | import os, re, logging |
mbligh | 53da18e | 2009-01-05 21:13:26 +0000 | [diff] [blame] | 2 | from autotest_lib.client.bin import test, utils |
| 3 | from autotest_lib.client.common_lib import error |
mbligh | 50f4b3c | 2007-03-14 16:42:41 +0000 | [diff] [blame] | 4 | |
| 5 | class tsc(test.test): |
mbligh | 9f0d48b | 2008-08-25 19:12:54 +0000 | [diff] [blame] | 6 | version = 2 |
mbligh | a8fe637 | 2008-08-28 20:55:43 +0000 | [diff] [blame] | 7 | |
mbligh | 9f0d48b | 2008-08-25 19:12:54 +0000 | [diff] [blame] | 8 | preserve_srcdir = True |
mbligh | 50f4b3c | 2007-03-14 16:42:41 +0000 | [diff] [blame] | 9 | |
mbligh | 9f0d48b | 2008-08-25 19:12:54 +0000 | [diff] [blame] | 10 | def setup(self): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 11 | os.chdir(self.srcdir) |
| 12 | utils.system('make') |
mbligh | 50f4b3c | 2007-03-14 16:42:41 +0000 | [diff] [blame] | 13 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 14 | |
mbligh | c5ddfd1 | 2008-08-04 17:15:00 +0000 | [diff] [blame] | 15 | def initialize(self): |
| 16 | self.job.require_gcc() |
| 17 | |
| 18 | |
mbligh | 9f0d48b | 2008-08-25 19:12:54 +0000 | [diff] [blame] | 19 | def run_once(self, args = '-t 650'): |
mbligh | a8fe637 | 2008-08-28 20:55:43 +0000 | [diff] [blame] | 20 | result = utils.run(self.srcdir + '/checktsc ' + args, |
jadmanski | 262fa26 | 2009-10-30 22:14:59 +0000 | [diff] [blame^] | 21 | stdout_tee=open(os.path.join(self.resultsdir, |
| 22 | 'checktsc.log'), 'w'), |
mbligh | a8fe637 | 2008-08-28 20:55:43 +0000 | [diff] [blame] | 23 | ignore_status=True) |
mbligh | a8fe637 | 2008-08-28 20:55:43 +0000 | [diff] [blame] | 24 | if result.exit_status != 0: |
lmr | 4c607f2 | 2009-06-02 11:50:38 +0000 | [diff] [blame] | 25 | logging.error('Program checktsc exit status is %s', |
| 26 | result.exit_status) |
mbligh | a8fe637 | 2008-08-28 20:55:43 +0000 | [diff] [blame] | 27 | default_reason = ("UNKNOWN FAILURE: rc=%d from %s" % |
| 28 | (result.exit_status, result.command)) |
| 29 | ## Analyze result.stdout to see if it is possible to form qualified |
| 30 | ## reason of failure and to raise an appropriate exception. |
mbligh | 1ef218d | 2009-08-03 16:57:56 +0000 | [diff] [blame] | 31 | ## For this test we qualify the reason of failure if the |
mbligh | a8fe637 | 2008-08-28 20:55:43 +0000 | [diff] [blame] | 32 | ## following conditions are met: |
| 33 | ## (i) result.exit_status = 1 |
| 34 | ## (ii) result.stdout ends with 'FAIL' |
| 35 | ## (iii) "FAIL" is preceeded by one or more |
| 36 | ## lines in the following format: |
| 37 | ## CPU x - CPU y = <delta> |
| 38 | ## Set as a reason the line that contains max abs(delta) |
| 39 | if result.exit_status == 1: |
| 40 | if result.stdout.strip('\n').endswith('FAIL'): |
| 41 | ## find all lines |
| 42 | ## CPU x - CPU y = <delta> |
| 43 | ## and parse out delta of max abs value |
| 44 | max_delta = 0 |
| 45 | reason = '' |
| 46 | threshold = int(args.split()[1]) |
| 47 | latencies = re.findall("CPU \d+ - CPU \d+ =\s+-*\d+", |
| 48 | result.stdout) |
| 49 | for ln in latencies: |
| 50 | cur_delta = int(ln.split('=', 2)[1]) |
| 51 | if abs(cur_delta) > max_delta: |
| 52 | max_delta = abs(cur_delta) |
| 53 | reason = ln |
| 54 | if max_delta > threshold: |
| 55 | reason = "Latency %s exceeds threshold %d" % (reason, |
| 56 | threshold) |
| 57 | raise error.TestFail(reason) |
| 58 | |
| 59 | ## If we are here, we failed to qualify the reason of test failre |
| 60 | ## Consider it as a test error |
| 61 | raise error.TestError(default_reason) |