1*9c5db199SXin Li# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li 5*9c5db199SXin Li""" 6*9c5db199SXin LiThis is a profiler class for copying Profile-Guided-Optimization (PGO) data 7*9c5db199SXin Lifiles back to the host. When Chrome is built with -fprofile-generate, it dumps 8*9c5db199SXin Liits PGO data in a directory that this test copies back to test.profdir. 9*9c5db199SXin Li 10*9c5db199SXin LiThe PGO data is found where the build happens in the chroot, which is hardcoded 11*9c5db199SXin Lias the source_dir below. 12*9c5db199SXin Li""" 13*9c5db199SXin Li 14*9c5db199SXin Liimport logging 15*9c5db199SXin Liimport os 16*9c5db199SXin Liimport shutil 17*9c5db199SXin Liimport tarfile 18*9c5db199SXin Li 19*9c5db199SXin Lifrom autotest_lib.client.bin import profiler 20*9c5db199SXin Lifrom autotest_lib.client.common_lib import error 21*9c5db199SXin Lifrom autotest_lib.client.cros import cros_ui 22*9c5db199SXin Li 23*9c5db199SXin Li 24*9c5db199SXin Liclass pgo(profiler.profiler): 25*9c5db199SXin Li """The pgo profiler collects PGO data for Chrome.""" 26*9c5db199SXin Li version = 1 27*9c5db199SXin Li 28*9c5db199SXin Li def initialize(self, source_dir='/tmp/pgo/chrome'): 29*9c5db199SXin Li self._source_dir = source_dir 30*9c5db199SXin Li 31*9c5db199SXin Li 32*9c5db199SXin Li def start(self, test): 33*9c5db199SXin Li # Remove the .gcda files first. 34*9c5db199SXin Li if os.path.exists(self._source_dir): 35*9c5db199SXin Li shutil.rmtree(self._source_dir) 36*9c5db199SXin Li 37*9c5db199SXin Li 38*9c5db199SXin Li def stop(self, test): 39*9c5db199SXin Li if not cros_ui.stop_and_wait_for_chrome_to_exit(timeout_secs=40): 40*9c5db199SXin Li raise error.TestError('Could not stop Chrome') 41*9c5db199SXin Li if os.path.isdir(self._source_dir): 42*9c5db199SXin Li tar = tarfile.open(name=os.path.join(test.profdir, 'pgo.tar.bz2'), 43*9c5db199SXin Li mode='w:bz2') 44*9c5db199SXin Li tar.add(self._source_dir, arcname='chrome', recursive=True) 45*9c5db199SXin Li tar.close() 46*9c5db199SXin Li versionfile = '/opt/google/chrome/profilelocation' 47*9c5db199SXin Li if os.path.isfile(versionfile): 48*9c5db199SXin Li shutil.copyfile(versionfile, 49*9c5db199SXin Li os.path.join(test.profdir, 'profiledestination')) 50*9c5db199SXin Li else: 51*9c5db199SXin Li logging.error('PGO dir: %s not found', self._source_dir) 52*9c5db199SXin Li cros_ui.start(wait_for_login_prompt=False) 53