1import os, re
2from autotest_lib.client.bin import test, utils
3from autotest_lib.client.common_lib import error
4
5
6class unixbench(test.test):
7    version = 2
8
9    def initialize(self):
10        self.job.require_gcc()
11        self.err = None
12
13
14    # http://www.tux.org/pub/tux/niemi/unixbench/unixbench-4.1.0.tgz
15    def setup(self, tarball = 'unixbench-4.1.0.tar.bz2'):
16        tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
17        utils.extract_tarball_to_dir(tarball, self.srcdir)
18        os.chdir(self.srcdir)
19
20        utils.system('patch -p1 < ../unixbench.patch')
21        utils.system('patch -p1 < ../Makefile.patch')
22        utils.make()
23        utils.system('rm pgms/select')
24
25
26    def run_once(self, args='', stepsecs=0):
27        vars = ('TMPDIR=\"%s\" RESULTDIR=\"%s\" FLAVOR=Linux' %
28               (self.tmpdir, self.resultsdir))
29        if stepsecs:
30            # change time per subtest from unixbench's defaults of
31            #   10 secs for small tests, 30 secs for bigger tests
32            vars += ' systime=%i looper=%i seconds=%i'\
33                    ' dhrytime=%i arithtime=%i' \
34                    % ((stepsecs,)*5)
35
36        os.chdir(self.srcdir)
37        try:
38            utils.system(vars + ' ./Run ' + args)
39        finally:
40            times_path = os.path.join(self.resultsdir, 'times')
41            # The 'times' file can be needlessly huge as it contains warnings
42            # and error messages printed out by small benchmarks that are
43            # run in a loop.  It can easily compress 100x in such cases.
44            if os.path.exists(times_path):
45                utils.system("gzip -9 '%s'" % (times_path,), ignore_status=True)
46
47        report_path = os.path.join(self.resultsdir, 'report')
48        self.report_data = open(report_path).readlines()[9:]
49
50
51    def cleanup(self):
52        # check err string and possible throw
53        if self.err is not None:
54            raise error.TestError(self.err)
55
56
57    def check_for_error(self, words):
58        l = len(words)
59        if l >= 3 and words[-3:l] == ['no', 'measured', 'results']:
60            # found a problem so record it in err string
61            key = '_'.join(words[:-3])
62            if self.err is None:
63                self.err = key
64            else:
65                self.err = self.err + " " + key
66            return True
67        else:
68            return False
69
70
71    def postprocess_iteration(self):
72        keyval = {}
73        for line in self.report_data:
74            if not line.strip():
75                break
76
77            words = line.split()
78            # look for problems first
79            if self.check_for_error(words):
80                continue
81
82            # we should make sure that there are at least
83            # 6 guys before we start accessing the array
84            if len(words) >= 6:
85                key = '_'.join(words[:-6])
86                key = re.sub('\W', '', key)
87                value = words[-6]
88                keyval[key] = value
89        for line in self.report_data:
90            if 'FINAL SCORE' in line:
91                keyval['score'] = line.split()[-1]
92                break
93        self.write_perf_keyval(keyval)
94
95
96""" Here is a sample report file:
97
98  BYTE UNIX Benchmarks (Version 4.1.0)
99  System -- Linux adrianbg 2.6.18.5 #1 SMP Thu J  Start Benchmark Run: Tue Sep 1
100   9 interactive users.
101   21:03:50 up 5 days,  7:38,  9 users,  load average: 0.71, 0.40, 0.25
102  lrwxrwxrwx 1 root root 4 Aug 15 09:53 /bin/sh -> bash
103  /bin/sh: symbolic link to `bash'
104  /dev/sda6            192149596  91964372  90424536  51% /home
105Dhrystone 2 using register variables     7918001.7 lps   (10.0 secs, 10 samples)
106System Call Overhead                     1427272.7 lps   (10.0 secs, 10 samples)
107Process Creation                          11508.6 lps   (30.0 secs, 3 samples)
108Execl Throughput                           4159.7 lps   (29.7 secs, 3 samples)
109File Read 1024 bufsize 2000 maxblocks    1708109.0 KBps  (30.0 secs, 3 samples)
110File Write 1024 bufsize 2000 maxblocks   788024.0 KBps  (30.0 secs, 3 samples)
111File Copy 1024 bufsize 2000 maxblocks    452986.0 KBps  (30.0 secs, 3 samples)
112File Read 256 bufsize 500 maxblocks      508752.0 KBps  (30.0 secs, 3 samples)
113File Write 256 bufsize 500 maxblocks     214772.0 KBps  (30.0 secs, 3 samples)
114File Copy 256 bufsize 500 maxblocks      143989.0 KBps  (30.0 secs, 3 samples)
115File Read 4096 bufsize 8000 maxblocks    2626923.0 KBps  (30.0 secs, 3 samples)
116File Write 4096 bufsize 8000 maxblocks   1175070.0 KBps  (30.0 secs, 3 samples)
117File Copy 4096 bufsize 8000 maxblocks    793041.0 KBps  (30.0 secs, 3 samples)
118Shell Scripts (1 concurrent)               4417.4 lpm   (60.0 secs, 3 samples)
119Shell Scripts (8 concurrent)               1109.0 lpm   (60.0 secs, 3 samples)
120Shell Scripts (16 concurrent)               578.3 lpm   (60.0 secs, 3 samples)
121Arithmetic Test (type = short)           1843690.0 lps   (10.0 secs, 3 samples)
122Arithmetic Test (type = int)             1873615.8 lps   (10.0 secs, 3 samples)
123Arithmetic Test (type = long)            1888345.9 lps   (10.0 secs, 3 samples)
124Arithmetic Test (type = float)           616260.3 lps   (10.0 secs, 3 samples)
125Arithmetic Test (type = double)          615942.1 lps   (10.0 secs, 3 samples)
126Arithoh                                  18864899.5 lps   (10.0 secs, 3 samples)
127Dc: sqrt(2) to 99 decimal places         161726.0 lpm   (30.0 secs, 3 samples)
128Recursion Test--Tower of Hanoi            89229.3 lps   (20.0 secs, 3 samples)
129
130
131                     INDEX VALUES
132TEST                                        BASELINE     RESULT      INDEX
133
134Dhrystone 2 using register variables        116700.0  7918001.7      678.5
135Double-Precision Whetstone                      55.0     1948.2      354.2
136Execl Throughput                                43.0     4159.7      967.4
137File Copy 1024 bufsize 2000 maxblocks         3960.0   452986.0     1143.9
138File Copy 256 bufsize 500 maxblocks           1655.0   143989.0      870.0
139File Copy 4096 bufsize 8000 maxblocks         5800.0   793041.0     1367.3
140Pipe Throughput                              12440.0  1048491.9      842.8
141Pipe-based Context Switching                  4000.0   300778.3      751.9
142Process Creation                               126.0    11508.6      913.4
143Shell Scripts (8 concurrent)                     6.0     1109.0     1848.3
144System Call Overhead                         15000.0  1427272.7      951.5
145                                                                 =========
146     FINAL SCORE                                                     902.1
147"""
148