| Index: tools/telemetry/telemetry/page_runner.py | 
| diff --git a/tools/telemetry/telemetry/page_runner.py b/tools/telemetry/telemetry/page_runner.py | 
| deleted file mode 100644 | 
| index 5a167825ba3ca4e616400d345f70637d0df8f129..0000000000000000000000000000000000000000 | 
| --- a/tools/telemetry/telemetry/page_runner.py | 
| +++ /dev/null | 
| @@ -1,320 +0,0 @@ | 
| -# 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 codecs | 
| -import logging | 
| -import os | 
| -import time | 
| -import traceback | 
| -import urlparse | 
| -import random | 
| - | 
| -from telemetry import browser_gone_exception | 
| -from telemetry import page_filter as page_filter_module | 
| -from telemetry import page_test | 
| -from telemetry import tab_crash_exception | 
| -from telemetry import util | 
| -from telemetry import wpr_modes | 
| - | 
| -class PageState(object): | 
| -  def __init__(self): | 
| -    self.did_login = False | 
| - | 
| -class _RunState(object): | 
| -  def __init__(self): | 
| -    self.first_browser = True | 
| -    self.browser = None | 
| -    self.tab = None | 
| -    self.is_tracing = False | 
| - | 
| -  def Close(self): | 
| -    self.is_tracing = False | 
| - | 
| -    if self.tab: | 
| -      self.tab.Disconnect() | 
| -      self.tab = None | 
| - | 
| -    if self.browser: | 
| -      self.browser.Close() | 
| -      self.browser = None | 
| - | 
| -def _ShuffleAndFilterPageSet(page_set, options): | 
| -  if options.pageset_shuffle_order_file and not options.pageset_shuffle: | 
| -    raise Exception('--pageset-shuffle-order-file requires --pageset-shuffle.') | 
| - | 
| -  if options.pageset_shuffle_order_file: | 
| -    return page_set.ReorderPageSet(options.pageset_shuffle_order_file) | 
| - | 
| -  page_filter = page_filter_module.PageFilter(options) | 
| -  pages = [page for page in page_set.pages[:] | 
| -           if not page.disabled and page_filter.IsSelected(page)] | 
| - | 
| -  if options.pageset_shuffle: | 
| -    random.Random().shuffle(pages) | 
| -  return [page | 
| -      for _ in xrange(int(options.pageset_repeat)) | 
| -      for page in pages | 
| -      for _ in xrange(int(options.page_repeat))] | 
| - | 
| -class PageRunner(object): | 
| -  """Runs a given test against a given test.""" | 
| -  def __init__(self, page_set): | 
| -    self.page_set = page_set | 
| - | 
| -  def __enter__(self): | 
| -    return self | 
| - | 
| -  def __exit__(self, *args): | 
| -    self.Close() | 
| - | 
| -  def Run(self, options, possible_browser, test, results): | 
| -    # Check if we can run against WPR. | 
| -    for page in self.page_set.pages: | 
| -      parsed_url = urlparse.urlparse(page.url) | 
| -      if parsed_url.scheme == 'file': | 
| -        continue | 
| -      if not page.archive_path: | 
| -        logging.warning(""" | 
| -  No page set archive provided for the page %s. Benchmarking against live sites! | 
| -  Results won't be repeatable or comparable. | 
| -""", page.url) | 
| -      elif options.wpr_mode != wpr_modes.WPR_RECORD: | 
| -        # The page has an archive, and we're not recording. | 
| -        if not os.path.isfile(page.archive_path): | 
| -          logging.warning(""" | 
| -  The page set archive %s for page %s does not exist, benchmarking against live | 
| -  sites! Results won't be repeatable or comparable. | 
| - | 
| -  To fix this, either add svn-internal to your .gclient using | 
| -  http://goto/read-src-internal, or create a new archive using record_wpr. | 
| -  """, os.path.relpath(page.archive_path), page.url) | 
| - | 
| -    # Verify credentials path. | 
| -    credentials_path = None | 
| -    if self.page_set.credentials_path: | 
| -      credentials_path = os.path.join(os.path.dirname(self.page_set.file_path), | 
| -                                      self.page_set.credentials_path) | 
| -      if not os.path.exists(credentials_path): | 
| -        credentials_path = None | 
| - | 
| -    # Set up user agent. | 
| -    if self.page_set.user_agent_type: | 
| -      options.browser_user_agent_type = self.page_set.user_agent_type | 
| - | 
| -    for page in self.page_set: | 
| -      test.CustomizeBrowserOptionsForPage(page, possible_browser.options) | 
| - | 
| -    # Check tracing directory. | 
| -    if options.trace_dir: | 
| -      if not os.path.exists(options.trace_dir): | 
| -        os.mkdir(options.trace_dir) | 
| -      if not os.path.isdir(options.trace_dir): | 
| -        raise Exception('--trace-dir isn\'t a directory: %s' % | 
| -                        options.trace_dir) | 
| -      elif os.listdir(options.trace_dir): | 
| -        raise Exception('Trace directory isn\'t empty: %s' % options.trace_dir) | 
| - | 
| -    # Reorder page set based on options. | 
| -    pages = _ShuffleAndFilterPageSet(self.page_set, options) | 
| - | 
| -    state = _RunState() | 
| -    last_archive_path = None | 
| -    try: | 
| -      for page in pages: | 
| -        if options.wpr_mode != wpr_modes.WPR_RECORD: | 
| -          if page.archive_path and os.path.isfile(page.archive_path): | 
| -            possible_browser.options.wpr_mode = wpr_modes.WPR_REPLAY | 
| -          else: | 
| -            possible_browser.options.wpr_mode = wpr_modes.WPR_OFF | 
| -        if last_archive_path != page.archive_path: | 
| -          state.Close() | 
| -          state = _RunState() | 
| -          last_archive_path = page.archive_path | 
| -        tries = 3 | 
| -        while tries: | 
| -          try: | 
| -            if not state.browser: | 
| -              self._SetupBrowser(state, test, possible_browser, | 
| -                                 credentials_path, page.archive_path) | 
| -            if not state.tab: | 
| -              if len(state.browser.tabs) == 0: | 
| -                state.browser.tabs.New() | 
| -              state.tab = state.browser.tabs[0] | 
| -            if options.trace_dir: | 
| -              self._SetupTracingTab(state) | 
| - | 
| -            try: | 
| -              self._RunPage(options, page, state.tab, test, results) | 
| -            except tab_crash_exception.TabCrashException: | 
| -              stdout = '' | 
| -              if not options.show_stdout: | 
| -                stdout = state.browser.GetStandardOutput() | 
| -                stdout = (('\nStandard Output:\n') + | 
| -                          ('*' * 80) + | 
| -                          '\n\t' + stdout.replace('\n', '\n\t') + '\n' + | 
| -                          ('*' * 80)) | 
| -              logging.warning('Tab crashed: %s%s', page.url, stdout) | 
| -              state.Close() | 
| - | 
| -            if options.trace_dir: | 
| -              self._EndTracing(state, options, page) | 
| - | 
| -            if test.needs_browser_restart_after_each_run: | 
| -              state.Close() | 
| - | 
| -            break | 
| -          except browser_gone_exception.BrowserGoneException: | 
| -            logging.warning('Lost connection to browser. Retrying.') | 
| -            state.Close() | 
| -            tries -= 1 | 
| -            if not tries: | 
| -              logging.error('Lost connection to browser 3 times. Failing.') | 
| -              raise | 
| -    finally: | 
| -      state.Close() | 
| - | 
| -  def _RunPage(self, options, page, tab, test, results): | 
| -    if not test.CanRunForPage(page): | 
| -      logging.warning('Skiping test: it cannot run for %s', page.url) | 
| -      results.AddSkippedPage(page, 'Test cannot run', '') | 
| -      return | 
| - | 
| -    logging.info('Running %s' % page.url) | 
| - | 
| -    page_state = PageState() | 
| -    try: | 
| -      did_prepare = self._PreparePage(page, tab, page_state, test, results) | 
| -    except util.TimeoutException, ex: | 
| -      logging.warning('Timed out waiting for reply on %s. This is unusual.', | 
| -                      page.url) | 
| -      results.AddFailure(page, ex, traceback.format_exc()) | 
| -      return | 
| -    except tab_crash_exception.TabCrashException, ex: | 
| -      results.AddFailure(page, ex, traceback.format_exc()) | 
| -      raise | 
| -    except browser_gone_exception.BrowserGoneException: | 
| -      raise | 
| -    except Exception, ex: | 
| -      logging.error('Unexpected failure while running %s: %s', | 
| -                    page.url, traceback.format_exc()) | 
| -      self._CleanUpPage(page, tab, page_state) | 
| -      raise | 
| - | 
| -    if not did_prepare: | 
| -      self._CleanUpPage(page, tab, page_state) | 
| -      return | 
| - | 
| -    try: | 
| -      test.Run(options, page, tab, results) | 
| -    except page_test.Failure, ex: | 
| -      logging.info('%s: %s', ex, page.url) | 
| -      results.AddFailure(page, ex, traceback.format_exc()) | 
| -      return | 
| -    except util.TimeoutException, ex: | 
| -      logging.warning('Timed out while running %s', page.url) | 
| -      results.AddFailure(page, ex, traceback.format_exc()) | 
| -      return | 
| -    except tab_crash_exception.TabCrashException, ex: | 
| -      results.AddFailure(page, ex, traceback.format_exc()) | 
| -      raise | 
| -    except browser_gone_exception.BrowserGoneException: | 
| -      raise | 
| -    except Exception, ex: | 
| -      logging.error('Unexpected failure while running %s: %s', | 
| -                    page.url, traceback.format_exc()) | 
| -      raise | 
| -    finally: | 
| -      self._CleanUpPage(page, tab, page_state) | 
| - | 
| -    results.AddSuccess(page) | 
| - | 
| -  def Close(self): | 
| -    pass | 
| - | 
| -  def _SetupBrowser(self, state, test, possible_browser, credentials_path, | 
| -                    archive_path): | 
| -    assert not state.tab | 
| -    state.browser = possible_browser.Create() | 
| -    state.browser.credentials.credentials_path = credentials_path | 
| -    test.SetUpBrowser(state.browser) | 
| - | 
| -    if state.first_browser: | 
| -      state.browser.credentials.WarnIfMissingCredentials(self.page_set) | 
| -      state.first_browser = False | 
| - | 
| -    state.browser.SetReplayArchivePath(archive_path) | 
| - | 
| -  def _SetupTracingTab(self, state): | 
| -    if state.browser.supports_tracing: | 
| -      state.is_tracing = True | 
| -      state.browser.StartTracing() | 
| - | 
| -  def _EndTracing(self, state, options, page): | 
| -    if state.is_tracing: | 
| -      assert state.browser | 
| -      state.is_tracing = False | 
| -      state.browser.StopTracing() | 
| -      trace_result = state.browser.GetTraceResultAndReset() | 
| -      logging.info('Processing trace...') | 
| - | 
| -      trace_file_base = os.path.join( | 
| -          options.trace_dir, page.url_as_file_safe_name) | 
| - | 
| -      if options.page_repeat != 1 or options.pageset_repeat != 1: | 
| -        trace_file_index = 0 | 
| - | 
| -        while True: | 
| -          trace_file = '%s_%03d.json' % (trace_file_base, trace_file_index) | 
| -          if not os.path.exists(trace_file): | 
| -            break | 
| -          trace_file_index = trace_file_index + 1 | 
| -      else: | 
| -        trace_file = '%s.json' % trace_file_base | 
| -      with codecs.open(trace_file, 'w', | 
| -                       encoding='utf-8') as trace_file: | 
| -        trace_result.Serialize(trace_file) | 
| -      logging.info('Trace saved.') | 
| - | 
| -  def _PreparePage(self, page, tab, page_state, test, results): | 
| -    parsed_url = urlparse.urlparse(page.url) | 
| -    if parsed_url[0] == 'file': | 
| -      dirname, filename = page.url_base_dir_and_file | 
| -      tab.browser.SetHTTPServerDirectory(dirname) | 
| -      target_side_url = tab.browser.http_server.UrlOf(filename) | 
| -    else: | 
| -      target_side_url = page.url | 
| - | 
| -    if page.credentials: | 
| -      page_state.did_login = tab.browser.credentials.LoginNeeded( | 
| -        tab, page.credentials) | 
| -      if not page_state.did_login: | 
| -        msg = 'Could not login to %s on %s' % (page.credentials, | 
| -                                               target_side_url) | 
| -        logging.info(msg) | 
| -        results.AddFailure(page, msg, "") | 
| -        return False | 
| - | 
| -    test.WillNavigateToPage(page, tab) | 
| -    tab.Navigate(target_side_url) | 
| -    test.DidNavigateToPage(page, tab) | 
| - | 
| -    # Wait for unpredictable redirects. | 
| -    if page.wait_time_after_navigate: | 
| -      time.sleep(page.wait_time_after_navigate) | 
| -    page.WaitToLoad(tab, 60) | 
| -    tab.WaitForDocumentReadyStateToBeInteractiveOrBetter() | 
| - | 
| -    return True | 
| - | 
| -  def _CleanUpPage(self, page, tab, page_state): # pylint: disable=R0201 | 
| -    if page.credentials and page_state.did_login: | 
| -      tab.browser.credentials.LoginNoLongerNeeded(tab, page.credentials) | 
| -    try: | 
| -      tab.EvaluateJavaScript("""window.chrome && chrome.benchmarking && | 
| -                              chrome.benchmarking.closeConnections()""") | 
| -    except Exception: | 
| -      pass | 
| - | 
| -  @staticmethod | 
| -  def AddCommandLineOptions(parser): | 
| -    page_filter_module.PageFilter.AddCommandLineOptions(parser) | 
|  |