• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import os, re, logging, shutil
2from autotest_lib.client.bin import utils, package, test
3from autotest_lib.client.bin.test_config import config_loader
4from autotest_lib.client.common_lib import error
5
6
7class dacapo(test.test):
8    """
9    This autotest module runs the dacapo benchmark suite.
10
11    This benchmark suite is intended as a tool for Java benchmarking by the
12    programming language, memory management and computer architecture
13    communities. It consists of a set of open source, real world applications
14    with non-trivial memory loads. The suite is the culmination of over five
15    years work at eight institutions, as part of the DaCapo research project,
16    which was funded by a National Science Foundation ITR Grant, CCR-0085792.
17
18    @author: Lucas Meneghel Rodrigues (lucasmr@br.ibm.com)
19    @see: http://dacapobench.org/
20    """
21    version = 2
22
23    def set_java_environment(self, jvm, java_root):
24        """
25        Setup java environment variables (path and classpath in order to
26        execute a specific jvm specified by the java_root variable.
27        java_root - Base of the java vm installation
28        """
29        if jvm.startswith('ibm'):
30            java_home = os.path.join(java_root, 'jre')
31        else:
32            java_home = java_root
33        java_bin = os.path.join(java_home, 'bin')
34        java_lib =  os.path.join(java_home, 'lib')
35        os.environ['JAVA_ROOT'] = java_root
36        os.environ['JAVA_HOME'] = java_home
37        os.environ['JRE_HOME'] = java_home
38        os.environ['CLASSPATH'] = java_lib
39        os.environ['JAVA_BINDIR'] = java_bin
40        os.environ['PATH'] = java_bin + ':' + os.environ['PATH']
41
42
43    def run_once(self, test='antlr', config='./dacapo.cfg', jvm='default'):
44        cfg = config_loader(cfg=config, tmpdir=self.tmpdir, raise_errors=True)
45        self.test = test
46        cachedir = os.path.join(self.bindir, 'cache')
47        if not os.path.isdir(cachedir):
48            os.makedirs(cachedir)
49
50        dacapo_url = cfg.get('dacapo', 'tarball_url')
51        dacapo_md5 = cfg.get('dacapo', 'package_md5')
52        dacapo_pkg = utils.unmap_url_cache(cachedir, dacapo_url, dacapo_md5)
53
54        if not jvm == 'default':
55            # Get the jvm package
56            jvm_pkg_url = cfg.get(jvm, 'jvm_pkg_url')
57            jvm_pkg_md5 = cfg.get(jvm, 'package_md5')
58            jvm_pkg = utils.unmap_url_cache(cachedir, jvm_pkg_url, jvm_pkg_md5)
59            # Install it
60            package.install(jvm_pkg)
61            # Basic Java environment variables setup
62            java_root = cfg.get(jvm, 'java_root')
63            self.set_java_environment(jvm, java_root)
64
65        if cfg.get('global', 'use_global') == 'yes':
66            iterations = cfg.get('global', 'iterations')
67            workload = cfg.get('global', 'workload')
68        else:
69            iterations = cfg.get(test, 'iterations')
70            workload = cfg.get(test, 'workload')
71
72        verbose = '-v '
73        workload = '-s %s ' % workload
74        iterations = '-n %s ' % iterations
75        self.scratch = os.path.join(self.resultsdir, test)
76        scratch = '--scratch-directory %s ' % self.scratch
77        args = verbose + workload + scratch + iterations + test
78
79        self.raw_result_file = os.path.join(self.resultsdir,
80                                            'raw_output_%s' % self.iteration)
81        raw_result = open(self.raw_result_file, 'w')
82
83        logging.info('Running dacapo benchmark %s', test)
84        try:
85            cmd = 'java -jar %s %s' % (dacapo_pkg, args)
86            results = utils.run(command=cmd, stdout_tee=raw_result,
87                                stderr_tee=raw_result)
88            self.results = results.stderr
89            raw_result.close()
90        except error.CmdError, e:
91            raise error.TestError('Dacapo benchmark %s has failed: %s' %
92                                  (test, e))
93
94
95    def postprocess_iteration(self):
96        result_line = self.results.splitlines()[-1]
97        time_regexp = re.compile('PASSED in (\d+) ms')
98        matches = time_regexp.findall(result_line)
99        if len(matches) == 1:
100            keylist = {}
101            logging.info('Benchmark %s completed in %s ms', self.test,
102                         matches[0])
103            keylist[self.test] = int(matches[0])
104            self.write_perf_keyval(keylist)
105            # Remove scratch directory
106            shutil.rmtree(self.scratch)
107        else:
108            logging.error('Problems executing benchmark %s, not recording '
109                          'results on the perf keyval', self.test)
110