예제 #1
0
def FindBrowser(options):
    """Finds the best PossibleBrowser object given a BrowserOptions object.

  Args:
    A BrowserFinderOptions object.

  Returns:
    A PossibleBrowser object. None if browser does not exist in DUT.

  Raises:
    BrowserFinderException: Options improperly set, or an error occurred.
  """
    if options.__class__.__name__ == '_FakeBrowserFinderOptions':
        return options.fake_possible_browser
    if options.browser_type == 'exact' and options.browser_executable is None:
        raise browser_finder_exceptions.BrowserFinderException(
            '--browser=exact requires --browser-executable to be set.')
    if options.browser_type != 'exact' and options.browser_executable != None:
        raise browser_finder_exceptions.BrowserFinderException(
            '--browser-executable requires --browser=exact.')

    if (not _IsCrosBrowser(options) and options.cros_remote != None):
        raise browser_finder_exceptions.BrowserFinderException(
            '--remote requires --browser=[la]cros-chrome[-guest].')

    devices = device_finder.GetDevicesMatchingOptions(options)
    browsers = []
    default_browsers = []

    browser_finders = _GetBrowserFinders(options.target_platforms)

    for device in devices:
        for finder in browser_finders:
            if (options.browser_type and options.browser_type != 'any' and
                    options.browser_type not in finder.FindAllBrowserTypes()):
                continue
            curr_browsers = finder.FindAllAvailableBrowsers(options, device)
            new_default_browser = finder.SelectDefaultBrowser(curr_browsers)
            if new_default_browser:
                default_browsers.append(new_default_browser)
            browsers.extend(curr_browsers)

    if not browsers:
        return None

    if options.browser_type is None:
        if default_browsers:
            default_browser = max(default_browsers,
                                  key=lambda b: b.last_modification_time)
            logging.warning(
                '--browser omitted. Using most recent local build: %s',
                default_browser.browser_type)
            default_browser.UpdateExecutableIfNeeded()
            return default_browser

        if len(browsers) == 1:
            logging.warning(
                '--browser omitted. Using only available browser: %s',
                browsers[0].browser_type)
            browsers[0].UpdateExecutableIfNeeded()
            return browsers[0]

        raise browser_finder_exceptions.BrowserTypeRequiredException(
            '--browser must be specified. Available browsers:\n%s' %
            '\n'.join(sorted(set([b.browser_type for b in browsers]))))

    chosen_browser = None
    if options.browser_type == 'any':
        types = FindAllBrowserTypes(browser_finders)
        chosen_browser = min(browsers,
                             key=lambda b: types.index(b.browser_type))
    else:
        matching_browsers = [
            b for b in browsers if b.browser_type == options.browser_type
            and b.SupportsOptions(options.browser_options)
        ]
        if not matching_browsers:
            logging.warning('Cannot find any matched browser')
            return None
        if len(matching_browsers) > 1:
            logging.warning('Multiple browsers of the same type found: %r',
                            matching_browsers)
        chosen_browser = max(matching_browsers,
                             key=lambda b: b.last_modification_time)

    if chosen_browser:
        logging.info('Chose browser: %r', chosen_browser)
        chosen_browser.UpdateExecutableIfNeeded()

    return chosen_browser
