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

"""This test remotely emulates noisy HPD line when connecting to an external
display in extended mode using the Chameleon board."""

import logging
import time
from autotest_lib.server.cros.chameleon import chameleon_test


class display_HotPlugNoisy(chameleon_test.ChameleonTest):
    """Noisy display HPD test.

    This test talks to a Chameleon board and a DUT to set up, run, and verify
    DUT behavior in response to noisy HPD line.
    """
    version = 1
    PLUG_CONFIGS = [
        # (plugged_before_noise, plugged_after_noise)

        (False, False),
        (False, True),
        (True, False),
        (True, True),
    ]

    PULSES_PLUGGED = [1, 2, 16, 32, 256, 512, 4096, 8192, (1<<16), (1<<17), (1<<20)]
    PULSES_UNPLUGGED = PULSES_PLUGGED + [1<<21]


    def run_once(self, host, test_mirrored=False):
        logging.info('See the display on Chameleon: port %d (%s)',
                     self.chameleon_port.get_connector_id(),
                     self.chameleon_port.get_connector_type())

        self.set_mirrored(test_mirrored)

        # Keep the original connector name, for later comparison.
        expected_connector = self.display_facade.get_external_connector_name()
        resolution = self.display_facade.get_external_resolution()
        logging.info('See the display on DUT: %s (%dx%d)', expected_connector,
                     *resolution)

        errors = []
        for (plugged_before_noise, plugged_after_noise) in self.PLUG_CONFIGS:
            logging.info('TESTING THE CASE: %s > noise > %s',
                         'plug' if plugged_before_noise else 'unplug',
                         'plug' if plugged_after_noise else 'unplug')

            self.set_plug(plugged_before_noise)

            self.check_external_display_connector(
                    expected_connector if plugged_before_noise else False)

            self.chameleon_port.fire_mixed_hpd_pulses(
                    self.PULSES_PLUGGED if plugged_after_noise
                                        else self.PULSES_UNPLUGGED)

            self.check_external_display_connector(
                    expected_connector if plugged_after_noise else False)

            if plugged_after_noise:
                test_name = 'SCREEN-%dx%d-%c-N-P' % (
                        resolution + ('P' if plugged_before_noise else 'U',))
                self.load_test_image_and_check(
                        test_name, resolution,
                        under_mirrored_mode=test_mirrored, error_list=errors)
            else:
                time.sleep(1)

        self.raise_on_errors(errors)
