| import os, re, logging, shutil |
| from autotest_lib.client.bin import utils, package, test |
| from autotest_lib.client.bin.test_config import config_loader |
| from autotest_lib.client.common_lib import error |
| |
| |
| class dacapo(test.test): |
| """ |
| This autotest module runs the dacapo benchmark suite. |
| |
| This benchmark suite is intended as a tool for Java benchmarking by the |
| programming language, memory management and computer architecture |
| communities. It consists of a set of open source, real world applications |
| with non-trivial memory loads. The suite is the culmination of over five |
| years work at eight institutions, as part of the DaCapo research project, |
| which was funded by a National Science Foundation ITR Grant, CCR-0085792. |
| |
| @author: Lucas Meneghel Rodrigues (lucasmr@br.ibm.com) |
| @see: http://dacapobench.org/ |
| """ |
| version = 2 |
| |
| def set_java_environment(self, jvm, java_root): |
| """ |
| Setup java environment variables (path and classpath in order to |
| execute a specific jvm specified by the java_root variable. |
| java_root - Base of the java vm installation |
| """ |
| if jvm.startswith('ibm'): |
| java_home = os.path.join(java_root, 'jre') |
| else: |
| java_home = java_root |
| java_bin = os.path.join(java_home, 'bin') |
| java_lib = os.path.join(java_home, 'lib') |
| os.environ['JAVA_ROOT'] = java_root |
| os.environ['JAVA_HOME'] = java_home |
| os.environ['JRE_HOME'] = java_home |
| os.environ['CLASSPATH'] = java_lib |
| os.environ['JAVA_BINDIR'] = java_bin |
| os.environ['PATH'] = java_bin + ':' + os.environ['PATH'] |
| |
| |
| def run_once(self, test='antlr', config='./dacapo.cfg', jvm='default'): |
| cfg = config_loader(cfg=config, tmpdir=self.tmpdir, raise_errors=True) |
| self.test = test |
| cachedir = os.path.join(self.bindir, 'cache') |
| if not os.path.isdir(cachedir): |
| os.makedirs(cachedir) |
| |
| dacapo_url = cfg.get('dacapo', 'tarball_url') |
| dacapo_md5 = cfg.get('dacapo', 'package_md5') |
| dacapo_pkg = utils.unmap_url_cache(cachedir, dacapo_url, dacapo_md5) |
| |
| if not jvm == 'default': |
| # Get the jvm package |
| jvm_pkg_url = cfg.get(jvm, 'jvm_pkg_url') |
| jvm_pkg_md5 = cfg.get(jvm, 'package_md5') |
| jvm_pkg = utils.unmap_url_cache(cachedir, jvm_pkg_url, jvm_pkg_md5) |
| # Install it |
| package.install(jvm_pkg) |
| # Basic Java environment variables setup |
| java_root = cfg.get(jvm, 'java_root') |
| self.set_java_environment(jvm, java_root) |
| |
| if cfg.get('global', 'use_global') == 'yes': |
| iterations = cfg.get('global', 'iterations') |
| workload = cfg.get('global', 'workload') |
| else: |
| iterations = cfg.get(test, 'iterations') |
| workload = cfg.get(test, 'workload') |
| |
| verbose = '-v ' |
| workload = '-s %s ' % workload |
| iterations = '-n %s ' % iterations |
| self.scratch = os.path.join(self.resultsdir, test) |
| scratch = '--scratch-directory %s ' % self.scratch |
| args = verbose + workload + scratch + iterations + test |
| |
| self.raw_result_file = os.path.join(self.resultsdir, |
| 'raw_output_%s' % self.iteration) |
| raw_result = open(self.raw_result_file, 'w') |
| |
| logging.info('Running dacapo benchmark %s', test) |
| try: |
| cmd = 'java -jar %s %s' % (dacapo_pkg, args) |
| results = utils.run(command=cmd, stdout_tee=raw_result, |
| stderr_tee=raw_result) |
| self.results = results.stderr |
| raw_result.close() |
| except error.CmdError, e: |
| raise error.TestError('Dacapo benchmark %s has failed: %s' % |
| (test, e)) |
| |
| |
| def postprocess_iteration(self): |
| result_line = self.results.splitlines()[-1] |
| time_regexp = re.compile('PASSED in (\d+) ms') |
| matches = time_regexp.findall(result_line) |
| if len(matches) == 1: |
| keylist = {} |
| logging.info('Benchmark %s completed in %s ms', self.test, |
| matches[0]) |
| keylist[self.test] = int(matches[0]) |
| self.write_perf_keyval(keylist) |
| # Remove scratch directory |
| shutil.rmtree(self.scratch) |
| else: |
| logging.error('Problems executing benchmark %s, not recording ' |
| 'results on the perf keyval', self.test) |