aboutsummaryrefslogtreecommitdiff
path: root/deprecated/fdo_scripts/profile_cycler.py
diff options
context:
space:
mode:
Diffstat (limited to 'deprecated/fdo_scripts/profile_cycler.py')
-rwxr-xr-xdeprecated/fdo_scripts/profile_cycler.py199
1 files changed, 199 insertions, 0 deletions
diff --git a/deprecated/fdo_scripts/profile_cycler.py b/deprecated/fdo_scripts/profile_cycler.py
new file mode 100755
index 00000000..176f2d4a
--- /dev/null
+++ b/deprecated/fdo_scripts/profile_cycler.py
@@ -0,0 +1,199 @@
+#!/usr/bin/python2
+#
+# Copyright 2011 Google Inc. All Rights Reserved.
+"""Script to profile a page cycler, and get it back to the host."""
+
+import copy
+import optparse
+import os
+import pickle
+import re
+import sys
+import tempfile
+import time
+
+import build_chrome_browser
+import cros_login
+import lock_machine
+import run_tests
+from cros_utils import command_executer
+from cros_utils import logger
+from cros_utils import misc
+
+
+class CyclerProfiler:
+ REMOTE_TMP_DIR = '/tmp'
+
+ def __init__(self, chromeos_root, board, cycler, profile_dir, remote):
+ self._chromeos_root = chromeos_root
+ self._cycler = cycler
+ self._profile_dir = profile_dir
+ self._remote = remote
+ self._board = board
+ self._ce = command_executer.GetCommandExecuter()
+ self._l = logger.GetLogger()
+
+ self._gcov_prefix = os.path.join(self.REMOTE_TMP_DIR, self._GetProfileDir())
+
+ def _GetProfileDir(self):
+ return misc.GetCtargetFromBoard(self._board, self._chromeos_root)
+
+ def _CopyTestData(self):
+ page_cycler_dir = os.path.join(self._chromeos_root, 'distfiles', 'target',
+ 'chrome-src-internal', 'src', 'data',
+ 'page_cycler')
+ if not os.path.isdir(page_cycler_dir):
+ raise RuntimeError('Page cycler dir %s not found!' % page_cycler_dir)
+ self._ce.CopyFiles(page_cycler_dir,
+ os.path.join(self.REMOTE_TMP_DIR, 'page_cycler'),
+ dest_machine=self._remote,
+ chromeos_root=self._chromeos_root,
+ recursive=True,
+ dest_cros=True)
+
+ def _PrepareTestData(self):
+ # chmod files so everyone can read them.
+ command = ('cd %s && find page_cycler -type f | xargs chmod a+r' %
+ self.REMOTE_TMP_DIR)
+ self._ce.CrosRunCommand(command,
+ chromeos_root=self._chromeos_root,
+ machine=self._remote)
+ command = ('cd %s && find page_cycler -type d | xargs chmod a+rx' %
+ self.REMOTE_TMP_DIR)
+ self._ce.CrosRunCommand(command,
+ chromeos_root=self._chromeos_root,
+ machine=self._remote)
+
+ def _CopyProfileToHost(self):
+ dest_dir = os.path.join(self._profile_dir,
+ os.path.basename(self._gcov_prefix))
+ # First remove the dir if it exists already
+ if os.path.exists(dest_dir):
+ command = 'rm -rf %s' % dest_dir
+ self._ce.RunCommand(command)
+
+ # Strip out the initial prefix for the Chrome directory before doing the
+ # copy.
+ chrome_dir_prefix = misc.GetChromeSrcDir()
+
+ command = 'mkdir -p %s' % dest_dir
+ self._ce.RunCommand(command)
+ self._ce.CopyFiles(self._gcov_prefix,
+ dest_dir,
+ src_machine=self._remote,
+ chromeos_root=self._chromeos_root,
+ recursive=True,
+ src_cros=True)
+
+ def _RemoveRemoteProfileDir(self):
+ command = 'rm -rf %s' % self._gcov_prefix
+ self._ce.CrosRunCommand(command,
+ chromeos_root=self._chromeos_root,
+ machine=self._remote)
+
+ def _LaunchCycler(self, cycler):
+ command = (
+ 'DISPLAY=:0 '
+ 'XAUTHORITY=/home/chronos/.Xauthority '
+ 'GCOV_PREFIX=%s '
+ 'GCOV_PREFIX_STRIP=3 '
+ '/opt/google/chrome/chrome '
+ '--no-sandbox '
+ '--renderer-clean-exit '
+ '--user-data-dir=$(mktemp -d) '
+ "--url \"file:///%s/page_cycler/%s/start.html?iterations=10&auto=1\" "
+ '--enable-file-cookies '
+ '--no-first-run '
+ '--js-flags=expose_gc &' % (self._gcov_prefix, self.REMOTE_TMP_DIR,
+ cycler))
+
+ self._ce.CrosRunCommand(command,
+ chromeos_root=self._chromeos_root,
+ machine=self._remote,
+ command_timeout=60)
+
+ def _PkillChrome(self, signal='9'):
+ command = 'pkill -%s chrome' % signal
+ self._ce.CrosRunCommand(command,
+ chromeos_root=self._chromeos_root,
+ machine=self._remote)
+
+ def DoProfile(self):
+ # Copy the page cycler data to the remote
+ self._CopyTestData()
+ self._PrepareTestData()
+ self._RemoveRemoteProfileDir()
+
+ for cycler in self._cycler.split(','):
+ self._ProfileOneCycler(cycler)
+
+ # Copy the profile back
+ self._CopyProfileToHost()
+
+ def _ProfileOneCycler(self, cycler):
+ # With aura, all that's needed is a stop/start ui.
+ self._PkillChrome()
+ cros_login.RestartUI(self._remote, self._chromeos_root, login=False)
+ # Run the cycler
+ self._LaunchCycler(cycler)
+ self._PkillChrome(signal='INT')
+ # Let libgcov dump the profile.
+ # TODO(asharif): There is a race condition here. Fix it later.
+ time.sleep(30)
+
+
+def Main(argv):
+ """The main function."""
+ # Common initializations
+ ### command_executer.InitCommandExecuter(True)
+ command_executer.InitCommandExecuter()
+ l = logger.GetLogger()
+ ce = command_executer.GetCommandExecuter()
+ parser = optparse.OptionParser()
+ parser.add_option('--cycler',
+ dest='cycler',
+ default='alexa_us',
+ help=('Comma-separated cyclers to profile. '
+ 'Example: alexa_us,moz,moz2'
+ 'Use all to profile all cyclers.'))
+ parser.add_option('--chromeos_root',
+ dest='chromeos_root',
+ default='../../',
+ help='Output profile directory.')
+ parser.add_option('--board',
+ dest='board',
+ default='x86-zgb',
+ help='The target board.')
+ parser.add_option('--remote',
+ dest='remote',
+ help=('The remote chromeos machine that'
+ ' has the profile image.'))
+ parser.add_option('--profile_dir',
+ dest='profile_dir',
+ default='profile_dir',
+ help='Store profiles in this directory.')
+
+ options, _ = parser.parse_args(argv)
+
+ all_cyclers = ['alexa_us', 'bloat', 'dhtml', 'dom', 'intl1', 'intl2',
+ 'morejs', 'morejsnp', 'moz', 'moz2']
+
+ if options.cycler == 'all':
+ options.cycler = ','.join(all_cyclers)
+
+ try:
+ cp = CyclerProfiler(options.chromeos_root, options.board, options.cycler,
+ options.profile_dir, options.remote)
+ cp.DoProfile()
+ retval = 0
+ except Exception as e:
+ retval = 1
+ print e
+ finally:
+ print 'Exiting...'
+ return retval
+
+
+if __name__ == '__main__':
+ retval = Main(sys.argv)
+ sys.exit(retval)