#!/usr/bin/python2
#
# Copyright (c) 2012 The Chromium 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 os
import re
import tempfile

from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error

class kernel_PerfEventRename(test.test):
    """
    Test perf's ability to deal with processes which have changed their name
    after perf record starts.  Older versions of perf lost their data about
    which executables or libraries were mapped so all the samples would end
    up being called unknown and this would make the profiles useless.

    Good output:
        97.43%        149  foobar_name  perf-rename-test   [.] 0x000006f8
    Bad output:
        96.54%        140  foobar_name  [unknown]          [.] 0x777046f3
    """
    version = 1
    executable = 'perf-rename-test'

    # This runs during the build process
    def setup(self):
        os.chdir(self.srcdir)
        utils.make(self.executable)

    def run_once(self):
        # the rename program runs a crc loop for a while to ensure that we get
        # a good number of samples
        loops = 10 * 1000 * 1000
        rename_name = 'foobar_name'
        (data_tmpfile, data_name) = tempfile.mkstemp(
            prefix='perfEventRename_data.', dir='/tmp')

        utils.system('perf record -o %s %s %s %s' %
                     (data_name, os.path.join(self.srcdir,
                                              self.executable),
                      rename_name, loops),
                     timeout=60)
        report = utils.system_output('perf report -n -i %s' % (data_name))
        logging.debug('report output: %s' % report)
        os.unlink(data_name)

        for line in report.splitlines():
            # The first several lines of output should be comments with '#'
            if re.match('^#', line):
                continue

            stuff = line.split()
            # there's a slight risk that we might get an unknown sample
            # somewhere in the mix, and I've seen this more often on some
            # platforms where there is high "skid" or imprecision.
            # So we'll mitigate that by only checking the first line after
            # the comments, which should be in the crc loop and the majority
            # of samples
            if stuff[3] == '[unknown]':
                logging.info('bad report entry: %s' % line)
                raise error.TestFail
            else:
                return True

