blob: 97e774a1e2331867df314544723a8a6b50374c37 [file] [log] [blame]
#!/usr/bin/python
#
# 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