# Copyright 2014 The Chromium OS 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, os

from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chrome, enrollment


class enterprise_RemoraRequisition(test.test):
    """Enroll as a Remora device."""
    version = 1

    _HANGOUTS_EXT_ID = 'acdafoiapclbpdkhnighhilgampkglpc'

    def _WaitForHangouts(self, browser):
        def _HangoutExtContexts():
            try:
                ext_contexts = browser.extensions.GetByExtensionId(
                        self._HANGOUTS_EXT_ID)
                if len(ext_contexts) > 1:
                    return ext_contexts
            except KeyError:
                pass
            return []
        return utils.poll_for_condition(
                _HangoutExtContexts,
                exception=error.TestFail('Hangouts app failed to launch'),
                timeout=30,
                sleep_interval=1)

    def _CheckHangoutsExtensionContexts(self, browser):
        ext_contexts = self._WaitForHangouts(browser)
        ext_urls = set([context.EvaluateJavaScript('location.href;')
                       for context in ext_contexts])
        expected_urls = set(
                ['chrome-extension://' + self._HANGOUTS_EXT_ID + '/' + path
                for path in ['hangoutswindow.html?windowid=0',
                             '_generated_background_page.html']])
        if expected_urls != ext_urls:
            raise error.TestFail(
                    'Unexpected extension context urls, expected %s, got %s'
                    % (expected_urls, ext_urls))


    def run_once(self):
        user_id, password = utils.get_signin_credentials(os.path.join(
                os.path.dirname(os.path.realpath(__file__)), 'credentials.txt'))
        if not (user_id and password):
            logging.warn('No credentials found - exiting test.')
            return

        with chrome.Chrome(auto_login=False) as cr:
            enrollment.RemoraEnrollment(cr.browser, user_id, password)
            self._CheckHangoutsExtensionContexts(cr.browser)
