blob: b4f66c1c2cb7c697e2053797a06698c5d0b9c52b [file] [log] [blame] [edit]
# 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))