• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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