# 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.

import os, 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.cros.video import youtube_helper
from autotest_lib.client.cros.video import helper_logger


FLASH_PROCESS_NAME = 'chrome/chrome --type=ppapi'
PLAYER_PLAYING_STATE = 'Playing'
PLAYBACK_TEST_TIME_S = 10


class video_MultiplePlayback(test.test):
    """This test verify simultaneous video playback.
    We are testing using Youtube html5 and a local video.

    """
    version = 1


    def verify_localvideo_playback(self, tab1):
        """To verify local video playback

        @param tab1: browser tab.
        """

        playback = 0 # seconds
        prev_playback = 0
        while (int(tab1.EvaluateJavaScript('testvideo.currentTime'))
               < int(tab1.EvaluateJavaScript('testvideo.duration'))
               and playback < PLAYBACK_TEST_TIME_S):
            if (int(tab1.EvaluateJavaScript('testvideo.currentTime'))
                    <= prev_playback):
                raise error.TestError('Video is not playing.')
            prev_playback = int(tab1.EvaluateJavaScript(
                    'testvideo.currentTime'))
            time.sleep(1)
            playback = playback + 1


    def run_video_tests(self, browser):
        """Play youtube html5 and a local video, and verify the playback.

        @param browser: The Browser object to run the test with.

        """
        browser.platform.SetHTTPServerDirectories(self.bindir)
        tab1 = browser.tabs.New()
        # Verifying <video> support.
        tab1.Navigate(browser.platform.http_server.UrlOf(
                os.path.join(self.bindir, 'video.html')))

        # Waiting for test video to load.
        tab1.WaitForJavaScriptCondition('testvideo.currentTime < 1.0',
                                        timeout=5)

        tab2 = browser.tabs.New()
        tab2.Navigate(browser.platform.http_server.UrlOf(
                os.path.join(self.bindir, 'youtube5.html')))
        yh = youtube_helper.YouTubeHelper(tab2)
        # Waiting for test video to load.
        yh.wait_for_player_state(PLAYER_PLAYING_STATE)
        yh.set_video_duration()
        # Verify that YouTube is running in html5 mode.
        prc = utils.get_process_list('chrome', '--type=ppapi')
        if prc:
            raise error.TestFail('Tab2: Running YouTube in Flash mode.')

        # Verifying video playback.
        self.verify_localvideo_playback(tab1)
        yh.verify_video_playback()


    @helper_logger.video_log_wrapper
    def run_once(self):
        # TODO(scottz): Remove this when crbug.com/220147 is fixed.
        dut_board = utils.get_current_board()
        if dut_board == 'x86-mario':
           raise error.TestNAError('This test is not available on %s' %
                                    dut_board)
        with chrome.Chrome(
                extra_browser_args=helper_logger.chrome_vmodule_flag(),
                init_network_controller=True) as cr:
            self.run_video_tests(cr.browser)
