# Copyright (c) 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.

from contextlib import closing
import logging
import os
import re
import time

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


# Chrome flags to use fake camera and skip camera permission.
EXTRA_BROWSER_ARGS = ['--use-fake-device-for-media-stream',
                      '--use-fake-ui-for-media-stream']
FAKE_FILE_ARG = '--use-file-for-fake-video-capture="%s"'
DOWNLOAD_BASE = 'http://commondatastorage.googleapis.com/chromiumos-test-assets-public/crowd/'
VIDEO_NAME = 'crowd720_25frames.y4m'

RTC_VIDEO_ENCODE = 'Media.RTCVideoEncoderInitEncodeSuccess'
RTC_VIDEO_ENCODE_BUCKET = 1
RTC_ENCODE_PROFILE = 'Media.RTCVideoEncoderProfile'
RTC_ENCODE_PROFILE_BUCKET = 11
HISTOGRAMS_URL = 'chrome://histograms/'

class video_ChromeRTCHWEncodeUsed(test.test):
    """The test verifies HW Encoding for WebRTC video."""
    version = 1


    def start_loopback(self, cr):
        """
        Opens WebRTC loopback page.

        @param cr: Autotest Chrome instance.
        """
        tab = cr.browser.tabs.New()
        tab.Navigate(cr.browser.platform.http_server.UrlOf(
                os.path.join(self.bindir, 'loopback.html')))
        tab.WaitForDocumentReadyStateToBeComplete()


    def assert_hardware_accelerated(self, cr):
        """
        Checks if WebRTC decoding is hardware accelerated.

        @param cr: Autotest Chrome instance.

        @raises error.TestError if decoding is not hardware accelerated.
        """
        tab = cr.browser.tabs.New()
        def histograms_loaded(histogram):
            """Returns true if histogram is loaded."""
            tab.Navigate(HISTOGRAMS_URL + histogram)
            tab.WaitForDocumentReadyStateToBeComplete()
            return tab.EvaluateJavaScript(
                    'document.documentElement.innerText.search("%s") != -1'
                    % histogram)

        def histogram_sucess(histogram, bucket):
            lines = tab.EvaluateJavaScript(
                    'document.documentElement.innerText').split("\n")
            lines = [line for line in lines if line.strip()]
            logging.info('Histograms for %s:', histogram )
            logging.info(lines)
            success = False
            for line in lines:
                re_string = '^'+ str(bucket) +'\s\s-(.*)100.0%(.*)'
                if re.match(re_string, line):
                    success = True
                    break
            if not success:
                raise error.TestError(
                        '{0} didn\'t show up or is not 100%'
                        ' successful.'.format(histogram))

        for histogram, bucket in [(RTC_VIDEO_ENCODE, RTC_VIDEO_ENCODE_BUCKET),
                (RTC_ENCODE_PROFILE, RTC_ENCODE_PROFILE_BUCKET)]:
            utils.poll_for_condition(
                    lambda: histograms_loaded(histogram),
                    timeout=5,
                    exception=error.TestError(
                            'Cannot find %s histogram.' % histogram),
                    sleep_interval=1)
            histogram_sucess(histogram, bucket)


    def run_once(self, arc_mode=None):
        boards_to_skip = ['peach_pit']
        dut_board = utils.get_current_board()
        if dut_board in boards_to_skip:
            logging.info("Skipping test run on this board.")
            return

        # Download test video.
        url = DOWNLOAD_BASE + VIDEO_NAME
        local_path = os.path.join(self.bindir, VIDEO_NAME)
        file_utils.download_file(url, local_path)

        # Start chrome with test flags.
        EXTRA_BROWSER_ARGS.append(FAKE_FILE_ARG % local_path)
        with chrome.Chrome(extra_browser_args=EXTRA_BROWSER_ARGS,
                           arc_mode=arc_mode) as cr:
            # Open WebRTC loopback page.
            cr.browser.platform.SetHTTPServerDirectories(self.bindir)
            self.start_loopback(cr)

            # Make sure decode is hardware accelerated.
            self.assert_hardware_accelerated(cr)
