# Copyright (c) 2013 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 json
import logging
import os
import socket
import time

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chromedriver
from autotest_lib.client.cros.video import histogram_verifier

import config_manager
import test_utils

#histogram fields to be verified
MEDIA_GVD_INIT_STATUS = 'Cast.Sender.VideoEncodeAcceleratorInitializeSuccess'
MEDIA_GVD_BUCKET = 1

class desktopui_SonicExtension(test.test):
    """Test loading the sonic extension through chromedriver."""
    version = 1
    wait_time = 5
    dep = 'sonic_extension'

    def _install_sonic_extension(self):
        dep_dir = os.path.join(self.autodir, 'deps', self.dep)
        logging.info('Installing sonic extension into %s', dep_dir)
        self.job.install_pkg(self.dep, 'dep', dep_dir)
        return dep_dir


    def _check_manifest(self, extension_path):
        """Checks the manifest for a public key.

        The sonic extension is an autotest dependency and will get
        installed through install_pkg as a component extension (with
        a public key). Any other method of installation is supported
        too, as long as it has a public key.

        @param extension_path: A path to the directory of the extension
            that contains a manifest.json.

        @raises TestError: If the extension doesn't have a public key.
        """
        manifest_json_file = os.path.join(extension_path, 'manifest.json')
        with open(manifest_json_file, 'r') as f:
            manifest_json = json.loads(f.read())
            if not manifest_json.get('key'):
                raise error.TestError('Not a component extension, cannot '
                                      'proceed with sonic test')


    def initialize(self, test_config, sonic_hostname, sonic_build='00000',
        extension_dir=None):
        """Initialize the test.

        @param extension_dir: Directory of a custom extension.
            If one isn't supplied, the latest ToT extension is
            downloaded and loaded into chromedriver.
        @param live: Use a live url if True. Start a test server
            and server a hello world page if False.
        """
        super(desktopui_SonicExtension, self).initialize()

        if not extension_dir:
            self._extension_dir = self._install_sonic_extension()
        else:
            self._extension_dir = extension_dir
        if not os.path.exists(self._extension_dir):
            raise error.TestError('Failed to install sonic extension.')
        logging.info('extension: %s', self._extension_dir)
        self._check_manifest(self._extension_dir)
        self._test_utils_page = 'e2e_test_utils.html'
        self._test_config = test_config
        self._sonic_hostname = sonic_hostname
        self._sonic_build = sonic_build
        self._settings = config_manager.ConfigurationManager(
                self._test_config).get_config_settings()
        self._test_utils = test_utils.TestUtils()


    def cleanup(self):
        """Clean up the test environment, e.g., stop local http server."""
        super(desktopui_SonicExtension, self).cleanup()

    def _get_run_information(self, driver, settings):
        """Get all the information about the test run.

        @param driver: The webdriver instance of the test
        @param settings: The settings and information about the test
        @return A json that contains all the different information
            about the test run
        """
        information = {}
        if 'machine_name' in settings:
            information['machine_name'] = settings['machine_name']
        else:
            information['machine_name'] = socket.gethostname()
        information['network_profile'] = settings['network_profile']
        information['chrome_version'] = self._test_utils.get_chrome_version(
                driver)
        information['chrome_revision'] = self._test_utils.get_chrome_revision(
                driver)
        information['sonic_build'] = self._sonic_build
        information['video_name'] = settings.get('video_name',
                                                 settings['video_site'])
        information['comments'] = settings['comments']
        return information

    def run_once(self):
        """Run the test code."""
        # TODO: When we've cloned the sonic test repo get these from their
        # test config files.
        logging.info('Starting sonic client test.')
        kwargs = {
            'extension_paths': [self._extension_dir],
            'extra_chrome_flags': [self._settings['extra_flags']],
        }

        with chromedriver.chromedriver(**kwargs) as chromedriver_instance:
            driver = chromedriver_instance.driver
            extension_id = chromedriver_instance.get_extension(
                    self._extension_dir).extension_id
            self._test_utils.enable_automatic_send_usage(driver)
            self._test_utils.set_local_storage_mr_mirroring(
                    driver, extension_id)
            test_info = self._get_run_information(driver, self._settings)

            logging.info('Starting tabcast to extension: %s', extension_id)
            current_tab_handle = driver.current_window_handle
            self._test_utils.start_mirroring_media_router(
                    driver, extension_id, self._sonic_hostname,
                    self._settings['video_site'],
                    self._settings['full_screen'] == 'on')
            self._test_utils.set_focus_tab(driver, current_tab_handle)
            driver.switch_to_window(current_tab_handle)
            cpu_usage = self._test_utils.cpu_usage_interval(
                    int(self._settings['mirror_duration']))
            self._test_utils.stop_mirroring_media_router(driver, extension_id)
            crash_id = self._test_utils.upload_mirroring_logs_media_router(
                    driver, extension_id)
            test_info['crash_id'] = crash_id
            if self._settings.get('sender_root_dir'):
                cpu_bound = self._test_utils.compute_cpu_utilization(cpu_usage)
                info_json_file = os.path.join(self._settings['sender_root_dir'],
                                              'test_information.json')
                cpu_json_file = os.path.join(
                        self._settings['sender_root_dir'], 'cpu_data.json')
                cpu_bound_json_file = os.path.join(
                        self._settings['sender_root_dir'], 'cpu_bound.json')
                json.dump(test_info, open(info_json_file, 'wb'))
                json.dump(cpu_usage, open(cpu_json_file, 'wb'))
                json.dump(cpu_bound, open(cpu_bound_json_file, 'wb'))
            time.sleep(self.wait_time)
            #To check encoder acceleration used while casting
            histogram_verifier.verify(
                 chromedriver_instance.chrome_instance,
                 MEDIA_GVD_INIT_STATUS, MEDIA_GVD_BUCKET)