예제 #2
0
def FindBrowser(options):
    """Finds the best PossibleBrowser object given a BrowserOptions object.

  Args:
    A BrowserOptions object.

  Returns:
    A PossibleBrowser object.

  Raises:
    BrowserFinderException: Options improperly set, or an error occurred.
  """
    if options.__class__.__name__ == '_FakeBrowserFinderOptions':
        return options.fake_possible_browser
    if options.browser_type == 'exact' and options.browser_executable == None:
        raise browser_finder_exceptions.BrowserFinderException(
            '--browser=exact requires --browser-executable to be set.')
    if options.browser_type != 'exact' and options.browser_executable != None:
        raise browser_finder_exceptions.BrowserFinderException(
            '--browser-executable requires --browser=exact.')

    if options.browser_type == 'cros-chrome' and options.cros_remote == None:
        raise browser_finder_exceptions.BrowserFinderException(
            'browser_type=cros-chrome requires cros_remote be set.')
    if (options.browser_type != 'cros-chrome'
            and options.browser_type != 'cros-chrome-guest'
            and options.cros_remote != None):
        raise browser_finder_exceptions.BrowserFinderException(
            '--remote requires --browser=cros-chrome or cros-chrome-guest.')

    devices = device_finder.GetDevicesMatchingOptions(options)
    browsers = []
    default_browsers = []
    for device in devices:
        for finder in BROWSER_FINDERS:
            if (options.browser_type and options.browser_type != 'any'
                    and options.browser_type
                    not in finder.FindAllBrowserTypes(options)):
                continue
            curr_browsers = finder.FindAllAvailableBrowsers(options, device)
            new_default_browser = finder.SelectDefaultBrowser(curr_browsers)
            if new_default_browser:
                default_browsers.append(new_default_browser)
            browsers.extend(curr_browsers)

    if options.browser_type == None:
        if default_browsers:
            default_browser = sorted(
                default_browsers, key=lambda b: b.last_modification_time)[-1]

            logging.warning(
                '--browser omitted. Using most recent local build: %s',
                default_browser.browser_type)
            default_browser.UpdateExecutableIfNeeded()
            return default_browser

        if len(browsers) == 1:
            logging.warning(
                '--browser omitted. Using only available browser: %s',
                browsers[0].browser_type)
            browsers[0].UpdateExecutableIfNeeded()
            return browsers[0]

        raise browser_finder_exceptions.BrowserTypeRequiredException(
            '--browser must be specified. Available browsers:\n%s' %
            '\n'.join(sorted(set([b.browser_type for b in browsers]))))

    if options.browser_type == 'any':
        types = FindAllBrowserTypes(options)

        def CompareBrowsersOnTypePriority(x, y):
            x_idx = types.index(x.browser_type)
            y_idx = types.index(y.browser_type)
            return x_idx - y_idx

        browsers.sort(CompareBrowsersOnTypePriority)
        if len(browsers) >= 1:
            browsers[0].UpdateExecutableIfNeeded()
            return browsers[0]
        else:
            return None

    matching_browsers = [
        b for b in browsers if b.browser_type == options.browser_type
        and b.SupportsOptions(options.browser_options)
    ]

    chosen_browser = None
    if len(matching_browsers) == 1:
        chosen_browser = matching_browsers[0]
    elif len(matching_browsers) > 1:
        logging.warning('Multiple browsers of the same type found: %s',
                        repr(matching_browsers))
        chosen_browser = sorted(matching_browsers,
                                key=lambda b: b.last_modification_time)[-1]

    if chosen_browser:
        logging.info('Chose browser: %s', repr(chosen_browser))
        chosen_browser.UpdateExecutableIfNeeded()

    return chosen_browser
예제 #3
0
  # Check ssh
  try:
    platform = platform_module.GetPlatformForDevice(presentation.device, finder_options)
  except cros_interface.LoginException, ex:
    if isinstance(ex, cros_interface.KeylessLoginRequiredException):
      logging.warn('Could not ssh into %s. Your presentation.device must be configured',
                   finder_options.cros_remote)
      logging.warn('to allow passwordless login as root.')
      logging.warn('For a test-build presentation.device, pass this to your script:')
      logging.warn('   --identity $(CHROMITE)/ssh_keys/testing_rsa')
      logging.warn('')
      logging.warn('For a developer-mode presentation.device, the steps are:')
      logging.warn(' - Ensure you have an id_rsa.pub (etc) on this computer')
      logging.warn(' - On the chromebook:')
      logging.warn('   -  Control-Alt-T; shell; sudo -s')
      logging.warn('   -  openssh-server start')
      logging.warn('   -  scp <this machine>:.ssh/id_rsa.pub /tmp/')
      logging.warn('   -  mkdir /root/.ssh')
      logging.warn('   -  chown go-rx /root/.ssh')
      logging.warn('   -  cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys')
      logging.warn('   -  chown 0600 /root/.ssh/authorized_keys')
    raise browser_finder_exceptions.BrowserFinderException(str(ex))

  browsers.extend([PossibleCrOSBrowser('cros-chrome', finder_options,
                                       platform, is_guest=False),
                   PossibleCrOSBrowser('cros-chrome-guest',
                                       finder_options, platform,
                                       is_guest=True)])
  return browsers