# 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.path
import time

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


class power_PSROccupancyTest(test.test):
    """
    Tests that PSR is entered on a static content.

    The purpose of this test is to verify that display enters the PSR state when
    the content being displayed is static. It also verifies that the display
    stays in PSR state for as long as the display is static. It first enables
    PSR if not enabled and makes the displayed content static. It then waits for
    some time, after which it checks whether the display was in PSR state for
    close to (<wait time> - <vblankoffdelay>).
    """
    version = 1


    def _is_psr_enabled(self):
        enable_psr_file_path = '/sys/module/i915/parameters/enable_psr'
        if not os.path.exists(enable_psr_file_path):
            raise error.TestFail('sysfs entry for "enable_psr" is missing.')
        return int(utils.read_file(enable_psr_file_path)) == 1


    def _get_perf_count(self):
        debugfs_file_path = '/sys/kernel/debug/dri/0/i915_edp_psr_status'
        if not os.path.exists(debugfs_file_path):
            raise error.TestFail('debugfs entry for PSR status is missing.')
        psr_status = utils.read_file(debugfs_file_path).splitlines()
        if len(psr_status) != 4:
            raise error.TestFail(
                    'Incorrect number of lines in %s.' % debugfs_file_path)
        perf_count_chunks = psr_status[3].split()
        if len(perf_count_chunks) != 2:
            raise error.TestFail('Unknown format in %s.' % debugfs_file_path)
        return int(perf_count_chunks[1])


    def _get_vblank_timeout(self):
        return int(utils.read_file('/sys/module/drm/parameters/vblankoffdelay'))


    def run_once(self):
        if utils.get_board() != 'samus':
            raise error.TestNAError(
                    'Trying to run PSR tests on non-samus board.')
        psr_enabled = self._is_psr_enabled()
        if not psr_enabled and utils.call_xrandr('--output eDP1 --set psr on'):
            error.TestFail('Unable to enable PSR via xrandr.')
        # Start chrome in full screen mode so that there is no blinking cursor
        # or ticking clock on the screen.
        with chrome.Chrome(logged_in=False, extra_browser_args=['--kiosk']):
            # Sample the PSR performance count from debugfs and wait for 20s.
            # At the end of 20s, re-sample the PSR performance count. The time
            # spent in PSR should be close to (20s - <vblankoffdelay>).
            sleep_time_milliseconds = 20 * 1000
            min_occupancy = 0.9 * (sleep_time_milliseconds -
                                   self._get_vblank_timeout())
            perf_count_old = self._get_perf_count()
            time.sleep(sleep_time_milliseconds / 1000)
            perf_count_new = self._get_perf_count()
            occupancy_time = perf_count_new - perf_count_old
            if occupancy_time < min_occupancy:
                raise error.TestFail(
                        'PSR occupancy time %dms less than expected.' %
                        occupancy_time)
            # Disable PSR if it was not enabled to begin with.
            if (not psr_enabled and
                utils.call_xrandr('--output eDP1 --set psr off')):
                raise error.TestWarn('Unable to disable PSR via xrandr.')
