1# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import os 6import logging 7 8from autotest_lib.client.bin import test, utils 9from autotest_lib.client.cros import service_stopper 10from autotest_lib.client.cros.graphics import graphics_utils 11 12# to run this test manually on a test target 13# ssh root@machine 14# cd /usr/local/autotest/deps/glbench 15# stop ui 16# ./windowmanagertest --screenshot1_sec 2 --screenshot2_sec 1 --cooldown_sec 1 \ 17# --screenshot1_cmd \ 18# "/usr/local/autotest/bin/screenshot.py screenshot1_generated.png" \ 19# --screenshot2_cmd \ 20# "/usr/local/autotest/bin/screenshot.py screenshot2_generated.png" 21# start ui 22 23class graphics_Sanity(graphics_utils.GraphicsTest): 24 """ 25 This test is meant to be used as a quick sanity check for GL/GLES. 26 """ 27 version = 1 28 29 # None-init vars used by cleanup() here, in case setup() fails 30 _services = None 31 32 33 def setup(self): 34 self.job.setup_dep(['glbench']) 35 36 37 def initialize(self): 38 super(graphics_Sanity, self).initialize() 39 # If UI is running, we must stop it and restore later. 40 self._services = service_stopper.ServiceStopper(['ui']) 41 self._services.stop_services() 42 43 44 def cleanup(self): 45 super(graphics_Sanity, self).cleanup() 46 if self._services: 47 self._services.restore_services() 48 49 50 def run_once(self): 51 """ 52 Draws a texture with a soft ellipse twice and captures each image. 53 Compares the output fuzzily against reference images. 54 """ 55 if graphics_utils.get_display_resolution() is None: 56 logging.warning('Skipping test because there is no screen') 57 return 58 self.add_failures('graphics_Sanity') 59 60 dep = 'glbench' 61 dep_dir = os.path.join(self.autodir, 'deps', dep) 62 self.job.install_pkg(dep, 'dep', dep_dir) 63 64 screenshot1_reference = os.path.join(self.bindir, 65 "screenshot1_reference.png") 66 screenshot1_generated = os.path.join(self.resultsdir, 67 "screenshot1_generated.png") 68 screenshot1_resized = os.path.join(self.resultsdir, 69 "screenshot1_generated_resized.png") 70 screenshot2_reference = os.path.join(self.bindir, 71 "screenshot2_reference.png") 72 screenshot2_generated = os.path.join(self.resultsdir, 73 "screenshot2_generated.png") 74 screenshot2_resized = os.path.join(self.resultsdir, 75 "screenshot2_generated_resized.png") 76 77 exefile = os.path.join(self.autodir, 'deps/glbench/windowmanagertest') 78 79 # Delay before screenshot: 1 second has caused failures. 80 options = ' --screenshot1_sec 2' 81 options += ' --screenshot2_sec 1' 82 options += ' --cooldown_sec 1' 83 # perceptualdiff can handle only 8 bit images. 84 screenshot_cmd = ' "/usr/local/autotest/bin/screenshot.py %s"' 85 options += ' --screenshot1_cmd' + screenshot_cmd % screenshot1_generated 86 options += ' --screenshot2_cmd' + screenshot_cmd % screenshot2_generated 87 88 cmd = exefile + ' ' + options 89 utils.run(cmd, 90 stdout_tee=utils.TEE_TO_LOGS, 91 stderr_tee=utils.TEE_TO_LOGS) 92 93 convert_cmd = ("convert -channel RGB -colorspace RGB -depth 8" 94 " -resize '100x100!' %s %s") 95 utils.system(convert_cmd % (screenshot1_generated, screenshot1_resized)) 96 utils.system(convert_cmd % (screenshot2_generated, screenshot2_resized)) 97 os.remove(screenshot1_generated) 98 os.remove(screenshot2_generated) 99 100 diff_cmd = 'perceptualdiff -verbose %s %s' 101 utils.system(diff_cmd % (screenshot1_reference, screenshot1_resized)) 102 utils.system(diff_cmd % (screenshot2_reference, screenshot2_resized)) 103 104 self.remove_failures('graphics_Sanity') 105