# Copyright (c) 2010 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
import logging

from autotest_lib.client.bin import test, utils
from autotest_lib.client.cros import service_stopper
from autotest_lib.client.cros.graphics import graphics_utils

# to run this test manually on a test target
# ssh root@machine
# cd /usr/local/autotest/deps/glbench
# stop ui
# ./windowmanagertest --screenshot1_sec 2 --screenshot2_sec 1 --cooldown_sec 1 \
#    --screenshot1_cmd \
#        "/usr/local/autotest/bin/screenshot.py screenshot1_generated.png" \
#    --screenshot2_cmd \
#        "/usr/local/autotest/bin/screenshot.py screenshot2_generated.png"
# start ui

class graphics_Sanity(test.test):
    """
    This test is meant to be used as a quick sanity check for GL/GLES.
    """
    version = 1

    # None-init vars used by cleanup() here, in case setup() fails
    _services = None


    def setup(self):
        self.job.setup_dep(['glbench'])


    def initialize(self):
        # If UI is running, we must stop it and restore later.
        self._services = service_stopper.ServiceStopper(['ui'])
        self._services.stop_services()


    def cleanup(self):
        if self._services:
          self._services.restore_services()


    def run_once(self):
        """
        Draws a texture with a soft ellipse twice and captures each image.
        Compares the output fuzzily against reference images.
        """
        if utils.is_freon() and graphics_utils.get_display_resolution() is None:
            logging.warning('Skipping test because there is no screen')
            return

        dep = 'glbench'
        dep_dir = os.path.join(self.autodir, 'deps', dep)
        self.job.install_pkg(dep, 'dep', dep_dir)

        screenshot1_reference = os.path.join(self.bindir,
                                             "screenshot1_reference.png")
        screenshot1_generated = os.path.join(self.resultsdir,
                                             "screenshot1_generated.png")
        screenshot1_resized = os.path.join(self.resultsdir,
                                           "screenshot1_generated_resized.png")
        screenshot2_reference = os.path.join(self.bindir,
                                             "screenshot2_reference.png")
        screenshot2_generated = os.path.join(self.resultsdir,
                                             "screenshot2_generated.png")
        screenshot2_resized = os.path.join(self.resultsdir,
                                           "screenshot2_generated_resized.png")

        exefile = os.path.join(self.autodir, 'deps/glbench/windowmanagertest')

        # Delay before screenshot: 1 second has caused failures.
        options = ' --screenshot1_sec 2'
        options += ' --screenshot2_sec 1'
        options += ' --cooldown_sec 1'
        # perceptualdiff can handle only 8 bit images.
        if not utils.is_freon():
          screenshot_cmd = ' "DISPLAY=:1 import -window root %s"'
        else:
          screenshot_cmd = ' "/usr/local/autotest/bin/screenshot.py %s"'
        options += ' --screenshot1_cmd' + screenshot_cmd % screenshot1_generated
        options += ' --screenshot2_cmd' + screenshot_cmd % screenshot2_generated

        cmd = exefile + ' ' + options
        if not utils.is_freon():
          cmd = 'X :1 vt1 & sleep 1; chvt 1 && DISPLAY=:1 ' + cmd
        try:
          utils.run(cmd,
                    stdout_tee=utils.TEE_TO_LOGS,
                    stderr_tee=utils.TEE_TO_LOGS)
        finally:
          if not utils.is_freon():
            # Just sending SIGTERM to X is not enough; we must wait for it to
            # really die before we start a new X server (ie start ui).
            utils.ensure_processes_are_dead_by_name('^X$')

        convert_cmd = ("convert -channel RGB -colorspace RGB -depth 8"
                       " -resize '100x100!' %s %s")
        utils.system(convert_cmd % (screenshot1_generated, screenshot1_resized))
        utils.system(convert_cmd % (screenshot2_generated, screenshot2_resized))
        os.remove(screenshot1_generated)
        os.remove(screenshot2_generated)

        diff_cmd = 'perceptualdiff -verbose %s %s'
        utils.system(diff_cmd % (screenshot1_reference, screenshot1_resized))
        utils.system(diff_cmd % (screenshot2_reference, screenshot2_resized))