#!/usr/bin/python
#
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging
import optparse
import os, re
from autotest_lib.client.bin import utils, test

re_float = r"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?"

class kernel_fs_Punybench(test.test):
    """Run a selected subset of the puny benchmarks
    """
    version = 1
    Bin = '/opt/punybench/bin/'


    def initialize(self):
        self.results = []
        self.job.drop_caches_between_iterations = True


    def _run(self, cmd, args):
        """Run a puny benchmark

        Prepends the path to the puny benchmark bin.

        @param cmd: command to be run
        @param args: arguments for the command
        """
        result = utils.system_output(
            os.path.join(self.Bin, cmd) + ' ' + args)
        logging.debug(result)
        return result


    @staticmethod
    def _ecrypt_mount(dir, mnt):
        """Mount the eCrypt File System

        @param dir: directory where encrypted file system is stored
        @param mnt: mount point for encrypted file system
        """
        options = ('-o'
                   ' key=passphrase:passphrase_passwd=secret'
                   ',ecryptfs_cipher=aes'
                   ',ecryptfs_key_bytes=32'
                   ',no_sig_cache'
                   ',ecryptfs_passthrough=no'
                   ',ecryptfs_enable_filename_crypto=no')
        utils.system_output('mkdir -p %s %s' % (dir, mnt))
        utils.system_output('mount -t ecryptfs %s %s %s' %
                           (options, dir, mnt))


    @staticmethod
    def _ecrypt_unmount(dir, mnt):
        """Unmount the eCrypt File System and remove it and its mount point

        @param dir: directory where encrypted file system was stored
        @param mnt: mount point for encrypted file system
        """
        utils.system_output('umount ' + dir)
        utils.system_output('rm -R ' + dir)
        utils.system_output('rm -R ' + mnt)


    @staticmethod
    def _find_max(tag, text):
        """Find the max in a memcpy result.

        @param tag: name of sub-test to select from text.
        @param text: output from memcpy test.
        @return Best result from that sub-test.

        Example input text:
          memcpy (Meg = 2**20)
          0. 4746.96 MiB/sec
          1. 4748.99 MiB/sec
          2. 4748.14 MiB/sec
          3. 4748.59 MiB/sec
          simple (Meg = 2**20)
          0. 727.996 MiB/sec
          1. 728.031 MiB/sec
          2. 728.22 MiB/sec
          3. 728.049 MiB/sec
          32bit (Meg = 2**20)
          0. 2713.16 MiB/sec
          1. 2719.93 MiB/sec
          2. 2724.33 MiB/sec
          3. 2711.5 MiB/sec
        """
        r1 = re.search(tag + ".*\n(\d.*sec\n)+", text)
        r2 = re.findall(r"\d+\. (" + re_float + r") M.*\n", r1.group(0))
        return max(float(result) for result in r2)


    def _memcpy(self):
        """Measure memory to memory copy.

        The size has to be large enough that it doesn't fit
        in the cache. We then take the best of serveral runs
        so we have a guarenteed not to exceed number.

        Several different ways are used to move memory.
        """
        size = 64 * 1024 * 1024
        loops = 4
        iterations = 10
        args  = '-z %d -i %d -l %d' % (size, iterations, loops)
        result = self._run('memcpy', args)

        for tag in ['memcpy', '32bit', '64bit']:
            value = self._find_max(tag, result)
            self.write_perf_keyval({tag + '_MiB_s': value})


    @staticmethod
    def _get_mib_s(tag, text):
        """Extract the MiB/s for tag from text

        @param tag: name of sub-test to select from text
        @param text: extact MiB/s from this text

        Example input text:
          SDRAM:
          memcpy_trivial:  (2097152 bytes copy) =  727.6 MiB/s /  729.9 MiB/s
          memcpy        :  (2097152 bytes copy) = 4514.2 MiB/s / 4746.9 MiB/s
          memcpy_trivial:  (3145728 bytes copy) =  727.7 MiB/s /  729.5 MiB/s
          memcpy        :  (3145728 bytes copy) = 4489.5 MiB/s / 4701.5 MiB/s
        """
        r1 = re.search(tag + ".*\n.*\n.*", text)
        r2 = re.search(r"[^\s]+ MiB/s$", r1.group(0))
        r3 = re.search(re_float, r2.group(0))
        return r3.group(0)


    def _memcpy_test(self):
        """Test the various caches and alignments

        WARNING: test will have to be changed if cache sizes change.
        """
        result = self._run('memcpy_test', "")
        self.write_perf_keyval({'L1cache_MiB_s':
                               self._get_mib_s('L1 cache', result)})
        self.write_perf_keyval({'L2cache_MiB_s':
                               self._get_mib_s('L2 cache', result)})
        self.write_perf_keyval({'SDRAM_MiB_s':
                               self._get_mib_s('SDRAM', result)})


    def _threadtree(self, prefix, dir):
        """Create and manipulate directory trees.

        Threadtree creates a directory tree with files for each task.
        It then copies that tree then deletes it.

        @param prefix: prefix to use on name/value pair for identifying results
        @param dir: directory path to use for test

        Example results:
          opens   =       3641
          created =       2914
          dirs    =       1456
          files   =       1458
          deleted =       4372
          read    = 1046306816
          written = 2095407104
           51.7   2. timer avg= 57.9 stdv= 8.76
        """
        iterations = 4
        tasks = 2
        width = 3
        depth = 5
        args = ('-d %s -i %d -t %d -w %d -k %d' %
               (dir, iterations, tasks, width, depth))
        result = self._run('threadtree', args)
        r1 = re.search(r"timer avg= *([^\s]*).*$", result)
        timer_avg = float(r1.group(1))
        p = tasks * pow(width, depth + 1) / timer_avg
        self.write_perf_keyval({prefix + 'threadtree_ops': p})


    def _uread_args(self):
        """Set custom args for _uread tests
        """
        size = 8 * 1024 * 1024 * 1024
        loops = 4
        iterations = 1
        return ('-f %s -z %d -i %d -l %d -b12' %
               (file, size, iterations, loops))


    def _uread(self, prefix, file):
        """Read a large file.

        @param prefix: prefix to use on name/value pair for identifying results
        @param file: file path to use for test

        The size should be picked so the file will
        not fit in memory.

        Example results:
          size=8589934592 n=1 55.5 3. timer avg= 55.5 stdv=0.0693 147.6 MiB/s
          size=8589934592 n=1 55.6 4. timer avg= 55.5 stdv=0.0817 147.5 MiB/s
        """
        args = '-f %s' % file
        result = self._run('uread', args)
        r1 = re.search(r"[^\s]+ MiB/s.*$", result)
        r2 = re.search(re_float, r1.group(0))
        mib_s = r2.group(0)
        self.write_perf_keyval({prefix + 'uread_MiB_s': mib_s})


    def _ureadrand_args(self):
        """Set custom args for _ureadrand
        """
        size = 8 * 1024 * 1024 * 1024
        loops = 4
        iterations = 100000
        return ('-f %s -z %d -i %d -l %d -b12' %
               (file, size, iterations, loops))


    def _ureadrand(self, prefix, file):
        """Read randomly a large file

        @param prefix: prefix to use on name/value pair for identifying results
        @param file: file path to use for test

        Example results (modified to fit in 80 columes):
size=8589934592 n=10000 4.7 3. timer avg= 4 stdv= 4.6 9.1 MiB/s 2326 IOPs/sec
size=8589934592 n=10000 4.9 4. timer avg= 4.2 stdv= 4.5 8.8 MiB/s 2262 IOPs/sec
        """
        args = '-f %s' % file
        result = self._run('ureadrand', args)
        r1 = re.search(r"([^\s]+ IOPs/sec).*$", result)
        r2 = re.search(re_float, r1.group(0))
        iops = r2.group(0)
        self.write_perf_keyval({prefix + 'ureadrand_iops': iops})


    def _uwrite_args(self):
        """Custom args for _uwrite
        """
        size = 8 * 1024 * 1024 * 1024
        loops = 4
        iterations = 1
        return ('-f %s -z %d -i %d -l %d -b12' %
               (file, size, iterations, loops))


    def _uwrite(self, prefix, file):
        """Write a large file.

        @param prefix: prefix to use on name/value pair for identifying results
        @param file: file path to use for test

        The size should be picked so the file will not fit in memory.

        Example results:
          size=8589934592 n=1 55.5 3. timer avg= 55.5 stdv=0.0693 147.6 MiB/s
          size=8589934592 n=1 55.6 4. timer avg= 55.5 stdv=0.0817 147.5 MiB/s
        """
        args = '-f %s' % file
        result = self._run('uwrite', args)
        r1 = re.search(r"[^\s]+ MiB/s.*$", result)
        r2 = re.search(re_float, r1.group(0))
        mib_s = r2.group(0)
        self.write_perf_keyval({prefix + 'uwrite_MiB_s': mib_s})


    def _uwriterand(self, prefix, file, size):
        """Write randomly a file

        @param prefix: prefix to use on name/value pair for identifying results
        @param file: file path to use for test
        @param size: size of file - large files are much slower than small files

        Example results (modified to fit in 80 columes):
size=16777216 n=1000 13.4 1. timer avg= 13.4 stdv= 0 0.29 MiB/s 74.8 IOPs/sec
size=16777216 n=1000 13.3 2. timer avg= 13.3 stdv=0.032 0.3 MiB/s 75.0 IOPs/sec

        """
        loops = 4
        iterations = 1000
        args = ('-f %s -z %d -i %d -l %d -b12' %
                (file, size, iterations, loops))
        result = self._run('uwriterand', args)
        r1 = re.search(r"([^\s]+ IOPs/sec).*$", result)
        r2 = re.search(re_float, r1.group(0))
        iops = r2.group(0)
        self.write_perf_keyval({prefix + 'uwriterand_iops': iops})


    def _uwritesync(self, prefix, file):
        """Synchronously writes a file

        @param prefix: prefix to use on name/value pair for identifying results
        @param file: file path to use for test

        Example results (modified to fit in 80 columes):
size=409600 n=100 4.58 3. timer avg= 4.41 stdv=0.195 0.0887 MiB/s 22.7 IOPs/sec
size=409600 n=100 4.84 4. timer avg= 4.52 stdv= 0.27 0.0885 MiB/s 22.15 IOPs/sec
        """
        loops = 4  # minimum loops to average or see trends
        num_blocks_to_write = 100  # Because sync writes are slow,
                                   # don't do too many
        args = ('-f %s -i %d -l %d -b12' %
                (file, num_blocks_to_write, loops))
        result = self._run('uwritesync', args)
        r1 = re.search(r"([^\s]+ IOPs/sec).*$", result)
        r2 = re.search(re_float, r1.group(0))
        iops = r2.group(0)
        self.write_perf_keyval({prefix + 'uwritesync_iops': iops})


    def _disk_tests(self, prefix,  dir, file):
        """Run this collection of disk tests

        @param prefix: prefix to use on name/value pair for identifying results
        @param dir: directory path to use for tests
        @param file: file path to use for tests
        """
        self._uread(prefix, file)
        self._ureadrand(prefix, file)
        self._uwrite(prefix, file)
        self._uwriterand(prefix + '_large_', file, 8 * 1024 * 1024 * 1024)
        # This tests sometimes gives invalid results
        # self._uwriterand(prefix + '_small_', file, 8 * 1024)
        self._uwritesync(prefix, file)
        self._threadtree(prefix, dir)


    def _ecryptfs(self):
        """Setup up to run disk tests on encrypted volume
        """
        dir = '/usr/local/ecrypt_tst'
        mnt = '/usr/local/ecrypt_mnt'
        self._ecrypt_mount(dir, mnt)
        self._disk_tests('ecryptfs_', mnt + '/_Dir', mnt + '/xyzzy')
        self._ecrypt_unmount(dir, mnt)


    def _parse_args(self, args):
        """Parse input arguments to this autotest.

        Args:
        @param args: List of arguments to parse.
        @return
          opts: Options, as per optparse.
          args: Non-option arguments, as per optparse.
        """
        parser = optparse.OptionParser()
        parser.add_option('--disk', dest='want_disk_tests',
                          action='store_true', default=False,
                          help='Run disk tests.')
        parser.add_option('--ecryptfs', dest='want_ecryptfs_tests',
                          action='store_true', default=False,
                          help='Run ecryptfs tests.')
        parser.add_option('--mem', dest='want_mem_tests',
                          action='store_true', default=False,
                          help='Run memory tests.')
        parser.add_option('--nop', dest='want_nop_tests',
                          action='store_true', default=False,
                          help='Do nothing.')
        # Preprocess the args to remove quotes before/after each one if they
        # exist.  This is necessary because arguments passed via
        # run_remote_tests.sh may be individually quoted, and those quotes must
        # be stripped before they are parsed.
        return parser.parse_args(map(lambda arg: arg.strip('\'\"'), args))


    def run_once(self, args=[]):
        """Run the PyAuto performance tests.

        @param args: Either space-separated arguments or a list of string
              arguments.  If this is a space separated string, we'll just
              call split() on it to get a list.  The list will be sent to
              optparse for parsing.
        """
        if isinstance(args, str):
            args = args.split()
        options, test_args = self._parse_args(args)

        if test_args:
            raise error.TestFail("Unknown args: %s" % repr(test_args))

        try:
            restart_swap = True
            utils.system_output('swapoff /dev/zram0')
        except:
            restart_swap = False
        utils.system_output('stop ui')
        if options.want_nop_tests:
            pass
        if options.want_mem_tests:
            self._memcpy_test()
            self._memcpy()
        if options.want_disk_tests:
            self._disk_tests('ext4_', '/usr/local/_Dir', '/usr/local/xyzzy')
        if options.want_ecryptfs_tests:
            self._ecryptfs()

        if restart_swap:
            utils.system_output('swapon /dev/zram0')
        utils.system_output('start ui')
