# Copyright 2016 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
import os
import time

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
from autotest_lib.client.common_lib.cros import enrollment
from autotest_lib.client.common_lib.cros import kiosk_utils
from autotest_lib.client.common_lib import utils as utils2

KIOSK_MODE = 'Starting kiosk mode...'


class enterprise_KioskEnrollment(test.test):
    """Enroll the device in enterprise."""
    version = 1

    APP_NAME = 'chromesign'
    EXT_ID = 'odjaaghiehpobimgdjjfofmablbaleem'
    EXT_PAGE = 'viewer.html'

    def _CheckKioskExtensionContexts(self, browser):
        ext_contexts = kiosk_utils.wait_for_kiosk_ext(
                browser, self.EXT_ID)
        ext_urls = set([context.EvaluateJavaScript('location.href;')
                       for context in ext_contexts])
        expected_urls = set(
                ['chrome-extension://' + self.EXT_ID + '/' + path
                for path in [self.EXT_PAGE,
                             '_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, kiosk_app_attributes=None):
        if kiosk_app_attributes:
            self.APP_NAME, self.EXT_ID, self.EXT_PAGE = \
                    kiosk_app_attributes.rstrip().split(':')
        user_id, password = utils.get_signin_credentials(os.path.join(
                os.path.dirname(os.path.realpath(__file__)),
                'credentials.' + self.APP_NAME))
        if not (user_id and password):
            logging.warn('No credentials found - exiting test.')
            return

        with chrome.Chrome(auto_login=False,
                           disable_gaia_services=False) as cr:
            enrollment.EnterpriseEnrollment(cr.browser, user_id, password)
        # This way of checking a kiosk extension doesn't work.
        #self._CheckKioskExtensionContexts(cr.browser)
        time.sleep(15)
        running_apps = utils2.system_output('cat /var/log/messages | grep kiosk')
        if KIOSK_MODE not in running_apps:
            raise error.TestFail(
                'DUT did not enter kiosk mode. and it should have.')    
