import os, re

from autotest_lib.client.bin import utils, test

class dbench(test.test):
    version = 3

    # http://samba.org/ftp/tridge/dbench/dbench-3.04.tar.gz
    def setup(self, tarball='dbench-3.04.tar.gz'):
        tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
        utils.extract_tarball_to_dir(tarball, self.srcdir)
        os.chdir(self.srcdir)

        utils.system('patch -p1 < ../dbench_startup.patch')
        utils.system('patch -p1 < ../dbench_ldflags.patch')
        utils.configure()
        utils.make()


    def initialize(self):
        self.job.require_gcc()
        self.results = []
        self.dbench = os.path.join(self.srcdir, 'dbench')


    def run_once(self, dir='.', nprocs=None, seconds=600, args=''):
        if not nprocs:
            nprocs = self.job.cpu_count()
        loadfile = os.path.join(self.srcdir, 'client.txt')
        cmd = '%s %s %s -D %s -c %s -t %d' % (self.dbench, nprocs, args,
                                              dir, loadfile, seconds)
        self.results = utils.system_output(cmd, retain_output=True)


    def postprocess_iteration(self):
        pattern = re.compile(r"Throughput (.*?) MB/sec (.*?) procs")
        (throughput, procs) = pattern.findall(self.results)[0]
        self.write_perf_keyval({'throughput':throughput, 'procs':procs})
