#!/usr/bin/python2
"""Simple benchmark for measuring startup time."""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import sys

# The parent directory is a module
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

# pylint: disable=C6204,C6203
import timer
import tv_testcase
import tv_testcase_util

NUM_BLANK_TO_BROWSE_ITERATIONS = 10

LAUNCH_TO_BLANK = "wbStartupDurLaunchToBlankUs"
BLANK_TO_BROWSE = "wbStartupDurBlankToBrowseUs"


class StartupTest(tv_testcase.TvTestCase):

  def setUp(self):
    # Override TvTestCase's setUp() so that blank startup can first be measured.
    pass

  def test_simple(self):
    """This test tries to measure the startup time for the YouTube TV page.

    Specifically, this test uses the Cobalt CVal Cobalt.Lifetime, which gets
    updated ~60Hz on a best effort basis and is in microseconds, to determine
    "wbStartupDurLaunchToBlankUs" and uses Timer to determine
    "wbStartupDurBlankToBrowseUs".
    """

    dur_launch_to_blank_us = self.get_cval("Cobalt.Lifetime")

    # Call TvTestCase's setUp() now that the blank startup time has been
    # measured.
    super(StartupTest, self).setUp()

    # Blank to browser record strategies
    blank_to_browse_record_strategies = []
    blank_to_browse_record_strategies.append(
        tv_testcase_util.RecordStrategyMean())
    blank_to_browse_record_strategies.append(
        tv_testcase_util.RecordStrategyPercentile(25))
    blank_to_browse_record_strategies.append(
        tv_testcase_util.RecordStrategyPercentile(50))
    blank_to_browse_record_strategies.append(
        tv_testcase_util.RecordStrategyPercentile(75))
    blank_to_browse_record_strategies.append(
        tv_testcase_util.RecordStrategyPercentile(95))

    # Blank to browser recorder
    blank_to_browse_recorder = tv_testcase_util.ResultsRecorder(
        BLANK_TO_BROWSE, blank_to_browse_record_strategies)

    for _ in range(NUM_BLANK_TO_BROWSE_ITERATIONS):
      self.load_blank()
      with timer.Timer(BLANK_TO_BROWSE) as t:
        self.load_tv()
      blank_to_browse_recorder.collect_value(int(t.seconds_elapsed * 1000000))

    tv_testcase_util.record_test_result(LAUNCH_TO_BLANK, dur_launch_to_blank_us)
    blank_to_browse_recorder.on_end_test()


if __name__ == "__main__":
  tv_testcase.main()
